diff --git a/Nmakefile b/Nmakefile index 02d2b5f1ed..1edc14199d 100755 --- a/Nmakefile +++ b/Nmakefile @@ -1,17 +1,27 @@ -!IF DEFINED(DEBUG) -LINK_FLAGS = /nologo /safeseh /DEBUG shell32.lib -CL_FLAGS = /nologo /Zi /O2 /W3 /DFACTOR_DEBUG -!ELSE -LINK_FLAGS = /nologo /safeseh shell32.lib +!IF DEFINED(PLATFORM) + +LINK_FLAGS = /nologo shell32.lib CL_FLAGS = /nologo /O2 /W3 + +!IF DEFINED(DEBUG) +LINK_FLAGS = $(LINK_FLAGS) /DEBUG +CL_FLAGS = $(CL_FLAGS) /Zi /DFACTOR_DEBUG +!ENDIF + +!IF "$(PLATFORM)" == "x86-32" +LINK_FLAGS = $(LINK_FLAGS) /safeseh +PLAF_DLL_OBJS = vm\os-windows-nt-x86.32.obj vm\safeseh.obj +!ELSEIF "$(PLATFORM)" == "x86-64" +PLAF_DLL_OBJS = vm\os-windows-nt-x86.64.obj !ENDIF ML_FLAGS = /nologo /safeseh EXE_OBJS = vm\main-windows-nt.obj vm\factor.res -DLL_OBJS = vm\os-windows-nt.obj \ +DLL_OBJS = $(PLAF_DLL_OBJS) \ vm\os-windows.obj \ + vm\os-windows-nt.obj \ vm\aging_collector.obj \ vm\alien.obj \ vm\arrays.obj \ @@ -49,7 +59,6 @@ DLL_OBJS = vm\os-windows-nt.obj \ vm\profiler.obj \ vm\quotations.obj \ vm\run.obj \ - vm\safeseh.obj \ vm\strings.obj \ vm\to_tenured_collector.obj \ vm\tuples.obj \ @@ -69,8 +78,6 @@ DLL_OBJS = vm\os-windows-nt.obj \ .rs.res: rc $< -all: factor.com factor.exe factor.dll.lib libfactor-ffi-test.dll - libfactor-ffi-test.dll: vm/ffi_test.obj link $(LINK_FLAGS) /out:libfactor-ffi-test.dll /dll vm/ffi_test.obj @@ -83,6 +90,23 @@ factor.com: $(EXE_OBJS) $(DLL_OBJS) factor.exe: $(EXE_OBJS) $(DLL_OBJS) link $(LINK_FLAGS) /out:factor.exe /SUBSYSTEM:windows $(EXE_OBJS) $(DLL_OBJS) +all: factor.com factor.exe factor.dll.lib libfactor-ffi-test.dll + +!ENDIF + +default: + @echo Usage: nmake /f Nmakefile platform + @echo Where platform is one of: + @echo x86-32 + @echo x86-64 + @exit 1 + +x86-32: + nmake PLATFORM=x86-32 /f Nmakefile all + +x86-64: + nmake PLATFORM=x86-64 /f Nmakefile all + clean: del vm\*.obj del factor.lib @@ -91,6 +115,6 @@ clean: del factor.dll del factor.dll.lib -.PHONY: all clean +.PHONY: all default x86-32 x86-64 clean .SUFFIXES: .rs diff --git a/basis/alien/fortran/fortran.factor b/basis/alien/fortran/fortran.factor index 9255c66c9f..8c74aa102a 100644 --- a/basis/alien/fortran/fortran.factor +++ b/basis/alien/fortran/fortran.factor @@ -13,8 +13,8 @@ SINGLETONS: f2c-abi g95-abi gfortran-abi intel-unix-abi intel-windows-abi ; << : add-f2c-libraries ( -- ) - "I77" "libI77.so" "cdecl" add-library - "F77" "libF77.so" "cdecl" add-library ; + "I77" "libI77.so" cdecl add-library + "F77" "libF77.so" cdecl add-library ; os netbsd? [ add-f2c-libraries ] when >> @@ -42,11 +42,11 @@ library-fortran-abis [ H{ } clone ] initialize [ "__" append ] [ "_" append ] if ; HOOK: fortran-c-abi fortran-abi ( -- abi ) -M: f2c-abi fortran-c-abi "cdecl" ; -M: g95-abi fortran-c-abi "cdecl" ; -M: gfortran-abi fortran-c-abi "cdecl" ; -M: intel-unix-abi fortran-c-abi "cdecl" ; -M: intel-windows-abi fortran-c-abi "cdecl" ; +M: f2c-abi fortran-c-abi cdecl ; +M: g95-abi fortran-c-abi cdecl ; +M: gfortran-abi fortran-c-abi cdecl ; +M: intel-unix-abi fortran-c-abi cdecl ; +M: intel-windows-abi fortran-c-abi cdecl ; HOOK: real-functions-return-double? fortran-abi ( -- ? ) M: f2c-abi real-functions-return-double? t ; diff --git a/basis/alien/libraries/libraries-docs.factor b/basis/alien/libraries/libraries-docs.factor index 59142733b9..8676ac8c58 100644 --- a/basis/alien/libraries/libraries-docs.factor +++ b/basis/alien/libraries/libraries-docs.factor @@ -6,7 +6,7 @@ IN: alien.libraries HELP: { $values - { "path" "a pathname string" } { "abi" "the ABI used by the library, either " { $snippet "cdecl" } " or " { $snippet "stdcall" } } + { "path" "a pathname string" } { "abi" "the ABI used by the library, either " { $link cdecl } " or " { $link stdcall } } { "library" library } } { $description "Opens a C library using the path and ABI parameters and outputs a library tuple." } { $notes "User code should use " { $link add-library } " so that the opened library is added to a global hashtable, " { $link libraries } "." } ; @@ -19,7 +19,7 @@ HELP: library { $description "Looks up a library by its logical name. The library object is a hashtable with the following keys:" { $list { { $snippet "name" } " - the full path of the C library binary" } - { { $snippet "abi" } " - the ABI used by the library, either " { $snippet "cdecl" } " or " { $snippet "stdcall" } } + { { $snippet "abi" } " - the ABI used by the library, either " { $link cdecl } " or " { $link stdcall } } { { $snippet "dll" } " - an instance of the " { $link dll } " class; only set if the library is loaded" } } } ; @@ -43,7 +43,7 @@ HELP: load-library { $description "Loads a library by logical name and outputs a handle which may be passed to " { $link dlsym } " or " { $link dlclose } ". If the library is already loaded, returns the existing handle." } ; HELP: add-library -{ $values { "name" string } { "path" string } { "abi" "one of " { $snippet "\"cdecl\"" } " or " { $snippet "\"stdcall\"" } } } +{ $values { "name" string } { "path" string } { "abi" "one of " { $link cdecl } " or " { $link stdcall } } } { $description "Defines a new logical library named " { $snippet "name" } " located in the file system at " { $snippet "path" } " and the specified ABI. The logical library name can then be used by a " { $link POSTPONE: LIBRARY: } " form to specify the logical library for subsequent " { $link POSTPONE: FUNCTION: } " definitions." } { $notes "Because the entire source file is parsed before top-level forms are executed, " { $link add-library } " must be placed within a " { $snippet "<< ... >>" } " parse-time evaluation block." $nl @@ -53,8 +53,8 @@ $nl { $examples "Here is a typical usage of " { $link add-library } ":" { $code "<< \"freetype\" {" - " { [ os macosx? ] [ \"libfreetype.6.dylib\" \"cdecl\" add-library ] }" - " { [ os windows? ] [ \"freetype6.dll\" \"cdecl\" add-library ] }" + " { [ os macosx? ] [ \"libfreetype.6.dylib\" cdecl add-library ] }" + " { [ os windows? ] [ \"freetype6.dll\" cdecl add-library ] }" " [ drop ]" "} cond >>" } diff --git a/basis/alien/libraries/libraries.factor b/basis/alien/libraries/libraries.factor index 47e34fe5ff..5a042fd436 100644 --- a/basis/alien/libraries/libraries.factor +++ b/basis/alien/libraries/libraries.factor @@ -36,7 +36,7 @@ M: library dispose dll>> [ dispose ] when* ; [ swap libraries get set-at ] 3bi ; : library-abi ( library -- abi ) - library [ abi>> ] [ "cdecl" ] if* ; + library [ abi>> ] [ cdecl ] if* ; SYMBOL: deploy-libraries diff --git a/basis/alien/parser/parser.factor b/basis/alien/parser/parser.factor index 4c5f5dbd6a..0891caa04a 100644 --- a/basis/alien/parser/parser.factor +++ b/basis/alien/parser/parser.factor @@ -4,7 +4,7 @@ USING: accessors alien alien.c-types alien.libraries arrays assocs classes combinators combinators.short-circuit compiler.units effects grouping kernel parser sequences splitting words fry locals lexer namespaces summary math -vocabs.parser ; +vocabs.parser words.constant ; IN: alien.parser : parse-c-type-name ( name -- word ) @@ -51,14 +51,17 @@ ERROR: *-in-c-type-name name ; dup "*" tail? [ *-in-c-type-name ] when ; -: CREATE-C-TYPE ( -- word ) - scan validate-c-type-name current-vocab create { +: (CREATE-C-TYPE) ( word -- word ) + validate-c-type-name current-vocab create { [ fake-definition ] [ set-word ] [ reset-c-type ] [ ] } cleave ; +: CREATE-C-TYPE ( -- word ) + scan (CREATE-C-TYPE) ; + > return-type-name CHAR: * suffix ; PRIVATE> +: define-enum-member ( word-string value -- next-value ) + [ create-in ] dip [ define-constant ] keep 1 + ; + +: parse-enum-member ( word-string value -- next-value ) + over "{" = + [ 2drop scan scan-object define-enum-member "}" expect ] + [ define-enum-member ] if ; + +: parse-enum-members ( counter -- ) + scan dup ";" = not + [ swap parse-enum-member parse-enum-members ] [ 2drop ] if ; + : scan-function-name ( -- return function ) scan-c-type scan parse-pointers ; diff --git a/basis/alien/remote-control/remote-control.factor b/basis/alien/remote-control/remote-control.factor index c305d720f0..5090280945 100644 --- a/basis/alien/remote-control/remote-control.factor +++ b/basis/alien/remote-control/remote-control.factor @@ -6,14 +6,14 @@ eval ; IN: alien.remote-control : eval-callback ( -- callback ) - void* { c-string } "cdecl" + void* { c-string } cdecl [ eval>string utf8 malloc-string ] alien-callback ; : yield-callback ( -- callback ) - void { } "cdecl" [ yield ] alien-callback ; + void { } cdecl [ yield ] alien-callback ; : sleep-callback ( -- callback ) - void { long } "cdecl" [ sleep ] alien-callback ; + void { long } cdecl [ sleep ] alien-callback ; : ?callback ( word -- alien ) dup optimized? [ execute ] [ drop f ] if ; inline diff --git a/basis/alien/syntax/syntax-docs.factor b/basis/alien/syntax/syntax-docs.factor index 58b43cec31..df20926480 100644 --- a/basis/alien/syntax/syntax-docs.factor +++ b/basis/alien/syntax/syntax-docs.factor @@ -58,15 +58,15 @@ HELP: TYPEDEF: { $notes "This word differs from " { $link typedef } " in that it runs at parse time, to ensure correct ordering of operations when loading source files. Words defined in source files are compiled before top-level forms are run, so if a source file defines C binding words and uses " { $link typedef } ", the type alias won't be available at compile time." } ; HELP: C-ENUM: -{ $syntax "C-ENUM: words... ;" } -{ $values { "words" "a sequence of word names" } } -{ $description "Creates a sequence of word definitions in the current vocabulary. Each word pushes an integer according to its index in the enumeration definition. The first word pushes 0." } +{ $syntax "C-ENUM: type/f words... ;" } +{ $values { "type" "a name to typedef to int or f" } { "words" "a sequence of word names" } } +{ $description "Creates a sequence of word definitions in the current vocabulary. Each word pushes an integer according to the rules of C enums." } { $notes "This word emulates a C-style " { $snippet "enum" } " in Factor. While this feature can be used for any purpose, using integer constants is discouraged unless it is for interfacing with C libraries. Factor code should use " { $link "words.symbol" } " or " { $link "singletons" } " instead." } { $examples "Here is an example enumeration definition:" - { $code "C-ENUM: red green blue ;" } + { $code "C-ENUM: color_t red { green 3 } blue ;" } "It is equivalent to the following series of definitions:" - { $code "CONSTANT: red 0" "CONSTANT: green 1" "CONSTANT: blue 2" } + { $code "CONSTANT: red 0" "CONSTANT: green 3" "CONSTANT: blue 4" } } ; HELP: C-TYPE: diff --git a/basis/alien/syntax/syntax.factor b/basis/alien/syntax/syntax.factor index 9eb8ca6287..00148a82d4 100644 --- a/basis/alien/syntax/syntax.factor +++ b/basis/alien/syntax/syntax.factor @@ -25,8 +25,10 @@ SYNTAX: TYPEDEF: scan-c-type CREATE-C-TYPE dup save-location typedef ; SYNTAX: C-ENUM: - ";" parse-tokens - [ [ create-in ] dip define-constant ] each-index ; + scan dup "f" = + [ drop ] + [ (CREATE-C-TYPE) dup save-location int swap typedef ] if + 0 parse-enum-members ; SYNTAX: C-TYPE: void CREATE-C-TYPE typedef ; diff --git a/basis/cairo/ffi/ffi.factor b/basis/cairo/ffi/ffi.factor index c4700d2dad..fafc41af26 100644 --- a/basis/cairo/ffi/ffi.factor +++ b/basis/cairo/ffi/ffi.factor @@ -1,6 +1,8 @@ ! Copyright (c) 2007 Sampo Vuori ! Copyright (c) 2008 Matthew Willis ! + + ! Adapted from cairo.h, version 1.5.14 ! License: http://factorcode.org/license.txt @@ -10,8 +12,8 @@ alien.libraries classes.struct ; IN: cairo.ffi << { - { [ os winnt? ] [ "cairo" "libcairo-2.dll" "cdecl" add-library ] } - { [ os macosx? ] [ "cairo" "/opt/local/lib/libcairo.dylib" "cdecl" add-library ] } + { [ os winnt? ] [ "cairo" "libcairo-2.dll" cdecl add-library ] } + { [ os macosx? ] [ "cairo" "/opt/local/lib/libcairo.dylib" cdecl add-library ] } { [ os unix? ] [ ] } } cond >> @@ -38,14 +40,13 @@ TYPEDEF: void* cairo_pattern_t TYPEDEF: void* cairo_destroy_func_t : cairo-destroy-func ( quot -- callback ) - [ void { pointer: void } "cdecl" ] dip alien-callback ; inline + [ void { pointer: void } cdecl ] dip alien-callback ; inline ! See cairo.h for details STRUCT: cairo_user_data_key_t { unused int } ; -TYPEDEF: int cairo_status_t -C-ENUM: +C-ENUM: cairo_status_t CAIRO_STATUS_SUCCESS CAIRO_STATUS_NO_MEMORY CAIRO_STATUS_INVALID_RESTORE @@ -79,11 +80,11 @@ CONSTANT: CAIRO_CONTENT_COLOR_ALPHA HEX: 3000 TYPEDEF: void* cairo_write_func_t : cairo-write-func ( quot -- callback ) - [ cairo_status_t { pointer: void c-string int } "cdecl" ] dip alien-callback ; inline + [ cairo_status_t { pointer: void c-string int } cdecl ] dip alien-callback ; inline TYPEDEF: void* cairo_read_func_t : cairo-read-func ( quot -- callback ) - [ cairo_status_t { pointer: void c-string int } "cdecl" ] dip alien-callback ; inline + [ cairo_status_t { pointer: void c-string int } cdecl ] dip alien-callback ; inline ! Functions for manipulating state objects FUNCTION: cairo_t* @@ -125,8 +126,7 @@ FUNCTION: void cairo_pop_group_to_source ( cairo_t* cr ) ; ! Modify state -TYPEDEF: int cairo_operator_t -C-ENUM: +C-ENUM: cairo_operator_t CAIRO_OPERATOR_CLEAR CAIRO_OPERATOR_SOURCE @@ -163,8 +163,7 @@ cairo_set_source_surface ( cairo_t* cr, cairo_surface_t* surface, double x, doub FUNCTION: void cairo_set_tolerance ( cairo_t* cr, double tolerance ) ; -TYPEDEF: int cairo_antialias_t -C-ENUM: +C-ENUM: cairo_antialias_t CAIRO_ANTIALIAS_DEFAULT CAIRO_ANTIALIAS_NONE CAIRO_ANTIALIAS_GRAY @@ -173,8 +172,7 @@ C-ENUM: FUNCTION: void cairo_set_antialias ( cairo_t* cr, cairo_antialias_t antialias ) ; -TYPEDEF: int cairo_fill_rule_t -C-ENUM: +C-ENUM: cairo_fill_rule_t CAIRO_FILL_RULE_WINDING CAIRO_FILL_RULE_EVEN_ODD ; @@ -184,8 +182,7 @@ cairo_set_fill_rule ( cairo_t* cr, cairo_fill_rule_t fill_rule ) ; FUNCTION: void cairo_set_line_width ( cairo_t* cr, double width ) ; -TYPEDEF: int cairo_line_cap_t -C-ENUM: +C-ENUM: cairo_line_cap_t CAIRO_LINE_CAP_BUTT CAIRO_LINE_CAP_ROUND CAIRO_LINE_CAP_SQUARE ; @@ -193,8 +190,7 @@ C-ENUM: FUNCTION: void cairo_set_line_cap ( cairo_t* cr, cairo_line_cap_t line_cap ) ; -TYPEDEF: int cairo_line_join_t -C-ENUM: +C-ENUM: cairo_line_join_t CAIRO_LINE_JOIN_MITER CAIRO_LINE_JOIN_ROUND CAIRO_LINE_JOIN_BEVEL ; @@ -379,35 +375,30 @@ STRUCT: cairo_font_extents_t { max_x_advance double } { max_y_advance double } ; -TYPEDEF: int cairo_font_slant_t -C-ENUM: +C-ENUM: cairo_font_slant_t CAIRO_FONT_SLANT_NORMAL CAIRO_FONT_SLANT_ITALIC CAIRO_FONT_SLANT_OBLIQUE ; -TYPEDEF: int cairo_font_weight_t -C-ENUM: +C-ENUM: cairo_font_weight_t CAIRO_FONT_WEIGHT_NORMAL CAIRO_FONT_WEIGHT_BOLD ; -TYPEDEF: int cairo_subpixel_order_t -C-ENUM: +C-ENUM: cairo_subpixel_order_t CAIRO_SUBPIXEL_ORDER_DEFAULT CAIRO_SUBPIXEL_ORDER_RGB CAIRO_SUBPIXEL_ORDER_BGR CAIRO_SUBPIXEL_ORDER_VRGB CAIRO_SUBPIXEL_ORDER_VBGR ; -TYPEDEF: int cairo_hint_style_t -C-ENUM: +C-ENUM: cairo_hint_style_t CAIRO_HINT_STYLE_DEFAULT CAIRO_HINT_STYLE_NONE CAIRO_HINT_STYLE_SLIGHT CAIRO_HINT_STYLE_MEDIUM CAIRO_HINT_STYLE_FULL ; -TYPEDEF: int cairo_hint_metrics_t -C-ENUM: +C-ENUM: cairo_hint_metrics_t CAIRO_HINT_METRICS_DEFAULT CAIRO_HINT_METRICS_OFF CAIRO_HINT_METRICS_ON ; @@ -527,8 +518,7 @@ cairo_font_face_get_reference_count ( cairo_font_face_t* font_face ) ; FUNCTION: cairo_status_t cairo_font_face_status ( cairo_font_face_t* font_face ) ; -TYPEDEF: int cairo_font_type_t -C-ENUM: +C-ENUM: cairo_font_type_t CAIRO_FONT_TYPE_TOY CAIRO_FONT_TYPE_FT CAIRO_FONT_TYPE_WIN32 @@ -640,8 +630,7 @@ cairo_get_target ( cairo_t* cr ) ; FUNCTION: cairo_surface_t* cairo_get_group_target ( cairo_t* cr ) ; -TYPEDEF: int cairo_path_data_type_t -C-ENUM: +C-ENUM: cairo_path_data_type_t CAIRO_PATH_MOVE_TO CAIRO_PATH_LINE_TO CAIRO_PATH_CURVE_TO @@ -707,8 +696,7 @@ cairo_surface_get_reference_count ( cairo_surface_t* surface ) ; FUNCTION: cairo_status_t cairo_surface_status ( cairo_surface_t* surface ) ; -TYPEDEF: int cairo_surface_type_t -C-ENUM: +C-ENUM: cairo_surface_type_t CAIRO_SURFACE_TYPE_IMAGE CAIRO_SURFACE_TYPE_PDF CAIRO_SURFACE_TYPE_PS @@ -771,8 +759,7 @@ cairo_surface_show_page ( cairo_surface_t* surface ) ; ! Image-surface functions -TYPEDEF: int cairo_format_t -C-ENUM: +C-ENUM: cairo_format_t CAIRO_FORMAT_ARGB32 CAIRO_FORMAT_RGB24 CAIRO_FORMAT_A8 @@ -844,8 +831,7 @@ cairo_pattern_get_user_data ( cairo_pattern_t* pattern, cairo_user_data_key_t* k FUNCTION: cairo_status_t cairo_pattern_set_user_data ( cairo_pattern_t* pattern, cairo_user_data_key_t* key, void* user_data, cairo_destroy_func_t destroy ) ; -TYPEDEF: int cairo_pattern_type_t -C-ENUM: +C-ENUM: cairo_pattern_type_t CAIRO_PATTERN_TYPE_SOLID CAIRO_PATTERN_TYPE_SURFACE CAIRO_PATTERN_TYPE_LINEAR @@ -866,8 +852,7 @@ cairo_pattern_set_matrix ( cairo_pattern_t* pattern, cairo_matrix_t* matrix ) ; FUNCTION: void cairo_pattern_get_matrix ( cairo_pattern_t* pattern, cairo_matrix_t* matrix ) ; -TYPEDEF: int cairo_extend_t -C-ENUM: +C-ENUM: cairo_extend_t CAIRO_EXTEND_NONE CAIRO_EXTEND_REPEAT CAIRO_EXTEND_REFLECT @@ -879,8 +864,7 @@ cairo_pattern_set_extend ( cairo_pattern_t* pattern, cairo_extend_t extend ) ; FUNCTION: cairo_extend_t cairo_pattern_get_extend ( cairo_pattern_t* pattern ) ; -TYPEDEF: int cairo_filter_t -C-ENUM: +C-ENUM: cairo_filter_t CAIRO_FILTER_FAST CAIRO_FILTER_GOOD CAIRO_FILTER_BEST diff --git a/basis/cocoa/application/application.factor b/basis/cocoa/application/application.factor index df56ce5c4c..6768e1471d 100644 --- a/basis/cocoa/application/application.factor +++ b/basis/cocoa/application/application.factor @@ -8,7 +8,7 @@ IN: cocoa.application : ( str -- alien ) -> autorelease ; -C-ENUM: +C-ENUM: f NSApplicationDelegateReplySuccess NSApplicationDelegateReplyCancel NSApplicationDelegateReplyFailure ; diff --git a/basis/cocoa/subclassing/subclassing.factor b/basis/cocoa/subclassing/subclassing.factor index e4db56221f..1accb1e8dc 100644 --- a/basis/cocoa/subclassing/subclassing.factor +++ b/basis/cocoa/subclassing/subclassing.factor @@ -40,7 +40,7 @@ IN: cocoa.subclassing : prepare-method ( ret types quot -- type imp ) [ [ encode-types ] 2keep ] dip - '[ _ _ "cdecl" _ alien-callback ] + '[ _ _ cdecl _ alien-callback ] (( -- callback )) define-temp ; : prepare-methods ( methods -- methods ) diff --git a/basis/compiler/alien/alien.factor b/basis/compiler/alien/alien.factor index 7426d7e940..63df85be05 100644 --- a/basis/compiler/alien/alien.factor +++ b/basis/compiler/alien/alien.factor @@ -9,7 +9,7 @@ IN: compiler.alien : alien-parameters ( params -- seq ) dup parameters>> - swap return>> large-struct? [ void* prefix ] when ; + swap return>> large-struct? [ struct-return-pointer-type prefix ] when ; : alien-return ( params -- type ) return>> dup large-struct? [ drop void ] when ; diff --git a/basis/compiler/cfg/builder/builder-tests.factor b/basis/compiler/cfg/builder/builder-tests.factor index 7f1b6aa6f2..b2c05edf73 100644 --- a/basis/compiler/cfg/builder/builder-tests.factor +++ b/basis/compiler/cfg/builder/builder-tests.factor @@ -68,8 +68,8 @@ IN: compiler.cfg.builder.tests [ [ dup ] loop ] [ [ 2 ] [ 3 throw ] if 4 ] [ int f "malloc" { int } alien-invoke ] - [ int { int } "cdecl" alien-indirect ] - [ int { int } "cdecl" [ ] alien-callback ] + [ int { int } cdecl alien-indirect ] + [ int { int } cdecl [ ] alien-callback ] [ swap - + * ] [ swap slot ] [ blahblah ] diff --git a/basis/compiler/codegen/codegen.factor b/basis/compiler/codegen/codegen.factor index 4208fec0a7..ffccf9f118 100755 --- a/basis/compiler/codegen/codegen.factor +++ b/basis/compiler/codegen/codegen.factor @@ -300,12 +300,12 @@ M: float-rep next-fastcall-param M: double-rep next-fastcall-param float-regs inc [ ?dummy-stack-params ] [ ?dummy-int-params ] bi ; -GENERIC: reg-class-full? ( reg-class -- ? ) +GENERIC# reg-class-full? 1 ( reg-class abi -- ? ) -M: stack-params reg-class-full? drop t ; +M: stack-params reg-class-full? 2drop t ; M: reg-class reg-class-full? - [ get ] [ param-regs length ] bi >= ; + [ get ] swap '[ _ param-regs length ] bi >= ; : alloc-stack-param ( rep -- n reg-class rep ) stack-params get @@ -315,13 +315,22 @@ M: reg-class reg-class-full? : alloc-fastcall-param ( rep -- n reg-class rep ) [ [ reg-class-of get ] [ reg-class-of ] [ next-fastcall-param ] tri ] keep ; -: alloc-parameter ( parameter -- reg rep ) - c-type-rep dup reg-class-of reg-class-full? +:: alloc-parameter ( parameter abi -- reg rep ) + parameter c-type-rep dup reg-class-of abi reg-class-full? [ alloc-stack-param ] [ alloc-fastcall-param ] if - [ param-reg ] dip ; + [ abi param-reg ] dip ; + +SYMBOL: (stack-value) +<< void* c-type clone \ (stack-value) define-primitive-type +stack-params \ (stack-value) c-type (>>rep) >> + +: ((flatten-type)) ( type to-type -- seq ) + [ stack-size cell align cell /i ] dip c-type ; inline : (flatten-int-type) ( type -- seq ) - stack-size cell align cell /i void* c-type ; + void* ((flatten-type)) ; +: (flatten-stack-type) ( type -- seq ) + (stack-value) ((flatten-type)) ; GENERIC: flatten-value-type ( type -- types ) @@ -355,8 +364,8 @@ M: c-type-name flatten-value-type c-type flatten-value-type ; #! Moves values from C stack to registers (if word is #! %load-param-reg) and registers to C stack (if word is #! %save-param-reg). - [ alien-parameters flatten-value-types ] - [ '[ alloc-parameter _ execute ] ] + [ [ alien-parameters flatten-value-types ] [ abi>> ] bi ] + [ '[ _ alloc-parameter _ execute ] ] bi* each-parameter ; inline : reverse-each-parameter ( parameters quot -- ) @@ -412,7 +421,7 @@ M: array dlsym-valid? '[ _ dlsym ] any? ; 3array ; : alien-invoke-dlsym ( params -- symbols dll ) - [ dup abi>> "stdcall" = [ stdcall-mangle ] [ function>> ] if ] + [ dup abi>> stdcall = [ stdcall-mangle ] [ function>> ] if ] [ library>> load-library ] bi 2dup check-dlsym ; diff --git a/basis/compiler/tests/alien.factor b/basis/compiler/tests/alien.factor index ceac1b094c..8735d7cae4 100755 --- a/basis/compiler/tests/alien.factor +++ b/basis/compiler/tests/alien.factor @@ -1,10 +1,11 @@ USING: accessors alien alien.c-types alien.libraries alien.syntax arrays classes.struct combinators -compiler continuations effects io io.backend io.pathnames -io.streams.string kernel math memory namespaces -namespaces.private parser quotations sequences -specialized-arrays stack-checker stack-checker.errors -system threads tools.test words alien.complex concurrency.promises ; +compiler continuations effects generalizations io +io.backend io.pathnames io.streams.string kernel +math memory namespaces namespaces.private parser +quotations sequences specialized-arrays stack-checker +stack-checker.errors system threads tools.test words +alien.complex concurrency.promises ; FROM: alien.c-types => float short ; SPECIALIZED-ARRAY: float SPECIALIZED-ARRAY: char @@ -19,9 +20,11 @@ IN: compiler.tests.alien { [ os unix? ] [ "libfactor-ffi-test.so" ] } } cond append-path ; -"f-cdecl" libfactor-ffi-tests-path "cdecl" add-library +"f-cdecl" libfactor-ffi-tests-path cdecl add-library -"f-stdcall" libfactor-ffi-tests-path "stdcall" add-library +"f-stdcall" libfactor-ffi-tests-path stdcall add-library + +"f-fastcall" libfactor-ffi-tests-path fastcall add-library >> LIBRARY: f-cdecl @@ -90,7 +93,7 @@ FUNCTION: TINY ffi_test_17 int x ; [ [ alien-indirect ] infer ] [ inference-error? ] must-fail-with : indirect-test-1 ( ptr -- result ) - int { } "cdecl" alien-indirect ; + int { } cdecl alien-indirect ; { 1 1 } [ indirect-test-1 ] must-infer-as @@ -99,7 +102,7 @@ FUNCTION: TINY ffi_test_17 int x ; [ 3 ] [ &: ffi_test_1 indirect-test-1 ] unit-test : indirect-test-1' ( ptr -- ) - int { } "cdecl" alien-indirect drop ; + int { } cdecl alien-indirect drop ; { 1 0 } [ indirect-test-1' ] must-infer-as @@ -108,7 +111,7 @@ FUNCTION: TINY ffi_test_17 int x ; [ -1 indirect-test-1 ] must-fail : indirect-test-2 ( x y ptr -- result ) - int { int int } "cdecl" alien-indirect gc ; + int { int int } cdecl alien-indirect gc ; { 3 1 } [ indirect-test-2 ] must-infer-as @@ -117,11 +120,11 @@ FUNCTION: TINY ffi_test_17 int x ; unit-test : indirect-test-3 ( a b c d ptr -- result ) - int { int int int int } "stdcall" alien-indirect + int { int int int int } stdcall alien-indirect gc ; [ f ] [ "f-stdcall" load-library f = ] unit-test -[ "stdcall" ] [ "f-stdcall" library abi>> ] unit-test +[ stdcall ] [ "f-stdcall" library abi>> ] unit-test : ffi_test_18 ( w x y z -- int ) int "f-stdcall" "ffi_test_18" { int int int int } @@ -137,6 +140,14 @@ unit-test 11 6 -7 ffi_test_19 [ x>> ] [ y>> ] [ z>> ] tri ] unit-test +: multi_ffi_test_18 ( w x y z w' x' y' z' -- int int ) + [ int "f-stdcall" "ffi_test_18" { int int int int } alien-invoke ] + 4 ndip + int "f-stdcall" "ffi_test_18" { int int int int } alien-invoke + gc ; + +[ 25 85 ] [ 2 3 4 5 6 7 8 9 multi_ffi_test_18 ] unit-test + FUNCTION: double ffi_test_6 float x float y ; [ 6.0 ] [ 3.0 2.0 ffi_test_6 ] unit-test [ "a" "b" ffi_test_6 ] must-fail @@ -314,21 +325,21 @@ FUNCTION: ulonglong ffi_test_38 ( ulonglong x, ulonglong y ) ; ! Test callbacks -: callback-1 ( -- callback ) void { } "cdecl" [ ] alien-callback ; +: callback-1 ( -- callback ) void { } cdecl [ ] alien-callback ; [ 0 1 ] [ [ callback-1 ] infer [ in>> length ] [ out>> length ] bi ] unit-test [ t ] [ callback-1 alien? ] unit-test -: callback_test_1 ( ptr -- ) void { } "cdecl" alien-indirect ; +: callback_test_1 ( ptr -- ) void { } cdecl alien-indirect ; [ ] [ callback-1 callback_test_1 ] unit-test -: callback-2 ( -- callback ) void { } "cdecl" [ [ 5 throw ] ignore-errors ] alien-callback ; +: callback-2 ( -- callback ) void { } cdecl [ [ 5 throw ] ignore-errors ] alien-callback ; [ ] [ callback-2 callback_test_1 ] unit-test -: callback-3 ( -- callback ) void { } "cdecl" [ 5 "x" set ] alien-callback ; +: callback-3 ( -- callback ) void { } cdecl [ 5 "x" set ] alien-callback ; [ t 3 5 ] [ [ @@ -340,38 +351,38 @@ FUNCTION: ulonglong ffi_test_38 ( ulonglong x, ulonglong y ) ; ] unit-test : callback-5 ( -- callback ) - void { } "cdecl" [ gc ] alien-callback ; + void { } cdecl [ gc ] alien-callback ; [ "testing" ] [ "testing" callback-5 callback_test_1 ] unit-test : callback-5b ( -- callback ) - void { } "cdecl" [ compact-gc ] alien-callback ; + void { } cdecl [ compact-gc ] alien-callback ; [ "testing" ] [ "testing" callback-5b callback_test_1 ] unit-test : callback-6 ( -- callback ) - void { } "cdecl" [ [ continue ] callcc0 ] alien-callback ; + void { } cdecl [ [ continue ] callcc0 ] alien-callback ; [ 1 2 3 ] [ callback-6 callback_test_1 1 2 3 ] unit-test : callback-7 ( -- callback ) - void { } "cdecl" [ 1000000 sleep ] alien-callback ; + void { } cdecl [ 1000000 sleep ] alien-callback ; [ 1 2 3 ] [ callback-7 callback_test_1 1 2 3 ] unit-test [ f ] [ namespace global eq? ] unit-test : callback-8 ( -- callback ) - void { } "cdecl" [ [ ] in-thread yield ] alien-callback ; + void { } cdecl [ [ ] in-thread yield ] alien-callback ; [ ] [ callback-8 callback_test_1 ] unit-test : callback-9 ( -- callback ) - int { int int int } "cdecl" [ + int { int int int } cdecl [ + + 1 + ] alien-callback ; @@ -429,12 +440,12 @@ STRUCT: double-rect } cleave ; : double-rect-callback ( -- alien ) - void { void* void* double-rect } "cdecl" + void { void* void* double-rect } cdecl [ "example" set-global 2drop ] alien-callback ; : double-rect-test ( arg callback -- arg' ) [ f f ] 2dip - void { void* void* double-rect } "cdecl" alien-indirect + void { void* void* double-rect } cdecl alien-indirect "example" get-global ; [ 1.0 2.0 3.0 4.0 ] @@ -455,7 +466,7 @@ FUNCTION: test_struct_14 ffi_test_40 ( double x1, double x2 ) ; ] unit-test : callback-10 ( -- callback ) - test_struct_14 { double double } "cdecl" + test_struct_14 { double double } cdecl [ test_struct_14 swap >>x2 @@ -463,7 +474,7 @@ FUNCTION: test_struct_14 ffi_test_40 ( double x1, double x2 ) ; ] alien-callback ; : callback-10-test ( x1 x2 callback -- result ) - test_struct_14 { double double } "cdecl" alien-indirect ; + test_struct_14 { double double } cdecl alien-indirect ; [ 1.0 2.0 ] [ 1.0 2.0 callback-10 callback-10-test @@ -478,7 +489,7 @@ FUNCTION: test-struct-12 ffi_test_41 ( int a, double x ) ; ] unit-test : callback-11 ( -- callback ) - test-struct-12 { int double } "cdecl" + test-struct-12 { int double } cdecl [ test-struct-12 swap >>x @@ -486,7 +497,7 @@ FUNCTION: test-struct-12 ffi_test_41 ( int a, double x ) ; ] alien-callback ; : callback-11-test ( x1 x2 callback -- result ) - test-struct-12 { int double } "cdecl" alien-indirect ; + test-struct-12 { int double } cdecl alien-indirect ; [ 1 2.0 ] [ 1 2.0 callback-11 callback-11-test @@ -502,7 +513,7 @@ FUNCTION: test_struct_15 ffi_test_42 ( float x, float y ) ; [ 1.0 2.0 ] [ 1.0 2.0 ffi_test_42 [ x>> ] [ y>> ] bi ] unit-test : callback-12 ( -- callback ) - test_struct_15 { float float } "cdecl" + test_struct_15 { float float } cdecl [ test_struct_15 swap >>y @@ -510,7 +521,7 @@ FUNCTION: test_struct_15 ffi_test_42 ( float x, float y ) ; ] alien-callback ; : callback-12-test ( x1 x2 callback -- result ) - test_struct_15 { float float } "cdecl" alien-indirect ; + test_struct_15 { float float } cdecl alien-indirect ; [ 1.0 2.0 ] [ 1.0 2.0 callback-12 callback-12-test [ x>> ] [ y>> ] bi @@ -525,7 +536,7 @@ FUNCTION: test_struct_16 ffi_test_43 ( float x, int a ) ; [ 1.0 2 ] [ 1.0 2 ffi_test_43 [ x>> ] [ a>> ] bi ] unit-test : callback-13 ( -- callback ) - test_struct_16 { float int } "cdecl" + test_struct_16 { float int } cdecl [ test_struct_16 swap >>a @@ -533,7 +544,7 @@ FUNCTION: test_struct_16 ffi_test_43 ( float x, int a ) ; ] alien-callback ; : callback-13-test ( x1 x2 callback -- result ) - test_struct_16 { float int } "cdecl" alien-indirect ; + test_struct_16 { float int } cdecl alien-indirect ; [ 1.0 2 ] [ 1.0 2 callback-13 callback-13-test @@ -584,13 +595,13 @@ FUNCTION: short ffi_test_48 ( bool-field-test x ) ; ! Test interaction between threads and callbacks : thread-callback-1 ( -- callback ) - int { } "cdecl" [ yield 100 ] alien-callback ; + int { } cdecl [ yield 100 ] alien-callback ; : thread-callback-2 ( -- callback ) - int { } "cdecl" [ yield 200 ] alien-callback ; + int { } cdecl [ yield 200 ] alien-callback ; : thread-callback-invoker ( callback -- n ) - int { } "cdecl" alien-indirect ; + int { } cdecl alien-indirect ; "p" set [ thread-callback-1 thread-callback-invoker "p" get fulfill ] in-thread @@ -603,6 +614,98 @@ FUNCTION: void this_does_not_exist ( ) ; [ this_does_not_exist ] [ { "kernel-error" 9 f f } = ] must-fail-with ! More alien-assembly tests are in cpu.* vocabs -: assembly-test-1 ( -- ) void { } "cdecl" [ ] alien-assembly ; +: assembly-test-1 ( -- ) void { } cdecl [ ] alien-assembly ; [ ] [ assembly-test-1 ] unit-test + +[ f ] [ "f-fastcall" load-library f = ] unit-test +[ fastcall ] [ "f-fastcall" library abi>> ] unit-test + +: ffi_test_49 ( x -- int ) + int "f-fastcall" "ffi_test_49" { int } + alien-invoke gc ; +: ffi_test_50 ( x y -- int ) + int "f-fastcall" "ffi_test_50" { int int } + alien-invoke gc ; +: ffi_test_51 ( x y z -- int ) + int "f-fastcall" "ffi_test_51" { int int int } + alien-invoke gc ; +: multi_ffi_test_51 ( x y z x' y' z' -- int int ) + [ int "f-fastcall" "ffi_test_51" { int int int } alien-invoke ] + 3dip + int "f-fastcall" "ffi_test_51" { int int int } alien-invoke gc ; + +[ 4 ] [ 3 ffi_test_49 ] unit-test +[ 8 ] [ 3 4 ffi_test_50 ] unit-test +[ 13 ] [ 3 4 5 ffi_test_51 ] unit-test +[ 13 22 ] [ 3 4 5 6 7 8 multi_ffi_test_51 ] unit-test + +: ffi_test_52 ( x y z -- int ) + int "f-fastcall" "ffi_test_52" { int float int } + alien-invoke gc ; +: ffi_test_53 ( x y z w -- int ) + int "f-fastcall" "ffi_test_53" { int float int int } + alien-invoke gc ; +: ffi_test_57 ( x y -- test-struct-11 ) + test-struct-11 "f-fastcall" "ffi_test_57" { int int } + alien-invoke gc ; +: ffi_test_58 ( x y z -- test-struct-11 ) + test-struct-11 "f-fastcall" "ffi_test_58" { int int int } + alien-invoke gc ; + +[ 13 ] [ 3 4.0 5 ffi_test_52 ] unit-test +[ 19 ] [ 3 4.0 5 6 ffi_test_53 ] unit-test +[ S{ test-struct-11 f 7 -1 } ] [ 3 4 ffi_test_57 ] unit-test +[ S{ test-struct-11 f 7 -3 } ] [ 3 4 7 ffi_test_58 ] unit-test + +: fastcall-ii-indirect ( x y ptr -- result ) + int { int int } fastcall alien-indirect ; +: fastcall-iii-indirect ( x y z ptr -- result ) + int { int int int } fastcall alien-indirect ; +: fastcall-ifi-indirect ( x y z ptr -- result ) + int { int float int } fastcall alien-indirect ; +: fastcall-ifii-indirect ( x y z w ptr -- result ) + int { int float int int } fastcall alien-indirect ; +: fastcall-struct-return-ii-indirect ( x y ptr -- result ) + test-struct-11 { int int } fastcall alien-indirect ; +: fastcall-struct-return-iii-indirect ( x y z ptr -- result ) + test-struct-11 { int int int } fastcall alien-indirect ; + +[ 8 ] [ 3 4 &: ffi_test_50 fastcall-ii-indirect ] unit-test +[ 13 ] [ 3 4 5 &: ffi_test_51 fastcall-iii-indirect ] unit-test +[ 13 ] [ 3 4.0 5 &: ffi_test_52 fastcall-ifi-indirect ] unit-test +[ 19 ] [ 3 4.0 5 6 &: ffi_test_53 fastcall-ifii-indirect ] unit-test + +[ S{ test-struct-11 f 7 -1 } ] +[ 3 4 &: ffi_test_57 fastcall-struct-return-ii-indirect ] unit-test + +[ S{ test-struct-11 f 7 -3 } ] +[ 3 4 7 &: ffi_test_58 fastcall-struct-return-iii-indirect ] unit-test + +: fastcall-ii-callback ( -- ptr ) + int { int int } fastcall [ + 1 + ] alien-callback ; +: fastcall-iii-callback ( -- ptr ) + int { int int int } fastcall [ + + 1 + ] alien-callback ; +: fastcall-ifi-callback ( -- ptr ) + int { int float int } fastcall + [ [ >integer ] dip + + 1 + ] alien-callback ; +: fastcall-ifii-callback ( -- ptr ) + int { int float int int } fastcall + [ [ >integer ] 2dip + + + 1 + ] alien-callback ; +: fastcall-struct-return-ii-callback ( -- ptr ) + test-struct-11 { int int } fastcall + [ [ + ] [ - ] 2bi test-struct-11 ] alien-callback ; +: fastcall-struct-return-iii-callback ( -- ptr ) + test-struct-11 { int int int } fastcall + [ [ drop + ] [ - nip ] 3bi test-struct-11 ] alien-callback ; + +[ 8 ] [ 3 4 fastcall-ii-callback fastcall-ii-indirect ] unit-test +[ 13 ] [ 3 4 5 fastcall-iii-callback fastcall-iii-indirect ] unit-test +[ 13 ] [ 3 4.0 5 fastcall-ifi-callback fastcall-ifi-indirect ] unit-test +[ 19 ] [ 3 4.0 5 6 fastcall-ifii-callback fastcall-ifii-indirect ] unit-test + +[ S{ test-struct-11 f 7 -1 } ] +[ 3 4 fastcall-struct-return-ii-callback fastcall-struct-return-ii-indirect ] unit-test + +[ S{ test-struct-11 f 7 -3 } ] +[ 3 4 7 fastcall-struct-return-iii-callback fastcall-struct-return-iii-indirect ] unit-test diff --git a/basis/compiler/tests/redefine24.factor b/basis/compiler/tests/redefine24.factor index 391102102e..90c4e9943d 100644 --- a/basis/compiler/tests/redefine24.factor +++ b/basis/compiler/tests/redefine24.factor @@ -7,12 +7,12 @@ TYPEDEF: alien.c-types:int type-1 TYPEDEF: alien.c-types:int type-3 : callback ( -- ptr ) - type-3 { type-1 type-1 } "cdecl" [ + >integer ] alien-callback ; + type-3 { type-1 type-1 } cdecl [ + >integer ] alien-callback ; TYPEDEF: alien.c-types:float type-2 : indirect ( x y ptr -- z ) - type-3 { type-2 type-2 } "cdecl" alien-indirect ; + type-3 { type-2 type-2 } cdecl alien-indirect ; [ ] [ "USING: alien.c-types alien.syntax ; diff --git a/basis/compression/zlib/ffi/ffi.factor b/basis/compression/zlib/ffi/ffi.factor index 553b55cf6e..aede6d5621 100644 --- a/basis/compression/zlib/ffi/ffi.factor +++ b/basis/compression/zlib/ffi/ffi.factor @@ -8,7 +8,7 @@ IN: compression.zlib.ffi { [ os winnt? ] [ "zlib1.dll" ] } { [ os macosx? ] [ "libz.dylib" ] } { [ os unix? ] [ "libz.so" ] } -} cond "cdecl" add-library >> +} cond cdecl add-library >> LIBRARY: zlib diff --git a/basis/core-foundation/run-loop/run-loop.factor b/basis/core-foundation/run-loop/run-loop.factor index 14d701ba17..793efefbe8 100644 --- a/basis/core-foundation/run-loop/run-loop.factor +++ b/basis/core-foundation/run-loop/run-loop.factor @@ -120,7 +120,7 @@ PRIVATE> [ fds>> [ enable-all-callbacks ] each ] bi ; : timer-callback ( -- callback ) - void { CFRunLoopTimerRef void* } "cdecl" + void { CFRunLoopTimerRef void* } cdecl [ 2drop reset-run-loop yield ] alien-callback ; : init-thread-timer ( -- ) diff --git a/basis/core-graphics/core-graphics.factor b/basis/core-graphics/core-graphics.factor index 1b7693da14..92925f5d64 100644 --- a/basis/core-graphics/core-graphics.factor +++ b/basis/core-graphics/core-graphics.factor @@ -6,8 +6,7 @@ images images.memory core-graphics.types core-foundation.utilities opengl.gl literals ; IN: core-graphics -! CGImageAlphaInfo -C-ENUM: +C-ENUM: CGImageAlphaInfo kCGImageAlphaNone kCGImageAlphaPremultipliedLast kCGImageAlphaPremultipliedFirst diff --git a/basis/cpu/architecture/architecture.factor b/basis/cpu/architecture/architecture.factor index ad1a4be2eb..1aaf1bf2ea 100644 --- a/basis/cpu/architecture/architecture.factor +++ b/basis/cpu/architecture/architecture.factor @@ -486,15 +486,15 @@ HOOK: %loop-entry cpu ( -- ) GENERIC: return-reg ( reg-class -- reg ) ! Sequence of registers used for parameter passing in class -GENERIC: param-regs ( reg-class -- regs ) +GENERIC# param-regs 1 ( reg-class abi -- regs ) -M: stack-params param-regs drop f ; +M: stack-params param-regs 2drop f ; -GENERIC: param-reg ( n reg-class -- reg ) +GENERIC# param-reg 1 ( n reg-class abi -- reg ) M: reg-class param-reg param-regs nth ; -M: stack-params param-reg drop ; +M: stack-params param-reg 2drop ; ! Is this integer small enough to be an immediate operand for ! %add-imm, %sub-imm, and %mul-imm? @@ -504,6 +504,9 @@ HOOK: immediate-arithmetic? cpu ( n -- ? ) ! %and-imm, %or-imm, and %xor-imm? HOOK: immediate-bitwise? cpu ( n -- ? ) +! What c-type describes the implicit struct return pointer for large structs? +HOOK: struct-return-pointer-type cpu ( -- c-type ) + ! Is this structure small enough to be returned in registers? HOOK: return-struct-in-registers? cpu ( c-type -- ? ) @@ -592,6 +595,6 @@ HOOK: %end-callback cpu ( -- ) HOOK: %end-callback-value cpu ( c-type -- ) -HOOK: callback-return-rewind cpu ( params -- n ) +HOOK: stack-cleanup cpu ( params -- n ) -M: object callback-return-rewind drop 0 ; +M: object stack-cleanup drop 0 ; diff --git a/basis/cpu/ppc/linux/linux.factor b/basis/cpu/ppc/linux/linux.factor index 5cfa1391c4..0a1e8477e8 100644 --- a/basis/cpu/ppc/linux/linux.factor +++ b/basis/cpu/ppc/linux/linux.factor @@ -13,7 +13,7 @@ M: linux reserved-area-size 2 cells ; M: linux lr-save 1 cells ; -M: float-regs param-regs drop { 1 2 3 4 5 6 7 8 } ; +M: float-regs param-regs 2drop { 1 2 3 4 5 6 7 8 } ; M: ppc value-struct? drop f ; diff --git a/basis/cpu/ppc/macosx/macosx.factor b/basis/cpu/ppc/macosx/macosx.factor index 152a3aa720..49e9768cf6 100644 --- a/basis/cpu/ppc/macosx/macosx.factor +++ b/basis/cpu/ppc/macosx/macosx.factor @@ -8,7 +8,7 @@ M: macosx reserved-area-size 6 cells ; M: macosx lr-save 2 cells ; -M: float-regs param-regs drop { 1 2 3 4 5 6 7 8 9 10 11 12 13 } ; +M: float-regs param-regs 2drop { 1 2 3 4 5 6 7 8 9 10 11 12 13 } ; M: ppc value-struct? drop t ; diff --git a/basis/cpu/ppc/ppc.factor b/basis/cpu/ppc/ppc.factor index cf8a832386..551693d5c7 100644 --- a/basis/cpu/ppc/ppc.factor +++ b/basis/cpu/ppc/ppc.factor @@ -235,7 +235,7 @@ M: spill-slot float-function-param* [ 1 ] dip n>> spill@ LFD ; M: integer float-function-param* FMR ; : float-function-param ( i src -- ) - [ float-regs param-regs nth ] dip float-function-param* ; + [ float-regs cdecl param-regs nth ] dip float-function-param* ; : float-function-return ( reg -- ) float-regs return-reg double-rep %copy ; @@ -584,7 +584,7 @@ M: ppc %reload ( dst rep src -- ) M: ppc %loop-entry ; M: int-regs return-reg drop 3 ; -M: int-regs param-regs drop { 3 4 5 6 7 8 9 10 } ; +M: int-regs param-regs 2drop { 3 4 5 6 7 8 9 10 } ; M: float-regs return-reg drop 1 ; M:: ppc %save-param-reg ( stack reg rep -- ) @@ -644,7 +644,7 @@ M:: ppc %box ( n rep func -- ) ! If the source is a stack location, load it into freg #0. ! If the source is f, then we assume the value is already in ! freg #0. - n [ 0 rep reg-class-of param-reg rep %load-param-reg ] when* + n [ 0 rep reg-class-of cdecl param-reg rep %load-param-reg ] when* rep double-rep? 5 4 ? %load-vm-addr func f %alien-invoke ; @@ -701,6 +701,8 @@ M: ppc immediate-arithmetic? ( n -- ? ) -32768 32767 between? ; M: ppc immediate-bitwise? ( n -- ? ) 0 65535 between? ; +M: ppc struct-return-pointer-type void* ; + M: ppc return-struct-in-registers? ( c-type -- ? ) c-type return-in-registers?>> ; diff --git a/basis/cpu/x86/32/32-tests.factor b/basis/cpu/x86/32/32-tests.factor index bc07e3a25b..375374806f 100644 --- a/basis/cpu/x86/32/32-tests.factor +++ b/basis/cpu/x86/32/32-tests.factor @@ -2,6 +2,6 @@ IN: cpu.x86.32.tests USING: alien alien.c-types tools.test cpu.x86.assembler cpu.x86.assembler.operands ; -: assembly-test-1 ( -- x ) int { } "cdecl" [ EAX 3 MOV ] alien-assembly ; +: assembly-test-1 ( -- x ) int { } cdecl [ EAX 3 MOV ] alien-assembly ; [ 3 ] [ assembly-test-1 ] unit-test diff --git a/basis/cpu/x86/32/32.factor b/basis/cpu/x86/32/32.factor index 97f0cfb668..0127d55997 100755 --- a/basis/cpu/x86/32/32.factor +++ b/basis/cpu/x86/32/32.factor @@ -1,9 +1,9 @@ ! Copyright (C) 2005, 2010 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. -USING: locals alien.c-types alien.libraries alien.syntax arrays -kernel fry math namespaces sequences system layouts io -vocabs.loader accessors init combinators command-line make -compiler compiler.units compiler.constants compiler.alien +USING: locals alien alien.c-types alien.libraries alien.syntax +arrays kernel fry math namespaces sequences system layouts io +vocabs.loader accessors init classes.struct combinators command-line +make compiler compiler.units compiler.constants compiler.alien compiler.codegen compiler.codegen.fixup compiler.cfg.instructions compiler.cfg.builder compiler.cfg.intrinsics compiler.cfg.stack-frame @@ -67,9 +67,9 @@ M:: x86.32 %dispatch ( src temp -- ) [ align-code ] bi ; -M: x86.32 pic-tail-reg EBX ; +M: x86.32 pic-tail-reg EDX ; -M: x86.32 reserved-stack-space 4 cells ; +M: x86.32 reserved-stack-space 0 ; M: x86.32 %alien-invoke 0 CALL rc-relative rel-dlsym ; @@ -86,14 +86,24 @@ M: x86.32 return-struct-in-registers? ( c-type -- ? ) : struct-return@ ( n -- operand ) [ next-stack@ ] [ stack-frame get params>> local@ ] if* ; -! On x86, parameters are never passed in registers. +! On x86, parameters are usually never passed in registers, except with Microsoft's +! "thiscall" and "fastcall" abis M: int-regs return-reg drop EAX ; -M: int-regs param-regs drop { } ; -M: float-regs param-regs drop { } ; +M: float-regs param-regs 2drop { } ; + +M: int-regs param-regs + nip { + { thiscall [ { ECX } ] } + { fastcall [ { ECX EDX } ] } + [ drop { } ] + } case ; GENERIC: load-return-reg ( src rep -- ) GENERIC: store-return-reg ( dst rep -- ) +M: stack-params load-return-reg drop EAX swap MOV ; +M: stack-params store-return-reg drop EAX MOV ; + M: int-rep load-return-reg drop EAX swap MOV ; M: int-rep store-return-reg drop EAX MOV ; @@ -111,19 +121,23 @@ M: x86.32 %prologue ( n -- ) M: x86.32 %prepare-jump pic-tail-reg 0 MOV xt-tail-pic-offset rc-absolute-cell rel-here ; -M: x86.32 %load-param-reg - stack-params assert= - [ [ EAX ] dip local@ MOV ] dip - stack@ EAX MOV ; +M: stack-params copy-register* + drop + { + { [ dup integer? ] [ EAX swap next-stack@ MOV EAX MOV ] } + { [ over integer? ] [ EAX swap MOV param@ EAX MOV ] } + } cond ; -M: x86.32 %save-param-reg 3drop ; +M: x86.32 %save-param-reg [ local@ ] 2dip %copy ; + +M: x86.32 %load-param-reg [ swap local@ ] dip %copy ; : (%box) ( n rep -- ) #! If n is f, push the return register onto the stack; we #! are boxing a return value of a C function. If n is an #! integer, push [ESP+n] on the stack; we are boxing a #! parameter being passed to a callback from C. - over [ [ next-stack@ ] dip load-return-reg ] [ 2drop ] if ; + over [ [ local@ ] dip load-return-reg ] [ 2drop ] if ; M:: x86.32 %box ( n rep func -- ) n rep (%box) @@ -295,27 +309,36 @@ M:: x86.32 %binary-float-function ( dst src1 src2 func -- ) func "libm" load-library %alien-invoke dst float-function-return ; -: stdcall? ( params -- ? ) - abi>> "stdcall" = ; - : funny-large-struct-return? ( params -- ? ) #! MINGW ABI incompatibility disaster [ return>> large-struct? ] - [ abi>> "mingw" = os windows? not or ] + [ abi>> mingw = os windows? not or ] bi and ; -M: x86.32 %cleanup ( params -- ) - #! a) If we just called an stdcall function in Windows, it - #! cleaned up the stack frame for us. But we don't want that - #! so we 'undo' the cleanup since we do that in %epilogue. - #! b) If we just called a function returning a struct, we - #! have to fix ESP. +: callee-cleanup? ( abi -- ? ) + { stdcall fastcall thiscall } member? ; + +: stack-arg-size ( params -- n ) + dup abi>> '[ + alien-parameters flatten-value-types + [ _ alloc-parameter 2drop ] each + stack-params get + ] with-param-regs ; + +M: x86.32 stack-cleanup ( params -- n ) + #! a) Functions which are stdcall/fastcall/thiscall have to + #! clean up the caller's stack frame. + #! b) Functions returning large structs on MINGW have to + #! fix ESP. { - { [ dup stdcall? ] [ drop ESP stack-frame get params>> SUB ] } - { [ dup funny-large-struct-return? ] [ drop EAX PUSH ] } - [ drop ] + { [ dup abi>> callee-cleanup? ] [ stack-arg-size ] } + { [ dup funny-large-struct-return? ] [ drop 4 ] } + [ drop 0 ] } cond ; +M: x86.32 %cleanup ( params -- ) + stack-cleanup [ ESP swap SUB ] unless-zero ; + M:: x86.32 %call-gc ( gc-root-count temp -- ) temp gc-root-base special@ LEA 8 save-vm-ptr @@ -329,18 +352,13 @@ M: x86.32 dummy-int-params? f ; M: x86.32 dummy-fp-params? f ; -M: x86.32 callback-return-rewind ( params -- n ) - #! a) If the callback is stdcall, we have to clean up the - #! caller's stack frame. - #! b) If the callback is returning a large struct, we have - #! to fix ESP. - { - { [ dup stdcall? ] [ [ params>> ] [ return>> ] bi + ] } - { [ dup funny-large-struct-return? ] [ drop 4 ] } - [ drop 0 ] - } cond ; - ! Dreadful -M: object flatten-value-type (flatten-int-type) ; +M: object flatten-value-type (flatten-stack-type) ; +M: struct-c-type flatten-value-type (flatten-stack-type) ; +M: long-long-type flatten-value-type (flatten-stack-type) ; +M: c-type flatten-value-type + dup rep>> int-rep? [ (flatten-int-type) ] [ (flatten-stack-type) ] if ; + +M: x86.32 struct-return-pointer-type (stack-value) ; check-sse diff --git a/basis/cpu/x86/32/bootstrap.factor b/basis/cpu/x86/32/bootstrap.factor index b2cd241df1..4eb8335b67 100644 --- a/basis/cpu/x86/32/bootstrap.factor +++ b/basis/cpu/x86/32/bootstrap.factor @@ -13,15 +13,16 @@ IN: bootstrap.x86 : div-arg ( -- reg ) EAX ; : mod-arg ( -- reg ) EDX ; : temp0 ( -- reg ) EAX ; -: temp1 ( -- reg ) EDX ; -: temp2 ( -- reg ) ECX ; -: temp3 ( -- reg ) EBX ; +: temp1 ( -- reg ) ECX ; +: temp2 ( -- reg ) EBX ; +: temp3 ( -- reg ) EDX ; +: pic-tail-reg ( -- reg ) EDX ; : stack-reg ( -- reg ) ESP ; : frame-reg ( -- reg ) EBP ; -: vm-reg ( -- reg ) ECX ; +: vm-reg ( -- reg ) EBX ; : ctx-reg ( -- reg ) EBP ; : nv-regs ( -- seq ) { ESI EDI EBX } ; -: nv-reg ( -- reg ) EBX ; +: nv-reg ( -- reg ) ESI ; : ds-reg ( -- reg ) ESI ; : rs-reg ( -- reg ) EDI ; : fixnum>slot@ ( -- ) temp0 2 SAR ; @@ -40,7 +41,7 @@ IN: bootstrap.x86 ] jit-prolog jit-define [ - temp3 0 MOV rc-absolute-cell rt-here jit-rel + pic-tail-reg 0 MOV rc-absolute-cell rt-here jit-rel 0 JMP rc-relative rt-entry-point-pic-tail jit-rel ] jit-word-jump jit-define @@ -53,8 +54,8 @@ IN: bootstrap.x86 : jit-save-context ( -- ) jit-load-context - EDX ESP -4 [+] LEA - ctx-reg context-callstack-top-offset [+] EDX MOV + ECX ESP -4 [+] LEA + ctx-reg context-callstack-top-offset [+] ECX MOV ctx-reg context-datastack-offset [+] ds-reg MOV ctx-reg context-retainstack-offset [+] rs-reg MOV ; @@ -135,25 +136,25 @@ IN: bootstrap.x86 [ ! Load callstack object - EBX ds-reg [] MOV + temp3 ds-reg [] MOV ds-reg bootstrap-cell SUB ! Get ctx->callstack_bottom jit-load-vm jit-load-context - EAX ctx-reg context-callstack-bottom-offset [+] MOV + temp0 ctx-reg context-callstack-bottom-offset [+] MOV ! Get top of callstack object -- 'src' for memcpy - EBP EBX callstack-top-offset [+] LEA + temp1 temp3 callstack-top-offset [+] LEA ! Get callstack length, in bytes --- 'len' for memcpy - EDX EBX callstack-length-offset [+] MOV - EDX tag-bits get SHR + temp2 temp3 callstack-length-offset [+] MOV + temp2 tag-bits get SHR ! Compute new stack pointer -- 'dst' for memcpy - EAX EDX SUB + temp0 temp2 SUB ! Install new stack pointer - ESP EAX MOV + ESP temp0 MOV ! Call memcpy - EDX PUSH - EBP PUSH - EAX PUSH + temp2 PUSH + temp1 PUSH + temp0 PUSH "factor_memcpy" jit-call ESP 12 ADD ! Return with new callstack @@ -177,7 +178,7 @@ IN: bootstrap.x86 ! Inline cache miss entry points : jit-load-return-address ( -- ) - EBX ESP stack-frame-size bootstrap-cell - [+] MOV ; + pic-tail-reg ESP stack-frame-size bootstrap-cell - [+] MOV ; ! These are always in tail position with an existing stack ! frame, and the stack. The frame setup takes this into account. @@ -185,7 +186,7 @@ IN: bootstrap.x86 jit-load-vm jit-save-context ESP 4 [+] vm-reg MOV - ESP [] EBX MOV + ESP [] pic-tail-reg MOV "inline_cache_miss" jit-call jit-restore-context ; @@ -213,6 +214,7 @@ IN: bootstrap.x86 [ ESP [] EAX MOV ESP 4 [+] EDX MOV + jit-load-vm ESP 8 [+] vm-reg MOV jit-call ] @@ -237,6 +239,7 @@ IN: bootstrap.x86 EBX tag-bits get SAR ESP [] EBX MOV ESP 4 [+] EBP MOV + jit-load-vm ESP 8 [+] vm-reg MOV "overflow_fixnum_multiply" jit-call ] @@ -266,7 +269,7 @@ IN: bootstrap.x86 ! Load context and parameter from datastack EAX ds-reg [] MOV EAX EAX alien-offset [+] MOV - EBX ds-reg -4 [+] MOV + EDX ds-reg -4 [+] MOV ds-reg 8 SUB ! Make the new context active @@ -280,7 +283,7 @@ IN: bootstrap.x86 ! Store parameter to datastack ds-reg 4 ADD - ds-reg [] EBX MOV ; + ds-reg [] EDX MOV ; [ jit-set-context ] \ (set-context) define-sub-primitive @@ -291,14 +294,14 @@ IN: bootstrap.x86 "new_context" jit-call ! Save pointer to quotation and parameter - EBX ds-reg MOV + EDX ds-reg MOV ds-reg 8 SUB ! Make the new context active EAX jit-switch-context ! Push parameter - EAX EBX -4 [+] MOV + EAX EDX -4 [+] MOV ds-reg 4 ADD ds-reg [] EAX MOV @@ -309,7 +312,7 @@ IN: bootstrap.x86 0 PUSH ! Jump to initial quotation - EAX EBX [] MOV + EAX EDX [] MOV jit-jump-quot ; [ jit-start-context ] \ (start-context) define-sub-primitive diff --git a/basis/cpu/x86/64/64-tests.factor b/basis/cpu/x86/64/64-tests.factor index 6d171af7ea..2d2c89441c 100644 --- a/basis/cpu/x86/64/64-tests.factor +++ b/basis/cpu/x86/64/64-tests.factor @@ -2,12 +2,12 @@ USING: alien alien.c-types cpu.architecture cpu.x86.64 cpu.x86.assembler cpu.x86.assembler.operands tools.test ; IN: cpu.x86.64.tests -: assembly-test-1 ( -- x ) int { } "cdecl" [ RAX 3 MOV ] alien-assembly ; +: assembly-test-1 ( -- x ) int { } cdecl [ RAX 3 MOV ] alien-assembly ; [ 3 ] [ assembly-test-1 ] unit-test : assembly-test-2 ( a b -- x ) - int { int int } "cdecl" [ + int { int int } cdecl [ param-reg-0 param-reg-1 ADD int-regs return-reg param-reg-0 MOV ] alien-assembly ; diff --git a/basis/cpu/x86/64/64.factor b/basis/cpu/x86/64/64.factor index 4dfb250348..432d210bec 100644 --- a/basis/cpu/x86/64/64.factor +++ b/basis/cpu/x86/64/64.factor @@ -11,10 +11,10 @@ cpu.architecture vm ; FROM: layouts => cell cells ; IN: cpu.x86.64 -: param-reg-0 ( -- reg ) 0 int-regs param-reg ; inline -: param-reg-1 ( -- reg ) 1 int-regs param-reg ; inline -: param-reg-2 ( -- reg ) 2 int-regs param-reg ; inline -: param-reg-3 ( -- reg ) 3 int-regs param-reg ; inline +: param-reg-0 ( -- reg ) 0 int-regs cdecl param-reg ; inline +: param-reg-1 ( -- reg ) 1 int-regs cdecl param-reg ; inline +: param-reg-2 ( -- reg ) 2 int-regs cdecl param-reg ; inline +: param-reg-3 ( -- reg ) 3 int-regs cdecl param-reg ; inline M: x86.64 pic-tail-reg RBX ; @@ -52,8 +52,6 @@ M: x86.64 %set-vm-field ( src offset -- ) M: x86.64 %vm-field-ptr ( dst offset -- ) [ vm-reg ] dip [+] LEA ; -: param@ ( n -- op ) reserved-stack-space + stack@ ; - M: x86.64 %prologue ( n -- ) temp-reg -7 [RIP+] LEA dup PUSH @@ -157,7 +155,7 @@ M:: x86.64 %unbox-large-struct ( n c-type -- ) "to_value_struct" f %alien-invoke ; : load-return-value ( rep -- ) - [ [ 0 ] dip reg-class-of param-reg ] + [ [ 0 ] dip reg-class-of cdecl param-reg ] [ reg-class-of return-reg ] [ ] tri %copy ; @@ -165,7 +163,7 @@ M:: x86.64 %unbox-large-struct ( n c-type -- ) M:: x86.64 %box ( n rep func -- ) n [ n - 0 rep reg-class-of param-reg + 0 rep reg-class-of cdecl param-reg rep %load-param-reg ] [ rep load-return-value @@ -253,7 +251,7 @@ M: x86.64 %end-callback-value ( ctype -- ) unbox-return ; : float-function-param ( i src -- ) - [ float-regs param-regs nth ] dip double-rep %copy ; + [ float-regs cdecl param-regs nth ] dip double-rep %copy ; : float-function-return ( reg -- ) float-regs return-reg double-rep %copy ; @@ -281,6 +279,8 @@ M:: x86.64 %call-gc ( gc-root-count temp -- ) ! Call GC "inline_gc" f %alien-invoke ; +M: x86.64 struct-return-pointer-type void* ; + ! The result of reading 4 bytes from memory is a fixnum on ! x86-64. enable-alien-4-intrinsics diff --git a/basis/cpu/x86/64/bootstrap.factor b/basis/cpu/x86/64/bootstrap.factor index 68c3d8b702..39046bce6a 100644 --- a/basis/cpu/x86/64/bootstrap.factor +++ b/basis/cpu/x86/64/bootstrap.factor @@ -11,10 +11,11 @@ IN: bootstrap.x86 : shift-arg ( -- reg ) RCX ; : div-arg ( -- reg ) RAX ; : mod-arg ( -- reg ) RDX ; -: temp0 ( -- reg ) RDI ; -: temp1 ( -- reg ) RSI ; +: temp0 ( -- reg ) RAX ; +: temp1 ( -- reg ) RCX ; : temp2 ( -- reg ) RDX ; : temp3 ( -- reg ) RBX ; +: pic-tail-reg ( -- reg ) RBX ; : return-reg ( -- reg ) RAX ; : nv-reg ( -- reg ) RBX ; : stack-reg ( -- reg ) RSP ; @@ -42,7 +43,7 @@ IN: bootstrap.x86 ] jit-prolog jit-define [ - temp3 5 [RIP+] LEA + pic-tail-reg 5 [RIP+] LEA 0 JMP rc-relative rt-entry-point-pic-tail jit-rel ] jit-word-jump jit-define diff --git a/basis/cpu/x86/64/unix/unix.factor b/basis/cpu/x86/64/unix/unix.factor index 2fb32ce733..a1868a3bc8 100644 --- a/basis/cpu/x86/64/unix/unix.factor +++ b/basis/cpu/x86/64/unix/unix.factor @@ -7,18 +7,13 @@ compiler.cfg.registers ; IN: cpu.x86.64.unix M: int-regs param-regs - drop { RDI RSI RDX RCX R8 R9 } ; + 2drop { RDI RSI RDX RCX R8 R9 } ; M: float-regs param-regs - drop { XMM0 XMM1 XMM2 XMM3 XMM4 XMM5 XMM6 XMM7 } ; + 2drop { XMM0 XMM1 XMM2 XMM3 XMM4 XMM5 XMM6 XMM7 } ; M: x86.64 reserved-stack-space 0 ; -SYMBOL: (stack-value) -! The ABI for passing structs by value is pretty great -<< void* c-type clone \ (stack-value) define-primitive-type -stack-params \ (stack-value) c-type (>>rep) >> - : struct-types&offset ( struct-type -- pairs ) fields>> [ [ type>> ] [ offset>> ] bi 2array @@ -36,8 +31,7 @@ stack-params \ (stack-value) c-type (>>rep) >> ] map ; : flatten-large-struct ( c-type -- seq ) - heap-size cell align - cell /i \ (stack-value) c-type ; + (flatten-stack-type) ; : flatten-struct ( c-type -- seq ) dup heap-size 16 > [ diff --git a/basis/cpu/x86/64/winnt/winnt.factor b/basis/cpu/x86/64/winnt/winnt.factor index c75bb5a1b9..5d8ecc5cfb 100644 --- a/basis/cpu/x86/64/winnt/winnt.factor +++ b/basis/cpu/x86/64/winnt/winnt.factor @@ -5,9 +5,9 @@ compiler.cfg.registers cpu.architecture cpu.x86.assembler cpu.x86 cpu.x86.assembler.operands ; IN: cpu.x86.64.winnt -M: int-regs param-regs drop { RCX RDX R8 R9 } ; +M: int-regs param-regs 2drop { RCX RDX R8 R9 } ; -M: float-regs param-regs drop { XMM0 XMM1 XMM2 XMM3 } ; +M: float-regs param-regs 2drop { XMM0 XMM1 XMM2 XMM3 } ; M: x86.64 reserved-stack-space 4 cells ; diff --git a/basis/cpu/x86/bootstrap.factor b/basis/cpu/x86/bootstrap.factor index 80b56f9f91..7accc4b1cb 100644 --- a/basis/cpu/x86/bootstrap.factor +++ b/basis/cpu/x86/bootstrap.factor @@ -12,8 +12,9 @@ big-endian off [ ! Optimizing compiler's side of callback accesses ! arguments that are on the stack via the frame pointer. - ! On x86-64, some arguments are passed in registers, and - ! so the only register that is safe for use here is nv-reg. + ! On x86-32 fastcall, and x86-64, some arguments are passed + ! in registers, and so the only registers that are safe for + ! use here are frame-reg, nv-reg and vm-reg. frame-reg PUSH frame-reg stack-reg MOV @@ -65,23 +66,24 @@ big-endian off frame-reg POP - ! Callbacks which return structs, or use stdcall, need a - ! parameter here. See the comment in callback-return-rewind - ! in cpu.x86.32 + ! Callbacks which return structs, or use stdcall/fastcall/thiscall, + ! need a parameter here. + + ! See the comment for M\ x86.32 stack-cleanup in cpu.x86.32 HEX: ffff RET rc-absolute-2 rt-untagged jit-rel ] callback-stub jit-define [ ! Load word - nv-reg 0 MOV rc-absolute-cell rt-literal jit-rel + temp0 0 MOV rc-absolute-cell rt-literal jit-rel ! Bump profiling counter - nv-reg profile-count-offset [+] 1 tag-fixnum ADD + temp0 profile-count-offset [+] 1 tag-fixnum ADD ! Load word->code - nv-reg nv-reg word-code-offset [+] MOV + temp0 temp0 word-code-offset [+] MOV ! Compute word entry point - nv-reg compiled-header-size ADD + temp0 compiled-header-size ADD ! Jump to entry point - nv-reg JMP + temp0 JMP ] jit-profiling jit-define [ @@ -200,7 +202,7 @@ big-endian off ! ! ! Polymorphic inline caches -! The PIC stubs are not permitted to touch temp3. +! The PIC stubs are not permitted to touch pic-tail-reg. ! Load a value from a stack position [ @@ -477,23 +479,23 @@ big-endian off ! load value temp3 ds-reg [] MOV ! make a copy - temp1 temp3 MOV - ! compute positive shift value in temp1 - temp1 CL SHL + temp2 temp3 MOV + ! compute positive shift value in temp2 + temp2 CL SHL shift-arg NEG ! compute negative shift value in temp3 temp3 CL SAR temp3 tag-mask get bitnot AND shift-arg 0 CMP - ! if shift count was negative, move temp0 to temp1 - temp1 temp3 CMOVGE + ! if shift count was negative, move temp0 to temp2 + temp2 temp3 CMOVGE ! push to stack - ds-reg [] temp1 MOV + ds-reg [] temp2 MOV ] \ fixnum-shift-fast define-sub-primitive : jit-fixnum-/mod ( -- ) ! load second parameter - temp3 ds-reg [] MOV + temp1 ds-reg [] MOV ! load first parameter div-arg ds-reg bootstrap-cell neg [+] MOV ! make a copy @@ -501,7 +503,7 @@ big-endian off ! sign-extend mod-arg bootstrap-cell-bits 1 - SAR ! divide - temp3 IDIV ; + temp1 IDIV ; [ jit-fixnum-/mod diff --git a/basis/cpu/x86/features/features.factor b/basis/cpu/x86/features/features.factor index 30b2ce3b57..7913489178 100644 --- a/basis/cpu/x86/features/features.factor +++ b/basis/cpu/x86/features/features.factor @@ -9,7 +9,7 @@ IN: cpu.x86.features > +} cond cdecl add-library >> ! ConnSatusType CONSTANT: CONNECTION_OK HEX: 0 diff --git a/basis/db/sqlite/ffi/ffi.factor b/basis/db/sqlite/ffi/ffi.factor index f93b961799..d9da317c89 100644 --- a/basis/db/sqlite/ffi/ffi.factor +++ b/basis/db/sqlite/ffi/ffi.factor @@ -10,7 +10,7 @@ IN: db.sqlite.ffi { [ os winnt? ] [ "sqlite3.dll" ] } { [ os macosx? ] [ "/usr/lib/libsqlite3.dylib" ] } { [ os unix? ] [ "libsqlite3.so" ] } - } cond "cdecl" add-library >> + } cond cdecl add-library >> ! Return values from sqlite functions CONSTANT: SQLITE_OK 0 ! Successful result diff --git a/basis/glib/glib.factor b/basis/glib/glib.factor index 157a426e19..7447f24151 100644 --- a/basis/glib/glib.factor +++ b/basis/glib/glib.factor @@ -8,14 +8,14 @@ IN: glib << { - { [ os winnt? ] [ "glib" "libglib-2.0-0.dll" "cdecl" add-library ] } - { [ os macosx? ] [ "glib" "/opt/local/lib/libglib-2.0.0.dylib" "cdecl" add-library ] } + { [ os winnt? ] [ "glib" "libglib-2.0-0.dll" cdecl add-library ] } + { [ os macosx? ] [ "glib" "/opt/local/lib/libglib-2.0.0.dylib" cdecl add-library ] } { [ os unix? ] [ ] } } cond { - { [ os winnt? ] [ "gobject" "libgobject-2.0-0.dll" "cdecl" add-library ] } - { [ os macosx? ] [ "gobject" "/opt/local/lib/libgobject-2.0.0.dylib" "cdecl" add-library ] } + { [ os winnt? ] [ "gobject" "libgobject-2.0-0.dll" cdecl add-library ] } + { [ os macosx? ] [ "gobject" "/opt/local/lib/libgobject-2.0.0.dylib" cdecl add-library ] } { [ os unix? ] [ ] } } cond diff --git a/basis/images/pgm/authors.txt b/basis/images/pgm/authors.txt new file mode 100644 index 0000000000..6f03a12101 --- /dev/null +++ b/basis/images/pgm/authors.txt @@ -0,0 +1 @@ +Erik Charlebois diff --git a/basis/images/pgm/pgm-tests.factor b/basis/images/pgm/pgm-tests.factor new file mode 100644 index 0000000000..7bfade4717 --- /dev/null +++ b/basis/images/pgm/pgm-tests.factor @@ -0,0 +1,7 @@ +! Copyright (C) 2010 Erik Charlebois. +! See http://factorcode.org/license.txt for BSD license. +USING: images.testing ; +IN: images.pgm.tests + +"vocab:images/testing/pgm/radial.binary.pgm" decode-test +"vocab:images/testing/pgm/radial.ascii.pgm" decode-test diff --git a/basis/images/pgm/pgm.factor b/basis/images/pgm/pgm.factor new file mode 100644 index 0000000000..52e594ddff --- /dev/null +++ b/basis/images/pgm/pgm.factor @@ -0,0 +1,62 @@ +! Copyright (C) 2010 Erik Charlebois. +! See http://factorcode.org/license.txt for BSD license. +USING: accessors alien.c-types ascii combinators images images.loader +io io.encodings.ascii io.encodings.string kernel locals make math +math.parser sequences specialized-arrays ; +SPECIALIZED-ARRAY: ushort +IN: images.pgm + +SINGLETON: pgm-image +"pgm" pgm-image register-image-class + +: read-token ( -- token ) + [ read1 dup blank? + [ t ] + [ dup CHAR: # = + [ "\n" read-until 2drop t ] + [ f ] if + ] if + ] [ drop ] while + " \n\r\t" read-until drop swap + prefix ascii decode ; + +: read-number ( -- number ) + read-token string>number ; + +:: read-numbers ( n lim -- ) + n lim = [ + read-number , + n 1 + lim read-numbers + ] unless ; + +:: read-pgm ( -- image ) + read-token :> type + read-number :> width + read-number :> height + read-number :> max + width height * :> npixels + max 256 >= :> wide + + type { + { "P2" [ [ 0 npixels read-numbers ] wide [ ushort-array{ } ] [ B{ } ] if make ] } + { "P5" [ wide [ 2 ] [ 1 ] if npixels * read ] } + } case :> data + + image new + L >>component-order + { width height } >>dim + f >>upside-down? + data >>bitmap + wide [ ushort-components ] [ ubyte-components ] if >>component-type ; + +M: pgm-image stream>image + drop [ read-pgm ] with-input-stream ; + +M: pgm-image image>stream + drop { + [ drop "P5\n" ascii encode write ] + [ dim>> first number>string " " append ascii encode write ] + [ dim>> second number>string "\n" append ascii encode write ] + [ component-type>> ubyte-components = [ "255\n" ] [ "65535\n" ] if ascii encode write ] + [ bitmap>> write ] + } cleave ; diff --git a/basis/images/pgm/summary.txt b/basis/images/pgm/summary.txt new file mode 100644 index 0000000000..f558b7cbb5 --- /dev/null +++ b/basis/images/pgm/summary.txt @@ -0,0 +1 @@ +Image loading for PGM image files. diff --git a/basis/images/ppm/authors.txt b/basis/images/ppm/authors.txt new file mode 100644 index 0000000000..6f03a12101 --- /dev/null +++ b/basis/images/ppm/authors.txt @@ -0,0 +1 @@ +Erik Charlebois diff --git a/basis/images/ppm/ppm-tests.factor b/basis/images/ppm/ppm-tests.factor new file mode 100644 index 0000000000..208af76dd2 --- /dev/null +++ b/basis/images/ppm/ppm-tests.factor @@ -0,0 +1,7 @@ +! Copyright (C) 2010 Erik Charlebois. +! See http://factorcode.org/license.txt for BSD license. +USING: images.testing ; +IN: images.ppm.tests + +"vocab:images/testing/ppm/binary.ppm" decode-test +"vocab:images/testing/ppm/ascii.ppm" decode-test diff --git a/basis/images/ppm/ppm.factor b/basis/images/ppm/ppm.factor new file mode 100644 index 0000000000..d50d51797d --- /dev/null +++ b/basis/images/ppm/ppm.factor @@ -0,0 +1,59 @@ +! Copyright (C) 2010 Erik Charlebois. +! See http://factorcode.org/license.txt for BSD license. +USING: accessors ascii combinators images images.loader io +io.encodings.ascii io.encodings.string kernel locals make math +math.parser prettyprint sequences ; +IN: images.ppm + +SINGLETON: ppm-image +"ppm" ppm-image register-image-class + +: read-token ( -- token ) + [ read1 dup blank? + [ t ] + [ dup CHAR: # = + [ "\n" read-until 2drop t ] + [ f ] if + ] if + ] [ drop ] while + " \n\r\t" read-until drop swap + prefix ascii decode ; + +: read-number ( -- number ) + read-token string>number ; + +:: read-numbers ( n lim -- ) + n lim = [ + read-number , + n 1 + lim read-numbers + ] unless ; + +:: read-ppm ( -- image ) + read-token :> type + read-number :> width + read-number :> height + read-number :> max + width height 3 * * :> npixels + type { + { "P3" [ [ 0 npixels read-numbers ] B{ } make ] } + { "P6" [ npixels read ] } + } case :> data + + image new + RGB >>component-order + { width height } >>dim + f >>upside-down? + data >>bitmap + ubyte-components >>component-type ; + +M: ppm-image stream>image + drop [ read-ppm ] with-input-stream ; + +M: ppm-image image>stream + drop { + [ drop "P6\n" ascii encode write ] + [ dim>> first number>string " " append ascii encode write ] + [ dim>> second number>string "\n" append ascii encode write ] + [ drop "255\n" ascii encode write ] + [ bitmap>> write ] + } cleave ; diff --git a/basis/images/ppm/summary.txt b/basis/images/ppm/summary.txt new file mode 100644 index 0000000000..f527e2a6de --- /dev/null +++ b/basis/images/ppm/summary.txt @@ -0,0 +1 @@ +Image loading for PPM image files. diff --git a/basis/io/backend/unix/multiplexers/run-loop/run-loop.factor b/basis/io/backend/unix/multiplexers/run-loop/run-loop.factor index 05328b48dc..ea31292c06 100644 --- a/basis/io/backend/unix/multiplexers/run-loop/run-loop.factor +++ b/basis/io/backend/unix/multiplexers/run-loop/run-loop.factor @@ -11,7 +11,7 @@ TUPLE: run-loop-mx kqueue-mx ; : file-descriptor-callback ( -- callback ) void { CFFileDescriptorRef CFOptionFlags void* } - "cdecl" [ + cdecl [ 3drop 0 mx get kqueue-mx>> wait-for-events reset-run-loop diff --git a/basis/io/monitors/recursive/recursive.factor b/basis/io/monitors/recursive/recursive.factor index b573e2fa2b..70daed9018 100644 --- a/basis/io/monitors/recursive/recursive.factor +++ b/basis/io/monitors/recursive/recursive.factor @@ -1,9 +1,10 @@ -! Copyright (C) 2008, 2009 Slava Pestov. +! Copyright (C) 2008, 2010 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. USING: accessors sequences assocs arrays continuations destructors combinators kernel threads concurrency.messaging concurrency.mailboxes concurrency.promises io.files io.files.info -io.directories io.pathnames io.monitors debugger fry ; +io.directories io.pathnames io.monitors io.monitors.private +debugger fry ; IN: io.monitors.recursive ! Simulate recursive monitors on platforms that don't have them @@ -71,12 +72,14 @@ M: recursive-monitor dispose* ] with with each ; : pump-loop ( -- ) - receive dup +stop+ eq? [ - drop stop-pump - ] [ - [ '[ _ update-hierarchy ] ignore-errors ] [ pump-step ] bi - pump-loop - ] if ; + receive { + { [ dup +stop+ eq? ] [ drop stop-pump ] } + { [ dup monitor-disposed eq? ] [ drop ] } + [ + [ '[ _ update-hierarchy ] ignore-errors ] [ pump-step ] bi + pump-loop + ] + } cond ; : monitor-ready ( error/t -- ) monitor tget ready>> fulfill ; diff --git a/basis/io/sockets/secure/openssl/openssl.factor b/basis/io/sockets/secure/openssl/openssl.factor index b3cf28a497..ca7ba0cd49 100644 --- a/basis/io/sockets/secure/openssl/openssl.factor +++ b/basis/io/sockets/secure/openssl/openssl.factor @@ -31,7 +31,7 @@ TUPLE: openssl-context < secure-context aliens sessions ; ] [ drop ] if ; : password-callback ( -- alien ) - int { void* int bool void* } "cdecl" + int { void* int bool void* } cdecl [| buf size rwflag password! | password [ B{ 0 } password! ] unless diff --git a/basis/io/sockets/windows/nt/nt.factor b/basis/io/sockets/windows/nt/nt.factor index 8eb2df5b46..7a961518a0 100644 --- a/basis/io/sockets/windows/nt/nt.factor +++ b/basis/io/sockets/windows/nt/nt.factor @@ -57,7 +57,7 @@ TUPLE: ConnectEx-args port } cleave int { SOCKET void* int PVOID DWORD LPDWORD void* } - "stdcall" alien-indirect drop + stdcall alien-indirect drop winsock-error-string [ throw ] when* ; inline M: object establish-connection ( client-out remote -- ) diff --git a/basis/math/floats/env/x86/32/32.factor b/basis/math/floats/env/x86/32/32.factor index ea3bee424f..7d45f01337 100644 --- a/basis/math/floats/env/x86/32/32.factor +++ b/basis/math/floats/env/x86/32/32.factor @@ -3,26 +3,26 @@ cpu.x86.assembler.operands math.floats.env.x86 system ; IN: math.floats.env.x86.32 M: x86.32 get-sse-env - void { void* } "cdecl" [ + void { void* } cdecl [ EAX ESP [] MOV EAX [] STMXCSR ] alien-assembly ; M: x86.32 set-sse-env - void { void* } "cdecl" [ + void { void* } cdecl [ EAX ESP [] MOV EAX [] LDMXCSR ] alien-assembly ; M: x86.32 get-x87-env - void { void* } "cdecl" [ + void { void* } cdecl [ EAX ESP [] MOV EAX [] FNSTSW EAX 2 [+] FNSTCW ] alien-assembly ; M: x86.32 set-x87-env - void { void* } "cdecl" [ + void { void* } cdecl [ EAX ESP [] MOV FNCLEX EAX 2 [+] FLDCW diff --git a/basis/math/floats/env/x86/64/64.factor b/basis/math/floats/env/x86/64/64.factor index b6f8ee151f..93cb11104f 100644 --- a/basis/math/floats/env/x86/64/64.factor +++ b/basis/math/floats/env/x86/64/64.factor @@ -3,23 +3,23 @@ cpu.x86.assembler.operands math.floats.env.x86 sequences system ; IN: math.floats.env.x86.64 M: x86.64 get-sse-env - void { void* } "cdecl" [ - int-regs param-regs first [] STMXCSR + void { void* } cdecl [ + int-regs cdecl param-regs first [] STMXCSR ] alien-assembly ; M: x86.64 set-sse-env - void { void* } "cdecl" [ - int-regs param-regs first [] LDMXCSR + void { void* } cdecl [ + int-regs cdecl param-regs first [] LDMXCSR ] alien-assembly ; M: x86.64 get-x87-env - void { void* } "cdecl" [ - int-regs param-regs first [] FNSTSW - int-regs param-regs first 2 [+] FNSTCW + void { void* } cdecl [ + int-regs cdecl param-regs first [] FNSTSW + int-regs cdecl param-regs first 2 [+] FNSTCW ] alien-assembly ; M: x86.64 set-x87-env - void { void* } "cdecl" [ + void { void* } cdecl [ FNCLEX - int-regs param-regs first 2 [+] FLDCW + int-regs cdecl param-regs first 2 [+] FLDCW ] alien-assembly ; diff --git a/basis/opengl/gl/macosx/macosx.factor b/basis/opengl/gl/macosx/macosx.factor index 9e095a62e6..aeaa5da4eb 100644 --- a/basis/opengl/gl/macosx/macosx.factor +++ b/basis/opengl/gl/macosx/macosx.factor @@ -3,4 +3,4 @@ IN: opengl.gl.macosx : gl-function-context ( -- context ) 0 ; inline : gl-function-address ( name -- address ) f dlsym ; inline -: gl-function-calling-convention ( -- str ) "cdecl" ; inline +: gl-function-calling-convention ( -- str ) cdecl ; inline diff --git a/basis/opengl/gl/unix/unix.factor b/basis/opengl/gl/unix/unix.factor index 3352b18350..c0a0218ed2 100644 --- a/basis/opengl/gl/unix/unix.factor +++ b/basis/opengl/gl/unix/unix.factor @@ -1,6 +1,6 @@ -USING: kernel x11.glx ; +USING: alien kernel x11.glx ; IN: opengl.gl.unix : gl-function-context ( -- context ) glXGetCurrentContext ; inline : gl-function-address ( name -- address ) glXGetProcAddressARB ; inline -: gl-function-calling-convention ( -- str ) "cdecl" ; inline +: gl-function-calling-convention ( -- str ) cdecl ; inline diff --git a/basis/opengl/gl/windows/windows.factor b/basis/opengl/gl/windows/windows.factor index 8bceb865e2..eda1e3178e 100644 --- a/basis/opengl/gl/windows/windows.factor +++ b/basis/opengl/gl/windows/windows.factor @@ -1,4 +1,4 @@ -USING: alien.c-types alien.syntax kernel windows.types ; +USING: alien alien.c-types alien.syntax kernel windows.types ; IN: opengl.gl.windows LIBRARY: gl @@ -8,4 +8,4 @@ FUNCTION: void* wglGetProcAddress ( c-string name ) ; : gl-function-context ( -- context ) wglGetCurrentContext ; inline : gl-function-address ( name -- address ) wglGetProcAddress ; inline -: gl-function-calling-convention ( -- str ) "stdcall" ; inline +: gl-function-calling-convention ( -- str ) stdcall ; inline diff --git a/basis/openssl/libcrypto/libcrypto.factor b/basis/openssl/libcrypto/libcrypto.factor index f9983d7813..fb39a8e51b 100644 --- a/basis/openssl/libcrypto/libcrypto.factor +++ b/basis/openssl/libcrypto/libcrypto.factor @@ -14,9 +14,9 @@ IN: openssl.libcrypto { { [ os openbsd? ] [ ] } ! VM is linked with it { [ os netbsd? ] [ ] } - { [ os winnt? ] [ "libcrypto" "libeay32.dll" "cdecl" add-library ] } - { [ os macosx? ] [ "libcrypto" "libcrypto.dylib" "cdecl" add-library ] } - { [ os unix? ] [ "libcrypto" "libcrypto.so" "cdecl" add-library ] } + { [ os winnt? ] [ "libcrypto" "libeay32.dll" cdecl add-library ] } + { [ os macosx? ] [ "libcrypto" "libcrypto.dylib" cdecl add-library ] } + { [ os unix? ] [ "libcrypto" "libcrypto.so" cdecl add-library ] } } cond >> diff --git a/basis/openssl/libssl/libssl.factor b/basis/openssl/libssl/libssl.factor index 96d235d271..272b1bb17e 100644 --- a/basis/openssl/libssl/libssl.factor +++ b/basis/openssl/libssl/libssl.factor @@ -10,9 +10,9 @@ IN: openssl.libssl << { { [ os openbsd? ] [ ] } ! VM is linked with it { [ os netbsd? ] [ ] } - { [ os winnt? ] [ "libssl" "ssleay32.dll" "cdecl" add-library ] } - { [ os macosx? ] [ "libssl" "libssl.dylib" "cdecl" add-library ] } - { [ os unix? ] [ "libssl" "libssl.so" "cdecl" add-library ] } + { [ os winnt? ] [ "libssl" "ssleay32.dll" cdecl add-library ] } + { [ os macosx? ] [ "libssl" "libssl.dylib" cdecl add-library ] } + { [ os unix? ] [ "libssl" "libssl.so" cdecl add-library ] } } cond >> CONSTANT: X509_FILETYPE_PEM 1 diff --git a/basis/pango/cairo/cairo.factor b/basis/pango/cairo/cairo.factor index d6baaffe2e..85d4cef424 100644 --- a/basis/pango/cairo/cairo.factor +++ b/basis/pango/cairo/cairo.factor @@ -12,8 +12,8 @@ classes.struct cairo cairo.ffi ; IN: pango.cairo << { - { [ os winnt? ] [ "pangocairo" "libpangocairo-1.0-0.dll" "cdecl" add-library ] } - { [ os macosx? ] [ "pangocairo" "/opt/local/lib/libpangocairo-1.0.0.dylib" "cdecl" add-library ] } + { [ os winnt? ] [ "pangocairo" "libpangocairo-1.0-0.dll" cdecl add-library ] } + { [ os macosx? ] [ "pangocairo" "/opt/local/lib/libpangocairo-1.0.0.dylib" cdecl add-library ] } { [ os unix? ] [ ] } } cond >> diff --git a/basis/pango/fonts/fonts.factor b/basis/pango/fonts/fonts.factor index c2a7ef128d..7ea4e0a0c2 100644 --- a/basis/pango/fonts/fonts.factor +++ b/basis/pango/fonts/fonts.factor @@ -8,8 +8,7 @@ IN: pango.fonts LIBRARY: pango -TYPEDEF: int PangoStyle -C-ENUM: +C-ENUM: PangoStyle PANGO_STYLE_NORMAL PANGO_STYLE_OBLIQUE PANGO_STYLE_ITALIC ; diff --git a/basis/pango/pango.factor b/basis/pango/pango.factor index 6dc48e39fe..3a249c664c 100644 --- a/basis/pango/pango.factor +++ b/basis/pango/pango.factor @@ -11,8 +11,8 @@ IN: pango ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! << { - { [ os winnt? ] [ "pango" "libpango-1.0-0.dll" "cdecl" add-library ] } - { [ os macosx? ] [ "pango" "/opt/local/lib/libpango-1.0.0.dylib" "cdecl" add-library ] } + { [ os winnt? ] [ "pango" "libpango-1.0-0.dll" cdecl add-library ] } + { [ os macosx? ] [ "pango" "/opt/local/lib/libpango-1.0.0.dylib" cdecl add-library ] } { [ os unix? ] [ ] } } cond >> diff --git a/basis/stack-checker/alien/alien.factor b/basis/stack-checker/alien/alien.factor index 9039c5d3f0..1c6b37b7df 100644 --- a/basis/stack-checker/alien/alien.factor +++ b/basis/stack-checker/alien/alien.factor @@ -107,8 +107,7 @@ TUPLE: alien-callback-params < alien-node-params quot xt ; [ callbacks get ] dip '[ _ ] cache ; : callback-bottom ( params -- ) - [ xt>> ] [ callback-return-rewind ] bi - '[ _ _ callback-xt ] infer-quot-here ; + [ xt>> ] [ stack-cleanup ] bi '[ _ _ callback-xt ] infer-quot-here ; : infer-alien-callback ( -- ) alien-callback-params new diff --git a/basis/tools/deploy/test/9/9.factor b/basis/tools/deploy/test/9/9.factor index 642ee48e67..73dade6657 100644 --- a/basis/tools/deploy/test/9/9.factor +++ b/basis/tools/deploy/test/9/9.factor @@ -2,9 +2,9 @@ USING: alien alien.c-types kernel math ; IN: tools.deploy.test.9 : callback-test ( -- callback ) - int { int } "cdecl" [ 1 + ] alien-callback ; + int { int } cdecl [ 1 + ] alien-callback ; : indirect-test ( -- ) - 10 callback-test int { int } "cdecl" alien-indirect 11 assert= ; + 10 callback-test int { int } cdecl alien-indirect 11 assert= ; MAIN: indirect-test diff --git a/basis/tools/disassembler/disassembler.factor b/basis/tools/disassembler/disassembler.factor index c0b3c9a586..c8df2f1094 100644 --- a/basis/tools/disassembler/disassembler.factor +++ b/basis/tools/disassembler/disassembler.factor @@ -15,6 +15,11 @@ HOOK: disassemble* disassembler-backend ( from to -- lines ) TR: tabs>spaces "\t" "\s" ; +GENERIC: (>address) ( object -- n ) + +M: integer (>address) ; +M: alien (>address) alien-address ; + PRIVATE> M: byte-array disassemble @@ -24,7 +29,7 @@ M: byte-array disassemble 2array disassemble ] with-destructors ; -M: pair disassemble first2 disassemble* [ tabs>spaces print ] each ; +M: pair disassemble first2 [ (>address) ] bi@ disassemble* [ tabs>spaces print ] each ; M: word disassemble word-code 2array disassemble ; diff --git a/basis/tools/disassembler/udis/udis.factor b/basis/tools/disassembler/udis/udis.factor index 5e46a34682..e998a5cfdb 100644 --- a/basis/tools/disassembler/udis/udis.factor +++ b/basis/tools/disassembler/udis/udis.factor @@ -12,7 +12,7 @@ IN: tools.disassembler.udis { [ os macosx? ] [ "libudis86.0.dylib" ] } { [ os unix? ] [ "libudis86.so.0" ] } { [ os winnt? ] [ "libudis86.dll" ] } -} cond "cdecl" add-library +} cond cdecl add-library >> LIBRARY: libudis86 diff --git a/basis/tools/profiler/profiler-tests.factor b/basis/tools/profiler/profiler-tests.factor index 5c31cdaeb4..b02b800463 100644 --- a/basis/tools/profiler/profiler-tests.factor +++ b/basis/tools/profiler/profiler-tests.factor @@ -21,9 +21,9 @@ IN: tools.profiler.tests [ ] [ \ + usage-profile. ] unit-test -: callback-test ( -- callback ) void { } "cdecl" [ ] alien-callback ; +: callback-test ( -- callback ) void { } cdecl [ ] alien-callback ; -: indirect-test ( callback -- ) void { } "cdecl" alien-indirect ; +: indirect-test ( callback -- ) void { } cdecl alien-indirect ; : foobar ( -- ) ; diff --git a/basis/ui/backend/windows/windows.factor b/basis/ui/backend/windows/windows.factor old mode 100644 new mode 100755 index c0829e5c8d..4e271a8280 --- a/basis/ui/backend/windows/windows.factor +++ b/basis/ui/backend/windows/windows.factor @@ -609,7 +609,7 @@ SYMBOL: trace-messages? ! return 0 if you handle the message, else just let DefWindowProc return its val : ui-wndproc ( -- object ) - uint { void* uint long long } "stdcall" [ + uint { void* uint long long } stdcall [ pick trace-messages? get-global [ dup windows-message-name name>> print flush ] when wm-handlers get-global at* [ call ] [ drop DefWindowProc ] if @@ -633,7 +633,7 @@ M: windows-ui-backend do-events 0 >>cbClsExtra 0 >>cbWndExtra f GetModuleHandle >>hInstance - f GetModuleHandle "fraptor" utf16n string>alien LoadIcon >>hIcon + f GetModuleHandle "APPICON" utf16n string>alien LoadIcon >>hIcon f IDC_ARROW LoadCursor >>hCursor class-name-ptr >>lpszClassName diff --git a/basis/ui/gadgets/grids/grids-docs.factor b/basis/ui/gadgets/grids/grids-docs.factor index 10b3bb7259..1632072ca2 100644 --- a/basis/ui/gadgets/grids/grids-docs.factor +++ b/basis/ui/gadgets/grids/grids-docs.factor @@ -2,7 +2,7 @@ USING: ui.gadgets help.markup help.syntax arrays ; IN: ui.gadgets.grids ARTICLE: "ui-grid-layout" "Grid layouts" -"Grid gadgets layout their children in a rectangular grid." +"Grid gadgets layout their children in a rectangular grid. The grid is represented as a sequence of sequences of gadgets. Every child sequence is a row of gadgets. Every row must have an equal number of gadgets in it." { $subsections grid } "Creating grids from a fixed set of gadgets:" { $subsections } diff --git a/basis/unicode/breaks/breaks.factor b/basis/unicode/breaks/breaks.factor index 46651bd7de..2ab8b27cc7 100644 --- a/basis/unicode/breaks/breaks.factor +++ b/basis/unicode/breaks/breaks.factor @@ -12,7 +12,7 @@ IN: unicode.breaks > +<< "hid" "hid.dll" stdcall add-library >> LIBRARY: hid TYPEDEF: LONG NTSTATUS @@ -206,11 +206,10 @@ CONSTANT: HID_USAGE_DIGITIZER_BARREL_SWITCH HEX: 44 CONSTANT: HIDP_LINK_COLLECTION_ROOT -1 CONSTANT: HIDP_LINK_COLLECTION_UNSPECIFIED 0 -C-ENUM: +C-ENUM: HIDP_REPORT_TYPE HidP_Input HidP_Output HidP_Feature ; -TYPEDEF: int HIDP_REPORT_TYPE STRUCT: USAGE_AND_PAGE { Usage USAGE } @@ -608,10 +607,9 @@ HidP_UsageAndPageListDifference ( ULONG UsageListLength ) ; -C-ENUM: +C-ENUM: HIDP_KEYBOARD_DIRECTION HidP_Keyboard_Break HidP_Keyboard_Make ; -TYPEDEF: int HIDP_KEYBOARD_DIRECTION STRUCT: HIDP_KEYBOARD_MODIFIER_STATE { ul ULONG } ; diff --git a/basis/windows/ddk/setupapi/setupapi.factor b/basis/windows/ddk/setupapi/setupapi.factor old mode 100644 new mode 100755 index 06d32725f7..578a44a6d8 --- a/basis/windows/ddk/setupapi/setupapi.factor +++ b/basis/windows/ddk/setupapi/setupapi.factor @@ -1,10 +1,11 @@ ! Copyright (C) 2010 Erik Charlebois. ! See http://factorcode.org/license.txt for BSD license. -USING: literals windows.kernel32 math alien.syntax windows.types classes.struct -alien.c-types windows.errors windows.ole32 windows.advapi32 alien.libraries ; +USING: literals windows.kernel32 math alien.syntax windows.types +classes.struct alien alien.c-types windows.errors windows.ole32 +windows.advapi32 alien.libraries ; IN: windows.ddk.setupapi -<< "setupapi" "setupapi.dll" "stdcall" add-library >> +<< "setupapi" "setupapi.dll" stdcall add-library >> LIBRARY: setupapi TYPEDEF: DWORDLONG SP_LOG_TOKEN @@ -1515,14 +1516,13 @@ FUNCTION: BOOL SetupRemoveFileLogEntryA ( HSPFILELOG FileLogHandle, PCSTR LogSec FUNCTION: BOOL SetupRemoveFileLogEntryW ( HSPFILELOG FileLogHandle, PCWSTR LogSectionName, PCWSTR TargetFilename ) ; ALIAS: SetupRemoveFileLogEntry SetupRemoveFileLogEntryW -C-ENUM: +C-ENUM: SetupFileLogInfo SetupFileLogSourceFilename SetupFileLogChecksum SetupFileLogDiskTagfile SetupFileLogDiskDescription SetupFileLogOtherInfo SetupFileLogMax ; -TYPEDEF: int SetupFileLogInfo FUNCTION: BOOL SetupQueryFileLogA ( HSPFILELOG FileLogHandle, PCSTR LogSectionName, PCSTR TargetFilename, SetupFileLogInfo DesiredInfo, PSTR DataOut, DWORD ReturnBufferSize, PDWORD RequiredSize ) ; FUNCTION: BOOL SetupQueryFileLogW ( HSPFILELOG FileLogHandle, PCWSTR LogSectionName, PCWSTR TargetFilename, SetupFileLogInfo DesiredInfo, PWSTR DataOut, DWORD ReturnBufferSize, PDWORD RequiredSize ) ; diff --git a/basis/windows/ddk/winusb/winusb.factor b/basis/windows/ddk/winusb/winusb.factor old mode 100644 new mode 100755 index 3b98e7e8ca..328e16f5c9 --- a/basis/windows/ddk/winusb/winusb.factor +++ b/basis/windows/ddk/winusb/winusb.factor @@ -1,10 +1,10 @@ ! Copyright (C) 2010 Erik Charlebois. ! See http://factorcode.org/license.txt for BSD license. -USING: alien.c-types alien.syntax classes.struct windows.kernel32 -windows.types alien.libraries ; +USING: alien alien.c-types alien.syntax classes.struct +windows.kernel32 windows.types alien.libraries ; IN: windows.ddk.winusb -<< "winusb" "winusb.dll" "stdcall" add-library >> +<< "winusb" "winusb.dll" stdcall add-library >> LIBRARY: winusb TYPEDEF: PVOID WINUSB_INTERFACE_HANDLE @@ -22,12 +22,11 @@ STRUCT: USB_INTERFACE_DESCRIPTOR { iInterface UCHAR } ; TYPEDEF: USB_INTERFACE_DESCRIPTOR* PUSB_INTERFACE_DESCRIPTOR -C-ENUM: +C-ENUM: USBD_PIPE_TYPE UsbdPipeTypeControl UsbdPipeTypeIsochronous UsbdPipeTypeBulk UsbdPipeTypeInterrupt ; -TYPEDEF: int USBD_PIPE_TYPE STRUCT: WINUSB_PIPE_INFORMATION { PipeType USBD_PIPE_TYPE } diff --git a/basis/windows/directx/d3d11shader/d3d11shader.factor b/basis/windows/directx/d3d11shader/d3d11shader.factor index 02ab9bb177..08146300f2 100644 --- a/basis/windows/directx/d3d11shader/d3d11shader.factor +++ b/basis/windows/directx/d3d11shader/d3d11shader.factor @@ -24,11 +24,11 @@ CONSTANT: D3D11_RETURN_TYPE_DOUBLE 7 CONSTANT: D3D11_RETURN_TYPE_CONTINUED 8 TYPEDEF: int D3D11_RESOURCE_RETURN_TYPE -C-ENUM: D3D11_CT_CBUFFER - D3D11_CT_TBUFFER - D3D11_CT_INTERFACE_POINTERS - D3D11_CT_RESOURCE_BIND_INFO ; -TYPEDEF: int D3D11_CBUFFER_TYPE +C-ENUM: D3D11_CBUFFER_TYPE + D3D11_CT_CBUFFER + D3D11_CT_TBUFFER + D3D11_CT_INTERFACE_POINTERS + D3D11_CT_RESOURCE_BIND_INFO ; TYPEDEF: D3D11_CBUFFER_TYPE* LPD3D11_CBUFFER_TYPE STRUCT: D3D11_SIGNATURE_PARAMETER_DESC diff --git a/basis/windows/directx/d3d9types/d3d9types.factor b/basis/windows/directx/d3d9types/d3d9types.factor index a9485a8fcf..09c19bcae4 100644 --- a/basis/windows/directx/d3d9types/d3d9types.factor +++ b/basis/windows/directx/d3d9types/d3d9types.factor @@ -502,8 +502,7 @@ CONSTANT: MAXD3DDECLUSAGE 13 CONSTANT: MAXD3DDECLUSAGEINDEX 15 CONSTANT: MAXD3DDECLLENGTH 64 -TYPEDEF: int D3DDECLMETHOD -C-ENUM: +C-ENUM: D3DDECLMETHOD D3DDECLMETHOD_DEFAULT D3DDECLMETHOD_PARTIALU D3DDECLMETHOD_PARTIALV diff --git a/basis/windows/directx/d3dcsx/d3dcsx.factor b/basis/windows/directx/d3dcsx/d3dcsx.factor index c2d3af8cf3..c6d0105fdc 100644 --- a/basis/windows/directx/d3dcsx/d3dcsx.factor +++ b/basis/windows/directx/d3dcsx/d3dcsx.factor @@ -48,10 +48,9 @@ COM-INTERFACE: ID3DX11FFT IUnknown {b3f7a938-4c93-4310-a675-b30d6de50553} HRESULT ForwardTransform ( ID3D11UnorderedAccessView* pInputBuffer, ID3D11UnorderedAccessView** ppOutputBuffer ) HRESULT InverseTransform ( ID3D11UnorderedAccessView* pInputBuffer, ID3D11UnorderedAccessView** ppOutputBuffer ) ; -C-ENUM: +C-ENUM: D3DX11_FFT_DATA_TYPE D3DX11_FFT_DATA_TYPE_REAL D3DX11_FFT_DATA_TYPE_COMPLEX ; -TYPEDEF: int D3DX11_FFT_DATA_TYPE CONSTANT: D3DX11_FFT_DIM_MASK_1D 1 CONSTANT: D3DX11_FFT_DIM_MASK_2D 3 diff --git a/basis/windows/directx/d3dx9shader/d3dx9shader.factor b/basis/windows/directx/d3dx9shader/d3dx9shader.factor index 12ba902fc5..00844338b5 100644 --- a/basis/windows/directx/d3dx9shader/d3dx9shader.factor +++ b/basis/windows/directx/d3dx9shader/d3dx9shader.factor @@ -41,25 +41,23 @@ STRUCT: D3DXSEMANTIC { UsageIndex UINT } ; TYPEDEF: D3DXSEMANTIC* LPD3DXSEMANTIC -C-ENUM: +C-ENUM: D3DXREGISTER_SET D3DXRS_BOOL D3DXRS_INT4 D3DXRS_FLOAT4 D3DXRS_SAMPLER ; -TYPEDEF: int D3DXREGISTER_SET TYPEDEF: D3DXREGISTER_SET* LPD3DXREGISTER_SET -C-ENUM: +C-ENUM: D3DXPARAMETER_CLASS D3DXPC_SCALAR D3DXPC_VECTOR D3DXPC_MATRIX_ROWS D3DXPC_MATRIX_COLUMNS D3DXPC_OBJECT D3DXPC_STRUCT ; -TYPEDEF: int D3DXPARAMETER_CLASS TYPEDEF: D3DXPARAMETER_CLASS* LPD3DXPARAMETER_CLASS -C-ENUM: +C-ENUM: D3DXPARAMETER_TYPE D3DXPT_VOID D3DXPT_BOOL D3DXPT_INT @@ -80,7 +78,6 @@ C-ENUM: D3DXPT_PIXELFRAGMENT D3DXPT_VERTEXFRAGMENT D3DXPT_UNSUPPORTED ; -TYPEDEF: int D3DXPARAMETER_TYPE TYPEDEF: D3DXPARAMETER_TYPE* LPD3DXPARAMETER_TYPE STRUCT: D3DXCONSTANTTABLE_DESC @@ -161,10 +158,9 @@ COM-INTERFACE: ID3DXTextureShader IUnknown {3E3D67F8-AA7A-405d-A857-BA01D4758426 HRESULT SetMatrixTransposeArray ( D3DXHANDLE hConstant, D3DXMATRIX* pMatrix, UINT Count ) HRESULT SetMatrixTransposePointerArray ( D3DXHANDLE hConstant, D3DXMATRIX** ppMatrix, UINT Count ) ; -C-ENUM: +C-ENUM: D3DXINCLUDE_TYPE D3DXINC_LOCAL D3DXINC_SYSTEM ; -TYPEDEF: int D3DXINCLUDE_TYPE TYPEDEF: D3DXINCLUDE_TYPE* LPD3DXINCLUDE_TYPE C-TYPE: ID3DXInclude diff --git a/basis/windows/directx/dcommon/dcommon.factor b/basis/windows/directx/dcommon/dcommon.factor index 3b80bd4509..32d69f924c 100644 --- a/basis/windows/directx/dcommon/dcommon.factor +++ b/basis/windows/directx/dcommon/dcommon.factor @@ -1,7 +1,7 @@ USING: alien.c-types alien.syntax ; IN: windows.directx.dcommon -C-ENUM: DWRITE_MEASURING_MODE_NATURAL - DWRITE_MEASURING_MODE_GDI_CLASSIC - DWRITE_MEASURING_MODE_GDI_NATURAL ; -TYPEDEF: int DWRITE_MEASURING_MODE +C-ENUM: DWRITE_MEASURING_MODE + DWRITE_MEASURING_MODE_NATURAL + DWRITE_MEASURING_MODE_GDI_CLASSIC + DWRITE_MEASURING_MODE_GDI_NATURAL ; diff --git a/basis/windows/directx/dwrite/dwrite.factor b/basis/windows/directx/dwrite/dwrite.factor old mode 100644 new mode 100755 index 3e4167ebad..91dd422667 --- a/basis/windows/directx/dwrite/dwrite.factor +++ b/basis/windows/directx/dwrite/dwrite.factor @@ -5,7 +5,7 @@ IN: windows.directx.dwrite LIBRARY: dwrite -C-ENUM: +C-ENUM: DWRITE_FONT_FILE_TYPE DWRITE_FONT_FILE_TYPE_UNKNOWN DWRITE_FONT_FILE_TYPE_CFF DWRITE_FONT_FILE_TYPE_TRUETYPE @@ -14,9 +14,8 @@ C-ENUM: DWRITE_FONT_FILE_TYPE_TYPE1_PFB DWRITE_FONT_FILE_TYPE_VECTOR DWRITE_FONT_FILE_TYPE_BITMAP ; -TYPEDEF: int DWRITE_FONT_FILE_TYPE -C-ENUM: +C-ENUM: DWRITE_FONT_FACE_TYPE DWRITE_FONT_FACE_TYPE_CFF DWRITE_FONT_FACE_TYPE_TRUETYPE DWRITE_FONT_FACE_TYPE_TRUETYPE_COLLECTION @@ -24,51 +23,49 @@ C-ENUM: DWRITE_FONT_FACE_TYPE_VECTOR DWRITE_FONT_FACE_TYPE_BITMAP DWRITE_FONT_FACE_TYPE_UNKNOWN ; -TYPEDEF: int DWRITE_FONT_FACE_TYPE -CONSTANT: DWRITE_FONT_SIMULATIONS_NONE 0 -CONSTANT: DWRITE_FONT_SIMULATIONS_BOLD 1 -CONSTANT: DWRITE_FONT_SIMULATIONS_OBLIQUE 2 -TYPEDEF: int DWRITE_FONT_SIMULATIONS +C-ENUM: DWRITE_FONT_SIMULATIONS + DWRITE_FONT_SIMULATIONS_NONE + DWRITE_FONT_SIMULATIONS_BOLD + DWRITE_FONT_SIMULATIONS_OBLIQUE ; -CONSTANT: DWRITE_FONT_WEIGHT_THIN 100 -CONSTANT: DWRITE_FONT_WEIGHT_EXTRA_LIGHT 200 -CONSTANT: DWRITE_FONT_WEIGHT_ULTRA_LIGHT 200 -CONSTANT: DWRITE_FONT_WEIGHT_LIGHT 300 -CONSTANT: DWRITE_FONT_WEIGHT_NORMAL 400 -CONSTANT: DWRITE_FONT_WEIGHT_REGULAR 400 -CONSTANT: DWRITE_FONT_WEIGHT_MEDIUM 500 -CONSTANT: DWRITE_FONT_WEIGHT_DEMI_BOLD 600 -CONSTANT: DWRITE_FONT_WEIGHT_SEMI_BOLD 600 -CONSTANT: DWRITE_FONT_WEIGHT_BOLD 700 -CONSTANT: DWRITE_FONT_WEIGHT_EXTRA_BOLD 800 -CONSTANT: DWRITE_FONT_WEIGHT_ULTRA_BOLD 800 -CONSTANT: DWRITE_FONT_WEIGHT_BLACK 900 -CONSTANT: DWRITE_FONT_WEIGHT_HEAVY 900 -CONSTANT: DWRITE_FONT_WEIGHT_EXTRA_BLACK 950 -CONSTANT: DWRITE_FONT_WEIGHT_ULTRA_BLACK 950 -TYPEDEF: int DWRITE_FONT_WEIGHT +C-ENUM: DWRITE_FONT_WEIGHT + { DWRITE_FONT_WEIGHT_THIN 100 } + { DWRITE_FONT_WEIGHT_EXTRA_LIGHT 200 } + { DWRITE_FONT_WEIGHT_ULTRA_LIGHT 200 } + { DWRITE_FONT_WEIGHT_LIGHT 300 } + { DWRITE_FONT_WEIGHT_NORMAL 400 } + { DWRITE_FONT_WEIGHT_REGULAR 400 } + { DWRITE_FONT_WEIGHT_MEDIUM 500 } + { DWRITE_FONT_WEIGHT_DEMI_BOLD 600 } + { DWRITE_FONT_WEIGHT_SEMI_BOLD 600 } + { DWRITE_FONT_WEIGHT_BOLD 700 } + { DWRITE_FONT_WEIGHT_EXTRA_BOLD 800 } + { DWRITE_FONT_WEIGHT_ULTRA_BOLD 800 } + { DWRITE_FONT_WEIGHT_BLACK 900 } + { DWRITE_FONT_WEIGHT_HEAVY 900 } + { DWRITE_FONT_WEIGHT_EXTRA_BLACK 950 } + { DWRITE_FONT_WEIGHT_ULTRA_BLACK 950 } ; -CONSTANT: DWRITE_FONT_STRETCH_UNDEFINED 0 -CONSTANT: DWRITE_FONT_STRETCH_ULTRA_CONDENSED 1 -CONSTANT: DWRITE_FONT_STRETCH_EXTRA_CONDENSED 2 -CONSTANT: DWRITE_FONT_STRETCH_CONDENSED 3 -CONSTANT: DWRITE_FONT_STRETCH_SEMI_CONDENSED 4 -CONSTANT: DWRITE_FONT_STRETCH_NORMAL 5 -CONSTANT: DWRITE_FONT_STRETCH_MEDIUM 5 -CONSTANT: DWRITE_FONT_STRETCH_SEMI_EXPANDED 6 -CONSTANT: DWRITE_FONT_STRETCH_EXPANDED 7 -CONSTANT: DWRITE_FONT_STRETCH_EXTRA_EXPANDED 8 -CONSTANT: DWRITE_FONT_STRETCH_ULTRA_EXPANDED 9 -TYPEDEF: int DWRITE_FONT_STRETCH +C-ENUM: DWRITE_FONT_STRETCH + { DWRITE_FONT_STRETCH_UNDEFINED 0 } + { DWRITE_FONT_STRETCH_ULTRA_CONDENSED 1 } + { DWRITE_FONT_STRETCH_EXTRA_CONDENSED 2 } + { DWRITE_FONT_STRETCH_CONDENSED 3 } + { DWRITE_FONT_STRETCH_SEMI_CONDENSED 4 } + { DWRITE_FONT_STRETCH_NORMAL 5 } + { DWRITE_FONT_STRETCH_MEDIUM 5 } + { DWRITE_FONT_STRETCH_SEMI_EXPANDED 6 } + { DWRITE_FONT_STRETCH_EXPANDED 7 } + { DWRITE_FONT_STRETCH_EXTRA_EXPANDED 8 } + { DWRITE_FONT_STRETCH_ULTRA_EXPANDED 9 } ; -C-ENUM: +C-ENUM: DWRITE_FONT_STYLE DWRITE_FONT_STYLE_NORMAL DWRITE_FONT_STYLE_OBLIQUE DWRITE_FONT_STYLE_ITALIC ; -TYPEDEF: int DWRITE_FONT_STYLE -C-ENUM: +C-ENUM: DWRITE_INFORMATIONAL_STRING_ID DWRITE_INFORMATIONAL_STRING_NONE DWRITE_INFORMATIONAL_STRING_COPYRIGHT_NOTICE DWRITE_INFORMATIONAL_STRING_VERSION_STRINGS @@ -85,7 +82,6 @@ C-ENUM: DWRITE_INFORMATIONAL_STRING_PREFERRED_FAMILY_NAMES DWRITE_INFORMATIONAL_STRING_PREFERRED_SUBFAMILY_NAMES DWRITE_INFORMATIONAL_STRING_SAMPLE_TEXT ; -TYPEDEF: int DWRITE_INFORMATIONAL_STRING_ID STRUCT: DWRITE_FONT_METRICS { designUnitsPerEm USHORT } @@ -112,10 +108,9 @@ STRUCT: DWRITE_GLYPH_OFFSET { advanceOffset FLOAT } { ascenderOffset FLOAT } ; -C-ENUM: +C-ENUM: DWRITE_FACTORY_TYPE DWRITE_FACTORY_TYPE_SHARED DWRITE_FACTORY_TYPE_ISOLATED ; -TYPEDEF: int DWRITE_FACTORY_TYPE C-TYPE: IDWriteFontFileStream @@ -138,14 +133,12 @@ COM-INTERFACE: IDWriteFontFile IUnknown {739d886a-cef5-47dc-8769-1a8b41bebbb0} HRESULT GetLoader ( IDWriteFontFileLoader** fontFileLoader ) HRESULT Analyze ( BOOL* isSupportedFontType, DWRITE_FONT_FILE_TYPE* fontFileType, DWRITE_FONT_FACE_TYPE* fontFaceType, UINT32* numberOfFaces ) ; -TYPEDEF: int DWRITE_PIXEL_GEOMETRY -C-ENUM: +C-ENUM: DWRITE_PIXEL_GEOMETRY DWRITE_PIXEL_GEOMETRY_FLAT DWRITE_PIXEL_GEOMETRY_RGB DWRITE_PIXEL_GEOMETRY_BGR ; -TYPEDEF: int DWRITE_RENDERING_MODE -C-ENUM: +C-ENUM: DWRITE_RENDERING_MODE DWRITE_RENDERING_MODE_DEFAULT DWRITE_RENDERING_MODE_ALIASED DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC @@ -240,39 +233,32 @@ COM-INTERFACE: IDWriteFont IUnknown {acd16696-8c14-4f5d-877e-fe3fc1d32737} HRESULT HasCharacter ( UINT32 unicodeValue, BOOL* exists ) HRESULT CreateFontFace ( IDWriteFontFace** fontFace ) ; -TYPEDEF: int DWRITE_READING_DIRECTION -C-ENUM: +C-ENUM: DWRITE_READING_DIRECTION DWRITE_READING_DIRECTION_LEFT_TO_RIGHT DWRITE_READING_DIRECTION_RIGHT_TO_LEFT ; -TYPEDEF: int DWRITE_FLOW_DIRECTION -C-ENUM: +C-ENUM: DWRITE_FLOW_DIRECTION DWRITE_FLOW_DIRECTION_TOP_TO_BOTTOM ; -TYPEDEF: int DWRITE_TEXT_ALIGNMENT -C-ENUM: +C-ENUM: DWRITE_TEXT_ALIGNMENT DWRITE_TEXT_ALIGNMENT_LEADING DWRITE_TEXT_ALIGNMENT_TRAILING DWRITE_TEXT_ALIGNMENT_CENTER ; -TYPEDEF: int DWRITE_PARAGRAPH_ALIGNMENT -C-ENUM: +C-ENUM: DWRITE_PARAGRAPH_ALIGNMENT DWRITE_PARAGRAPH_ALIGNMENT_NEAR DWRITE_PARAGRAPH_ALIGNMENT_FAR DWRITE_PARAGRAPH_ALIGNMENT_CENTER ; -TYPEDEF: int DWRITE_WORD_WRAPPING -C-ENUM: +C-ENUM: DWRITE_WORD_WRAPPING DWRITE_WORD_WRAPPING_WRAP DWRITE_WORD_WRAPPING_NO_WRAP ; -TYPEDEF: int DWRITE_LINE_SPACING_METHOD -C-ENUM: +C-ENUM: DWRITE_LINE_SPACING_METHOD DWRITE_LINE_SPACING_METHOD_DEFAULT DWRITE_LINE_SPACING_METHOD_UNIFORM ; -TYPEDEF: int DWRITE_TRIMMING_GRANULARITY -C-ENUM: +C-ENUM: DWRITE_TRIMMING_GRANULARITY DWRITE_TRIMMING_GRANULARITY_NONE DWRITE_TRIMMING_GRANULARITY_CHARACTER DWRITE_TRIMMING_GRANULARITY_WORD ; @@ -410,31 +396,29 @@ COM-INTERFACE: IDWriteTypography IUnknown {55f1112b-1dc2-4b3c-9541-f46894ed85b6} UINT32 GetFontFeatureCount ( ) HRESULT GetFontFeature ( UINT32 fontFeatureIndex, DWRITE_FONT_FEATURE* fontFeature ) ; -CONSTANT: DWRITE_SCRIPT_SHAPES_DEFAULT 0 -CONSTANT: DWRITE_SCRIPT_SHAPES_NO_VISUAL 1 -TYPEDEF: int DWRITE_SCRIPT_SHAPES +C-ENUM: DWRITE_SCRIPT_SHAPES + DWRITE_SCRIPT_SHAPES_DEFAULT + DWRITE_SCRIPT_SHAPES_NO_VISUAL ; STRUCT: DWRITE_SCRIPT_ANALYSIS { script USHORT } { shapes DWRITE_SCRIPT_SHAPES } ; -C-ENUM: +C-ENUM: DWRITE_BREAK_CONDITION DWRITE_BREAK_CONDITION_NEUTRAL DWRITE_BREAK_CONDITION_CAN_BREAK DWRITE_BREAK_CONDITION_MAY_NOT_BREAK DWRITE_BREAK_CONDITION_MUST_BREAK ; -TYPEDEF: int DWRITE_BREAK_CONDITION STRUCT: DWRITE_LINE_BREAKPOINT { data BYTE } ; -C-ENUM: +C-ENUM: DWRITE_NUMBER_SUBSTITUTION_METHOD DWRITE_NUMBER_SUBSTITUTION_METHOD_FROM_CULTURE DWRITE_NUMBER_SUBSTITUTION_METHOD_CONTEXTUAL DWRITE_NUMBER_SUBSTITUTION_METHOD_NONE DWRITE_NUMBER_SUBSTITUTION_METHOD_NATIONAL DWRITE_NUMBER_SUBSTITUTION_METHOD_TRADITIONAL ; -TYPEDEF: int DWRITE_NUMBER_SUBSTITUTION_METHOD COM-INTERFACE: IDWriteNumberSubstitution IUnknown {14885CC9-BAB0-4f90-B6ED-5C366A2CD03D} ; @@ -628,9 +612,9 @@ COM-INTERFACE: IDWriteGdiInterop IUnknown {1edd9491-9853-4299-898f-6432983b6f3a} HRESULT CreateFontFaceFromHdc ( HDC hdc, IDWriteFontFace** fontFace ) HRESULT CreateBitmapRenderTarget ( HDC hdc, UINT32 width, UINT32 height, IDWriteBitmapRenderTarget** renderTarget ) ; -C-ENUM: DWRITE_TEXTURE_ALIASED_1x1 - DWRITE_TEXTURE_CLEARTYPE_3x1 ; -TYPEDEF: int DWRITE_TEXTURE_TYPE +C-ENUM: DWRITE_TEXTURE_TYPE + DWRITE_TEXTURE_ALIASED_1x1 + DWRITE_TEXTURE_CLEARTYPE_3x1 ; CONSTANT: DWRITE_ALPHA_MAX 255 diff --git a/basis/windows/directx/dxgitype/dxgitype.factor b/basis/windows/directx/dxgitype/dxgitype.factor index 0b318f7af1..bdab49e652 100644 --- a/basis/windows/directx/dxgitype/dxgitype.factor +++ b/basis/windows/directx/dxgitype/dxgitype.factor @@ -47,23 +47,23 @@ STRUCT: DXGI_RATIONAL { Numerator UINT } { Denominator UINT } ; -C-ENUM: DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED - DXGI_MODE_SCANLINE_ORDER_PROGRESSIVE - DXGI_MODE_SCANLINE_ORDER_UPPER_FIELD_FIRST - DXGI_MODE_SCANLINE_ORDER_LOWER_FIELD_FIRST ; -TYPEDEF: int DXGI_MODE_SCANLINE_ORDER +C-ENUM: DXGI_MODE_SCANLINE_ORDER + DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED + DXGI_MODE_SCANLINE_ORDER_PROGRESSIVE + DXGI_MODE_SCANLINE_ORDER_UPPER_FIELD_FIRST + DXGI_MODE_SCANLINE_ORDER_LOWER_FIELD_FIRST ; -C-ENUM: DXGI_MODE_SCALING_UNSPECIFIED - DXGI_MODE_SCALING_CENTERED - DXGI_MODE_SCALING_STRETCHED ; -TYPEDEF: int DXGI_MODE_SCALING +C-ENUM: DXGI_MODE_SCALING + DXGI_MODE_SCALING_UNSPECIFIED + DXGI_MODE_SCALING_CENTERED + DXGI_MODE_SCALING_STRETCHED ; -C-ENUM: DXGI_MODE_ROTATION_UNSPECIFIED - DXGI_MODE_ROTATION_IDENTITY - DXGI_MODE_ROTATION_ROTATE90 - DXGI_MODE_ROTATION_ROTATE180 - DXGI_MODE_ROTATION_ROTATE270 ; -TYPEDEF: int DXGI_MODE_ROTATION +C-ENUM: DXGI_MODE_ROTATION + DXGI_MODE_ROTATION_UNSPECIFIED + DXGI_MODE_ROTATION_IDENTITY + DXGI_MODE_ROTATION_ROTATE90 + DXGI_MODE_ROTATION_ROTATE180 + DXGI_MODE_ROTATION_ROTATE270 ; STRUCT: DXGI_MODE_DESC { Width UINT } diff --git a/basis/windows/directx/xapo/xapo.factor b/basis/windows/directx/xapo/xapo.factor index 5878af80e0..f071ea08d5 100644 --- a/basis/windows/directx/xapo/xapo.factor +++ b/basis/windows/directx/xapo/xapo.factor @@ -39,10 +39,9 @@ STRUCT: XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS { pFormat WAVEFORMATEX* } { MaxFrameCount UINT32 } ; -C-ENUM: - XAPO_BUFFER_SILENT - XAPO_BUFFER_VALID ; -TYPEDEF: int XAPO_BUFFER_FLAGS +C-ENUM: XAPO_BUFFER_FLAGS + XAPO_BUFFER_SILENT + XAPO_BUFFER_VALID ; STRUCT: XAPO_PROCESS_BUFFER_PARAMETERS { pBuffer void* } diff --git a/basis/windows/directx/xaudio2/xaudio2.factor b/basis/windows/directx/xaudio2/xaudio2.factor index 303eaf26b1..bbbf55b34f 100644 --- a/basis/windows/directx/xaudio2/xaudio2.factor +++ b/basis/windows/directx/xaudio2/xaudio2.factor @@ -133,12 +133,11 @@ STRUCT: XAUDIO2_EFFECT_CHAIN { EffectCount UINT32 } { pEffectDescriptors XAUDIO2_EFFECT_DESCRIPTOR* } ; -C-ENUM: +C-ENUM: XAUDIO2_FILTER_TYPE LowPassFilter BandPassFilter HighPassFilter NotchFilter ; -TYPEDEF: int XAUDIO2_FILTER_TYPE STRUCT: XAUDIO2_FILTER_PARAMETERS { Type XAUDIO2_FILTER_TYPE } diff --git a/basis/windows/dwmapi/dwmapi.factor b/basis/windows/dwmapi/dwmapi.factor old mode 100644 new mode 100755 index 998846ebc2..60fa5b4d83 --- a/basis/windows/dwmapi/dwmapi.factor +++ b/basis/windows/dwmapi/dwmapi.factor @@ -1,6 +1,7 @@ ! (c)2009 Joe Groff bsd license -USING: alien.c-types alien.data alien.libraries alien.syntax -classes.struct kernel math system-info.windows windows.types ; +USING: alien alien.c-types alien.data alien.libraries +alien.syntax classes.struct kernel math system-info.windows +windows.types ; IN: windows.dwmapi STRUCT: MARGINS @@ -21,7 +22,7 @@ STRUCT: DWM_BLURBEHIND : full-window-margins ( -- MARGINS ) -1 -1 -1 -1 ; inline -<< "dwmapi" "dwmapi.dll" "stdcall" add-library >> +<< "dwmapi" "dwmapi.dll" stdcall add-library >> LIBRARY: dwmapi diff --git a/basis/windows/kernel32/kernel32.factor b/basis/windows/kernel32/kernel32.factor index c2622cbf48..a7c460f525 100644 --- a/basis/windows/kernel32/kernel32.factor +++ b/basis/windows/kernel32/kernel32.factor @@ -199,7 +199,7 @@ CONSTANT: THREAD_PRIORITY_LOWEST -2 CONSTANT: THREAD_PRIORITY_NORMAL 0 CONSTANT: THREAD_PRIORITY_TIME_CRITICAL 15 -C-ENUM: +C-ENUM: COMPUTER_NAME_FORMAT ComputerNameNetBIOS ComputerNameDnsHostname ComputerNameDnsDomain @@ -210,8 +210,6 @@ C-ENUM: ComputerNamePhysicalDnsFullyQualified ComputerNameMax ; -TYPEDEF: uint COMPUTER_NAME_FORMAT - STRUCT: OVERLAPPED { internal UINT_PTR } { internal-high UINT_PTR } diff --git a/basis/windows/nt/nt.factor b/basis/windows/nt/nt.factor index 8e831e153e..4b119ba5fa 100644 --- a/basis/windows/nt/nt.factor +++ b/basis/windows/nt/nt.factor @@ -1,35 +1,35 @@ USING: alien sequences alien.libraries ; { - { "advapi32" "advapi32.dll" "stdcall" } - { "dinput" "dinput8.dll" "stdcall" } - { "gdi32" "gdi32.dll" "stdcall" } - { "user32" "user32.dll" "stdcall" } - { "kernel32" "kernel32.dll" "stdcall" } - { "winsock" "ws2_32.dll" "stdcall" } - { "mswsock" "mswsock.dll" "stdcall" } - { "shell32" "shell32.dll" "stdcall" } - { "libc" "msvcrt.dll" "cdecl" } - { "libm" "msvcrt.dll" "cdecl" } - { "gl" "opengl32.dll" "stdcall" } - { "glu" "glu32.dll" "stdcall" } - { "ole32" "ole32.dll" "stdcall" } - { "usp10" "usp10.dll" "stdcall" } - { "psapi" "psapi.dll" "stdcall" } - { "xinput" "xinput1_3.dll" "stdcall" } - { "dxgi" "dxgi.dll" "stdcall" } - { "d2d1" "d2d1.dll" "stdcall" } - { "d3d9" "d3d9.dll" "stdcall" } - { "d3d10" "d3d10.dll" "stdcall" } - { "d3d10_1" "d3d10_1.dll" "stdcall" } - { "d3d11" "d3d11.dll" "stdcall" } - { "d3dcompiler" "d3dcompiler_42.dll" "stdcall" } - { "d3dcsx" "d3dcsx_42.dll" "stdcall" } - { "d3dx9" "d3dx9_42.dll" "stdcall" } - { "d3dx10" "d3dx10_42.dll" "stdcall" } - { "d3dx11" "d3dx11_42.dll" "stdcall" } - { "dwrite" "dwrite.dll" "stdcall" } - { "x3daudio" "x3daudio1_6.dll" "stdcall" } - { "xactengine" "xactengine3_5.dll" "stdcall" } - { "xapofx" "xapofx1_3.dll" "stdcall" } - { "xaudio2" "xaudio2_5.dll" "stdcall" } + { "advapi32" "advapi32.dll" stdcall } + { "dinput" "dinput8.dll" stdcall } + { "gdi32" "gdi32.dll" stdcall } + { "user32" "user32.dll" stdcall } + { "kernel32" "kernel32.dll" stdcall } + { "winsock" "ws2_32.dll" stdcall } + { "mswsock" "mswsock.dll" stdcall } + { "shell32" "shell32.dll" stdcall } + { "libc" "msvcrt.dll" cdecl } + { "libm" "msvcrt.dll" cdecl } + { "gl" "opengl32.dll" stdcall } + { "glu" "glu32.dll" stdcall } + { "ole32" "ole32.dll" stdcall } + { "usp10" "usp10.dll" stdcall } + { "psapi" "psapi.dll" stdcall } + { "xinput" "xinput1_3.dll" stdcall } + { "dxgi" "dxgi.dll" stdcall } + { "d2d1" "d2d1.dll" stdcall } + { "d3d9" "d3d9.dll" stdcall } + { "d3d10" "d3d10.dll" stdcall } + { "d3d10_1" "d3d10_1.dll" stdcall } + { "d3d11" "d3d11.dll" stdcall } + { "d3dcompiler" "d3dcompiler_42.dll" stdcall } + { "d3dcsx" "d3dcsx_42.dll" stdcall } + { "d3dx9" "d3dx9_42.dll" stdcall } + { "d3dx10" "d3dx10_42.dll" stdcall } + { "d3dx11" "d3dx11_42.dll" stdcall } + { "dwrite" "dwrite.dll" stdcall } + { "x3daudio" "x3daudio1_6.dll" stdcall } + { "xactengine" "xactengine3_5.dll" stdcall } + { "xapofx" "xapofx1_3.dll" stdcall } + { "xaudio2" "xaudio2_5.dll" stdcall } } [ first3 add-library ] each diff --git a/basis/windows/usp10/usp10.factor b/basis/windows/usp10/usp10.factor index 1c33aaf940..21b4f77434 100644 --- a/basis/windows/usp10/usp10.factor +++ b/basis/windows/usp10/usp10.factor @@ -37,22 +37,23 @@ FUNCTION: HRESULT ScriptLayout ( int* piLogicalToVisual ) ; -C-ENUM: SCRIPT_JUSTIFY_NONE -SCRIPT_JUSTIFY_ARABIC_BLANK -SCRIPT_JUSTIFY_CHARACTER -SCRIPT_JUSTIFY_RESERVED1 -SCRIPT_JUSTIFY_BLANK -SCRIPT_JUSTIFY_RESERVED2 -SCRIPT_JUSTIFY_RESERVED3 -SCRIPT_JUSTIFY_ARABIC_NORMAL -SCRIPT_JUSTIFY_ARABIC_KASHIDA -SCRIPT_JUSTIFY_ALEF -SCRIPT_JUSTIFY_HA -SCRIPT_JUSTIFY_RA -SCRIPT_JUSTIFY_BA -SCRIPT_JUSTIFY_BARA -SCRIPT_JUSTIFY_SEEN -SCRIPT_JUSTIFFY_RESERVED4 ; +C-ENUM: f + SCRIPT_JUSTIFY_NONE + SCRIPT_JUSTIFY_ARABIC_BLANK + SCRIPT_JUSTIFY_CHARACTER + SCRIPT_JUSTIFY_RESERVED1 + SCRIPT_JUSTIFY_BLANK + SCRIPT_JUSTIFY_RESERVED2 + SCRIPT_JUSTIFY_RESERVED3 + SCRIPT_JUSTIFY_ARABIC_NORMAL + SCRIPT_JUSTIFY_ARABIC_KASHIDA + SCRIPT_JUSTIFY_ALEF + SCRIPT_JUSTIFY_HA + SCRIPT_JUSTIFY_RA + SCRIPT_JUSTIFY_BA + SCRIPT_JUSTIFY_BARA + SCRIPT_JUSTIFY_SEEN + SCRIPT_JUSTIFFY_RESERVED4 ; STRUCT: SCRIPT_VISATTR { flags WORD } ; diff --git a/basis/x11/constants/constants.factor b/basis/x11/constants/constants.factor index 763cddaaf1..64c7e2f8dd 100644 --- a/basis/x11/constants/constants.factor +++ b/basis/x11/constants/constants.factor @@ -406,4 +406,4 @@ CONSTANT: MSBFirst 1 ! * EXTENDED WINDOW MANAGER HINTS ! ***************************************************************** -C-ENUM: _NET_WM_STATE_REMOVE _NET_WM_STATE_ADD _NET_WM_STATE_TOGGLE ; +C-ENUM: f _NET_WM_STATE_REMOVE _NET_WM_STATE_ADD _NET_WM_STATE_TOGGLE ; diff --git a/core/alien/alien-docs.factor b/core/alien/alien-docs.factor index 5f91d4c695..96eb9002be 100644 --- a/core/alien/alien-docs.factor +++ b/core/alien/alien-docs.factor @@ -5,6 +5,21 @@ alien.libraries alien.c-types quotations kernel sequences ; IN: alien +HELP: cdecl +{ $description "This symbol is passed as the " { $snippet "abi" } " argument to " { $link alien-indirect } ", " { $link alien-callback } ", " { $link alien-assembly } ", and " { $link add-library } " to indicate that the standard C calling convention should be used, where the caller cleans up the stack frame after calling the function. This symbol only has meaning on 32-bit x86 platforms." } ; + +HELP: stdcall +{ $description "This symbol is passed as the " { $snippet "abi" } " argument to " { $link alien-indirect } ", " { $link alien-callback } ", " { $link alien-assembly } ", and " { $link add-library } " to indicate that the Windows API calling convention should be used, where the called function cleans up its own stack frame before returning to the caller. This symbol only has meaning on 32-bit x86 platforms." } ; + +HELP: fastcall +{ $warning "In the current implementation this ABI only works for functions that take only integer and pointer arguments." } +{ $description "This symbol is passed as the " { $snippet "abi" } " argument to " { $link alien-indirect } ", " { $link alien-callback } ", " { $link alien-assembly } ", and " { $link add-library } " to indicate that the \"fast call\" calling convention should be used, where the first two integer or pointer arguments are passed in registers and the function cleans up its own stack frame before returning to the caller. This symbol only has meaning on 32-bit x86 platforms." } ; + +HELP: thiscall +{ $description "This symbol is passed as the " { $snippet "abi" } " argument to " { $link alien-indirect } ", " { $link alien-callback } ", " { $link alien-assembly } ", and " { $link add-library } " to indicate that Microsoft Visual C++ calling convention should be used, where the first argument (which must be a \"this\" pointer) is passed in a register and the function cleans up its own stack frame before returning to the caller. This symbol only has meaning on 32-bit x86 platforms." } ; + +{ cdecl stdcall fastcall thiscall } related-words + HELP: >c-ptr { $values { "obj" object } { "c-ptr" c-ptr } } { $contract "Outputs a pointer to the binary data of this object." } ; @@ -85,7 +100,7 @@ HELP: alien-indirect-error } ; HELP: alien-indirect -{ $values { "args..." "zero or more objects passed to the C function" } { "funcptr" "a C function pointer" } { "return" "a C return type" } { "parameters" "a sequence of C parameter types" } { "abi" "one of " { $snippet "\"cdecl\"" } " or " { $snippet "\"stdcall\"" } } { "return..." "the return value of the function, if not " { $link void } } } +{ $values { "args..." "zero or more objects passed to the C function" } { "funcptr" "a C function pointer" } { "return" "a C return type" } { "parameters" "a sequence of C parameter types" } { "abi" "one of " { $link cdecl } " or " { $link stdcall } } { "return..." "the return value of the function, if not " { $link void } } } { $description "Invokes a C function pointer passed on the data stack. Input parameters are taken from the data stack following the function pointer, and the return value is pushed on the data stack after the function returns. A return type of " { $link void } " indicates that no value is to be expected." } @@ -101,7 +116,7 @@ HELP: alien-callback-error } ; HELP: alien-callback -{ $values { "return" "a C return type" } { "parameters" "a sequence of C parameter types" } { "abi" "one of " { $snippet "\"cdecl\"" } " or " { $snippet "\"stdcall\"" } } { "quot" quotation } { "alien" alien } } +{ $values { "return" "a C return type" } { "parameters" "a sequence of C parameter types" } { "abi" "one of " { $link cdecl } " or " { $link stdcall } } { "quot" quotation } { "alien" alien } } { $description "Defines a callback from C to Factor which accepts the given set of parameters from the C caller, pushes them on the data stack, calls the quotation, and passes a return value back to the C caller. A return type of " { $snippet "void" } " indicates that no value is to be returned." $nl @@ -114,7 +129,7 @@ HELP: alien-callback "A simple example, showing a C function which returns the difference of two given integers:" { $code ": difference-callback ( -- alien )" - " int { int int } \"cdecl\" [ - ] alien-callback ;" + " int { int int } cdecl [ - ] alien-callback ;" } } { $errors "Throws an " { $link alien-callback-error } " if the word calling " { $link alien-callback } " is not compiled." } ; @@ -128,7 +143,7 @@ HELP: alien-assembly-error } ; HELP: alien-assembly -{ $values { "args..." "zero or more objects passed to the C function" } { "return" "a C return type" } { "parameters" "a sequence of C parameter types" } { "abi" "one of " { $snippet "\"cdecl\"" } " or " { $snippet "\"stdcall\"" } } { "quot" quotation } { "return..." "the return value of the function, if not " { $link void } } } +{ $values { "args..." "zero or more objects passed to the C function" } { "return" "a C return type" } { "parameters" "a sequence of C parameter types" } { "abi" "one of " { $link cdecl } " or " { $link stdcall } } { "quot" quotation } { "return..." "the return value of the function, if not " { $link void } } } { $description "Invokes arbitrary machine code, generated at compile-time by the quotation. Input parameters are taken from the data stack, and the return value is pushed on the data stack after the function returns. A return type of " { $link void } " indicates that no value is to be expected." } diff --git a/core/alien/alien.factor b/core/alien/alien.factor index a44d703fbc..27e326a557 100644 --- a/core/alien/alien.factor +++ b/core/alien/alien.factor @@ -64,6 +64,10 @@ M: alien equal? M: pinned-alien hashcode* nip dup expired>> [ drop 1234 ] [ alien-address ] if ; +SINGLETONS: stdcall thiscall fastcall cdecl mingw ; + +UNION: abi stdcall thiscall fastcall cdecl mingw ; + ERROR: alien-callback-error ; : alien-callback ( return parameters abi quot -- alien ) diff --git a/extra/benchmark/fib6/fib6.factor b/extra/benchmark/fib6/fib6.factor index 561110d941..1ae1c6a34d 100644 --- a/extra/benchmark/fib6/fib6.factor +++ b/extra/benchmark/fib6/fib6.factor @@ -2,12 +2,12 @@ USING: math kernel alien alien.c-types ; IN: benchmark.fib6 : fib ( x -- y ) - int { int } "cdecl" [ + int { int } cdecl [ dup 1 <= [ drop 1 ] [ 1 - dup fib swap 1 - fib + ] if ] alien-callback - int { int } "cdecl" alien-indirect ; + int { int } cdecl alien-indirect ; : fib-main ( -- ) 32 fib drop ; diff --git a/extra/chipmunk/ffi/ffi.factor b/extra/chipmunk/ffi/ffi.factor index 0142b57a77..857e746d26 100644 --- a/extra/chipmunk/ffi/ffi.factor +++ b/extra/chipmunk/ffi/ffi.factor @@ -1,8 +1,9 @@ ! Copyright (C) 2010 Erik Charlebois ! See http:// factorcode.org/license.txt for BSD license. -USING: accessors alien.c-types alien.syntax classes.struct combinators -combinators.short-circuit kernel math math.order sequences -typed specialized-arrays locals system alien.libraries ; +USING: accessors alien alien.c-types alien.libraries +alien.syntax classes.struct combinators combinators.short-circuit +kernel math math.order sequences typed specialized-arrays locals +system ; SPECIALIZED-ARRAY: void* IN: chipmunk.ffi @@ -11,7 +12,7 @@ IN: chipmunk.ffi { [ os windows? ] [ "chipmunk.dll" ] } { [ os macosx? ] [ "libchipmunk.dylib" ] } { [ os unix? ] [ "libchipmunk.so" ] } -} cond "cdecl" add-library +} cond cdecl add-library "chipmunk" deploy-library >> @@ -348,12 +349,11 @@ STRUCT: cpSegmentQueryInfo { t cpFloat } { n cpVect } ; -C-ENUM: +C-ENUM: cpShapeType CP_CIRCLE_SHAPE CP_SEGMENT_SHAPE CP_POLY_SHAPE CP_NUM_SHAPES ; -TYPEDEF: int cpShapeType CALLBACK: cpBB cacheData_cb ( cpShape* shape, cpVect p, cpVect rot ) ; CALLBACK: void destroy_cb ( cpShape* shape ) ; @@ -482,11 +482,10 @@ STRUCT: cpContact FUNCTION: cpContact* cpContactInit ( cpContact* con, cpVect p, cpVect n, cpFloat dist, cpHashValue hash ) ; -C-ENUM: +C-ENUM: cpArbiterState cpArbiterStateNormal cpArbiterStateFirstColl cpArbiterStateIgnore ; -TYPEDEF: int cpArbiterState STRUCT: cpArbiter { numContacts int } diff --git a/extra/curses/ffi/ffi.factor b/extra/curses/ffi/ffi.factor index 222885b72c..2b52d0ec56 100644 --- a/extra/curses/ffi/ffi.factor +++ b/extra/curses/ffi/ffi.factor @@ -8,7 +8,7 @@ IN: curses.ffi { [ os winnt? ] [ "libcurses.dll" ] } { [ os macosx? ] [ "libcurses.dylib" ] } { [ os unix? ] [ "libcurses.so" ] } -} cond "cdecl" add-library >> +} cond cdecl add-library >> C-TYPE: WINDOW C-TYPE: SCREEN diff --git a/extra/cursors/cursors-tests.factor b/extra/cursors/cursors-tests.factor index 44eb6bc16c..df168a9008 100644 --- a/extra/cursors/cursors-tests.factor +++ b/extra/cursors/cursors-tests.factor @@ -1,5 +1,5 @@ ! (c)2010 Joe Groff bsd license -USING: accessors cursors make math sequences sorting tools.test ; +USING: accessors cursors kernel make math sequences sorting tools.test ; FROM: cursors => each map assoc-each assoc>map ; IN: cursors.tests @@ -12,6 +12,10 @@ IN: cursors.tests T{ linear-cursor f 1 1 } T{ linear-cursor f 5 1 } [ value>> 3 mod zero? ] -find ] unit-test +[ T{ linear-cursor f 5 1 } ] [ + T{ linear-cursor f 1 1 } T{ linear-cursor f 5 1 } [ value>> 6 = ] -find +] unit-test + [ { 1 3 } ] [ [ T{ linear-cursor f 1 2 } T{ linear-cursor f 5 2 } [ value>> , ] -each ] { } make diff --git a/extra/elf/elf.factor b/extra/elf/elf.factor index 2ad82bc23c..bf4de754d1 100644 --- a/extra/elf/elf.factor +++ b/extra/elf/elf.factor @@ -1,8 +1,11 @@ ! Copyright (C) 2010 Erik Charlebois. ! See http://factorcode.org/license.txt for BSD license. -USING: alien.c-types alien.syntax classes.struct ; +USING: accessors alien alien.c-types alien.strings alien.syntax arrays +classes.struct io.encodings.ascii kernel locals math math.intervals +sequences specialized-arrays strings typed ; IN: elf +! FFI data CONSTANT: EI_NIDENT 16 CONSTANT: EI_MAG0 0 CONSTANT: EI_MAG1 1 @@ -456,3 +459,154 @@ STRUCT: Elf32_Dyn STRUCT: Elf64_Dyn { d_tag Elf64_Sxword } { d_val Elf64_Xword } ; + +! Low-level interface +SPECIALIZED-ARRAYS: Elf32_Shdr Elf64_Shdr Elf32_Sym Elf64_Sym Elf32_Phdr Elf64_Phdr uchar ; +UNION: Elf32/64_Ehdr Elf32_Ehdr Elf64_Ehdr ; +UNION: Elf32/64_Shdr Elf32_Shdr Elf64_Shdr ; +UNION: Elf32/64_Shdr-array Elf32_Shdr-array Elf64_Shdr-array ; +UNION: Elf32/64_Sym Elf32_Sym Elf64_Sym ; +UNION: Elf32/64_Sym-array Elf32_Sym-array Elf64_Sym-array ; +UNION: Elf32/64_Phdr Elf32_Phdr Elf64_Phdr ; +UNION: Elf32/64_Phdr-array Elf32_Phdr-array Elf64_Phdr-array ; + +TYPED: 64-bit? ( elf: Elf32/64_Ehdr -- ? ) + e_ident>> EI_CLASS swap nth ELFCLASS64 = ; + +TYPED: elf-header ( c-ptr -- elf: Elf32/64_Ehdr ) + [ Elf64_Ehdr memory>struct 64-bit? ] keep swap + [ Elf64_Ehdr memory>struct ] + [ Elf32_Ehdr memory>struct ] if ; + +TYPED:: elf-section-headers ( elf: Elf32/64_Ehdr -- headers: Elf32/64_Shdr-array ) + elf [ e_shoff>> ] [ e_shnum>> ] bi :> ( off num ) + off elf >c-ptr num + elf 64-bit? + [ ] + [ ] if ; + +TYPED:: elf-program-headers ( elf: Elf32/64_Ehdr -- headers: Elf32/64_Phdr-array ) + elf [ e_phoff>> ] [ e_phnum>> ] bi :> ( off num ) + off elf >c-ptr num + elf 64-bit? + [ ] + [ ] if ; + +TYPED: elf-loadable-segments ( headers: Elf32/64_Phdr-array -- headers: Elf32/64_Phdr-array ) + [ p_type>> PT_LOAD = ] filter ; + +TYPED:: elf-segment-sections ( segment: Elf32/64_Phdr sections: Elf32/64_Shdr-array -- sections ) + segment [ p_offset>> dup ] [ p_filesz>> + ] bi [a,b) :> segment-interval + sections [ dup [ sh_offset>> dup ] [ sh_size>> + ] bi [a,b) 2array ] { } map-as :> section-intervals + section-intervals [ second segment-interval interval-intersect empty-interval = not ] + filter [ first ] map ; + +TYPED:: virtual-address-segment ( elf: Elf32/64_Ehdr address -- program-header/f ) + elf elf-program-headers elf-loadable-segments [ + [ p_vaddr>> dup ] [ p_memsz>> + ] bi [a,b) + address swap interval-contains? + ] filter [ f ] [ first ] if-empty ; + +TYPED:: virtual-address-section ( elf: Elf32/64_Ehdr address -- section-header/f ) + elf address virtual-address-segment :> segment + segment elf elf-section-headers elf-segment-sections :> sections + address segment p_vaddr>> - segment p_offset>> + :> faddress + sections [ + [ sh_offset>> dup ] [ sh_size>> + ] bi [a,b) + faddress swap interval-contains? + ] filter [ f ] [ first ] if-empty ; + +TYPED:: elf-segment-data ( elf: Elf32/64_Ehdr header: Elf32/64_Phdr -- uchar-array/f ) + header [ p_offset>> elf >c-ptr ] [ p_filesz>> ] bi ; + +TYPED:: elf-section-data ( elf: Elf32/64_Ehdr header: Elf32/64_Shdr -- uchar-array/f ) + header [ sh_offset>> elf >c-ptr ] [ sh_size>> ] bi ; + +TYPED:: elf-section-data-by-index ( elf: Elf32/64_Ehdr index -- header/f uchar-array/f ) + elf elf-section-headers :> sections + index sections nth :> header + elf header elf-section-data :> data + header data ; + +TYPED:: elf-section-name ( elf: Elf32/64_Ehdr header: Elf32/64_Shdr -- name: string ) + elf elf e_shstrndx>> elf-section-data-by-index nip >c-ptr :> section-names + header sh_name>> section-names ascii alien>string ; + +TYPED:: elf-section-data-by-name ( elf: Elf32/64_Ehdr name: string -- header/f uchar-array/f ) + elf elf-section-headers :> sections + elf e_shstrndx>> :> ndx + elf ndx sections nth elf-section-data >c-ptr :> section-names + sections 1 tail [ + sh_name>> section-names ascii alien>string name = + ] find nip + [ dup elf swap elf-section-data ] + [ f f ] if* ; + +TYPED:: elf-sections ( elf: Elf32/64_Ehdr -- sections ) + elf elf-section-headers :> sections + elf elf e_shstrndx>> elf-section-data-by-index nip >c-ptr :> section-names + sections [ + [ sh_name>> section-names + ascii alien>string ] keep 2array + ] { } map-as ; + +TYPED:: elf-symbols ( elf: Elf32/64_Ehdr section-data: uchar-array -- symbols ) + elf ".strtab" elf-section-data-by-name nip >c-ptr :> strings + section-data [ >c-ptr ] [ length ] bi + elf 64-bit? + [ Elf64_Sym heap-size / ] + [ Elf32_Sym heap-size / ] if + [ [ st_name>> strings ascii alien>string ] keep 2array ] { } map-as ; + +! High level interface +TUPLE: elf elf-header ; +TUPLE: section name elf-header section-header data ; +TUPLE: segment elf-header program-header data ; +TUPLE: symbol name elf-header sym data ; + +GENERIC: sections ( obj -- sections ) + +: ( c-ptr -- elf ) + elf-header elf boa ; + +M:: elf sections ( elf -- sections ) + elf elf-header>> elf-sections + [ + first2 :> ( name header ) + elf elf-header>> header elf-section-data :> data + name elf elf-header>> header data section boa + ] { } map-as ; + +:: segments ( elf -- segments ) + elf elf-header>> elf-program-headers + [| header | + elf elf-header>> header elf-segment-data :> data + elf elf-header>> header data segment boa + ] { } map-as ; + +M:: segment sections ( segment -- sections ) + segment program-header>> + segment elf-header>> elf-section-headers + elf-segment-sections + + [| header | + segment elf-header>> header elf-section-name :> name + segment elf-header>> header elf-section-data :> data + name segment elf-header>> header data section boa + ] { } map-as ; + +:: symbols ( section -- symbols ) + section elf-header>> + section data>> + elf-symbols + [ + first2 :> ( name sym ) + name section elf-header>> sym f symbol boa + ] { } map-as ; + +:: symbol-data ( symbol -- data ) + symbol [ elf-header>> ] [ sym>> st_value>> ] bi virtual-address-segment :> segment + symbol sym>> st_value>> segment p_vaddr>> - segment p_offset>> + :> faddress + faddress symbol elf-header>> >c-ptr + symbol sym>> st_size>> ; + diff --git a/extra/fluids/authors.txt b/extra/fluids/authors.txt new file mode 100644 index 0000000000..6f03a12101 --- /dev/null +++ b/extra/fluids/authors.txt @@ -0,0 +1 @@ +Erik Charlebois diff --git a/extra/fluids/colors.ppm b/extra/fluids/colors.ppm new file mode 100644 index 0000000000..c12c455f4c Binary files /dev/null and b/extra/fluids/colors.ppm differ diff --git a/extra/fluids/fluids.factor b/extra/fluids/fluids.factor new file mode 100644 index 0000000000..f383534658 --- /dev/null +++ b/extra/fluids/fluids.factor @@ -0,0 +1,120 @@ +! Copyright (C) 2010 Erik Charlebois. +! See http://factorcode.org/license.txt for BSD license. +USING: accessors arrays classes.struct destructors game.loop +game.worlds gpu gpu.buffers gpu.effects.blur gpu.framebuffers +gpu.render gpu.shaders gpu.state gpu.textures gpu.util images +images.loader kernel literals locals make math math.rectangles +math.vectors namespaces opengl.gl sequences specialized-arrays +ui.gadgets.worlds ui.gestures ui.pixel-formats gpu.effects.step +images.pgm images.ppm ; +FROM: alien.c-types => float ; +SPECIALIZED-ARRAY: float +IN: fluids + +STRUCT: particle_t + { p float[2] } + { v float[2] } + { m float } ; +SPECIALIZED-ARRAY: particle_t + +CONSTANT: gravity { 0.0 -0.1 } + +:: verlet-integrate-particle ( particle dt -- particle' ) + particle [ p>> ] [ v>> ] bi dt v*n v+ + gravity dt dt * particle m>> 2 * / v*n v+ :> p' + p' particle p>> v- dt v/n :> v' + p' v' particle m>> particle_t ; inline + +CONSTANT: initial-particles +particle_t-array{ + S{ particle_t f float-array{ 0.5 0.6 } float-array{ 0 0.1 } 1.0 } + S{ particle_t f float-array{ 0.5 0.6 } float-array{ 0.1 0 } 3.0 } + + S{ particle_t f float-array{ 0.5 0.5 } float-array{ 0.1 0.1 } 2.0 } + S{ particle_t f float-array{ 0.5 0.6 } float-array{ -0.1 0 } 1.0 } + S{ particle_t f float-array{ 0.6 0.5 } float-array{ 0 -0.1 } 3.0 } + S{ particle_t f float-array{ 0.7 0.5 } float-array{ 0.1 0.1 } 1.0 } + S{ particle_t f float-array{ 0.1 0.5 } float-array{ -0.1 -0.1 } 5.0 } + S{ particle_t f float-array{ 0.2 0.5 } float-array{ 0 0 } 1.0 } + S{ particle_t f float-array{ 0.3 0.3 } float-array{ 0 0 } 4.0 } + S{ particle_t f float-array{ 0.5 0.15 } float-array{ 0 0 } 1.0 } + S{ particle_t f float-array{ 0.5 0.1 } float-array{ 0 0 } 9.0 } +} + +: integrate-particles! ( particles dt -- particles ) + [ verlet-integrate-particle ] curry map! ; + +TUPLE: fluids-world < game-world + particles texture ramp { paused boolean initial: f } ; + +: make-texture ( pathname -- texture ) + load-image + [ + [ component-order>> ] + [ component-type>> ] bi + T{ texture-parameters + { wrap clamp-texcoord-to-edge } + { min-filter filter-nearest } + { mag-filter filter-nearest } + { min-mipmap-filter f } } + + ] + [ + 0 swap [ allocate-texture-image ] 3keep 2drop + ] bi ; + +SYMBOL: fluid + +: integrate ( world -- ) + particles>> $[ 60 fps 1000000 /f ] integrate-particles! drop ; + +: pause ( -- ) + fluid get [ not ] change-paused drop ; + +: step ( -- ) + fluid get paused>> [ fluid get integrate ] when ; + +M: fluids-world begin-game-world + dup fluid set + init-gpu + initial-particles clone >>particles + "resource:extra/fluids/particle2.pgm" make-texture >>texture + "resource:extra/fluids/colors.ppm" make-texture >>ramp + drop ; + +M: fluids-world end-game-world + drop ; + +M: fluids-world tick-game-world + dup paused>> [ drop ] [ integrate ] if ; + +M:: fluids-world draw-world* ( world -- ) + world particles>> [ + [ p>> [ first , ] [ second , ] bi ] each + ] curry float-array{ } make :> verts + + [ + verts world texture>> 30.0 world dim>> { 4 4 } v/ + blended-point-sprite-batch &dispose + blend-state new set-gpu-state + gaussian-blur &dispose + world ramp>> world dim>> step-texture &dispose + world dim>> draw-texture + ] with-destructors ; + +GAME: fluids { + { world-class fluids-world } + { title "Fluids Test" } + { pixel-format-attributes { + windowed double-buffered T{ depth-bits { value 24 } } } } + { pref-dim { 1024 768 } } + { tick-interval-micros $[ 60 fps ] } +} ; + +fluids-world H{ + { T{ button-down } [ [ + hand-loc get >float-array + world get dim>> >float-array v/ 2 v*n 1 v-n { 1 -1 } v* + float-array{ 0 0.2 } 2.0 particle_t suffix + ] change-particles drop ] } +} set-gestures diff --git a/extra/fluids/particle2.pgm b/extra/fluids/particle2.pgm new file mode 100644 index 0000000000..a45dc41082 Binary files /dev/null and b/extra/fluids/particle2.pgm differ diff --git a/extra/freetype/freetype.factor b/extra/freetype/freetype.factor index d131d2eb35..497ae883c1 100644 --- a/extra/freetype/freetype.factor +++ b/extra/freetype/freetype.factor @@ -5,8 +5,8 @@ alien.libraries classes.struct ; IN: freetype << "freetype" { - { [ os macosx? ] [ "/usr/X11R6/lib/libfreetype.6.dylib" "cdecl" add-library ] } - { [ os windows? ] [ "freetype6.dll" "cdecl" add-library ] } + { [ os macosx? ] [ "/usr/X11R6/lib/libfreetype.6.dylib" cdecl add-library ] } + { [ os windows? ] [ "freetype6.dll" cdecl add-library ] } { [ t ] [ drop ] } } cond >> @@ -176,14 +176,14 @@ FUNCTION: FT_Error FT_Set_Char_Size ( face* face, FT_F26Dot6 char_width, FT_F26D FUNCTION: FT_Error FT_Load_Char ( face* face, FT_ULong charcode, FT_Int32 load_flags ) ; -C-ENUM: +C-ENUM: f FT_RENDER_MODE_NORMAL FT_RENDER_MODE_LIGHT FT_RENDER_MODE_MONO FT_RENDER_MODE_LCD FT_RENDER_MODE_LCD_V ; -C-ENUM: +C-ENUM: f FT_PIXEL_MODE_NONE FT_PIXEL_MODE_MONO FT_PIXEL_MODE_GRAY diff --git a/extra/gpu/demos/bunny/bunny.factor b/extra/gpu/demos/bunny/bunny.factor index bee94d302a..ae5757efcd 100644 --- a/extra/gpu/demos/bunny/bunny.factor +++ b/extra/gpu/demos/bunny/bunny.factor @@ -34,12 +34,12 @@ GLSL-SHADER-FILE: window-vertex-shader vertex-shader "window.v.glsl" GLSL-SHADER-FILE: sobel-fragment-shader fragment-shader "sobel.f.glsl" GLSL-PROGRAM: sobel-program window-vertex-shader sobel-fragment-shader - window-vertex ; + window-vertex-format ; GLSL-SHADER-FILE: loading-fragment-shader fragment-shader "loading.f.glsl" GLSL-PROGRAM: loading-program window-vertex-shader loading-fragment-shader - window-vertex ; + window-vertex-format ; TUPLE: bunny-state vertexes diff --git a/extra/gpu/demos/raytrace/raytrace.factor b/extra/gpu/demos/raytrace/raytrace.factor index 2ad6c82d7c..bdd1b51deb 100644 --- a/extra/gpu/demos/raytrace/raytrace.factor +++ b/extra/gpu/demos/raytrace/raytrace.factor @@ -10,7 +10,7 @@ GLSL-SHADER-FILE: raytrace-vertex-shader vertex-shader "raytrace.v.glsl" GLSL-SHADER-FILE: raytrace-fragment-shader fragment-shader "raytrace.f.glsl" GLSL-PROGRAM: raytrace-program raytrace-vertex-shader raytrace-fragment-shader - window-vertex ; + window-vertex-format ; UNIFORM-TUPLE: sphere-uniforms { "center" vec3-uniform f } diff --git a/extra/gpu/effects/blur/authors.txt b/extra/gpu/effects/blur/authors.txt new file mode 100644 index 0000000000..6f03a12101 --- /dev/null +++ b/extra/gpu/effects/blur/authors.txt @@ -0,0 +1 @@ +Erik Charlebois diff --git a/extra/gpu/effects/blur/blur.factor b/extra/gpu/effects/blur/blur.factor new file mode 100644 index 0000000000..ed72b28374 --- /dev/null +++ b/extra/gpu/effects/blur/blur.factor @@ -0,0 +1,82 @@ +! Copyright (C) 2010 Erik Charlebois. +! See http://factorcode.org/license.txt for BSD license. +USING: arrays destructors fry gpu.framebuffers gpu.render gpu.shaders +gpu.state gpu.textures gpu.util images kernel locals math +math.rectangles sequences ; +IN: gpu.effects.blur + +GLSL-SHADER: blur-fragment-shader fragment-shader +uniform sampler2D texture; +uniform bool horizontal; +uniform float blurSize; +varying vec2 texcoord; +void main() +{ + vec4 col = 0.16 * texture2D(texture, texcoord); + if (horizontal) + { + vec2 blurX1 = vec2(blurSize, 0.0); + vec2 blurX2 = vec2(blurSize * 2.0, 0.0); + vec2 blurX3 = vec2(blurSize * 3.0, 0.0); + vec2 blurX4 = vec2(blurSize * 4.0, 0.0); + col += 0.15 * ( texture2D(texture, texcoord - blurX1) + + texture2D(texture, texcoord + blurX1)); + col += 0.12 * ( texture2D(texture, texcoord - blurX2) + + texture2D(texture, texcoord + blurX2)); + col += 0.09 * ( texture2D(texture, texcoord - blurX3) + + texture2D(texture, texcoord + blurX3)); + col += 0.05 * ( texture2D(texture, texcoord - blurX4) + + texture2D(texture, texcoord + blurX4)); + } + else + { + vec2 blurY1 = vec2(0.0, blurSize); + vec2 blurY2 = vec2(0.0, blurSize * 2.0); + vec2 blurY3 = vec2(0.0, blurSize * 3.0); + vec2 blurY4 = vec2(0.0, blurSize * 4.0); + col += 0.15 * ( texture2D(texture, texcoord - blurY1) + + texture2D(texture, texcoord + blurY1)); + col += 0.12 * ( texture2D(texture, texcoord - blurY2) + + texture2D(texture, texcoord + blurY2)); + col += 0.09 * ( texture2D(texture, texcoord - blurY3) + + texture2D(texture, texcoord + blurY3)); + col += 0.05 * ( texture2D(texture, texcoord - blurY4) + + texture2D(texture, texcoord + blurY4)); + } + gl_FragColor = col; +} +; + +UNIFORM-TUPLE: blur-uniforms + { "texture" texture-uniform f } + { "horizontal" bool-uniform f } + { "blurSize" float-uniform f } ; + +GLSL-PROGRAM: blur-program window-vertex-shader blur-fragment-shader window-vertex-format ; + +:: (blur) ( texture horizontal? framebuffer dim -- ) + { 0 0 } dim set-gpu-state + texture horizontal? 1.0 dim horizontal? [ first ] [ second ] if / blur-uniforms boa framebuffer { + { "primitive-mode" [ 2drop triangle-strip-mode ] } + { "uniforms" [ drop ] } + { "vertex-array" [ 2drop blur-program &dispose ] } + { "indexes" [ 2drop T{ index-range f 0 4 } ] } + { "framebuffer" [ nip ] } + } 2 render ; + +:: blur ( texture horizontal? -- texture ) + texture 0 texture-dim :> dim + dim RGB float-components <2d-render-texture> :> ( target-framebuffer target-texture ) + texture horizontal? target-framebuffer dim (blur) + target-framebuffer dispose + target-texture ; + +: horizontal-blur ( texture -- texture ) t blur ; inline + +: vertical-blur ( texture -- texture ) f blur ; inline + +: discompose ( quot1 quot2 -- compose ) + '[ @ &dispose @ ] with-destructors ; inline + +: gaussian-blur ( texture -- texture ) + [ horizontal-blur ] [ vertical-blur ] discompose ; diff --git a/extra/gpu/effects/blur/summary.txt b/extra/gpu/effects/blur/summary.txt new file mode 100644 index 0000000000..a9c5314a2e --- /dev/null +++ b/extra/gpu/effects/blur/summary.txt @@ -0,0 +1 @@ +Blur effects for textures. diff --git a/extra/gpu/effects/step/authors.txt b/extra/gpu/effects/step/authors.txt new file mode 100644 index 0000000000..6f03a12101 --- /dev/null +++ b/extra/gpu/effects/step/authors.txt @@ -0,0 +1 @@ +Erik Charlebois diff --git a/extra/gpu/effects/step/step.factor b/extra/gpu/effects/step/step.factor new file mode 100644 index 0000000000..bd3b013b4a --- /dev/null +++ b/extra/gpu/effects/step/step.factor @@ -0,0 +1,40 @@ +! Copyright (C) 2010 Erik Charlebois. +! See http://factorcode.org/license.txt for BSD license. +USING: destructors gpu.render gpu.shaders gpu.state gpu.textures +gpu.util images kernel locals math.rectangles ; +IN: gpu.effects.step + +GLSL-SHADER: step-fragment-shader fragment-shader +const vec4 luminance = vec4(0.3, 0.59, 0.11, 0.0); +uniform sampler2D texture; +uniform sampler2D ramp; +varying vec2 texcoord; +void main() +{ + vec4 col = texture2D(texture, texcoord); + float l = dot(col, luminance); + gl_FragColor = texture2D(ramp, vec2(l, 0.0)); +} +; + +UNIFORM-TUPLE: step-uniforms + { "texture" texture-uniform f } + { "ramp" texture-uniform f } ; + +GLSL-PROGRAM: step-program window-vertex-shader step-fragment-shader window-vertex-format ; + +: (step-texture) ( texture ramp texture dim -- ) + { 0 0 } swap set-gpu-state + [ step-uniforms boa ] dip { + { "primitive-mode" [ 2drop triangle-strip-mode ] } + { "uniforms" [ drop ] } + { "vertex-array" [ 2drop step-program ] } + { "indexes" [ 2drop T{ index-range f 0 4 } ] } + { "framebuffer" [ nip ] } + } 2 render ; + +:: step-texture ( texture ramp dim -- texture ) + dim RGB float-components <2d-render-texture> :> ( target-framebuffer target-texture ) + texture ramp target-framebuffer dim (step-texture) + target-framebuffer dispose + target-texture ; diff --git a/extra/gpu/effects/step/summary.txt b/extra/gpu/effects/step/summary.txt new file mode 100644 index 0000000000..61028dd28a --- /dev/null +++ b/extra/gpu/effects/step/summary.txt @@ -0,0 +1 @@ +Render a quad with a step texture. diff --git a/extra/gpu/util/util.factor b/extra/gpu/util/util.factor index d33fcf8c09..2678f0452c 100644 --- a/extra/gpu/util/util.factor +++ b/extra/gpu/util/util.factor @@ -1,6 +1,7 @@ ! (c)2009 Joe Groff bsd license -USING: gpu.buffers gpu.render gpu.shaders gpu.textures images kernel -specialized-arrays ; +USING: arrays destructors gpu.buffers gpu.framebuffers gpu.render +gpu.shaders gpu.state gpu.textures images kernel locals math +math.rectangles opengl.gl sequences specialized-arrays ; FROM: alien.c-types => float ; SPECIALIZED-ARRAY: float IN: gpu.util @@ -44,10 +45,59 @@ CONSTANT: environment-cube-map-mv-matrices { 0.0 0.0 0.0 1.0 } } } } + +GLSL-SHADER: window-vertex-shader vertex-shader +attribute vec2 vertex; +varying vec2 texcoord; +void main() +{ + texcoord = vertex * vec2(0.5) + vec2(0.5); + gl_Position = vec4(vertex, 0.0, 1.0); +} +; -VERTEX-FORMAT: window-vertex +GLSL-SHADER: window-fragment-shader fragment-shader +uniform sampler2D texture; +varying vec2 texcoord; +void main() +{ + gl_FragColor = texture2D(texture, texcoord); +} +; + +VERTEX-FORMAT: window-vertex-format { "vertex" float-components 2 f } ; +UNIFORM-TUPLE: window-uniforms + { "texture" texture-uniform f } ; + +GLSL-PROGRAM: window-program window-vertex-shader window-fragment-shader window-vertex-format ; + +GLSL-SHADER: window-point-vertex-shader vertex-shader +uniform float point_size; +attribute vec2 vertex; +void main() +{ + gl_Position = vec4(vertex, 0.0, 1.0); + gl_PointSize = point_size; +} +; + +GLSL-SHADER: window-point-fragment-shader fragment-shader +#version 120 +uniform sampler2D texture; +void main() +{ + gl_FragColor = texture2D(texture, gl_PointCoord); +} +; + +UNIFORM-TUPLE: window-point-uniforms + { "texture" texture-uniform f } + { "point_size" float-uniform f } ; + +GLSL-PROGRAM: window-point-program window-point-vertex-shader window-point-fragment-shader window-vertex-format ; + CONSTANT: window-vertexes float-array{ -1.0 -1.0 @@ -62,4 +112,47 @@ CONSTANT: window-vertexes byte-array>buffer ; inline : ( program-instance -- vertex-array ) - [ ] dip window-vertex ; inline + [ ] dip window-vertex-format ; inline + +:: <2d-render-texture> ( dim order type -- renderbuffer texture ) + order type + T{ texture-parameters + { wrap clamp-texcoord-to-edge } + { min-filter filter-linear } + { min-mipmap-filter f } } + [ + 0 1array f f dim + dup { { default-attachment { 0 0 0 } } } clear-framebuffer + ] keep ; + +: draw-texture ( texture dim -- ) + { 0 0 } swap set-gpu-state + { + { "primitive-mode" [ drop triangle-strip-mode ] } + { "uniforms" [ window-uniforms boa ] } + { "vertex-array" [ drop window-program &dispose ] } + { "indexes" [ drop T{ index-range f 0 4 } ] } + } render ; + +:: ( verts program-instance -- vertex-array ) + verts stream-upload draw-usage vertex-buffer byte-array>buffer &dispose + program-instance &dispose ; + +: (blended-point-sprite-batch) ( verts framebuffer texture point-size dim -- ) + f eq-add func-one func-one dup set-gpu-state + f origin-upper-left 1.0 set-gpu-state + GL_POINT_SPRITE glEnable + { 0 0 } swap set-gpu-state + window-point-uniforms boa { + { "primitive-mode" [ 3drop points-mode ] } + { "uniforms" [ 2nip ] } + { "vertex-array" [ 2drop window-point-program ] } + { "indexes" [ 2drop length 2 / 0 swap ] } + { "framebuffer" [ drop nip ] } + } 3 render ; + +:: blended-point-sprite-batch ( verts texture point-size dim -- texture ) + dim RGB float-components <2d-render-texture> :> ( target-framebuffer target-texture ) + verts target-framebuffer texture point-size dim (blended-point-sprite-batch) + target-framebuffer dispose + target-texture ; diff --git a/extra/images/testing/pgm/radial.ascii.fig b/extra/images/testing/pgm/radial.ascii.fig new file mode 100644 index 0000000000..6e52311b94 Binary files /dev/null and b/extra/images/testing/pgm/radial.ascii.fig differ diff --git a/extra/images/testing/pgm/radial.ascii.pgm b/extra/images/testing/pgm/radial.ascii.pgm new file mode 100644 index 0000000000..1a7a6a832d --- /dev/null +++ b/extra/images/testing/pgm/radial.ascii.pgm @@ -0,0 +1,16388 @@ +P2 +# CREATOR: GIMP PNM Filter Version 1.1 +128 128 +255 +0 +2 +4 +6 +8 +10 +12 +13 +16 +17 +19 +21 +22 +24 +26 +28 +30 +32 +33 +35 +36 +38 +40 +41 +42 +44 +45 +46 +48 +49 +51 +52 +54 +55 +56 +57 +58 +59 +60 +61 +63 +63 +65 +65 +66 +67 +67 +68 +69 +70 +71 +71 +72 +72 +72 +73 +74 +74 +74 +74 +74 +74 +75 +74 +75 +75 +74 +75 +74 +74 +74 +74 +73 +73 +73 +72 +72 +71 +70 +69 +69 +69 +67 +66 +66 +65 +64 +63 +62 +61 +60 +59 +58 +57 +56 +55 +54 +52 +51 +49 +48 +46 +45 +43 +42 +41 +39 +38 +36 +34 +33 +31 +29 +27 +26 +25 +23 +21 +19 +18 +16 +14 +12 +10 +8 +6 +4 +2 +2 +4 +6 +8 +10 +12 +13 +16 +18 +20 +21 +23 +24 +27 +29 +31 +32 +34 +35 +37 +38 +40 +41 +43 +45 +46 +48 +49 +50 +52 +54 +55 +56 +57 +59 +60 +61 +61 +63 +64 +66 +66 +67 +68 +69 +69 +70 +71 +72 +73 +73 +74 +74 +75 +76 +76 +76 +77 +76 +77 +77 +78 +77 +77 +77 +77 +77 +77 +78 +77 +77 +77 +76 +76 +75 +75 +74 +74 +74 +73 +72 +71 +71 +70 +68 +68 +67 +67 +65 +64 +63 +62 +60 +59 +59 +57 +56 +54 +54 +52 +51 +49 +47 +46 +45 +43 +41 +41 +38 +37 +35 +34 +32 +30 +29 +27 +25 +23 +21 +19 +18 +15 +14 +12 +10 +8 +6 +4 +4 +6 +8 +10 +12 +14 +16 +18 +20 +21 +23 +25 +27 +28 +30 +32 +34 +36 +37 +39 +40 +43 +44 +46 +47 +49 +50 +51 +53 +54 +56 +58 +58 +60 +60 +62 +63 +65 +66 +67 +68 +68 +70 +71 +72 +73 +73 +74 +74 +75 +76 +76 +78 +77 +78 +78 +79 +80 +79 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +79 +79 +78 +78 +78 +78 +77 +77 +76 +75 +75 +74 +73 +72 +71 +70 +70 +69 +67 +67 +65 +64 +63 +62 +61 +60 +59 +57 +56 +54 +53 +52 +51 +49 +47 +46 +44 +42 +41 +39 +38 +35 +34 +32 +31 +29 +27 +25 +23 +22 +19 +18 +16 +14 +12 +10 +8 +6 +6 +8 +10 +12 +14 +16 +18 +19 +22 +23 +26 +27 +29 +31 +33 +35 +37 +38 +39 +41 +43 +45 +47 +48 +49 +51 +53 +54 +56 +57 +58 +60 +61 +63 +64 +65 +66 +67 +69 +69 +70 +71 +72 +73 +74 +75 +76 +77 +77 +78 +79 +79 +80 +80 +81 +81 +81 +82 +82 +83 +82 +83 +83 +83 +83 +83 +83 +83 +83 +83 +82 +82 +82 +82 +80 +80 +80 +79 +79 +78 +77 +76 +75 +75 +74 +73 +73 +72 +71 +69 +68 +67 +66 +65 +64 +62 +61 +59 +59 +57 +55 +54 +52 +51 +50 +48 +47 +45 +43 +42 +40 +38 +36 +35 +33 +31 +29 +27 +25 +24 +22 +20 +18 +16 +14 +12 +10 +7 +8 +9 +12 +14 +16 +18 +19 +22 +24 +25 +27 +30 +31 +34 +35 +37 +38 +41 +42 +44 +45 +47 +49 +50 +52 +53 +55 +56 +58 +59 +61 +62 +63 +65 +66 +67 +69 +70 +71 +72 +73 +73 +75 +76 +77 +77 +78 +80 +80 +81 +81 +82 +82 +84 +83 +84 +84 +84 +85 +86 +85 +86 +86 +86 +86 +85 +86 +86 +86 +86 +85 +85 +84 +84 +84 +83 +83 +82 +81 +80 +80 +80 +78 +78 +77 +76 +75 +74 +73 +72 +71 +69 +68 +68 +66 +65 +64 +62 +61 +59 +58 +57 +55 +53 +52 +50 +49 +47 +46 +44 +42 +40 +39 +36 +35 +33 +31 +29 +28 +26 +23 +22 +20 +18 +16 +14 +12 +10 +10 +12 +14 +16 +18 +20 +22 +23 +26 +28 +30 +31 +33 +36 +37 +38 +41 +42 +45 +45 +48 +50 +51 +53 +55 +56 +58 +59 +60 +62 +63 +64 +66 +68 +69 +69 +71 +73 +74 +74 +76 +77 +77 +78 +79 +80 +82 +82 +82 +84 +85 +85 +85 +86 +86 +87 +87 +88 +88 +89 +88 +88 +89 +88 +89 +89 +88 +89 +88 +88 +88 +88 +87 +87 +86 +86 +86 +85 +85 +84 +82 +82 +82 +81 +80 +79 +78 +77 +75 +74 +73 +72 +71 +70 +68 +67 +66 +64 +64 +62 +60 +59 +57 +56 +54 +53 +51 +49 +48 +46 +44 +42 +40 +39 +37 +35 +34 +31 +30 +28 +26 +24 +21 +20 +18 +16 +14 +12 +12 +14 +16 +18 +20 +22 +24 +26 +28 +30 +32 +34 +36 +38 +39 +41 +43 +45 +47 +48 +50 +52 +53 +55 +57 +58 +59 +61 +63 +64 +65 +67 +69 +70 +71 +73 +74 +74 +76 +77 +78 +79 +80 +81 +83 +83 +84 +85 +85 +86 +87 +87 +89 +89 +90 +89 +90 +90 +91 +91 +91 +92 +92 +92 +92 +92 +91 +92 +92 +91 +91 +91 +90 +89 +89 +89 +88 +87 +87 +86 +86 +85 +84 +83 +82 +81 +80 +79 +78 +77 +76 +75 +74 +72 +71 +69 +68 +67 +66 +64 +63 +61 +59 +58 +56 +55 +53 +52 +50 +49 +46 +45 +43 +41 +39 +37 +36 +33 +32 +30 +28 +26 +24 +22 +20 +18 +15 +14 +14 +15 +18 +20 +22 +24 +26 +28 +30 +31 +33 +36 +37 +40 +42 +43 +45 +47 +48 +50 +52 +54 +56 +57 +59 +61 +62 +64 +65 +67 +68 +70 +71 +72 +74 +75 +76 +77 +78 +80 +81 +82 +83 +84 +85 +86 +87 +87 +88 +89 +89 +90 +90 +91 +92 +92 +93 +93 +94 +94 +94 +95 +94 +94 +94 +94 +94 +94 +94 +94 +94 +94 +93 +92 +92 +92 +90 +91 +90 +89 +88 +87 +86 +86 +85 +84 +83 +82 +81 +80 +78 +77 +76 +75 +73 +72 +70 +69 +68 +67 +65 +63 +62 +61 +59 +57 +56 +54 +52 +50 +49 +47 +45 +43 +41 +40 +38 +35 +34 +32 +30 +28 +26 +24 +22 +20 +17 +16 +15 +17 +20 +22 +24 +26 +28 +30 +32 +34 +35 +38 +40 +41 +44 +45 +48 +49 +51 +53 +54 +56 +58 +60 +62 +63 +65 +66 +68 +69 +70 +72 +73 +74 +76 +77 +79 +80 +81 +82 +84 +84 +85 +87 +87 +89 +89 +90 +91 +91 +92 +93 +94 +94 +94 +95 +96 +96 +96 +97 +97 +97 +97 +97 +98 +98 +98 +97 +97 +96 +96 +96 +95 +95 +95 +95 +94 +93 +92 +92 +91 +90 +89 +88 +88 +87 +86 +84 +83 +82 +81 +80 +79 +77 +76 +74 +73 +72 +71 +69 +68 +66 +64 +63 +61 +59 +58 +57 +54 +53 +51 +49 +48 +45 +43 +42 +39 +37 +35 +34 +31 +30 +28 +26 +24 +21 +20 +18 +17 +20 +22 +23 +26 +28 +30 +31 +34 +36 +38 +40 +42 +44 +46 +48 +49 +51 +53 +55 +57 +59 +60 +62 +63 +65 +66 +68 +70 +72 +73 +74 +76 +78 +78 +79 +81 +83 +83 +84 +86 +87 +89 +89 +90 +91 +92 +92 +94 +95 +95 +96 +96 +97 +98 +98 +99 +98 +99 +100 +100 +99 +100 +100 +100 +100 +100 +100 +100 +99 +99 +98 +99 +98 +98 +97 +96 +96 +95 +95 +93 +93 +92 +91 +90 +89 +89 +87 +86 +85 +84 +83 +81 +79 +78 +77 +75 +74 +73 +71 +70 +69 +67 +65 +64 +62 +60 +59 +57 +55 +53 +51 +49 +47 +46 +44 +41 +40 +38 +36 +34 +32 +30 +27 +26 +24 +21 +19 +19 +21 +24 +26 +28 +30 +32 +34 +35 +38 +40 +41 +44 +45 +48 +50 +52 +54 +56 +56 +59 +61 +62 +64 +66 +67 +69 +71 +73 +74 +76 +77 +78 +79 +81 +83 +84 +85 +86 +87 +89 +90 +91 +92 +93 +93 +95 +96 +97 +97 +97 +98 +99 +100 +100 +100 +101 +101 +102 +103 +102 +102 +103 +103 +102 +103 +102 +102 +103 +102 +102 +102 +101 +100 +100 +99 +99 +98 +98 +98 +97 +96 +95 +94 +92 +91 +91 +89 +89 +88 +87 +85 +84 +83 +81 +79 +78 +77 +75 +74 +73 +71 +69 +68 +66 +64 +62 +61 +59 +57 +55 +54 +51 +49 +48 +46 +43 +42 +40 +38 +36 +33 +32 +29 +27 +26 +23 +21 +21 +23 +25 +27 +30 +32 +33 +35 +38 +40 +42 +44 +45 +48 +50 +52 +53 +55 +57 +59 +61 +63 +64 +67 +68 +69 +71 +73 +75 +76 +77 +79 +81 +82 +83 +85 +87 +88 +89 +90 +91 +92 +93 +95 +95 +96 +97 +98 +99 +99 +101 +101 +102 +102 +103 +104 +104 +105 +105 +105 +105 +105 +106 +106 +106 +106 +106 +106 +105 +105 +105 +104 +104 +103 +103 +103 +102 +101 +101 +100 +99 +98 +97 +96 +96 +95 +93 +93 +91 +90 +88 +87 +86 +85 +83 +82 +81 +79 +77 +76 +74 +73 +71 +69 +68 +66 +65 +63 +61 +59 +57 +56 +54 +51 +50 +48 +46 +43 +42 +40 +38 +35 +34 +32 +30 +27 +25 +23 +22 +25 +27 +29 +32 +34 +35 +38 +40 +42 +44 +45 +48 +50 +52 +53 +56 +57 +60 +61 +64 +65 +67 +69 +70 +72 +74 +76 +77 +79 +80 +81 +83 +84 +86 +87 +88 +90 +91 +92 +94 +95 +96 +97 +98 +99 +100 +101 +102 +102 +103 +104 +105 +105 +106 +106 +107 +108 +108 +108 +108 +108 +108 +108 +109 +109 +108 +108 +108 +108 +107 +107 +106 +106 +106 +105 +104 +104 +103 +103 +102 +101 +100 +99 +98 +97 +96 +95 +94 +92 +91 +90 +89 +87 +86 +84 +83 +82 +80 +79 +76 +75 +74 +71 +70 +69 +67 +65 +63 +61 +59 +57 +56 +54 +51 +49 +48 +46 +44 +42 +40 +38 +35 +34 +31 +29 +27 +25 +24 +26 +29 +31 +33 +35 +37 +39 +42 +44 +46 +48 +49 +51 +54 +56 +57 +60 +61 +63 +65 +67 +69 +71 +73 +74 +76 +77 +79 +81 +82 +84 +85 +87 +89 +90 +91 +92 +94 +95 +96 +97 +99 +99 +100 +102 +103 +104 +104 +106 +106 +107 +108 +108 +109 +109 +110 +110 +110 +111 +111 +111 +111 +111 +111 +112 +111 +111 +111 +111 +111 +110 +110 +109 +109 +108 +108 +107 +106 +105 +105 +103 +102 +101 +100 +99 +99 +97 +96 +95 +94 +92 +91 +90 +88 +87 +86 +84 +82 +80 +79 +77 +75 +74 +72 +71 +69 +67 +65 +63 +61 +60 +58 +56 +54 +52 +50 +48 +46 +44 +42 +39 +37 +35 +34 +31 +28 +27 +26 +28 +31 +33 +35 +37 +39 +41 +44 +45 +47 +50 +52 +54 +56 +58 +59 +62 +64 +66 +67 +69 +71 +73 +75 +76 +78 +80 +82 +83 +85 +86 +88 +90 +91 +92 +94 +95 +97 +97 +98 +100 +101 +103 +103 +104 +105 +106 +107 +108 +109 +109 +110 +111 +111 +112 +112 +113 +113 +114 +114 +114 +114 +114 +115 +114 +114 +114 +113 +113 +113 +113 +112 +111 +111 +110 +110 +109 +108 +108 +107 +106 +106 +104 +103 +102 +102 +99 +99 +97 +97 +95 +94 +92 +91 +89 +87 +87 +84 +83 +81 +80 +78 +77 +75 +73 +71 +69 +67 +66 +63 +62 +60 +58 +56 +54 +51 +50 +48 +46 +44 +42 +39 +37 +35 +33 +31 +28 +28 +31 +32 +35 +36 +39 +41 +43 +46 +47 +49 +52 +54 +56 +57 +60 +62 +63 +65 +68 +69 +71 +73 +75 +77 +79 +80 +82 +84 +85 +87 +88 +90 +91 +93 +95 +96 +97 +99 +100 +101 +102 +104 +105 +106 +107 +108 +109 +109 +111 +111 +113 +113 +113 +114 +114 +115 +116 +116 +116 +117 +117 +117 +117 +117 +117 +117 +117 +117 +117 +116 +115 +115 +115 +115 +113 +113 +112 +111 +111 +110 +109 +108 +107 +106 +104 +103 +102 +102 +100 +98 +97 +96 +95 +93 +92 +90 +89 +87 +85 +84 +82 +80 +79 +77 +75 +73 +72 +69 +67 +66 +64 +61 +60 +57 +56 +53 +52 +49 +48 +46 +43 +41 +38 +37 +35 +33 +30 +30 +31 +34 +36 +39 +40 +42 +45 +47 +49 +52 +54 +56 +57 +60 +62 +64 +65 +68 +69 +71 +74 +76 +77 +79 +81 +83 +84 +86 +87 +89 +90 +93 +94 +96 +97 +99 +100 +101 +103 +104 +106 +106 +108 +109 +110 +111 +112 +112 +114 +114 +115 +115 +117 +117 +117 +117 +119 +118 +119 +119 +119 +120 +119 +120 +119 +120 +120 +119 +119 +119 +119 +118 +118 +117 +116 +116 +115 +114 +114 +113 +111 +111 +110 +109 +108 +106 +105 +104 +103 +101 +100 +99 +97 +96 +94 +92 +91 +89 +87 +86 +84 +83 +80 +79 +77 +76 +73 +71 +70 +67 +65 +64 +62 +59 +57 +55 +54 +51 +49 +47 +45 +43 +41 +38 +37 +34 +31 +32 +34 +35 +38 +40 +43 +45 +46 +49 +52 +53 +55 +57 +59 +62 +64 +66 +68 +70 +72 +73 +75 +77 +79 +81 +83 +85 +86 +88 +90 +91 +93 +95 +97 +98 +99 +101 +102 +103 +105 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +117 +119 +119 +120 +121 +120 +121 +121 +122 +122 +122 +122 +123 +123 +122 +123 +122 +122 +122 +121 +121 +120 +121 +120 +119 +118 +117 +117 +116 +115 +114 +113 +112 +111 +110 +108 +107 +106 +105 +104 +102 +100 +99 +98 +96 +95 +93 +91 +90 +88 +86 +84 +83 +81 +79 +77 +75 +74 +71 +70 +68 +66 +63 +62 +59 +57 +55 +53 +51 +49 +47 +45 +42 +40 +38 +36 +33 +33 +35 +37 +40 +42 +44 +47 +49 +51 +53 +56 +57 +59 +61 +63 +66 +68 +70 +72 +74 +76 +78 +80 +82 +83 +86 +87 +88 +90 +93 +94 +95 +97 +99 +101 +102 +103 +105 +106 +107 +108 +110 +111 +113 +113 +115 +116 +116 +118 +118 +120 +120 +121 +121 +122 +123 +124 +124 +125 +124 +125 +126 +126 +125 +125 +125 +125 +126 +125 +125 +124 +124 +124 +123 +122 +122 +121 +121 +119 +118 +117 +116 +116 +115 +113 +112 +111 +110 +109 +107 +106 +105 +103 +102 +100 +98 +97 +96 +93 +92 +90 +89 +87 +85 +83 +81 +79 +78 +76 +74 +71 +70 +68 +65 +64 +62 +59 +58 +56 +53 +51 +48 +46 +44 +42 +39 +38 +35 +35 +36 +39 +42 +43 +46 +48 +50 +53 +54 +57 +59 +61 +64 +65 +68 +69 +72 +74 +75 +78 +80 +81 +83 +86 +87 +89 +91 +93 +94 +96 +98 +99 +101 +102 +104 +105 +107 +109 +110 +111 +113 +114 +116 +116 +117 +119 +120 +121 +121 +122 +123 +124 +124 +126 +126 +126 +127 +127 +128 +128 +128 +128 +128 +128 +128 +128 +128 +128 +127 +127 +127 +127 +126 +125 +125 +124 +123 +123 +121 +121 +120 +118 +118 +116 +115 +114 +112 +111 +110 +108 +107 +105 +104 +102 +101 +99 +98 +96 +94 +93 +91 +89 +87 +85 +84 +82 +80 +78 +75 +74 +71 +70 +68 +65 +63 +61 +59 +57 +55 +52 +50 +49 +46 +44 +41 +39 +37 +37 +39 +40 +43 +46 +48 +49 +52 +54 +57 +59 +61 +63 +66 +68 +70 +72 +73 +76 +77 +80 +82 +84 +86 +88 +90 +92 +94 +95 +97 +98 +100 +101 +103 +105 +107 +108 +110 +111 +112 +113 +115 +116 +118 +118 +120 +121 +122 +123 +124 +124 +126 +127 +127 +128 +128 +129 +129 +129 +130 +131 +131 +131 +131 +131 +131 +131 +131 +130 +130 +130 +129 +129 +129 +128 +127 +126 +126 +125 +124 +123 +122 +121 +120 +119 +118 +116 +115 +114 +113 +111 +110 +108 +107 +104 +103 +102 +100 +98 +96 +95 +93 +91 +90 +87 +85 +84 +82 +79 +78 +75 +74 +72 +69 +67 +65 +63 +60 +59 +56 +55 +52 +49 +47 +46 +43 +41 +38 +37 +40 +42 +44 +47 +49 +52 +54 +56 +58 +61 +62 +65 +67 +69 +72 +73 +75 +77 +80 +82 +83 +86 +88 +89 +92 +93 +95 +97 +99 +101 +102 +104 +106 +108 +108 +110 +112 +114 +115 +116 +118 +119 +120 +121 +122 +124 +125 +126 +127 +128 +128 +130 +130 +130 +131 +132 +132 +133 +133 +133 +133 +134 +134 +134 +134 +133 +134 +133 +133 +132 +133 +132 +131 +131 +130 +129 +128 +127 +126 +126 +125 +124 +123 +121 +120 +119 +118 +117 +115 +114 +112 +111 +109 +107 +105 +104 +103 +101 +99 +97 +95 +94 +91 +90 +87 +86 +83 +82 +80 +78 +76 +73 +71 +69 +67 +65 +62 +61 +59 +56 +53 +52 +49 +47 +45 +43 +40 +39 +41 +44 +46 +48 +51 +54 +56 +58 +60 +63 +64 +66 +69 +71 +73 +76 +78 +80 +81 +84 +86 +88 +89 +92 +93 +95 +97 +100 +100 +103 +104 +106 +108 +110 +112 +113 +114 +116 +118 +119 +120 +122 +123 +124 +126 +126 +128 +128 +129 +130 +131 +132 +133 +134 +134 +134 +135 +136 +136 +136 +137 +137 +137 +137 +137 +137 +136 +136 +136 +136 +135 +134 +134 +133 +133 +131 +132 +130 +130 +128 +127 +126 +125 +124 +123 +121 +121 +118 +117 +116 +114 +112 +111 +110 +108 +107 +105 +102 +101 +100 +98 +95 +94 +91 +90 +88 +86 +83 +82 +79 +78 +76 +73 +71 +69 +67 +65 +62 +60 +58 +55 +54 +51 +49 +47 +44 +42 +41 +44 +46 +47 +50 +53 +55 +57 +60 +61 +64 +66 +68 +71 +72 +75 +77 +79 +82 +84 +85 +88 +90 +91 +93 +95 +98 +99 +101 +103 +105 +107 +108 +110 +112 +113 +115 +117 +118 +120 +121 +122 +124 +126 +126 +128 +129 +130 +131 +132 +133 +134 +135 +135 +136 +137 +138 +138 +139 +138 +139 +139 +140 +139 +139 +140 +139 +139 +139 +139 +138 +137 +138 +136 +136 +135 +135 +134 +133 +132 +131 +130 +129 +128 +127 +126 +124 +122 +121 +119 +119 +117 +115 +113 +112 +111 +109 +107 +105 +103 +101 +99 +98 +96 +94 +92 +90 +87 +86 +84 +82 +79 +78 +75 +73 +71 +68 +66 +64 +61 +60 +58 +55 +53 +50 +48 +46 +43 +42 +44 +47 +50 +52 +54 +56 +58 +61 +64 +66 +68 +70 +72 +74 +77 +79 +81 +83 +85 +87 +90 +92 +93 +95 +98 +99 +101 +103 +105 +107 +109 +111 +112 +115 +116 +117 +119 +120 +123 +123 +125 +126 +128 +129 +130 +132 +132 +134 +135 +136 +137 +137 +138 +139 +140 +140 +141 +141 +141 +141 +142 +143 +142 +143 +142 +142 +142 +142 +142 +141 +141 +141 +140 +139 +138 +137 +137 +135 +134 +134 +132 +132 +130 +129 +128 +126 +125 +124 +122 +121 +119 +118 +115 +115 +112 +110 +109 +107 +106 +104 +101 +100 +98 +96 +93 +92 +90 +88 +85 +83 +81 +79 +77 +74 +72 +70 +67 +66 +63 +61 +59 +56 +54 +52 +49 +47 +45 +44 +46 +49 +51 +54 +56 +58 +61 +62 +65 +67 +70 +72 +74 +76 +78 +81 +83 +85 +87 +89 +92 +93 +96 +98 +100 +102 +104 +106 +107 +110 +111 +113 +115 +117 +118 +120 +121 +123 +125 +126 +127 +129 +130 +132 +132 +134 +136 +136 +137 +139 +139 +140 +141 +142 +142 +143 +143 +144 +144 +145 +145 +145 +145 +145 +145 +145 +144 +145 +145 +144 +143 +143 +142 +142 +141 +140 +139 +138 +138 +136 +135 +134 +133 +132 +130 +129 +128 +126 +124 +123 +121 +120 +118 +116 +114 +113 +111 +109 +107 +106 +104 +102 +100 +98 +95 +94 +91 +90 +87 +86 +83 +81 +79 +76 +74 +72 +70 +68 +65 +63 +61 +58 +55 +54 +51 +48 +46 +45 +48 +50 +52 +55 +58 +60 +62 +64 +67 +69 +71 +74 +76 +78 +80 +83 +84 +86 +90 +91 +93 +95 +97 +99 +101 +103 +105 +108 +109 +111 +113 +115 +117 +118 +120 +122 +124 +126 +127 +128 +130 +132 +132 +134 +136 +136 +138 +139 +140 +141 +141 +143 +144 +144 +145 +146 +146 +147 +147 +148 +148 +148 +148 +148 +148 +147 +148 +147 +147 +146 +147 +145 +145 +144 +143 +143 +142 +141 +140 +138 +138 +137 +135 +135 +133 +131 +130 +128 +127 +125 +124 +122 +120 +119 +117 +115 +114 +111 +109 +108 +106 +103 +102 +99 +97 +95 +93 +92 +89 +87 +85 +83 +81 +78 +76 +74 +71 +69 +66 +65 +62 +60 +57 +55 +52 +50 +48 +47 +50 +52 +54 +57 +58 +61 +64 +66 +68 +71 +72 +75 +77 +80 +82 +85 +86 +89 +91 +93 +95 +98 +100 +102 +104 +105 +108 +110 +111 +114 +115 +117 +119 +121 +122 +125 +126 +127 +129 +131 +133 +134 +136 +137 +138 +140 +140 +142 +143 +144 +144 +145 +146 +147 +148 +148 +149 +150 +150 +150 +151 +150 +151 +151 +151 +150 +150 +151 +149 +149 +149 +148 +148 +147 +146 +145 +145 +144 +142 +141 +140 +139 +138 +137 +135 +133 +132 +131 +129 +127 +126 +125 +123 +121 +119 +117 +116 +113 +111 +109 +107 +105 +104 +101 +99 +98 +95 +94 +91 +89 +87 +84 +82 +79 +78 +75 +73 +71 +68 +65 +64 +61 +59 +56 +54 +52 +49 +48 +50 +53 +56 +58 +60 +62 +65 +67 +69 +72 +75 +77 +79 +81 +83 +86 +88 +90 +93 +95 +97 +99 +102 +104 +105 +108 +110 +111 +113 +116 +117 +119 +121 +123 +124 +127 +128 +129 +131 +133 +134 +136 +137 +139 +140 +142 +143 +144 +146 +146 +147 +148 +149 +150 +151 +151 +152 +152 +153 +153 +153 +154 +154 +153 +154 +153 +153 +153 +152 +152 +152 +151 +151 +150 +149 +149 +148 +146 +145 +144 +143 +142 +140 +139 +138 +137 +135 +134 +132 +130 +128 +126 +125 +123 +122 +119 +117 +115 +113 +111 +110 +108 +106 +104 +101 +99 +97 +95 +93 +90 +88 +86 +83 +81 +79 +76 +75 +72 +70 +67 +65 +62 +60 +58 +56 +53 +50 +49 +52 +55 +57 +59 +61 +64 +66 +69 +71 +74 +76 +78 +81 +83 +85 +88 +90 +93 +95 +96 +98 +101 +103 +105 +107 +109 +111 +114 +115 +118 +119 +121 +123 +125 +127 +129 +130 +132 +134 +136 +137 +139 +140 +141 +143 +144 +145 +147 +148 +149 +150 +151 +151 +152 +153 +154 +154 +155 +156 +156 +156 +157 +156 +157 +156 +156 +156 +155 +155 +155 +155 +154 +153 +153 +152 +151 +150 +149 +147 +147 +145 +144 +143 +141 +140 +138 +137 +136 +134 +132 +130 +128 +127 +125 +124 +122 +120 +118 +116 +113 +112 +110 +107 +105 +103 +101 +99 +97 +94 +92 +90 +88 +86 +83 +81 +78 +76 +73 +72 +69 +67 +65 +62 +59 +57 +55 +51 +51 +53 +55 +58 +60 +63 +66 +68 +71 +73 +75 +77 +80 +82 +85 +87 +89 +91 +93 +96 +98 +101 +103 +105 +108 +110 +111 +114 +115 +118 +120 +122 +123 +125 +127 +129 +131 +132 +134 +136 +137 +139 +141 +142 +144 +145 +147 +148 +149 +150 +151 +153 +154 +154 +155 +156 +157 +157 +158 +158 +158 +159 +159 +159 +159 +160 +159 +159 +158 +158 +158 +157 +157 +155 +155 +155 +153 +152 +151 +150 +149 +147 +147 +146 +144 +142 +141 +140 +138 +136 +134 +133 +131 +129 +127 +126 +123 +121 +119 +118 +115 +113 +112 +109 +107 +105 +103 +101 +98 +96 +94 +91 +89 +87 +84 +82 +80 +78 +76 +73 +71 +68 +66 +63 +61 +58 +55 +54 +52 +55 +57 +60 +63 +65 +67 +69 +72 +74 +77 +79 +81 +84 +86 +89 +91 +93 +95 +98 +100 +102 +104 +106 +109 +111 +113 +115 +118 +120 +122 +123 +126 +128 +130 +131 +133 +135 +136 +138 +140 +142 +143 +144 +146 +148 +149 +150 +151 +152 +154 +155 +156 +157 +158 +159 +159 +160 +161 +161 +162 +162 +162 +162 +162 +162 +162 +162 +161 +161 +161 +160 +159 +159 +158 +157 +157 +155 +154 +153 +151 +151 +150 +148 +146 +145 +143 +142 +140 +138 +137 +135 +133 +131 +129 +127 +126 +123 +121 +119 +118 +115 +114 +111 +108 +107 +104 +102 +100 +98 +95 +94 +91 +89 +86 +84 +82 +79 +77 +74 +72 +70 +67 +64 +62 +60 +57 +54 +54 +56 +58 +61 +64 +66 +69 +71 +74 +76 +78 +80 +83 +86 +88 +90 +93 +95 +97 +100 +102 +104 +106 +109 +111 +113 +115 +117 +119 +121 +123 +125 +127 +130 +132 +133 +135 +137 +138 +140 +142 +144 +146 +147 +149 +150 +152 +153 +154 +155 +156 +158 +159 +159 +161 +161 +162 +162 +163 +164 +164 +164 +164 +165 +165 +165 +165 +165 +164 +164 +163 +163 +162 +161 +160 +160 +159 +158 +156 +155 +155 +153 +151 +150 +148 +147 +146 +144 +142 +141 +139 +137 +135 +133 +132 +129 +127 +126 +123 +121 +119 +117 +115 +112 +110 +108 +107 +104 +102 +100 +97 +95 +92 +90 +88 +85 +83 +81 +79 +75 +73 +71 +69 +66 +63 +61 +58 +56 +55 +57 +60 +62 +65 +67 +69 +72 +74 +77 +80 +82 +84 +87 +89 +92 +94 +96 +99 +101 +103 +106 +108 +110 +112 +115 +117 +119 +121 +123 +125 +127 +130 +132 +133 +136 +137 +139 +141 +143 +145 +146 +148 +149 +151 +153 +154 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +166 +166 +167 +168 +167 +168 +168 +168 +168 +167 +167 +167 +166 +165 +165 +164 +163 +163 +162 +161 +159 +158 +156 +155 +154 +152 +151 +149 +148 +146 +144 +143 +141 +139 +138 +135 +133 +131 +130 +127 +126 +123 +121 +119 +117 +115 +113 +111 +108 +106 +104 +101 +99 +97 +95 +91 +89 +87 +84 +82 +79 +77 +74 +72 +70 +67 +65 +62 +59 +57 +56 +58 +60 +63 +66 +68 +71 +73 +76 +79 +81 +84 +86 +89 +91 +94 +96 +98 +100 +103 +105 +107 +110 +112 +114 +116 +118 +121 +123 +125 +127 +130 +131 +133 +136 +137 +139 +141 +143 +145 +146 +149 +150 +152 +153 +155 +156 +158 +159 +161 +162 +163 +164 +165 +165 +167 +168 +168 +169 +170 +169 +170 +171 +171 +171 +170 +171 +170 +169 +170 +169 +168 +167 +166 +166 +165 +164 +163 +162 +160 +159 +158 +156 +155 +153 +151 +151 +148 +146 +145 +143 +142 +140 +137 +136 +133 +131 +130 +127 +125 +123 +121 +119 +116 +114 +111 +110 +107 +105 +102 +100 +98 +96 +93 +91 +89 +86 +84 +81 +79 +76 +74 +71 +68 +66 +64 +61 +58 +57 +60 +62 +65 +67 +70 +72 +75 +78 +80 +82 +84 +87 +90 +92 +95 +97 +99 +102 +105 +106 +109 +111 +114 +116 +118 +121 +122 +125 +127 +130 +132 +134 +136 +137 +139 +142 +144 +145 +147 +149 +151 +153 +154 +155 +157 +159 +160 +161 +163 +165 +165 +167 +168 +169 +170 +171 +171 +172 +172 +173 +173 +173 +173 +173 +173 +173 +173 +172 +172 +171 +171 +170 +169 +169 +168 +167 +166 +165 +163 +162 +161 +158 +157 +156 +154 +153 +151 +148 +147 +145 +143 +141 +139 +137 +136 +133 +131 +129 +127 +124 +123 +120 +118 +116 +113 +111 +109 +107 +104 +102 +99 +97 +95 +92 +89 +87 +85 +82 +80 +77 +75 +72 +70 +67 +65 +62 +60 +58 +61 +63 +66 +69 +71 +74 +76 +79 +81 +84 +86 +89 +91 +93 +96 +98 +101 +103 +105 +108 +110 +113 +116 +118 +120 +122 +125 +126 +129 +131 +133 +135 +137 +139 +142 +144 +145 +148 +149 +151 +153 +154 +156 +158 +160 +161 +163 +164 +165 +166 +168 +169 +171 +171 +172 +173 +174 +174 +175 +175 +176 +176 +176 +176 +176 +176 +175 +175 +175 +174 +174 +173 +172 +171 +170 +169 +168 +167 +165 +165 +163 +161 +160 +158 +156 +155 +153 +151 +149 +147 +145 +144 +141 +140 +137 +135 +133 +131 +129 +127 +124 +122 +120 +117 +115 +113 +110 +108 +106 +103 +100 +98 +96 +94 +91 +89 +86 +83 +81 +78 +76 +74 +71 +68 +66 +64 +60 +59 +62 +65 +67 +70 +73 +75 +78 +80 +83 +85 +88 +90 +92 +95 +97 +100 +103 +105 +107 +109 +112 +114 +117 +119 +121 +123 +126 +128 +131 +133 +135 +137 +139 +141 +143 +146 +148 +149 +152 +153 +155 +156 +158 +160 +162 +164 +165 +167 +168 +169 +170 +172 +173 +174 +175 +175 +177 +177 +177 +178 +178 +179 +179 +179 +179 +179 +179 +178 +178 +177 +177 +176 +175 +173 +173 +171 +171 +170 +168 +167 +165 +163 +162 +161 +159 +157 +155 +153 +151 +150 +148 +146 +143 +141 +139 +137 +134 +133 +130 +128 +126 +124 +122 +119 +117 +114 +112 +109 +107 +105 +102 +100 +97 +95 +92 +90 +88 +84 +83 +80 +77 +75 +72 +70 +67 +65 +62 +61 +63 +66 +68 +71 +73 +76 +79 +81 +84 +86 +89 +91 +94 +96 +99 +102 +104 +106 +109 +111 +113 +116 +119 +120 +123 +125 +127 +130 +132 +134 +137 +139 +141 +143 +145 +147 +150 +151 +154 +155 +157 +159 +161 +162 +165 +165 +167 +169 +171 +172 +173 +174 +176 +177 +178 +178 +179 +180 +181 +181 +181 +182 +182 +182 +182 +182 +181 +181 +180 +180 +179 +178 +178 +176 +176 +175 +173 +172 +170 +169 +167 +166 +164 +162 +160 +159 +157 +155 +154 +152 +149 +147 +146 +143 +141 +139 +136 +134 +132 +130 +128 +125 +123 +120 +118 +116 +114 +111 +109 +106 +104 +101 +98 +96 +94 +91 +89 +87 +83 +81 +79 +76 +73 +71 +69 +65 +63 +61 +64 +66 +69 +72 +74 +77 +80 +82 +85 +88 +90 +93 +95 +98 +100 +102 +105 +107 +110 +112 +115 +117 +120 +122 +124 +127 +129 +131 +134 +136 +139 +141 +143 +145 +147 +150 +151 +154 +155 +158 +159 +161 +163 +164 +167 +168 +170 +171 +173 +174 +176 +177 +178 +179 +180 +181 +182 +183 +183 +183 +184 +185 +185 +185 +185 +185 +184 +184 +183 +183 +182 +182 +180 +179 +178 +177 +175 +174 +173 +172 +169 +168 +167 +165 +163 +161 +159 +158 +155 +153 +151 +149 +147 +145 +143 +141 +138 +136 +134 +131 +130 +127 +124 +122 +120 +117 +115 +113 +110 +108 +105 +103 +100 +97 +95 +92 +90 +87 +85 +82 +79 +77 +74 +72 +69 +66 +64 +63 +65 +68 +70 +73 +75 +78 +81 +83 +86 +88 +91 +94 +97 +99 +101 +104 +106 +109 +111 +114 +116 +118 +121 +124 +126 +128 +131 +133 +136 +138 +140 +142 +145 +147 +149 +151 +154 +156 +157 +159 +161 +164 +166 +167 +169 +170 +172 +173 +175 +177 +178 +180 +180 +182 +183 +184 +185 +185 +186 +187 +187 +187 +187 +188 +187 +187 +186 +186 +186 +186 +184 +184 +183 +182 +181 +179 +178 +177 +176 +174 +172 +171 +169 +167 +165 +163 +162 +159 +157 +155 +154 +151 +149 +146 +144 +142 +140 +138 +135 +133 +131 +128 +126 +123 +121 +119 +116 +114 +112 +109 +107 +104 +101 +99 +96 +94 +91 +88 +86 +84 +81 +78 +76 +73 +70 +67 +65 +64 +66 +69 +72 +74 +76 +79 +82 +84 +87 +90 +92 +95 +97 +100 +103 +105 +108 +110 +113 +115 +118 +120 +122 +125 +128 +130 +132 +135 +137 +139 +142 +144 +146 +149 +151 +153 +155 +158 +160 +161 +163 +166 +167 +169 +171 +172 +174 +176 +178 +179 +180 +181 +183 +184 +186 +186 +187 +188 +188 +189 +190 +190 +191 +190 +190 +190 +190 +189 +188 +188 +187 +187 +185 +184 +184 +182 +180 +179 +177 +176 +175 +172 +171 +169 +168 +166 +163 +161 +160 +157 +155 +153 +151 +148 +146 +144 +141 +140 +137 +134 +133 +130 +128 +125 +122 +120 +118 +115 +112 +110 +108 +105 +103 +100 +97 +95 +92 +90 +88 +84 +82 +79 +77 +74 +71 +68 +66 +64 +67 +70 +73 +75 +77 +80 +83 +86 +88 +91 +93 +96 +99 +101 +104 +106 +109 +112 +114 +116 +119 +122 +124 +126 +129 +131 +134 +137 +138 +141 +144 +145 +148 +150 +152 +155 +157 +159 +161 +163 +166 +168 +170 +171 +173 +175 +177 +179 +180 +181 +183 +184 +186 +187 +188 +189 +189 +191 +191 +192 +193 +193 +193 +193 +193 +193 +193 +192 +192 +191 +190 +189 +188 +187 +186 +185 +183 +181 +180 +179 +177 +175 +173 +171 +169 +168 +165 +163 +161 +159 +157 +155 +152 +150 +148 +146 +143 +141 +138 +136 +134 +131 +129 +126 +124 +121 +119 +117 +114 +111 +108 +107 +104 +102 +98 +96 +94 +90 +88 +85 +83 +80 +77 +75 +72 +70 +67 +65 +68 +71 +73 +76 +79 +81 +84 +86 +89 +91 +94 +97 +100 +102 +105 +108 +110 +112 +115 +118 +120 +123 +125 +128 +130 +133 +135 +138 +140 +142 +145 +147 +150 +152 +154 +157 +158 +161 +163 +165 +167 +169 +171 +174 +175 +178 +179 +181 +182 +184 +185 +187 +188 +189 +190 +192 +193 +193 +194 +194 +195 +195 +195 +196 +196 +196 +196 +195 +194 +193 +193 +191 +190 +189 +188 +187 +185 +184 +182 +180 +179 +177 +175 +173 +171 +169 +167 +165 +163 +160 +159 +156 +154 +152 +149 +147 +144 +143 +140 +138 +135 +132 +130 +127 +125 +123 +120 +117 +115 +113 +110 +108 +104 +102 +100 +97 +94 +92 +89 +86 +83 +81 +78 +75 +73 +71 +68 +66 +69 +71 +74 +76 +79 +82 +84 +88 +90 +93 +96 +98 +100 +104 +106 +108 +111 +114 +116 +119 +121 +124 +126 +129 +132 +134 +136 +139 +141 +144 +146 +149 +151 +153 +156 +158 +160 +163 +165 +167 +169 +171 +173 +175 +177 +179 +181 +183 +185 +186 +188 +189 +191 +192 +193 +194 +195 +196 +197 +197 +198 +198 +199 +199 +199 +198 +198 +198 +197 +196 +196 +195 +193 +192 +190 +190 +188 +186 +185 +183 +181 +180 +177 +175 +173 +171 +170 +167 +165 +163 +160 +158 +155 +154 +151 +149 +146 +144 +141 +139 +136 +134 +131 +129 +127 +124 +122 +119 +116 +114 +111 +109 +105 +103 +101 +98 +96 +93 +90 +88 +85 +82 +80 +77 +74 +72 +68 +67 +70 +73 +75 +77 +81 +83 +86 +88 +91 +93 +97 +99 +101 +104 +107 +110 +112 +115 +117 +120 +123 +126 +128 +131 +133 +135 +138 +140 +143 +145 +148 +150 +152 +155 +158 +160 +162 +164 +166 +169 +171 +173 +175 +178 +180 +182 +183 +185 +187 +188 +190 +192 +193 +194 +196 +197 +198 +199 +199 +201 +200 +201 +201 +201 +201 +202 +201 +200 +199 +199 +198 +197 +196 +194 +193 +192 +190 +189 +187 +185 +183 +181 +180 +178 +175 +173 +171 +169 +166 +165 +162 +160 +157 +155 +153 +150 +148 +145 +143 +140 +138 +136 +132 +131 +127 +125 +123 +120 +118 +115 +113 +110 +107 +104 +101 +99 +97 +94 +91 +88 +86 +83 +81 +78 +75 +72 +70 +67 +71 +74 +76 +78 +82 +84 +87 +89 +92 +95 +97 +100 +103 +105 +108 +110 +113 +116 +119 +121 +123 +126 +129 +131 +134 +137 +140 +141 +145 +147 +149 +152 +154 +156 +159 +161 +163 +166 +168 +171 +172 +175 +177 +179 +181 +183 +185 +187 +189 +191 +192 +194 +195 +197 +198 +199 +200 +202 +202 +203 +203 +204 +205 +205 +204 +204 +204 +203 +202 +201 +201 +199 +199 +197 +195 +194 +192 +191 +189 +187 +185 +183 +181 +179 +177 +175 +172 +171 +168 +166 +164 +162 +159 +156 +154 +152 +149 +146 +144 +141 +139 +137 +133 +131 +129 +126 +124 +121 +118 +116 +113 +110 +108 +105 +103 +100 +97 +94 +92 +89 +86 +84 +81 +79 +76 +73 +71 +69 +71 +73 +77 +79 +82 +85 +88 +90 +93 +95 +98 +101 +104 +106 +109 +111 +114 +117 +120 +122 +125 +128 +130 +133 +135 +137 +141 +143 +145 +148 +151 +153 +155 +157 +161 +163 +165 +168 +170 +172 +175 +177 +179 +181 +183 +185 +187 +189 +191 +193 +194 +196 +197 +199 +200 +202 +203 +204 +205 +206 +207 +207 +207 +207 +207 +207 +207 +206 +205 +205 +204 +202 +200 +200 +198 +197 +194 +193 +191 +189 +188 +185 +183 +181 +179 +176 +175 +173 +170 +167 +165 +163 +160 +158 +155 +153 +150 +148 +146 +142 +140 +137 +135 +133 +129 +127 +125 +122 +119 +117 +114 +112 +109 +106 +103 +101 +98 +95 +93 +90 +87 +85 +82 +79 +76 +74 +71 +69 +72 +74 +77 +80 +83 +85 +88 +90 +94 +96 +99 +102 +104 +107 +110 +113 +115 +118 +120 +123 +126 +129 +131 +134 +136 +139 +141 +144 +147 +149 +152 +154 +157 +159 +161 +165 +166 +169 +171 +174 +176 +178 +180 +183 +185 +187 +189 +191 +193 +195 +197 +199 +201 +202 +203 +205 +206 +207 +208 +208 +210 +210 +210 +210 +210 +209 +209 +209 +208 +207 +206 +204 +204 +202 +201 +199 +197 +195 +193 +191 +189 +187 +185 +183 +181 +178 +176 +174 +171 +169 +167 +165 +162 +159 +157 +154 +151 +149 +147 +144 +141 +139 +137 +134 +131 +129 +126 +123 +120 +118 +115 +112 +109 +107 +105 +102 +99 +96 +94 +91 +88 +86 +83 +80 +78 +74 +72 +70 +73 +76 +78 +81 +84 +86 +88 +92 +95 +98 +100 +103 +106 +108 +111 +114 +116 +118 +121 +124 +126 +129 +132 +134 +137 +140 +142 +145 +148 +150 +153 +155 +158 +160 +163 +165 +168 +171 +173 +175 +178 +180 +182 +185 +187 +189 +191 +194 +195 +197 +199 +201 +203 +204 +206 +207 +209 +209 +211 +212 +212 +212 +213 +212 +213 +213 +212 +212 +211 +210 +209 +207 +206 +204 +202 +201 +199 +198 +195 +193 +191 +189 +187 +184 +182 +180 +177 +175 +173 +170 +168 +166 +163 +160 +158 +155 +152 +151 +148 +145 +142 +140 +138 +134 +132 +129 +127 +124 +121 +119 +116 +113 +110 +108 +105 +102 +100 +97 +94 +91 +89 +86 +83 +81 +78 +75 +72 +71 +73 +76 +78 +81 +85 +87 +90 +92 +95 +98 +100 +103 +106 +109 +112 +114 +116 +119 +123 +125 +127 +130 +133 +135 +139 +141 +143 +146 +149 +152 +154 +157 +160 +162 +164 +167 +170 +172 +175 +177 +179 +181 +184 +186 +189 +191 +193 +195 +197 +199 +202 +203 +205 +207 +208 +210 +211 +212 +213 +214 +215 +215 +216 +216 +215 +215 +215 +214 +213 +212 +211 +209 +208 +207 +205 +203 +201 +199 +198 +195 +193 +191 +189 +186 +184 +181 +179 +177 +175 +171 +170 +167 +164 +162 +159 +157 +154 +152 +149 +146 +144 +141 +138 +136 +133 +131 +128 +125 +122 +119 +117 +114 +111 +109 +106 +103 +101 +98 +95 +93 +90 +87 +84 +81 +79 +76 +73 +71 +74 +77 +79 +82 +85 +88 +91 +93 +95 +98 +101 +104 +106 +109 +112 +114 +118 +120 +123 +126 +128 +131 +134 +136 +139 +142 +145 +147 +149 +153 +155 +158 +160 +163 +165 +169 +171 +173 +176 +178 +181 +183 +186 +188 +190 +192 +195 +197 +199 +201 +203 +206 +207 +209 +210 +212 +213 +215 +216 +216 +218 +218 +218 +219 +218 +218 +217 +217 +216 +215 +214 +212 +211 +208 +207 +205 +204 +201 +199 +197 +195 +192 +190 +188 +185 +183 +181 +178 +175 +173 +171 +168 +165 +163 +161 +158 +156 +152 +149 +147 +144 +141 +139 +136 +133 +131 +128 +126 +123 +120 +118 +115 +112 +109 +107 +104 +101 +99 +96 +93 +90 +87 +85 +82 +79 +77 +74 +71 +74 +77 +80 +82 +85 +88 +91 +94 +96 +99 +102 +104 +107 +110 +113 +116 +118 +122 +124 +126 +129 +132 +135 +137 +141 +143 +145 +148 +150 +153 +156 +158 +161 +164 +167 +170 +172 +174 +177 +179 +182 +185 +187 +190 +191 +194 +197 +199 +201 +203 +205 +207 +209 +211 +213 +214 +216 +217 +218 +220 +221 +220 +221 +221 +221 +221 +220 +219 +218 +217 +216 +215 +212 +211 +209 +207 +205 +203 +201 +198 +197 +194 +192 +190 +187 +185 +182 +179 +177 +174 +172 +169 +167 +164 +161 +159 +156 +154 +150 +148 +145 +143 +140 +138 +134 +132 +129 +126 +124 +121 +118 +115 +112 +110 +108 +105 +102 +100 +96 +94 +91 +88 +86 +82 +80 +77 +74 +72 +75 +77 +80 +83 +86 +89 +92 +95 +97 +100 +102 +105 +108 +111 +113 +117 +119 +122 +124 +128 +130 +133 +135 +139 +140 +144 +146 +149 +152 +154 +157 +160 +162 +165 +168 +171 +173 +175 +178 +181 +183 +186 +188 +190 +193 +195 +198 +201 +203 +205 +207 +209 +211 +213 +214 +217 +219 +220 +221 +222 +223 +223 +223 +224 +224 +223 +223 +222 +221 +219 +218 +217 +215 +213 +211 +209 +207 +205 +203 +200 +198 +196 +193 +191 +188 +185 +184 +180 +178 +175 +173 +170 +167 +165 +163 +160 +157 +154 +151 +149 +146 +143 +141 +138 +136 +133 +130 +127 +125 +122 +119 +116 +113 +110 +108 +106 +102 +100 +97 +94 +92 +89 +86 +83 +81 +77 +75 +73 +75 +78 +81 +84 +87 +89 +92 +95 +97 +101 +103 +106 +108 +111 +114 +117 +119 +122 +125 +128 +131 +134 +136 +139 +142 +145 +147 +150 +152 +155 +158 +161 +163 +166 +168 +171 +174 +177 +179 +182 +185 +187 +190 +192 +195 +197 +200 +201 +205 +206 +209 +211 +213 +215 +217 +219 +221 +222 +224 +224 +226 +227 +226 +227 +227 +226 +225 +225 +224 +222 +221 +219 +217 +215 +214 +211 +208 +207 +204 +202 +200 +197 +194 +192 +190 +187 +184 +182 +179 +177 +174 +172 +168 +166 +164 +161 +158 +156 +153 +150 +147 +144 +142 +139 +136 +133 +131 +128 +125 +122 +120 +117 +114 +112 +109 +106 +103 +100 +97 +95 +92 +89 +87 +83 +80 +78 +75 +73 +76 +78 +81 +84 +87 +89 +92 +95 +98 +101 +104 +106 +109 +112 +115 +117 +120 +123 +126 +128 +132 +134 +137 +140 +142 +145 +148 +150 +154 +156 +158 +161 +164 +167 +170 +172 +175 +177 +180 +183 +185 +188 +191 +193 +196 +198 +201 +203 +205 +208 +210 +213 +215 +218 +219 +221 +223 +225 +226 +227 +229 +229 +230 +229 +229 +229 +228 +227 +226 +224 +223 +221 +219 +217 +215 +213 +210 +208 +206 +203 +201 +199 +196 +193 +191 +188 +185 +183 +180 +178 +175 +172 +169 +167 +164 +161 +159 +156 +154 +150 +148 +145 +143 +140 +136 +134 +131 +129 +125 +123 +120 +118 +114 +112 +110 +107 +103 +101 +98 +95 +93 +90 +87 +84 +82 +78 +76 +74 +76 +79 +81 +85 +88 +90 +93 +95 +98 +101 +104 +107 +109 +112 +115 +117 +121 +123 +126 +129 +132 +135 +137 +140 +142 +146 +148 +151 +154 +156 +159 +162 +164 +167 +170 +173 +176 +179 +181 +184 +186 +189 +192 +194 +197 +200 +202 +205 +207 +210 +212 +215 +217 +219 +221 +223 +225 +227 +228 +229 +231 +231 +232 +233 +232 +232 +231 +229 +228 +227 +225 +223 +221 +219 +216 +214 +212 +209 +207 +204 +202 +200 +197 +194 +192 +189 +187 +184 +181 +178 +176 +173 +170 +168 +164 +163 +160 +157 +154 +151 +148 +146 +143 +140 +137 +134 +131 +129 +126 +124 +120 +117 +115 +113 +110 +106 +104 +102 +98 +95 +93 +90 +87 +84 +81 +78 +76 +74 +76 +80 +83 +85 +88 +90 +94 +96 +99 +101 +104 +107 +110 +113 +116 +118 +122 +124 +127 +129 +132 +135 +138 +140 +144 +146 +149 +151 +155 +157 +160 +163 +166 +168 +171 +174 +176 +179 +181 +185 +187 +190 +192 +195 +198 +200 +203 +206 +208 +210 +214 +216 +218 +221 +223 +225 +227 +229 +231 +232 +233 +235 +235 +235 +235 +234 +234 +232 +231 +229 +228 +225 +223 +221 +219 +216 +214 +211 +209 +206 +203 +201 +198 +196 +193 +190 +187 +184 +182 +179 +177 +174 +171 +168 +166 +163 +160 +157 +154 +151 +149 +146 +143 +141 +138 +135 +132 +129 +127 +124 +121 +118 +115 +113 +110 +107 +104 +102 +98 +96 +93 +91 +88 +85 +82 +79 +76 +73 +76 +80 +82 +85 +88 +91 +94 +96 +100 +102 +105 +107 +110 +113 +115 +119 +122 +125 +127 +130 +133 +136 +138 +141 +144 +147 +149 +152 +155 +158 +161 +164 +166 +169 +172 +174 +177 +179 +182 +185 +188 +191 +193 +197 +199 +202 +204 +207 +210 +212 +215 +217 +220 +222 +225 +227 +229 +232 +233 +235 +236 +237 +238 +238 +238 +238 +236 +235 +233 +231 +229 +226 +224 +222 +219 +218 +215 +212 +210 +207 +205 +202 +199 +196 +193 +191 +188 +186 +183 +179 +177 +175 +171 +169 +166 +163 +161 +158 +155 +152 +150 +146 +144 +141 +138 +135 +132 +130 +127 +125 +121 +119 +116 +113 +111 +107 +105 +102 +99 +96 +94 +91 +88 +86 +82 +80 +76 +75 +76 +80 +82 +86 +88 +91 +93 +97 +99 +102 +105 +108 +111 +113 +116 +119 +121 +124 +127 +130 +133 +136 +139 +141 +144 +147 +150 +153 +155 +159 +161 +163 +166 +169 +172 +174 +178 +180 +183 +186 +188 +192 +194 +196 +200 +202 +205 +208 +210 +213 +215 +218 +221 +224 +226 +229 +231 +233 +235 +237 +239 +240 +240 +241 +241 +240 +239 +237 +235 +233 +231 +228 +226 +223 +221 +218 +216 +213 +210 +208 +205 +202 +200 +197 +194 +191 +189 +186 +183 +181 +177 +175 +172 +169 +167 +163 +161 +158 +155 +152 +149 +147 +144 +141 +139 +136 +133 +130 +127 +125 +122 +119 +116 +113 +110 +108 +105 +102 +100 +97 +94 +91 +88 +85 +83 +80 +77 +75 +77 +80 +83 +85 +88 +91 +94 +97 +99 +102 +105 +108 +111 +114 +116 +120 +122 +125 +128 +130 +133 +136 +139 +142 +145 +148 +150 +153 +156 +158 +161 +164 +167 +169 +173 +176 +178 +180 +184 +186 +189 +192 +195 +197 +200 +203 +206 +209 +212 +214 +217 +220 +222 +225 +227 +230 +232 +234 +237 +240 +241 +243 +243 +244 +243 +242 +241 +239 +237 +235 +232 +230 +227 +224 +222 +219 +216 +214 +211 +208 +206 +203 +200 +197 +194 +192 +190 +186 +183 +181 +178 +175 +173 +170 +166 +164 +161 +158 +156 +153 +150 +147 +145 +141 +139 +136 +134 +131 +128 +125 +122 +119 +117 +114 +111 +108 +105 +102 +99 +97 +94 +91 +88 +85 +83 +80 +77 +74 +77 +80 +83 +86 +88 +92 +94 +97 +100 +102 +105 +108 +111 +113 +117 +119 +123 +125 +128 +131 +133 +137 +139 +141 +145 +148 +151 +153 +156 +159 +161 +164 +168 +170 +173 +176 +178 +181 +184 +187 +189 +193 +196 +198 +200 +204 +206 +209 +212 +214 +218 +220 +223 +226 +229 +231 +234 +236 +239 +241 +243 +245 +246 +247 +246 +245 +243 +241 +239 +236 +234 +231 +228 +226 +223 +220 +217 +214 +212 +209 +206 +204 +201 +198 +196 +193 +190 +187 +184 +181 +179 +176 +173 +170 +168 +164 +162 +159 +156 +153 +151 +148 +145 +142 +139 +137 +133 +130 +128 +125 +122 +119 +117 +114 +111 +108 +105 +103 +100 +97 +94 +92 +88 +86 +83 +80 +77 +75 +77 +80 +83 +86 +88 +92 +94 +97 +100 +103 +106 +109 +111 +114 +117 +119 +122 +125 +128 +131 +134 +136 +140 +142 +145 +148 +151 +153 +156 +159 +162 +165 +167 +170 +173 +176 +178 +182 +185 +187 +190 +193 +196 +199 +202 +204 +207 +209 +213 +215 +218 +220 +223 +227 +229 +232 +235 +238 +240 +242 +245 +247 +249 +250 +249 +247 +245 +242 +240 +237 +234 +232 +229 +226 +224 +221 +218 +216 +213 +210 +206 +204 +201 +198 +196 +193 +190 +187 +185 +182 +178 +175 +173 +170 +168 +164 +162 +159 +156 +153 +150 +148 +145 +142 +139 +136 +133 +131 +128 +126 +122 +120 +117 +114 +111 +109 +106 +103 +100 +97 +94 +91 +89 +85 +83 +80 +77 +75 +77 +80 +83 +86 +89 +91 +94 +97 +100 +102 +106 +109 +112 +115 +117 +120 +123 +125 +128 +131 +134 +137 +139 +142 +145 +147 +151 +154 +156 +159 +162 +164 +167 +171 +174 +176 +179 +181 +185 +187 +190 +193 +196 +198 +202 +204 +207 +210 +213 +216 +218 +221 +224 +227 +230 +232 +235 +238 +241 +243 +246 +248 +251 +252 +251 +249 +246 +244 +241 +238 +235 +232 +229 +226 +224 +221 +219 +216 +213 +209 +207 +204 +202 +199 +195 +193 +190 +187 +185 +182 +179 +176 +173 +171 +168 +165 +162 +159 +156 +154 +151 +148 +146 +142 +139 +137 +134 +131 +129 +125 +123 +120 +117 +114 +112 +109 +105 +102 +100 +98 +95 +92 +89 +86 +84 +80 +77 +75 +77 +81 +83 +86 +88 +92 +94 +98 +100 +103 +105 +108 +111 +114 +117 +120 +123 +126 +128 +131 +134 +136 +139 +143 +145 +148 +151 +154 +157 +159 +163 +164 +168 +170 +174 +176 +179 +181 +185 +187 +190 +193 +196 +199 +201 +204 +207 +210 +213 +215 +219 +221 +224 +226 +230 +233 +235 +238 +241 +244 +247 +250 +252 +255 +252 +250 +246 +244 +241 +238 +236 +233 +230 +227 +224 +222 +218 +216 +213 +210 +207 +204 +202 +199 +196 +193 +190 +188 +185 +182 +179 +176 +173 +171 +167 +164 +162 +159 +156 +154 +150 +148 +145 +142 +139 +136 +133 +131 +128 +125 +122 +120 +117 +115 +111 +108 +106 +103 +100 +97 +94 +92 +89 +86 +83 +81 +78 +74 +78 +80 +83 +86 +88 +92 +95 +97 +100 +103 +106 +109 +111 +114 +117 +119 +123 +125 +128 +131 +134 +136 +140 +142 +145 +148 +151 +153 +157 +159 +162 +165 +168 +170 +173 +177 +179 +182 +185 +187 +190 +192 +196 +199 +201 +204 +207 +210 +213 +216 +218 +221 +224 +227 +230 +232 +235 +238 +241 +243 +246 +249 +251 +253 +251 +249 +246 +243 +241 +238 +235 +233 +230 +227 +224 +221 +218 +216 +213 +210 +207 +204 +201 +198 +196 +192 +191 +187 +184 +182 +179 +176 +173 +170 +168 +165 +162 +159 +156 +153 +151 +148 +145 +142 +140 +137 +133 +131 +129 +125 +122 +120 +117 +114 +111 +108 +106 +103 +100 +98 +95 +92 +89 +86 +83 +80 +78 +74 +78 +80 +83 +86 +89 +91 +94 +97 +100 +103 +105 +109 +111 +114 +116 +120 +123 +126 +128 +131 +134 +136 +139 +142 +145 +148 +150 +153 +156 +159 +162 +165 +167 +170 +173 +176 +179 +182 +184 +188 +190 +193 +196 +198 +201 +204 +207 +209 +212 +215 +218 +221 +223 +226 +229 +232 +235 +237 +239 +242 +244 +247 +249 +249 +249 +247 +245 +243 +239 +238 +235 +232 +229 +227 +224 +220 +218 +215 +213 +210 +206 +204 +201 +199 +196 +193 +189 +188 +184 +181 +179 +176 +173 +170 +168 +165 +162 +159 +156 +153 +150 +147 +145 +143 +139 +137 +133 +131 +128 +126 +122 +120 +117 +114 +112 +109 +105 +103 +100 +97 +94 +92 +89 +86 +83 +81 +77 +74 +77 +81 +83 +86 +89 +92 +95 +97 +100 +103 +105 +108 +111 +114 +116 +120 +122 +125 +128 +131 +134 +136 +140 +142 +145 +147 +151 +154 +156 +159 +162 +165 +167 +170 +172 +175 +178 +181 +184 +187 +190 +193 +195 +198 +201 +203 +206 +209 +212 +215 +217 +220 +223 +226 +229 +231 +234 +236 +239 +241 +243 +245 +246 +246 +246 +245 +243 +241 +238 +236 +234 +231 +228 +226 +222 +220 +217 +215 +212 +209 +207 +203 +201 +198 +195 +193 +190 +187 +184 +181 +178 +176 +173 +170 +167 +164 +161 +159 +156 +154 +150 +148 +145 +142 +139 +136 +134 +131 +128 +125 +122 +120 +117 +114 +111 +108 +105 +103 +100 +97 +95 +91 +89 +86 +83 +80 +77 +75 +77 +80 +83 +86 +88 +92 +94 +97 +99 +103 +106 +109 +111 +113 +117 +120 +122 +125 +128 +131 +133 +137 +139 +142 +145 +147 +151 +153 +155 +158 +161 +164 +167 +170 +173 +175 +178 +180 +183 +187 +189 +192 +194 +197 +200 +203 +205 +209 +212 +214 +217 +219 +222 +225 +227 +229 +232 +234 +237 +239 +241 +242 +243 +244 +243 +242 +241 +240 +237 +235 +233 +229 +227 +225 +222 +219 +217 +213 +211 +208 +206 +203 +200 +198 +195 +192 +189 +186 +184 +181 +178 +175 +172 +170 +167 +164 +161 +158 +156 +153 +150 +147 +144 +142 +139 +136 +133 +131 +128 +125 +122 +119 +117 +114 +111 +108 +106 +103 +100 +97 +94 +91 +89 +86 +83 +80 +77 +75 +77 +79 +83 +85 +88 +91 +94 +97 +100 +102 +105 +108 +111 +114 +116 +119 +122 +124 +127 +130 +133 +136 +139 +141 +145 +147 +150 +152 +155 +159 +161 +164 +166 +170 +172 +175 +177 +181 +184 +186 +189 +191 +195 +197 +199 +202 +205 +208 +211 +213 +216 +219 +221 +224 +226 +228 +231 +233 +235 +237 +239 +239 +241 +241 +241 +239 +238 +237 +235 +233 +231 +228 +226 +223 +221 +219 +216 +213 +210 +207 +205 +202 +200 +197 +195 +192 +189 +186 +183 +181 +177 +175 +172 +169 +166 +164 +161 +159 +155 +152 +149 +147 +144 +141 +139 +136 +133 +130 +128 +125 +122 +119 +116 +114 +110 +108 +105 +102 +100 +97 +94 +91 +89 +86 +83 +80 +77 +74 +77 +79 +82 +85 +88 +90 +93 +96 +99 +102 +105 +107 +110 +113 +116 +119 +121 +125 +127 +130 +133 +135 +138 +141 +143 +147 +149 +152 +155 +158 +161 +163 +166 +169 +172 +174 +177 +180 +182 +185 +188 +191 +194 +196 +199 +201 +204 +207 +209 +212 +215 +217 +220 +222 +224 +227 +229 +231 +233 +235 +236 +237 +238 +238 +237 +238 +236 +235 +233 +231 +229 +227 +224 +223 +219 +218 +214 +212 +209 +207 +204 +201 +199 +197 +193 +190 +188 +185 +183 +180 +177 +174 +171 +169 +166 +163 +160 +157 +155 +152 +149 +147 +144 +141 +139 +135 +132 +130 +127 +124 +122 +118 +116 +113 +111 +108 +105 +102 +99 +96 +94 +91 +88 +86 +82 +80 +77 +74 +77 +79 +82 +85 +87 +90 +93 +96 +99 +102 +104 +107 +110 +113 +115 +118 +121 +123 +127 +130 +132 +135 +138 +141 +144 +147 +149 +152 +155 +157 +160 +162 +166 +168 +171 +174 +176 +179 +182 +185 +187 +190 +193 +196 +198 +200 +203 +206 +208 +211 +213 +216 +219 +220 +223 +225 +227 +229 +231 +233 +234 +235 +235 +235 +235 +234 +233 +232 +231 +229 +227 +225 +223 +220 +218 +215 +213 +211 +208 +206 +203 +201 +198 +195 +192 +190 +187 +184 +182 +180 +176 +174 +171 +168 +165 +162 +160 +157 +155 +152 +149 +146 +143 +141 +138 +135 +132 +130 +126 +124 +121 +118 +116 +113 +110 +107 +104 +102 +99 +96 +93 +91 +88 +85 +82 +79 +76 +73 +77 +79 +81 +85 +88 +90 +93 +96 +98 +101 +104 +106 +109 +112 +115 +118 +120 +124 +126 +129 +132 +134 +137 +140 +143 +146 +149 +151 +154 +157 +159 +162 +165 +167 +170 +173 +176 +178 +181 +184 +187 +189 +191 +194 +197 +200 +202 +204 +207 +210 +212 +214 +217 +218 +221 +223 +225 +227 +228 +229 +231 +232 +233 +233 +233 +232 +230 +230 +229 +227 +225 +223 +221 +219 +217 +215 +212 +209 +208 +205 +202 +200 +197 +195 +191 +189 +186 +184 +181 +179 +175 +173 +170 +167 +165 +162 +159 +157 +153 +151 +148 +146 +143 +140 +137 +135 +132 +129 +127 +124 +120 +118 +115 +112 +109 +106 +104 +101 +99 +95 +93 +90 +87 +84 +82 +79 +76 +73 +76 +79 +81 +84 +86 +89 +93 +95 +98 +101 +104 +106 +109 +112 +114 +117 +121 +123 +126 +129 +131 +134 +136 +139 +142 +145 +147 +151 +153 +156 +158 +162 +164 +167 +170 +172 +175 +177 +180 +183 +185 +188 +191 +193 +196 +199 +201 +203 +205 +208 +210 +213 +215 +217 +219 +221 +222 +224 +226 +227 +228 +229 +230 +230 +229 +229 +228 +227 +226 +225 +223 +221 +219 +217 +215 +213 +210 +208 +206 +204 +201 +198 +196 +193 +191 +188 +186 +182 +180 +178 +174 +172 +169 +166 +164 +162 +159 +156 +153 +150 +148 +145 +142 +139 +137 +134 +131 +128 +126 +123 +121 +118 +115 +112 +109 +106 +103 +101 +98 +95 +92 +90 +87 +84 +81 +78 +75 +72 +76 +78 +81 +83 +87 +89 +92 +95 +97 +101 +103 +106 +109 +112 +115 +117 +119 +123 +126 +128 +130 +133 +136 +139 +142 +144 +147 +149 +153 +155 +158 +160 +163 +166 +169 +171 +173 +177 +179 +181 +184 +187 +189 +192 +194 +197 +199 +202 +204 +207 +209 +211 +214 +215 +217 +219 +221 +223 +223 +224 +226 +227 +227 +226 +226 +227 +226 +225 +223 +223 +221 +218 +217 +215 +214 +211 +209 +207 +204 +202 +200 +197 +195 +192 +190 +187 +184 +182 +179 +176 +173 +171 +168 +166 +163 +161 +158 +156 +153 +150 +147 +144 +142 +139 +136 +133 +131 +128 +125 +122 +119 +117 +114 +111 +109 +105 +103 +100 +97 +95 +92 +89 +86 +83 +80 +78 +75 +72 +75 +77 +80 +83 +86 +89 +91 +94 +97 +99 +102 +105 +108 +111 +114 +116 +119 +121 +124 +127 +130 +132 +136 +138 +141 +143 +146 +149 +151 +154 +157 +159 +163 +165 +168 +170 +173 +176 +178 +181 +184 +186 +188 +191 +193 +196 +198 +200 +203 +205 +207 +209 +211 +213 +215 +216 +218 +220 +221 +222 +223 +223 +224 +224 +224 +223 +223 +222 +220 +220 +219 +217 +215 +213 +211 +209 +207 +205 +202 +200 +198 +196 +193 +191 +188 +186 +183 +181 +178 +175 +173 +170 +168 +165 +162 +160 +157 +155 +152 +149 +146 +143 +140 +138 +135 +133 +130 +127 +124 +121 +119 +116 +113 +111 +108 +105 +102 +99 +97 +95 +92 +89 +86 +83 +80 +77 +75 +72 +74 +77 +80 +82 +85 +88 +91 +94 +97 +99 +102 +105 +107 +111 +112 +116 +119 +122 +124 +126 +130 +132 +134 +137 +140 +143 +146 +148 +151 +153 +156 +159 +161 +164 +167 +169 +172 +174 +176 +179 +182 +185 +186 +190 +192 +194 +196 +199 +200 +203 +206 +208 +209 +211 +213 +214 +216 +217 +219 +220 +220 +221 +221 +221 +221 +221 +220 +220 +218 +217 +215 +215 +212 +211 +209 +207 +205 +203 +201 +199 +197 +194 +192 +190 +186 +185 +182 +179 +177 +175 +172 +169 +167 +164 +161 +159 +156 +153 +151 +148 +145 +143 +140 +137 +135 +132 +129 +127 +124 +121 +118 +115 +113 +110 +107 +104 +102 +99 +96 +93 +91 +88 +86 +83 +79 +77 +74 +71 +74 +77 +79 +82 +85 +88 +91 +93 +95 +99 +102 +104 +106 +109 +112 +115 +117 +120 +123 +125 +129 +132 +134 +137 +139 +142 +145 +147 +150 +152 +155 +158 +161 +163 +165 +168 +171 +173 +175 +178 +180 +183 +186 +188 +190 +193 +194 +197 +199 +201 +203 +206 +207 +209 +210 +212 +213 +214 +215 +216 +217 +218 +218 +218 +218 +218 +217 +217 +216 +215 +214 +212 +211 +209 +207 +205 +203 +202 +199 +197 +195 +193 +190 +188 +185 +183 +180 +178 +176 +173 +170 +168 +166 +163 +160 +157 +155 +153 +150 +147 +145 +142 +139 +136 +134 +131 +128 +126 +123 +120 +117 +115 +112 +109 +107 +104 +101 +99 +96 +93 +90 +88 +85 +82 +80 +76 +74 +71 +73 +76 +79 +82 +84 +87 +90 +92 +95 +98 +100 +104 +106 +109 +112 +114 +116 +120 +122 +125 +128 +130 +133 +136 +138 +141 +143 +147 +149 +151 +154 +156 +159 +162 +165 +167 +169 +172 +174 +177 +179 +181 +184 +186 +188 +191 +193 +195 +197 +199 +201 +203 +205 +207 +208 +209 +211 +212 +214 +214 +214 +215 +216 +216 +215 +215 +215 +214 +213 +212 +211 +210 +208 +207 +205 +203 +201 +199 +198 +195 +193 +190 +188 +186 +184 +182 +180 +177 +174 +171 +169 +167 +164 +162 +159 +157 +154 +151 +149 +146 +144 +141 +139 +135 +133 +131 +128 +125 +122 +120 +117 +114 +112 +108 +106 +103 +101 +98 +96 +92 +90 +87 +84 +81 +79 +76 +73 +70 +72 +75 +78 +81 +83 +86 +89 +91 +94 +97 +100 +102 +105 +108 +110 +113 +116 +119 +121 +124 +127 +129 +132 +134 +137 +140 +142 +145 +148 +150 +153 +155 +158 +160 +163 +165 +168 +171 +173 +176 +178 +180 +182 +185 +187 +189 +191 +193 +195 +197 +199 +201 +203 +205 +206 +207 +208 +210 +210 +211 +212 +212 +213 +212 +213 +212 +212 +212 +211 +209 +208 +207 +206 +204 +203 +200 +199 +197 +195 +193 +191 +189 +187 +185 +182 +180 +178 +176 +173 +170 +168 +165 +163 +160 +158 +155 +153 +151 +148 +145 +142 +139 +138 +135 +132 +130 +126 +124 +121 +118 +116 +114 +111 +108 +106 +103 +100 +97 +94 +92 +89 +86 +83 +81 +78 +75 +72 +69 +72 +75 +77 +80 +83 +86 +88 +91 +93 +96 +99 +101 +104 +107 +110 +112 +115 +117 +120 +123 +126 +128 +131 +133 +136 +139 +142 +144 +147 +149 +152 +154 +157 +159 +161 +164 +166 +169 +171 +174 +176 +179 +180 +183 +185 +187 +189 +191 +193 +195 +197 +199 +200 +202 +203 +205 +206 +207 +208 +209 +209 +210 +210 +210 +210 +210 +209 +209 +208 +207 +206 +204 +203 +202 +200 +199 +197 +195 +193 +191 +189 +188 +185 +183 +180 +178 +176 +173 +172 +169 +167 +164 +161 +160 +156 +154 +152 +149 +147 +144 +142 +139 +136 +133 +131 +128 +125 +123 +120 +118 +115 +112 +110 +107 +104 +102 +99 +97 +94 +91 +89 +85 +83 +80 +78 +74 +72 +68 +71 +74 +76 +79 +82 +85 +88 +90 +93 +95 +98 +101 +104 +107 +109 +112 +114 +117 +119 +122 +125 +127 +130 +133 +136 +138 +140 +142 +146 +147 +151 +152 +156 +158 +160 +163 +165 +168 +170 +172 +174 +177 +179 +181 +183 +185 +187 +189 +191 +193 +195 +196 +198 +200 +200 +202 +204 +204 +205 +205 +206 +206 +207 +207 +207 +207 +206 +206 +205 +204 +203 +202 +201 +199 +198 +197 +195 +193 +191 +190 +187 +185 +183 +181 +179 +177 +175 +173 +169 +168 +166 +163 +160 +158 +156 +153 +150 +148 +146 +143 +140 +138 +135 +133 +130 +128 +125 +122 +119 +117 +114 +112 +109 +106 +104 +101 +99 +95 +93 +91 +87 +85 +82 +79 +77 +73 +71 +68 +70 +73 +76 +79 +81 +84 +87 +89 +92 +95 +97 +100 +103 +105 +108 +111 +113 +116 +118 +121 +124 +126 +129 +131 +134 +137 +139 +141 +144 +147 +149 +151 +154 +157 +159 +161 +163 +166 +168 +170 +172 +175 +177 +180 +181 +183 +185 +187 +189 +191 +192 +194 +196 +197 +198 +200 +201 +202 +203 +203 +203 +204 +204 +204 +205 +204 +204 +203 +202 +202 +201 +200 +198 +197 +195 +194 +193 +191 +189 +187 +185 +184 +181 +179 +177 +175 +173 +170 +168 +166 +164 +162 +158 +157 +154 +152 +149 +146 +144 +142 +139 +136 +134 +132 +129 +126 +123 +121 +118 +116 +113 +110 +108 +105 +102 +100 +97 +95 +92 +89 +87 +84 +81 +78 +76 +73 +70 +67 +70 +72 +75 +77 +81 +83 +86 +89 +91 +94 +97 +99 +102 +104 +107 +110 +113 +115 +118 +120 +123 +125 +128 +131 +132 +135 +138 +141 +142 +145 +147 +150 +152 +155 +158 +160 +162 +164 +167 +168 +171 +173 +175 +177 +179 +181 +184 +185 +187 +188 +190 +192 +193 +195 +196 +196 +198 +199 +200 +200 +201 +201 +201 +202 +202 +201 +201 +201 +200 +199 +198 +197 +196 +194 +193 +192 +190 +189 +187 +185 +183 +182 +180 +177 +176 +173 +171 +169 +167 +165 +162 +160 +157 +155 +153 +150 +148 +146 +143 +141 +138 +136 +133 +131 +128 +126 +123 +120 +117 +115 +112 +110 +107 +105 +102 +99 +97 +94 +91 +89 +86 +83 +80 +77 +75 +72 +69 +66 +69 +72 +74 +77 +79 +82 +85 +87 +90 +93 +96 +98 +100 +104 +106 +108 +111 +113 +116 +119 +121 +124 +126 +129 +132 +134 +136 +139 +141 +144 +146 +149 +151 +154 +155 +158 +160 +163 +165 +167 +169 +172 +174 +175 +177 +179 +181 +183 +185 +186 +188 +189 +190 +192 +194 +194 +196 +196 +197 +197 +198 +198 +198 +199 +199 +198 +198 +198 +197 +196 +196 +194 +194 +192 +190 +189 +187 +186 +185 +183 +181 +180 +177 +175 +173 +172 +169 +167 +164 +162 +160 +158 +155 +154 +151 +149 +146 +143 +141 +139 +136 +134 +132 +129 +127 +124 +122 +119 +117 +114 +111 +109 +106 +103 +100 +98 +95 +92 +90 +88 +85 +82 +79 +77 +74 +71 +68 +65 +68 +71 +73 +76 +78 +82 +84 +86 +90 +92 +94 +97 +99 +102 +105 +107 +110 +113 +115 +117 +120 +122 +126 +128 +130 +132 +136 +137 +140 +143 +145 +147 +149 +152 +154 +156 +159 +161 +163 +166 +168 +169 +172 +174 +175 +177 +179 +180 +182 +184 +186 +187 +188 +190 +190 +191 +193 +193 +194 +195 +196 +195 +196 +196 +195 +196 +195 +194 +194 +194 +193 +192 +191 +189 +188 +186 +186 +184 +182 +181 +179 +177 +175 +173 +171 +170 +167 +165 +163 +161 +159 +157 +154 +152 +150 +147 +144 +143 +140 +137 +135 +133 +130 +128 +125 +123 +120 +117 +115 +112 +110 +108 +105 +103 +99 +97 +94 +91 +89 +87 +84 +81 +78 +76 +73 +71 +68 +64 +67 +70 +72 +75 +77 +81 +83 +85 +88 +91 +93 +96 +99 +101 +104 +107 +109 +112 +114 +117 +119 +121 +124 +126 +129 +132 +133 +136 +138 +141 +143 +145 +148 +150 +152 +155 +157 +159 +161 +163 +165 +167 +169 +171 +173 +175 +177 +179 +180 +182 +183 +185 +186 +187 +188 +189 +190 +191 +191 +192 +193 +193 +193 +193 +193 +192 +192 +192 +192 +191 +190 +189 +188 +187 +186 +184 +183 +181 +180 +178 +176 +175 +173 +172 +170 +167 +166 +163 +161 +159 +157 +154 +153 +151 +148 +146 +143 +141 +139 +136 +133 +132 +128 +127 +124 +121 +119 +116 +114 +112 +109 +106 +103 +101 +98 +96 +94 +91 +88 +86 +83 +80 +77 +75 +72 +70 +67 +63 +66 +69 +71 +74 +76 +79 +82 +85 +87 +90 +92 +95 +98 +100 +102 +105 +107 +110 +113 +115 +118 +120 +122 +125 +128 +130 +132 +135 +137 +140 +141 +144 +146 +149 +151 +153 +155 +157 +159 +161 +163 +166 +168 +170 +171 +172 +174 +176 +178 +179 +180 +182 +183 +185 +185 +186 +187 +188 +189 +190 +190 +189 +190 +190 +190 +190 +189 +189 +189 +188 +187 +186 +186 +184 +183 +182 +181 +179 +178 +176 +175 +172 +170 +169 +167 +165 +163 +161 +159 +157 +155 +153 +151 +149 +146 +144 +142 +139 +137 +135 +132 +130 +128 +125 +122 +121 +118 +115 +112 +110 +107 +105 +102 +100 +98 +94 +93 +89 +87 +84 +82 +80 +77 +74 +72 +69 +66 +62 +65 +67 +71 +73 +76 +78 +80 +83 +86 +88 +91 +93 +96 +99 +101 +104 +106 +109 +111 +114 +117 +118 +121 +124 +126 +129 +130 +133 +135 +137 +140 +142 +144 +147 +149 +151 +153 +155 +157 +159 +161 +164 +166 +167 +169 +170 +172 +174 +175 +176 +178 +180 +181 +182 +183 +184 +185 +185 +186 +186 +186 +187 +187 +187 +188 +187 +187 +186 +186 +185 +185 +184 +183 +181 +180 +180 +178 +176 +176 +174 +172 +170 +169 +167 +165 +163 +161 +160 +158 +156 +154 +152 +149 +147 +145 +142 +140 +138 +136 +133 +131 +128 +126 +124 +121 +119 +116 +114 +111 +109 +106 +104 +102 +98 +96 +94 +91 +89 +86 +84 +81 +78 +75 +73 +70 +68 +65 +61 +64 +67 +69 +72 +75 +77 +80 +83 +85 +88 +90 +92 +95 +97 +100 +103 +105 +108 +110 +112 +115 +118 +120 +122 +125 +127 +129 +132 +134 +136 +139 +140 +142 +145 +147 +149 +151 +153 +156 +157 +159 +161 +163 +164 +166 +168 +170 +172 +173 +174 +175 +176 +178 +179 +180 +181 +182 +182 +184 +183 +184 +184 +185 +185 +184 +184 +184 +184 +184 +182 +182 +182 +180 +179 +178 +177 +176 +174 +173 +171 +170 +168 +167 +165 +163 +161 +159 +157 +156 +153 +152 +149 +147 +145 +142 +140 +138 +136 +134 +132 +129 +127 +124 +122 +120 +117 +115 +113 +110 +108 +105 +103 +100 +98 +95 +92 +90 +88 +85 +82 +80 +77 +75 +72 +69 +66 +64 +61 +63 +66 +69 +71 +74 +76 +79 +81 +83 +86 +89 +91 +93 +96 +99 +101 +104 +106 +108 +111 +114 +116 +119 +121 +123 +125 +128 +130 +132 +135 +137 +139 +141 +144 +145 +147 +149 +151 +153 +156 +157 +159 +161 +163 +164 +166 +168 +169 +171 +171 +173 +175 +175 +177 +178 +179 +179 +179 +181 +181 +181 +181 +182 +182 +182 +181 +181 +181 +180 +180 +179 +179 +177 +177 +175 +174 +173 +171 +170 +169 +167 +165 +165 +163 +161 +159 +157 +155 +154 +151 +150 +147 +145 +143 +141 +139 +137 +134 +132 +130 +127 +125 +123 +121 +118 +116 +114 +111 +108 +106 +104 +101 +99 +96 +93 +91 +89 +87 +84 +81 +79 +76 +73 +71 +69 +65 +63 +59 +62 +65 +67 +70 +73 +74 +77 +80 +82 +85 +87 +90 +93 +95 +98 +99 +103 +105 +107 +110 +112 +114 +117 +119 +121 +123 +125 +128 +130 +132 +135 +137 +139 +141 +143 +146 +148 +149 +151 +154 +155 +157 +158 +160 +162 +163 +165 +166 +168 +169 +171 +172 +173 +174 +175 +175 +176 +177 +178 +178 +179 +179 +179 +179 +179 +179 +178 +178 +178 +177 +177 +176 +175 +174 +173 +171 +170 +169 +168 +166 +165 +164 +162 +161 +159 +157 +155 +153 +152 +149 +147 +145 +143 +141 +139 +137 +135 +133 +131 +128 +126 +124 +122 +119 +117 +114 +112 +110 +107 +105 +102 +100 +98 +95 +93 +90 +87 +84 +82 +80 +78 +75 +72 +70 +67 +65 +62 +59 +61 +63 +66 +68 +71 +73 +76 +79 +81 +83 +86 +88 +91 +93 +96 +99 +101 +103 +106 +108 +110 +113 +116 +117 +120 +122 +124 +127 +129 +131 +133 +135 +137 +139 +141 +143 +146 +147 +149 +151 +153 +155 +156 +158 +160 +161 +163 +164 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +175 +176 +175 +176 +176 +176 +176 +176 +176 +176 +175 +174 +174 +173 +172 +172 +170 +169 +168 +167 +166 +164 +163 +161 +159 +158 +156 +155 +153 +151 +149 +147 +146 +143 +142 +139 +137 +136 +133 +131 +129 +126 +124 +122 +120 +117 +115 +113 +111 +108 +105 +104 +100 +99 +96 +94 +91 +89 +87 +84 +81 +79 +76 +74 +71 +68 +66 +64 +61 +57 +60 +62 +65 +67 +70 +73 +75 +78 +80 +82 +85 +87 +89 +92 +94 +97 +99 +102 +104 +107 +109 +111 +113 +116 +118 +121 +123 +124 +127 +129 +131 +133 +135 +138 +140 +141 +144 +146 +147 +149 +151 +153 +154 +156 +157 +159 +161 +162 +163 +164 +165 +166 +168 +169 +170 +170 +171 +171 +172 +172 +172 +173 +173 +173 +173 +173 +173 +172 +172 +171 +171 +170 +169 +169 +167 +166 +165 +165 +163 +162 +161 +159 +157 +156 +154 +152 +151 +149 +147 +145 +143 +141 +139 +137 +136 +133 +131 +129 +127 +124 +122 +121 +118 +116 +114 +111 +108 +106 +104 +101 +100 +97 +94 +92 +90 +88 +84 +82 +80 +77 +74 +72 +70 +67 +64 +62 +60 +56 +59 +61 +63 +66 +69 +71 +74 +76 +79 +81 +83 +86 +89 +91 +93 +96 +98 +100 +102 +105 +107 +110 +112 +114 +116 +119 +121 +123 +125 +128 +130 +131 +133 +136 +138 +139 +141 +143 +145 +147 +148 +150 +151 +154 +154 +156 +158 +159 +160 +162 +163 +164 +165 +166 +167 +168 +168 +169 +170 +170 +170 +170 +170 +171 +171 +170 +170 +170 +169 +169 +168 +167 +167 +166 +165 +164 +163 +161 +160 +159 +158 +156 +155 +154 +152 +151 +149 +147 +145 +143 +142 +140 +138 +135 +133 +131 +129 +127 +125 +123 +121 +118 +116 +114 +112 +110 +107 +105 +102 +100 +98 +96 +93 +90 +88 +86 +83 +81 +79 +76 +74 +71 +68 +66 +63 +61 +59 +54 +57 +60 +62 +65 +67 +69 +73 +75 +77 +80 +82 +84 +86 +90 +92 +94 +97 +98 +101 +103 +105 +108 +110 +112 +114 +117 +119 +121 +124 +125 +127 +129 +131 +134 +136 +137 +139 +142 +142 +144 +146 +148 +150 +151 +153 +154 +156 +157 +158 +159 +161 +162 +162 +163 +164 +165 +165 +166 +167 +167 +167 +168 +168 +168 +168 +168 +167 +167 +166 +166 +166 +165 +164 +163 +162 +161 +160 +159 +158 +157 +155 +154 +152 +152 +150 +148 +146 +144 +143 +141 +139 +137 +135 +134 +132 +130 +127 +125 +123 +121 +119 +116 +115 +113 +110 +108 +106 +103 +101 +99 +97 +94 +92 +89 +87 +84 +82 +80 +77 +74 +72 +69 +67 +65 +62 +59 +57 +53 +56 +59 +61 +64 +66 +68 +70 +73 +75 +78 +80 +83 +85 +88 +90 +92 +95 +97 +99 +102 +104 +107 +108 +110 +113 +115 +117 +119 +122 +124 +125 +127 +130 +132 +133 +135 +137 +139 +140 +142 +144 +146 +147 +149 +151 +152 +153 +154 +156 +157 +158 +159 +159 +160 +162 +162 +163 +163 +163 +164 +164 +165 +164 +165 +165 +165 +165 +164 +164 +163 +163 +162 +162 +160 +160 +159 +158 +157 +156 +155 +153 +152 +150 +149 +147 +145 +144 +142 +141 +139 +137 +135 +133 +131 +130 +128 +125 +123 +122 +119 +118 +115 +113 +111 +108 +106 +104 +101 +99 +97 +95 +92 +90 +88 +85 +83 +81 +78 +76 +73 +71 +68 +66 +63 +61 +59 +56 +52 +55 +57 +60 +62 +64 +67 +69 +72 +74 +76 +79 +81 +84 +86 +89 +91 +94 +96 +97 +100 +103 +105 +107 +109 +111 +113 +115 +117 +119 +121 +124 +126 +127 +129 +131 +133 +134 +136 +139 +140 +142 +143 +144 +147 +148 +149 +151 +151 +153 +154 +155 +156 +157 +158 +159 +159 +160 +161 +161 +161 +162 +162 +162 +162 +162 +161 +161 +161 +161 +161 +160 +159 +159 +158 +157 +156 +155 +154 +153 +152 +150 +150 +148 +147 +145 +144 +141 +140 +138 +136 +135 +134 +132 +129 +127 +125 +124 +121 +120 +117 +115 +113 +111 +109 +107 +104 +102 +100 +98 +96 +93 +91 +88 +87 +84 +82 +79 +76 +74 +71 +70 +67 +64 +62 +60 +57 +55 +51 +54 +56 +58 +61 +63 +66 +68 +70 +73 +75 +78 +80 +82 +84 +87 +89 +91 +94 +96 +99 +100 +102 +104 +107 +110 +111 +113 +116 +117 +120 +122 +123 +125 +128 +129 +131 +133 +134 +136 +137 +139 +140 +143 +144 +145 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +157 +158 +158 +159 +158 +159 +159 +159 +159 +159 +159 +158 +158 +158 +157 +156 +156 +155 +155 +153 +153 +152 +150 +149 +148 +147 +145 +144 +142 +140 +140 +138 +136 +135 +133 +131 +129 +127 +125 +123 +121 +119 +118 +115 +113 +111 +109 +107 +104 +102 +101 +98 +96 +94 +92 +89 +87 +84 +83 +80 +77 +76 +73 +70 +68 +66 +64 +61 +58 +56 +53 +49 +52 +55 +57 +60 +62 +64 +67 +69 +71 +73 +76 +79 +81 +83 +86 +88 +90 +92 +95 +96 +98 +101 +104 +105 +108 +110 +112 +113 +115 +118 +119 +121 +123 +125 +127 +128 +131 +132 +133 +135 +137 +138 +140 +142 +143 +144 +145 +147 +148 +149 +150 +151 +151 +152 +154 +153 +154 +155 +156 +155 +156 +157 +157 +156 +156 +156 +156 +156 +155 +155 +154 +154 +153 +152 +152 +150 +150 +149 +147 +146 +146 +144 +143 +142 +141 +139 +137 +135 +134 +132 +130 +129 +127 +125 +123 +121 +120 +117 +116 +113 +112 +109 +108 +105 +103 +101 +98 +97 +94 +92 +90 +88 +86 +83 +81 +78 +76 +73 +71 +69 +67 +64 +62 +59 +57 +54 +51 +48 +50 +53 +55 +58 +61 +63 +65 +68 +70 +72 +75 +77 +79 +81 +84 +85 +88 +91 +93 +95 +97 +100 +101 +103 +106 +107 +110 +112 +114 +116 +117 +120 +121 +123 +124 +127 +128 +130 +131 +133 +135 +136 +137 +139 +141 +142 +143 +144 +145 +146 +147 +148 +149 +149 +150 +151 +152 +152 +153 +153 +153 +154 +153 +153 +153 +153 +153 +153 +153 +152 +152 +151 +150 +150 +149 +149 +148 +146 +145 +144 +143 +141 +140 +139 +138 +136 +135 +133 +131 +130 +129 +127 +125 +123 +121 +119 +118 +115 +114 +112 +109 +108 +105 +104 +101 +99 +97 +95 +93 +91 +88 +86 +84 +81 +79 +77 +74 +73 +70 +68 +66 +63 +60 +58 +56 +53 +51 +47 +50 +51 +54 +56 +58 +61 +63 +65 +69 +71 +73 +75 +78 +80 +82 +84 +86 +89 +91 +93 +95 +97 +100 +102 +103 +105 +108 +109 +112 +114 +115 +117 +119 +120 +122 +124 +126 +128 +129 +130 +132 +134 +135 +136 +138 +139 +140 +141 +143 +143 +144 +145 +146 +147 +148 +148 +148 +150 +150 +150 +150 +151 +151 +151 +151 +150 +150 +151 +149 +150 +149 +148 +148 +147 +147 +146 +145 +144 +143 +141 +140 +139 +138 +137 +135 +133 +132 +130 +130 +127 +126 +124 +122 +121 +119 +117 +115 +114 +112 +109 +108 +105 +104 +101 +99 +97 +95 +93 +90 +89 +87 +84 +82 +79 +78 +75 +73 +71 +68 +66 +64 +61 +59 +56 +54 +52 +49 +45 +48 +50 +53 +55 +57 +60 +62 +64 +67 +69 +71 +73 +76 +79 +80 +82 +85 +87 +89 +91 +94 +95 +97 +100 +102 +104 +106 +107 +109 +111 +113 +115 +117 +119 +120 +122 +124 +125 +127 +129 +130 +131 +133 +134 +136 +137 +138 +139 +140 +141 +142 +142 +144 +144 +145 +146 +146 +147 +147 +147 +148 +148 +148 +148 +148 +148 +148 +147 +147 +147 +146 +145 +145 +144 +144 +143 +142 +141 +140 +139 +138 +137 +135 +134 +133 +132 +130 +128 +127 +125 +124 +122 +120 +119 +117 +115 +114 +111 +109 +108 +105 +104 +101 +100 +98 +95 +94 +92 +89 +87 +85 +82 +80 +78 +76 +73 +71 +69 +67 +64 +62 +60 +57 +55 +52 +50 +47 +44 +46 +49 +51 +54 +56 +58 +61 +63 +65 +67 +70 +72 +74 +76 +78 +81 +83 +85 +87 +89 +92 +93 +96 +98 +99 +101 +103 +106 +107 +110 +111 +113 +115 +116 +118 +120 +121 +123 +125 +126 +128 +129 +130 +131 +133 +134 +135 +136 +137 +138 +139 +140 +141 +141 +142 +143 +143 +143 +144 +145 +145 +145 +146 +145 +145 +145 +145 +145 +144 +144 +144 +143 +142 +141 +141 +140 +140 +138 +138 +137 +135 +134 +133 +131 +130 +129 +128 +126 +124 +123 +121 +119 +118 +117 +115 +113 +111 +109 +107 +105 +104 +102 +99 +97 +96 +93 +91 +90 +87 +85 +83 +81 +78 +77 +74 +72 +70 +67 +65 +63 +61 +58 +56 +54 +51 +48 +47 +43 +45 +47 +49 +52 +54 +56 +59 +61 +64 +66 +68 +70 +73 +74 +77 +79 +82 +84 +85 +88 +90 +92 +94 +96 +97 +100 +102 +103 +105 +107 +109 +111 +113 +114 +116 +117 +119 +121 +123 +124 +125 +126 +127 +129 +130 +131 +133 +134 +134 +135 +137 +138 +138 +138 +140 +140 +141 +141 +142 +142 +142 +142 +142 +142 +142 +143 +142 +142 +142 +141 +141 +141 +139 +139 +138 +137 +137 +135 +135 +134 +133 +132 +130 +129 +127 +127 +125 +124 +122 +120 +119 +118 +116 +114 +113 +111 +109 +107 +105 +104 +102 +100 +98 +96 +93 +91 +90 +87 +85 +84 +81 +79 +77 +74 +72 +70 +68 +66 +63 +61 +59 +56 +54 +52 +49 +47 +45 +41 +44 +45 +48 +50 +52 +55 +57 +59 +61 +64 +66 +68 +71 +72 +75 +78 +79 +82 +84 +86 +88 +90 +91 +93 +96 +98 +99 +102 +103 +105 +106 +108 +111 +112 +113 +115 +117 +119 +120 +121 +123 +124 +126 +127 +127 +129 +130 +131 +132 +133 +134 +135 +135 +136 +136 +137 +137 +139 +138 +139 +139 +139 +139 +139 +139 +139 +140 +139 +139 +139 +138 +137 +137 +136 +135 +135 +134 +133 +132 +131 +130 +129 +128 +127 +125 +124 +123 +121 +120 +118 +116 +115 +113 +111 +110 +108 +107 +105 +103 +102 +99 +97 +95 +93 +91 +90 +87 +86 +83 +81 +80 +77 +75 +73 +70 +68 +66 +64 +62 +60 +58 +55 +52 +51 +48 +46 +43 +39 +42 +44 +46 +49 +50 +53 +56 +58 +60 +62 +65 +67 +69 +71 +74 +76 +78 +79 +81 +84 +86 +87 +90 +91 +94 +96 +97 +99 +101 +103 +105 +106 +108 +109 +111 +112 +115 +116 +117 +118 +120 +122 +122 +124 +125 +127 +128 +129 +129 +130 +132 +132 +133 +133 +134 +135 +135 +136 +136 +136 +136 +136 +137 +137 +137 +136 +137 +136 +136 +136 +135 +135 +134 +133 +132 +132 +131 +131 +129 +128 +127 +127 +125 +124 +123 +121 +120 +119 +117 +116 +114 +112 +112 +110 +107 +107 +105 +103 +101 +99 +98 +96 +93 +91 +90 +87 +86 +84 +82 +79 +77 +75 +73 +71 +69 +67 +64 +62 +60 +58 +55 +54 +51 +49 +46 +44 +41 +38 +40 +43 +45 +47 +49 +51 +54 +56 +58 +61 +62 +65 +67 +69 +72 +73 +76 +77 +80 +81 +83 +85 +88 +90 +92 +94 +96 +97 +99 +101 +102 +104 +106 +107 +109 +110 +112 +114 +115 +116 +118 +119 +120 +121 +122 +124 +125 +126 +127 +127 +128 +129 +130 +131 +131 +132 +132 +132 +133 +133 +134 +134 +134 +134 +134 +134 +133 +134 +133 +132 +133 +131 +132 +131 +130 +129 +128 +128 +126 +126 +125 +124 +122 +121 +120 +119 +118 +116 +115 +114 +112 +111 +109 +107 +106 +104 +102 +101 +98 +97 +95 +93 +91 +90 +87 +86 +84 +82 +80 +78 +75 +73 +72 +69 +67 +65 +63 +60 +59 +56 +53 +51 +49 +47 +45 +43 +40 +36 +39 +41 +44 +45 +48 +50 +52 +55 +57 +59 +61 +63 +65 +67 +69 +71 +74 +76 +78 +80 +81 +84 +86 +87 +89 +91 +93 +95 +97 +99 +100 +101 +103 +105 +106 +109 +109 +111 +113 +114 +115 +117 +117 +119 +120 +121 +122 +123 +124 +125 +126 +126 +127 +128 +128 +129 +130 +130 +130 +130 +131 +131 +131 +131 +131 +131 +131 +131 +130 +130 +129 +129 +128 +128 +127 +126 +126 +125 +124 +124 +122 +121 +120 +119 +117 +116 +116 +113 +113 +111 +109 +108 +107 +105 +103 +102 +100 +99 +97 +94 +93 +91 +89 +88 +85 +83 +81 +80 +78 +76 +73 +72 +70 +67 +65 +63 +61 +59 +56 +54 +52 +50 +48 +46 +43 +41 +38 +34 +37 +39 +41 +44 +46 +48 +50 +53 +55 +57 +59 +61 +63 +66 +68 +70 +71 +73 +76 +77 +79 +82 +84 +85 +87 +89 +91 +93 +94 +96 +98 +100 +101 +103 +104 +106 +107 +108 +110 +112 +112 +114 +115 +116 +118 +119 +119 +121 +121 +122 +123 +124 +125 +125 +126 +127 +127 +127 +127 +128 +128 +128 +128 +129 +128 +128 +128 +128 +128 +127 +127 +126 +126 +125 +124 +124 +123 +122 +122 +120 +120 +118 +118 +116 +115 +114 +113 +111 +110 +108 +107 +106 +104 +103 +101 +100 +97 +96 +94 +92 +91 +89 +87 +86 +84 +82 +80 +78 +76 +73 +72 +70 +68 +66 +63 +61 +59 +56 +55 +53 +51 +48 +46 +44 +41 +40 +37 +33 +35 +37 +39 +42 +44 +46 +49 +51 +53 +55 +57 +59 +62 +63 +66 +67 +69 +71 +74 +76 +78 +80 +81 +84 +86 +87 +89 +90 +92 +94 +95 +97 +98 +100 +102 +104 +104 +106 +108 +109 +110 +111 +112 +114 +114 +116 +116 +118 +118 +120 +121 +121 +122 +123 +123 +123 +124 +124 +125 +125 +125 +126 +126 +125 +126 +125 +125 +125 +125 +125 +124 +123 +123 +123 +122 +121 +120 +120 +119 +118 +117 +116 +115 +113 +112 +111 +110 +109 +108 +107 +105 +103 +102 +100 +99 +97 +95 +94 +93 +90 +88 +87 +85 +83 +82 +80 +77 +76 +73 +72 +70 +68 +66 +63 +61 +59 +58 +56 +53 +51 +49 +47 +44 +42 +40 +37 +36 +31 +33 +36 +38 +41 +42 +45 +47 +49 +51 +53 +55 +57 +60 +61 +64 +65 +68 +70 +71 +74 +76 +77 +80 +81 +83 +85 +87 +89 +90 +92 +93 +95 +96 +98 +99 +101 +103 +104 +105 +107 +108 +108 +110 +111 +112 +113 +114 +115 +116 +117 +118 +118 +119 +120 +120 +121 +121 +122 +122 +122 +123 +122 +123 +122 +122 +123 +122 +123 +122 +122 +121 +120 +120 +120 +119 +119 +118 +117 +116 +115 +114 +113 +112 +111 +110 +109 +108 +106 +105 +104 +102 +101 +99 +98 +97 +95 +93 +92 +90 +88 +86 +84 +83 +81 +79 +77 +76 +73 +72 +70 +68 +66 +64 +62 +60 +58 +56 +53 +52 +49 +47 +44 +42 +40 +38 +36 +34 +29 +32 +34 +36 +38 +41 +43 +45 +47 +50 +52 +54 +56 +58 +60 +62 +64 +66 +68 +70 +71 +74 +75 +77 +79 +81 +83 +85 +86 +88 +89 +91 +92 +94 +95 +97 +99 +100 +101 +102 +104 +105 +106 +107 +108 +110 +111 +111 +113 +113 +114 +115 +116 +117 +117 +118 +118 +118 +119 +119 +119 +120 +120 +120 +120 +120 +120 +119 +120 +119 +119 +118 +118 +117 +117 +116 +116 +115 +114 +113 +113 +111 +110 +109 +108 +108 +107 +105 +104 +102 +101 +99 +98 +97 +95 +94 +92 +91 +89 +87 +86 +84 +83 +80 +79 +77 +76 +74 +72 +69 +68 +66 +64 +61 +60 +57 +55 +53 +51 +49 +47 +45 +43 +41 +39 +37 +34 +32 +28 +31 +33 +35 +37 +39 +41 +43 +46 +47 +50 +51 +53 +56 +58 +60 +61 +64 +65 +67 +70 +72 +73 +75 +77 +79 +80 +82 +83 +85 +87 +89 +90 +92 +93 +95 +96 +97 +99 +100 +102 +102 +103 +105 +106 +106 +108 +109 +110 +111 +111 +112 +113 +113 +114 +115 +115 +116 +116 +117 +116 +117 +117 +117 +116 +117 +117 +117 +117 +116 +115 +116 +115 +114 +114 +113 +113 +112 +111 +111 +110 +109 +108 +107 +106 +104 +104 +102 +101 +100 +98 +98 +96 +94 +93 +92 +90 +89 +87 +86 +84 +82 +81 +78 +77 +75 +73 +72 +69 +68 +66 +63 +61 +60 +57 +56 +54 +51 +50 +48 +46 +43 +41 +39 +37 +35 +32 +30 +27 +29 +31 +33 +35 +37 +39 +41 +43 +45 +48 +50 +52 +54 +56 +58 +59 +62 +64 +65 +68 +69 +71 +73 +74 +77 +78 +80 +81 +83 +84 +86 +88 +90 +90 +92 +94 +95 +96 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +110 +111 +112 +112 +112 +113 +113 +113 +113 +114 +114 +114 +114 +114 +114 +114 +113 +113 +114 +113 +112 +112 +111 +110 +110 +110 +109 +108 +107 +106 +105 +104 +104 +102 +101 +100 +99 +98 +96 +95 +93 +92 +91 +89 +87 +86 +85 +83 +81 +80 +78 +76 +74 +72 +71 +69 +68 +66 +63 +62 +60 +57 +56 +53 +52 +50 +47 +46 +44 +41 +39 +37 +35 +33 +31 +28 +25 +27 +29 +31 +33 +36 +37 +40 +41 +43 +46 +48 +50 +52 +54 +56 +58 +60 +61 +63 +65 +68 +69 +71 +72 +74 +75 +78 +79 +81 +82 +84 +85 +87 +88 +90 +91 +92 +93 +95 +96 +98 +98 +100 +101 +101 +102 +104 +105 +106 +106 +107 +108 +108 +109 +110 +110 +110 +110 +111 +111 +111 +111 +111 +112 +111 +111 +111 +111 +111 +110 +110 +109 +109 +109 +108 +107 +106 +106 +105 +105 +103 +103 +101 +101 +100 +98 +97 +96 +95 +94 +92 +91 +90 +89 +87 +85 +84 +82 +81 +79 +77 +76 +74 +72 +71 +69 +67 +66 +63 +61 +60 +58 +55 +53 +52 +49 +47 +45 +43 +42 +39 +38 +35 +34 +31 +29 +27 +22 +25 +27 +29 +31 +34 +35 +37 +40 +42 +44 +46 +48 +50 +52 +54 +56 +58 +59 +61 +63 +64 +66 +68 +71 +72 +74 +75 +77 +79 +80 +81 +83 +84 +85 +87 +89 +90 +91 +92 +93 +95 +96 +97 +98 +99 +100 +101 +102 +102 +103 +104 +105 +105 +105 +106 +107 +108 +107 +108 +108 +108 +109 +108 +108 +108 +108 +109 +108 +108 +108 +107 +107 +107 +105 +105 +105 +104 +103 +102 +102 +101 +100 +99 +98 +97 +96 +95 +93 +92 +91 +90 +88 +87 +86 +84 +83 +82 +80 +78 +77 +75 +74 +72 +70 +69 +66 +65 +63 +61 +60 +57 +56 +54 +51 +49 +48 +46 +43 +41 +40 +38 +35 +33 +31 +29 +27 +25 +21 +23 +25 +27 +29 +32 +33 +36 +38 +40 +42 +44 +46 +48 +50 +52 +54 +55 +57 +59 +61 +63 +64 +66 +68 +70 +71 +73 +74 +76 +77 +80 +81 +82 +84 +85 +86 +87 +89 +90 +92 +92 +93 +94 +95 +96 +97 +98 +99 +99 +100 +102 +102 +103 +103 +104 +104 +104 +105 +105 +105 +105 +105 +106 +106 +105 +105 +105 +106 +105 +105 +105 +104 +104 +103 +102 +102 +101 +101 +100 +99 +98 +97 +97 +95 +94 +94 +93 +91 +89 +88 +88 +86 +84 +83 +82 +80 +79 +77 +76 +75 +72 +71 +69 +68 +66 +65 +62 +61 +59 +58 +56 +54 +51 +50 +48 +46 +44 +42 +40 +38 +36 +34 +31 +30 +27 +25 +23 +19 +22 +24 +26 +27 +30 +32 +34 +36 +38 +39 +42 +43 +46 +47 +50 +51 +53 +55 +57 +58 +60 +63 +64 +66 +67 +69 +70 +73 +74 +75 +76 +78 +80 +81 +83 +83 +85 +86 +87 +89 +90 +91 +92 +93 +94 +95 +95 +96 +97 +98 +98 +99 +100 +100 +101 +102 +101 +102 +103 +103 +103 +102 +103 +103 +102 +102 +103 +102 +103 +102 +102 +101 +101 +100 +100 +100 +99 +98 +98 +97 +96 +94 +93 +93 +92 +91 +90 +89 +87 +87 +85 +83 +83 +81 +80 +78 +77 +75 +74 +72 +71 +69 +68 +65 +64 +63 +61 +59 +57 +55 +54 +51 +50 +47 +46 +44 +42 +40 +38 +36 +34 +32 +30 +28 +25 +24 +22 +17 +19 +21 +23 +25 +28 +30 +31 +34 +36 +37 +40 +42 +43 +46 +47 +50 +51 +53 +54 +57 +58 +60 +62 +64 +65 +67 +68 +70 +72 +73 +74 +76 +77 +79 +80 +81 +83 +83 +85 +86 +87 +88 +89 +91 +91 +92 +92 +93 +95 +95 +96 +96 +97 +98 +98 +99 +99 +99 +99 +100 +100 +100 +100 +100 +100 +100 +100 +100 +99 +99 +98 +99 +98 +97 +97 +97 +96 +95 +94 +94 +92 +92 +91 +90 +89 +89 +87 +86 +84 +84 +82 +81 +80 +79 +77 +75 +74 +73 +71 +70 +68 +67 +65 +63 +62 +60 +59 +56 +55 +53 +51 +49 +47 +46 +44 +42 +40 +38 +36 +34 +32 +29 +28 +25 +24 +21 +19 +16 +18 +19 +22 +24 +26 +28 +30 +31 +34 +36 +38 +40 +42 +44 +45 +47 +49 +50 +52 +54 +56 +57 +59 +61 +62 +65 +66 +67 +69 +71 +72 +73 +75 +76 +78 +79 +80 +81 +83 +83 +85 +86 +86 +87 +88 +89 +90 +91 +91 +92 +93 +94 +95 +95 +95 +95 +96 +96 +97 +97 +97 +97 +97 +97 +97 +98 +97 +97 +97 +96 +96 +96 +95 +95 +94 +94 +93 +92 +92 +91 +90 +89 +88 +87 +86 +86 +84 +83 +82 +81 +80 +78 +77 +76 +75 +73 +72 +71 +69 +68 +66 +64 +63 +61 +59 +58 +56 +54 +53 +50 +49 +47 +45 +44 +42 +40 +38 +35 +33 +32 +29 +28 +26 +24 +22 +19 +17 +13 +16 +18 +19 +22 +24 +26 +28 +30 +31 +34 +36 +38 +40 +42 +43 +45 +47 +48 +50 +52 +54 +55 +57 +59 +60 +62 +63 +65 +67 +68 +69 +71 +72 +74 +75 +76 +77 +79 +80 +81 +82 +82 +84 +85 +86 +87 +88 +88 +89 +89 +91 +91 +92 +92 +93 +93 +94 +93 +94 +94 +94 +94 +94 +95 +95 +95 +95 +94 +94 +94 +93 +93 +93 +92 +92 +91 +90 +89 +89 +88 +88 +87 +85 +84 +84 +82 +82 +80 +79 +79 +78 +76 +75 +73 +72 +70 +69 +68 +66 +65 +63 +62 +61 +59 +58 +56 +54 +52 +50 +48 +47 +45 +44 +41 +39 +37 +35 +34 +31 +30 +28 +26 +24 +22 +20 +18 +16 +12 +14 +16 +18 +20 +22 +24 +26 +28 +30 +32 +33 +36 +38 +39 +41 +43 +45 +46 +48 +50 +52 +54 +55 +57 +58 +59 +61 +63 +64 +65 +67 +68 +69 +71 +72 +74 +75 +76 +77 +78 +79 +80 +82 +82 +83 +84 +84 +86 +87 +87 +88 +88 +89 +89 +90 +90 +90 +90 +91 +91 +91 +92 +92 +92 +92 +91 +91 +92 +91 +91 +91 +90 +89 +89 +88 +88 +87 +87 +86 +85 +85 +84 +84 +82 +81 +80 +79 +78 +77 +76 +75 +74 +72 +71 +70 +68 +67 +66 +64 +63 +61 +60 +58 +56 +55 +53 +52 +50 +48 +46 +45 +43 +41 +39 +38 +36 +34 +32 +30 +28 +26 +24 +22 +20 +18 +15 +14 +9 +12 +14 +16 +18 +20 +22 +24 +25 +28 +30 +32 +34 +35 +37 +39 +41 +42 +44 +46 +48 +49 +50 +53 +54 +56 +58 +59 +60 +62 +63 +65 +66 +67 +69 +70 +71 +72 +73 +74 +75 +76 +78 +78 +80 +81 +81 +82 +83 +83 +85 +85 +86 +86 +86 +86 +88 +88 +87 +88 +89 +89 +88 +89 +89 +89 +88 +89 +88 +88 +88 +88 +88 +87 +87 +86 +85 +85 +84 +84 +83 +82 +81 +81 +80 +79 +78 +77 +76 +75 +73 +72 +71 +70 +68 +67 +66 +64 +63 +62 +60 +59 +57 +56 +54 +53 +51 +49 +48 +46 +45 +43 +41 +39 +37 +35 +34 +31 +30 +28 +26 +24 +22 +20 +18 +16 +14 +12 +8 +10 +12 +14 +16 +18 +20 +22 +24 +25 +27 +29 +32 +33 +35 +37 +38 +40 +41 +44 +45 +48 +49 +50 +52 +53 +55 +56 +57 +60 +61 +62 +63 +65 +66 +67 +68 +69 +71 +72 +73 +74 +75 +76 +76 +78 +79 +79 +80 +80 +81 +82 +83 +83 +83 +84 +85 +85 +85 +86 +86 +86 +86 +86 +86 +86 +86 +86 +85 +85 +85 +85 +84 +84 +83 +83 +82 +82 +81 +81 +80 +79 +79 +78 +77 +75 +75 +74 +73 +72 +71 +69 +69 +67 +66 +65 +63 +62 +61 +59 +58 +57 +55 +54 +52 +50 +48 +47 +45 +44 +42 +40 +38 +36 +35 +33 +31 +30 +27 +26 +23 +22 +20 +18 +16 +14 +12 +10 +5 +8 +10 +12 +14 +16 +18 +20 +22 +24 +25 +27 +29 +31 +33 +34 +36 +38 +40 +42 +43 +45 +47 +48 +49 +52 +52 +54 +55 +56 +58 +60 +60 +62 +63 +65 +66 +67 +68 +69 +71 +72 +72 +73 +74 +75 +76 +77 +77 +78 +78 +79 +80 +80 +81 +82 +82 +82 +82 +82 +83 +83 +83 +83 +84 +83 +83 +82 +83 +82 +82 +82 +81 +81 +80 +81 +80 +80 +79 +78 +77 +77 +76 +75 +74 +74 +72 +72 +71 +69 +68 +67 +66 +64 +63 +62 +60 +60 +58 +57 +55 +54 +53 +51 +50 +48 +47 +45 +43 +41 +39 +38 +36 +34 +33 +31 +29 +27 +25 +23 +22 +20 +18 +16 +14 +12 +10 +8 +4 +6 +8 +10 +12 +14 +16 +17 +19 +21 +24 +25 +27 +29 +30 +33 +34 +36 +38 +39 +41 +43 +44 +46 +47 +49 +50 +52 +53 +55 +56 +57 +58 +60 +61 +62 +63 +65 +65 +67 +67 +68 +70 +71 +71 +72 +73 +74 +75 +75 +76 +76 +77 +77 +78 +79 +79 +79 +79 +80 +80 +80 +81 +81 +81 +80 +81 +80 +80 +80 +79 +79 +79 +79 +78 +78 +77 +77 +76 +75 +75 +74 +73 +72 +71 +71 +70 +69 +68 +67 +66 +65 +64 +62 +61 +60 +59 +57 +56 +54 +53 +52 +50 +48 +47 +46 +44 +43 +41 +39 +37 +36 +34 +33 +30 +29 +27 +26 +23 +21 +20 +18 +16 +13 +11 +10 +8 +6 +2 +4 +6 +8 +10 +11 +14 +16 +18 +19 +21 +23 +25 +27 +29 +30 +32 +33 +35 +37 +39 +40 +42 +43 +45 +46 +48 +49 +51 +52 +53 +55 +56 +57 +58 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +69 +70 +71 +71 +72 +73 +74 +74 +74 +76 +75 +77 +77 +77 +77 +77 +78 +77 +77 +78 +77 +77 +77 +77 +77 +77 +77 +77 +76 +75 +75 +74 +74 +73 +73 +72 +71 +71 +70 +69 +68 +67 +66 +65 +64 +63 +62 +60 +60 +59 +57 +56 +54 +54 +52 +50 +49 +48 +46 +44 +43 +42 +40 +38 +37 +35 +33 +32 +30 +28 +27 +25 +23 +22 +20 +18 +16 +14 +11 +10 +8 +6 +4 diff --git a/extra/images/testing/pgm/radial.binary.fig b/extra/images/testing/pgm/radial.binary.fig new file mode 100644 index 0000000000..6e52311b94 Binary files /dev/null and b/extra/images/testing/pgm/radial.binary.fig differ diff --git a/extra/images/testing/pgm/radial.binary.pgm b/extra/images/testing/pgm/radial.binary.pgm new file mode 100644 index 0000000000..598ee59e2d Binary files /dev/null and b/extra/images/testing/pgm/radial.binary.pgm differ diff --git a/extra/images/testing/ppm/ascii.fig b/extra/images/testing/ppm/ascii.fig new file mode 100644 index 0000000000..68a1fa1ac1 Binary files /dev/null and b/extra/images/testing/ppm/ascii.fig differ diff --git a/extra/images/testing/ppm/ascii.ppm b/extra/images/testing/ppm/ascii.ppm new file mode 100644 index 0000000000..326b70ecc0 --- /dev/null +++ b/extra/images/testing/ppm/ascii.ppm @@ -0,0 +1,57604 @@ +P3 +# CREATOR: GIMP PNM Filter Version 1.1 +160 120 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +255 +255 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +255 +255 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +255 +255 +255 +255 +255 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +255 +255 +255 +255 +255 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +255 +255 +255 +255 +255 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +255 +255 +255 +255 +255 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +255 +255 +255 +255 +255 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +255 +255 +255 +255 +255 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +255 +255 +255 +255 +255 +255 +255 +255 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +255 +255 +255 +255 +255 +255 +255 +255 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +255 +255 +255 +255 +255 +255 +255 +255 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +255 +255 +255 +255 +255 +255 +255 +255 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +255 +255 +255 +255 +255 +255 +255 +255 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +255 +255 +255 +255 +255 +255 +255 +255 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +255 +255 +255 +255 +255 +255 +255 +255 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +255 +255 +255 +255 +255 +255 +255 +255 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +243 +50 +50 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +50 +86 +243 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +0 +0 +255 +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 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +242 +190 +255 +218 +71 +255 +207 +17 +255 +205 +4 +255 +210 +31 +255 +223 +95 +255 +243 +196 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +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 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +239 +174 +255 +204 +2 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +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 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +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 +213 +43 +255 +204 +0 +255 +219 +77 +255 +247 +214 +255 +254 +251 +255 +251 +234 +255 +238 +169 +255 +217 +63 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +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 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +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 +205 +5 +255 +204 +0 +255 +252 +238 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +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 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +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 +210 +32 +255 +204 +0 +255 +230 +132 +255 +251 +237 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +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 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +236 +158 +255 +204 +0 +255 +204 +0 +255 +204 +1 +255 +211 +36 +255 +221 +87 +255 +237 +164 +255 +254 +250 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +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 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +242 +190 +255 +219 +77 +255 +206 +11 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +214 +48 +255 +251 +233 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +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 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +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 +254 +252 +255 +247 +213 +255 +234 +152 +255 +211 +35 +255 +204 +0 +255 +222 +92 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +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 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +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 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +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 +248 +220 +255 +204 +0 +255 +208 +19 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +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 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +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 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +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 +251 +235 +255 +204 +0 +255 +205 +5 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +1 +255 +204 +0 +255 +255 +254 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +1 +255 +204 +0 +255 +255 +254 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +1 +255 +204 +0 +255 +255 +254 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +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 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +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 +215 +54 +255 +234 +150 +255 +247 +215 +255 +254 +248 +255 +254 +249 +255 +245 +204 +255 +218 +68 +255 +204 +0 +255 +212 +42 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +208 +19 +255 +204 +0 +255 +242 +190 +255 +255 +254 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +208 +19 +255 +204 +0 +255 +242 +190 +255 +255 +254 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +208 +19 +255 +204 +0 +255 +242 +190 +255 +255 +254 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +247 +217 +255 +204 +2 +255 +206 +10 +255 +251 +236 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +252 +239 +255 +206 +11 +255 +204 +2 +255 +247 +216 +255 +255 +255 +255 +241 +186 +255 +219 +75 +255 +207 +15 +255 +206 +9 +255 +215 +57 +255 +242 +188 +255 +255 +255 +255 +255 +255 +255 +247 +217 +255 +204 +2 +255 +206 +10 +255 +251 +236 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +252 +239 +255 +206 +11 +255 +204 +2 +255 +247 +216 +255 +255 +255 +255 +241 +186 +255 +219 +75 +255 +207 +15 +255 +206 +9 +255 +215 +57 +255 +242 +188 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +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 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +2 +255 +238 +172 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +221 +84 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +221 +84 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +221 +84 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +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 +221 +85 +255 +204 +0 +255 +230 +132 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +232 +138 +255 +204 +0 +255 +220 +80 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +205 +5 +255 +245 +204 +255 +255 +255 +255 +255 +255 +255 +221 +85 +255 +204 +0 +255 +230 +132 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +232 +138 +255 +204 +0 +255 +220 +80 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +205 +5 +255 +245 +204 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +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 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +245 +203 +255 +226 +111 +255 +213 +46 +255 +206 +9 +255 +205 +5 +255 +209 +27 +255 +221 +83 +255 +243 +195 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +250 +229 +255 +221 +83 +255 +208 +18 +255 +204 +1 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +250 +229 +255 +221 +83 +255 +208 +18 +255 +204 +1 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +250 +229 +255 +221 +83 +255 +208 +18 +255 +204 +1 +255 +204 +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 +245 +205 +255 +204 +0 +255 +209 +25 +255 +254 +249 +255 +255 +255 +255 +255 +255 +255 +254 +251 +255 +210 +29 +255 +204 +0 +255 +244 +198 +255 +255 +255 +255 +255 +255 +255 +221 +84 +255 +245 +205 +255 +254 +249 +255 +249 +227 +255 +222 +88 +255 +204 +0 +255 +222 +88 +255 +255 +255 +255 +255 +255 +255 +245 +205 +255 +204 +0 +255 +209 +25 +255 +254 +249 +255 +255 +255 +255 +255 +255 +255 +254 +251 +255 +210 +29 +255 +204 +0 +255 +244 +198 +255 +255 +255 +255 +255 +255 +255 +221 +84 +255 +245 +205 +255 +254 +249 +255 +249 +227 +255 +222 +88 +255 +204 +0 +255 +222 +88 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +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 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +218 +71 +255 +204 +0 +255 +236 +159 +255 +255 +255 +255 +255 +255 +255 +238 +168 +255 +204 +0 +255 +216 +60 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +252 +239 +255 +204 +0 +255 +210 +29 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +218 +71 +255 +204 +0 +255 +236 +159 +255 +255 +255 +255 +255 +255 +255 +238 +168 +255 +204 +0 +255 +216 +60 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +252 +239 +255 +204 +0 +255 +210 +29 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +206 +10 +255 +206 +11 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +206 +10 +255 +206 +11 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +242 +192 +255 +204 +0 +255 +213 +46 +255 +255 +255 +255 +255 +255 +255 +215 +56 +255 +204 +0 +255 +240 +178 +255 +255 +255 +255 +255 +255 +255 +254 +252 +255 +232 +139 +255 +214 +48 +255 +206 +10 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +205 +6 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +242 +192 +255 +204 +0 +255 +213 +46 +255 +255 +255 +255 +255 +255 +255 +215 +56 +255 +204 +0 +255 +240 +178 +255 +255 +255 +255 +255 +255 +255 +254 +252 +255 +232 +139 +255 +214 +48 +255 +206 +10 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +205 +6 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +209 +26 +255 +209 +27 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +209 +26 +255 +209 +27 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +216 +58 +255 +204 +0 +255 +241 +187 +255 +244 +199 +255 +204 +0 +255 +212 +42 +255 +255 +254 +255 +255 +255 +255 +255 +255 +255 +227 +113 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +216 +58 +255 +204 +0 +255 +241 +187 +255 +244 +199 +255 +204 +0 +255 +212 +42 +255 +255 +254 +255 +255 +255 +255 +255 +255 +255 +227 +113 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +213 +43 +255 +213 +43 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +213 +43 +255 +213 +43 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +240 +179 +255 +204 +0 +255 +218 +72 +255 +221 +86 +255 +204 +0 +255 +236 +158 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +208 +18 +255 +204 +0 +255 +238 +168 +255 +252 +240 +255 +255 +254 +255 +252 +241 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +240 +179 +255 +204 +0 +255 +218 +72 +255 +221 +86 +255 +204 +0 +255 +236 +158 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +208 +18 +255 +204 +0 +255 +238 +168 +255 +252 +240 +255 +255 +254 +255 +252 +241 +255 +204 +0 +255 +204 +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 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +254 +255 +213 +45 +255 +204 +1 +255 +205 +3 +255 +209 +27 +255 +254 +249 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +206 +9 +255 +204 +0 +255 +239 +176 +255 +254 +248 +255 +248 +221 +255 +221 +87 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +254 +255 +213 +45 +255 +204 +1 +255 +205 +3 +255 +209 +27 +255 +254 +249 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +206 +9 +255 +204 +0 +255 +239 +176 +255 +254 +248 +255 +248 +221 +255 +221 +87 +255 +204 +0 +255 +204 +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 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +237 +165 +255 +204 +0 +255 +204 +0 +255 +232 +138 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +220 +81 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +219 +76 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +237 +165 +255 +204 +0 +255 +204 +0 +255 +232 +138 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +220 +81 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +219 +76 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +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 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +248 +218 +255 +204 +0 +255 +207 +15 +255 +252 +241 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +251 +235 +255 +220 +82 +255 +206 +10 +255 +207 +16 +255 +223 +96 +255 +252 +240 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +248 +218 +255 +204 +0 +255 +207 +15 +255 +252 +241 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +251 +235 +255 +220 +82 +255 +206 +10 +255 +207 +16 +255 +223 +96 +255 +252 +240 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +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 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +236 +158 +255 +204 +0 +255 +227 +116 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +236 +158 +255 +204 +0 +255 +227 +116 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +252 +238 +255 +218 +71 +255 +204 +0 +255 +247 +213 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +252 +238 +255 +218 +71 +255 +204 +0 +255 +247 +213 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +219 +74 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +204 +0 +255 +204 +0 +255 +219 +74 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +205 +4 +255 +217 +65 +255 +250 +229 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +204 +0 +255 +205 +4 +255 +217 +65 +255 +250 +229 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +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/extra/images/testing/ppm/binary.fig b/extra/images/testing/ppm/binary.fig new file mode 100644 index 0000000000..68a1fa1ac1 Binary files /dev/null and b/extra/images/testing/ppm/binary.fig differ diff --git a/extra/images/testing/ppm/binary.ppm b/extra/images/testing/ppm/binary.ppm new file mode 100644 index 0000000000..b774663b8d Binary files /dev/null and b/extra/images/testing/ppm/binary.ppm differ diff --git a/extra/libusb/libusb.factor b/extra/libusb/libusb.factor index d521015d6f..b276a923b0 100644 --- a/extra/libusb/libusb.factor +++ b/extra/libusb/libusb.factor @@ -11,7 +11,7 @@ IN: libusb { [ os windows? ] [ "libusb-1.0.dll" ] } { [ os macosx? ] [ "libusb-1.0.dylib" ] } { [ os unix? ] [ "libusb-1.0.so" ] } - } cond "cdecl" add-library >> + } cond cdecl add-library >> LIBRARY: libusb : libusb_cpu_to_le16 ( x -- y ) @@ -19,28 +19,28 @@ LIBRARY: libusb ALIAS: libusb_le16_to_cpu libusb_cpu_to_le16 -CONSTANT: LIBUSB_CLASS_PER_INTERFACE 0 -CONSTANT: LIBUSB_CLASS_AUDIO 1 -CONSTANT: LIBUSB_CLASS_COMM 2 -CONSTANT: LIBUSB_CLASS_HID 3 -CONSTANT: LIBUSB_CLASS_PRINTER 7 -CONSTANT: LIBUSB_CLASS_PTP 6 -CONSTANT: LIBUSB_CLASS_MASS_STORAGE 8 -CONSTANT: LIBUSB_CLASS_HUB 9 -CONSTANT: LIBUSB_CLASS_DATA 10 -CONSTANT: LIBUSB_CLASS_VENDOR_SPEC HEX: ff -TYPEDEF: int libusb_class_code +C-ENUM: libusb_class_code + { LIBUSB_CLASS_PER_INTERFACE 0 } + { LIBUSB_CLASS_AUDIO 1 } + { LIBUSB_CLASS_COMM 2 } + { LIBUSB_CLASS_HID 3 } + { LIBUSB_CLASS_PRINTER 7 } + { LIBUSB_CLASS_PTP 6 } + { LIBUSB_CLASS_MASS_STORAGE 8 } + { LIBUSB_CLASS_HUB 9 } + { LIBUSB_CLASS_DATA 10 } + { LIBUSB_CLASS_VENDOR_SPEC HEX: ff } ; -CONSTANT: LIBUSB_DT_DEVICE HEX: 01 -CONSTANT: LIBUSB_DT_CONFIG HEX: 02 -CONSTANT: LIBUSB_DT_STRING HEX: 03 -CONSTANT: LIBUSB_DT_INTERFACE HEX: 04 -CONSTANT: LIBUSB_DT_ENDPOINT HEX: 05 -CONSTANT: LIBUSB_DT_HID HEX: 21 -CONSTANT: LIBUSB_DT_REPORT HEX: 22 -CONSTANT: LIBUSB_DT_PHYSICAL HEX: 23 -CONSTANT: LIBUSB_DT_HUB HEX: 29 -TYPEDEF: int libusb_descriptor_type +C-ENUM: libusb_descriptor_type + { LIBUSB_DT_DEVICE HEX: 01 } + { LIBUSB_DT_CONFIG HEX: 02 } + { LIBUSB_DT_STRING HEX: 03 } + { LIBUSB_DT_INTERFACE HEX: 04 } + { LIBUSB_DT_ENDPOINT HEX: 05 } + { LIBUSB_DT_HID HEX: 21 } + { LIBUSB_DT_REPORT HEX: 22 } + { LIBUSB_DT_PHYSICAL HEX: 23 } + { LIBUSB_DT_HUB HEX: 29 } ; CONSTANT: LIBUSB_DT_DEVICE_SIZE 18 CONSTANT: LIBUSB_DT_CONFIG_SIZE 9 @@ -52,56 +52,57 @@ CONSTANT: LIBUSB_DT_HUB_NONVAR_SIZE 7 CONSTANT: LIBUSB_ENDPOINT_ADDRESS_MASK HEX: 0f CONSTANT: LIBUSB_ENDPOINT_DIR_MASK HEX: 80 -CONSTANT: LIBUSB_ENDPOINT_IN HEX: 80 -CONSTANT: LIBUSB_ENDPOINT_OUT HEX: 00 -TYPEDEF: int libusb_endpoint_direction +C-ENUM: libusb_endpoint_direction + { LIBUSB_ENDPOINT_IN HEX: 80 } + { LIBUSB_ENDPOINT_OUT HEX: 00 } ; CONSTANT: LIBUSB_TRANSFER_TYPE_MASK HEX: 03 -CONSTANT: LIBUSB_TRANSFER_TYPE_CONTROL 0 -CONSTANT: LIBUSB_TRANSFER_TYPE_ISOCHRONOUS 1 -CONSTANT: LIBUSB_TRANSFER_TYPE_BULK 2 -CONSTANT: LIBUSB_TRANSFER_TYPE_INTERRUPT 3 -TYPEDEF: int libusb_transfer_type +C-ENUM: libusb_transfer_type + { LIBUSB_TRANSFER_TYPE_CONTROL 0 } + { LIBUSB_TRANSFER_TYPE_ISOCHRONOUS 1 } + { LIBUSB_TRANSFER_TYPE_BULK 2 } + { LIBUSB_TRANSFER_TYPE_INTERRUPT 3 } ; -CONSTANT: LIBUSB_REQUEST_GET_STATUS HEX: 00 -CONSTANT: LIBUSB_REQUEST_CLEAR_FEATURE HEX: 01 -CONSTANT: LIBUSB_REQUEST_SET_FEATURE HEX: 03 -CONSTANT: LIBUSB_REQUEST_SET_ADDRESS HEX: 05 -CONSTANT: LIBUSB_REQUEST_GET_DESCRIPTOR HEX: 06 -CONSTANT: LIBUSB_REQUEST_SET_DESCRIPTOR HEX: 07 -CONSTANT: LIBUSB_REQUEST_GET_CONFIGURATION HEX: 08 -CONSTANT: LIBUSB_REQUEST_SET_CONFIGURATION HEX: 09 -CONSTANT: LIBUSB_REQUEST_GET_INTERFACE HEX: 0A -CONSTANT: LIBUSB_REQUEST_SET_INTERFACE HEX: 0B -CONSTANT: LIBUSB_REQUEST_SYNCH_FRAME HEX: 0C -TYPEDEF: int libusb_standard_request +C-ENUM: libusb_standard_request + { LIBUSB_REQUEST_GET_STATUS HEX: 00 } + { LIBUSB_REQUEST_CLEAR_FEATURE HEX: 01 } + { LIBUSB_REQUEST_SET_FEATURE HEX: 03 } + { LIBUSB_REQUEST_SET_ADDRESS HEX: 05 } + { LIBUSB_REQUEST_GET_DESCRIPTOR HEX: 06 } + { LIBUSB_REQUEST_SET_DESCRIPTOR HEX: 07 } + { LIBUSB_REQUEST_GET_CONFIGURATION HEX: 08 } + { LIBUSB_REQUEST_SET_CONFIGURATION HEX: 09 } + { LIBUSB_REQUEST_GET_INTERFACE HEX: 0A } + { LIBUSB_REQUEST_SET_INTERFACE HEX: 0B } + { LIBUSB_REQUEST_SYNCH_FRAME HEX: 0C } ; -CONSTANT: LIBUSB_REQUEST_TYPE_STANDARD HEX: 00 -CONSTANT: LIBUSB_REQUEST_TYPE_CLASS HEX: 20 -CONSTANT: LIBUSB_REQUEST_TYPE_VENDOR HEX: 40 -CONSTANT: LIBUSB_REQUEST_TYPE_RESERVED HEX: 60 +C-ENUM: libusb_request_type + { LIBUSB_REQUEST_TYPE_STANDARD HEX: 00 } + { LIBUSB_REQUEST_TYPE_CLASS HEX: 20 } + { LIBUSB_REQUEST_TYPE_VENDOR HEX: 40 } + { LIBUSB_REQUEST_TYPE_RESERVED HEX: 60 } ; -CONSTANT: LIBUSB_RECIPIENT_DEVICE HEX: 00 -CONSTANT: LIBUSB_RECIPIENT_INTERFACE HEX: 01 -CONSTANT: LIBUSB_RECIPIENT_ENDPOINT HEX: 02 -CONSTANT: LIBUSB_RECIPIENT_OTHER HEX: 03 -TYPEDEF: int libusb_request_recipient +C-ENUM: libusb_request_recipient + { LIBUSB_RECIPIENT_DEVICE HEX: 00 } + { LIBUSB_RECIPIENT_INTERFACE HEX: 01 } + { LIBUSB_RECIPIENT_ENDPOINT HEX: 02 } + { LIBUSB_RECIPIENT_OTHER HEX: 03 } ; CONSTANT: LIBUSB_ISO_SYNC_TYPE_MASK HEX: 0C -CONSTANT: LIBUSB_ISO_SYNC_TYPE_NONE 0 -CONSTANT: LIBUSB_ISO_SYNC_TYPE_ASYNC 1 -CONSTANT: LIBUSB_ISO_SYNC_TYPE_ADAPTIVE 2 -CONSTANT: LIBUSB_ISO_SYNC_TYPE_SYNC 3 -TYPEDEF: int libusb_iso_sync_type +C-ENUM: libusb_iso_sync_type + { LIBUSB_ISO_SYNC_TYPE_NONE 0 } + { LIBUSB_ISO_SYNC_TYPE_ASYNC 1 } + { LIBUSB_ISO_SYNC_TYPE_ADAPTIVE 2 } + { LIBUSB_ISO_SYNC_TYPE_SYNC 3 } ; CONSTANT: LIBUSB_ISO_USAGE_TYPE_MASK HEX: 30 -CONSTANT: LIBUSB_ISO_USAGE_TYPE_DATA 0 -CONSTANT: LIBUSB_ISO_USAGE_TYPE_FEEDBACK 1 -CONSTANT: LIBUSB_ISO_USAGE_TYPE_IMPLICIT 2 -TYPEDEF: int libusb_iso_usage_type +C-ENUM: libusb_iso_usage_type + { LIBUSB_ISO_USAGE_TYPE_DATA 0 } + { LIBUSB_ISO_USAGE_TYPE_FEEDBACK 1 } + { LIBUSB_ISO_USAGE_TYPE_IMPLICIT 2 } ; STRUCT: libusb_device_descriptor { bLength uint8_t } @@ -175,23 +176,23 @@ C-TYPE: libusb_context C-TYPE: libusb_device C-TYPE: libusb_device_handle -CONSTANT: LIBUSB_SUCCESS 0 -CONSTANT: LIBUSB_ERROR_IO -1 -CONSTANT: LIBUSB_ERROR_INVALID_PARAM -2 -CONSTANT: LIBUSB_ERROR_ACCESS -3 -CONSTANT: LIBUSB_ERROR_NO_DEVICE -4 -CONSTANT: LIBUSB_ERROR_NOT_FOUND -5 -CONSTANT: LIBUSB_ERROR_BUSY -6 -CONSTANT: LIBUSB_ERROR_TIMEOUT -7 -CONSTANT: LIBUSB_ERROR_OVERFLOW -8 -CONSTANT: LIBUSB_ERROR_PIPE -9 -CONSTANT: LIBUSB_ERROR_INTERRUPTED -10 -CONSTANT: LIBUSB_ERROR_NO_MEM -11 -CONSTANT: LIBUSB_ERROR_NOT_SUPPORTED -12 -CONSTANT: LIBUSB_ERROR_OTHER -99 -TYPEDEF: int libusb_error +C-ENUM: libusb_error + { LIBUSB_SUCCESS 0 } + { LIBUSB_ERROR_IO -1 } + { LIBUSB_ERROR_INVALID_PARAM -2 } + { LIBUSB_ERROR_ACCESS -3 } + { LIBUSB_ERROR_NO_DEVICE -4 } + { LIBUSB_ERROR_NOT_FOUND -5 } + { LIBUSB_ERROR_BUSY -6 } + { LIBUSB_ERROR_TIMEOUT -7 } + { LIBUSB_ERROR_OVERFLOW -8 } + { LIBUSB_ERROR_PIPE -9 } + { LIBUSB_ERROR_INTERRUPTED -10 } + { LIBUSB_ERROR_NO_MEM -11 } + { LIBUSB_ERROR_NOT_SUPPORTED -12 } + { LIBUSB_ERROR_OTHER -99 } ; -C-ENUM: +C-ENUM: libusb_transfer_status LIBUSB_TRANSFER_COMPLETED LIBUSB_TRANSFER_ERROR LIBUSB_TRANSFER_TIMED_OUT @@ -199,12 +200,11 @@ C-ENUM: LIBUSB_TRANSFER_STALL LIBUSB_TRANSFER_NO_DEVICE LIBUSB_TRANSFER_OVERFLOW ; -TYPEDEF: int libusb_transfer_status -CONSTANT: LIBUSB_TRANSFER_SHORT_NOT_OK 1 -CONSTANT: LIBUSB_TRANSFER_FREE_BUFFER 2 -CONSTANT: LIBUSB_TRANSFER_FREE_TRANSFER 4 -TYPEDEF: int libusb_transfer_flags +C-ENUM: libusb_transfer_flags + { LIBUSB_TRANSFER_SHORT_NOT_OK 1 } + { LIBUSB_TRANSFER_FREE_BUFFER 2 } + { LIBUSB_TRANSFER_FREE_TRANSFER 4 } ; STRUCT: libusb_iso_packet_descriptor { length uint } diff --git a/extra/llvm/core/core.factor b/extra/llvm/core/core.factor index f0a3cafe33..0ab43c6ab6 100644 --- a/extra/llvm/core/core.factor +++ b/extra/llvm/core/core.factor @@ -1,6 +1,6 @@ ! Copyright (C) 2009 Matthew Willis. ! See http://factorcode.org/license.txt for BSD license. -USING: alien.libraries alien.syntax system sequences combinators kernel ; +USING: alien.libraries alien.syntax system sequences combinators kernel alien.c-types ; IN: llvm.core @@ -12,7 +12,7 @@ IN: llvm.core { [ os macosx? ] [ "/usr/local/lib/lib" ".dylib" surround ] } { [ os windows? ] [ ".dll" append ] } { [ os unix? ] [ "lib" ".so" surround ] } - } cond "cdecl" add-library ; + } cond cdecl add-library ; "LLVMSystem" add-llvm-library "LLVMSupport" add-llvm-library @@ -28,20 +28,20 @@ LIBRARY: LLVMCore TYPEDEF: uint unsigned TYPEDEF: unsigned enum -CONSTANT: LLVMZExtAttribute BIN: 1 -CONSTANT: LLVMSExtAttribute BIN: 10 -CONSTANT: LLVMNoReturnAttribute BIN: 100 -CONSTANT: LLVMInRegAttribute BIN: 1000 -CONSTANT: LLVMStructRetAttribute BIN: 10000 -CONSTANT: LLVMNoUnwindAttribute BIN: 100000 -CONSTANT: LLVMNoAliasAttribute BIN: 1000000 -CONSTANT: LLVMByValAttribute BIN: 10000000 -CONSTANT: LLVMNestAttribute BIN: 100000000 -CONSTANT: LLVMReadNoneAttribute BIN: 1000000000 -CONSTANT: LLVMReadOnlyAttribute BIN: 10000000000 -TYPEDEF: enum LLVMAttribute; +C-ENUM: LLVMAttribute + { LLVMZExtAttribute BIN: 1 } + { LLVMSExtAttribute BIN: 10 } + { LLVMNoReturnAttribute BIN: 100 } + { LLVMInRegAttribute BIN: 1000 } + { LLVMStructRetAttribute BIN: 10000 } + { LLVMNoUnwindAttribute BIN: 100000 } + { LLVMNoAliasAttribute BIN: 1000000 } + { LLVMByValAttribute BIN: 10000000 } + { LLVMNestAttribute BIN: 100000000 } + { LLVMReadNoneAttribute BIN: 1000000000 } + { LLVMReadOnlyAttribute BIN: 10000000000 } ; -C-ENUM: +C-ENUM: LLVMTypeKind LLVMVoidTypeKind LLVMFloatTypeKind LLVMDoubleTypeKind @@ -57,9 +57,8 @@ C-ENUM: LLVMPointerTypeKind LLVMOpaqueTypeKind LLVMVectorTypeKind ; -TYPEDEF: enum LLVMTypeKind -C-ENUM: +C-ENUM: LLVMLinkage LLVMExternalLinkage LLVMLinkOnceLinkage LLVMWeakLinkage @@ -69,34 +68,32 @@ C-ENUM: LLVMDLLExportLinkage LLVMExternalWeakLinkage LLVMGhostLinkage ; -TYPEDEF: enum LLVMLinkage -C-ENUM: +C-ENUM: LLVMVisibility LLVMDefaultVisibility LLVMHiddenVisibility LLVMProtectedVisibility ; -TYPEDEF: enum LLVMVisibility -CONSTANT: LLVMCCallConv 0 -CONSTANT: LLVMFastCallConv 8 -CONSTANT: LLVMColdCallConv 9 -CONSTANT: LLVMX86StdcallCallConv 64 -CONSTANT: LLVMX86FastcallCallConv 65 -TYPEDEF: enum LLVMCallConv +C-ENUM: LLVMCallConv + { LLVMCCallConv 0 } + { LLVMFastCallConv 8 } + { LLVMColdCallConv 9 } + { LLVMX86StdcallCallConv 64 } + { LLVMX86FastcallCallConv 65 } ; -CONSTANT: LLVMIntEQ 32 -CONSTANT: LLVMIntNE 33 -CONSTANT: LLVMIntUGT 34 -CONSTANT: LLVMIntUGE 35 -CONSTANT: LLVMIntULT 36 -CONSTANT: LLVMIntULE 37 -CONSTANT: LLVMIntSGT 38 -CONSTANT: LLVMIntSGE 39 -CONSTANT: LLVMIntSLT 40 -CONSTANT: LLVMIntSLE 41 -TYPEDEF: enum LLVMIntPredicate +C-ENUM: LLVMIntPredicate + { LLVMIntEQ 32 } + { LLVMIntNE 33 } + { LLVMIntUGT 34 } + { LLVMIntUGE 35 } + { LLVMIntULT 36 } + { LLVMIntULE 37 } + { LLVMIntSGT 38 } + { LLVMIntSGE 39 } + { LLVMIntSLT 40 } + { LLVMIntSLE 41 } ; -C-ENUM: +C-ENUM: LLVMRealPredicate LLVMRealPredicateFalse LLVMRealOEQ LLVMRealOGT @@ -113,7 +110,6 @@ C-ENUM: LLVMRealULE LLVMRealUNE LLVMRealPredicateTrue ; -TYPEDEF: enum LLVMRealPredicate ! Opaque Types diff --git a/extra/llvm/invoker/invoker.factor b/extra/llvm/invoker/invoker.factor index 87f39944d9..cc3480fe49 100644 --- a/extra/llvm/invoker/invoker.factor +++ b/extra/llvm/invoker/invoker.factor @@ -41,7 +41,7 @@ TUPLE: function name alien return params ; dup name>> function-pointer , dup return>> c-type , dup params>> [ second c-type ] map , - "cdecl" , \ alien-indirect , + cdecl , \ alien-indirect , ] [ ] make swap function-effect [ define-declared ] with-compilation-unit ; : install-module ( name -- ) diff --git a/extra/macho/authors.txt b/extra/macho/authors.txt new file mode 100644 index 0000000000..6f03a12101 --- /dev/null +++ b/extra/macho/authors.txt @@ -0,0 +1 @@ +Erik Charlebois diff --git a/extra/macho/macho.factor b/extra/macho/macho.factor new file mode 100644 index 0000000000..57424cd243 --- /dev/null +++ b/extra/macho/macho.factor @@ -0,0 +1,806 @@ +! Copyright (C) 2010 Erik Charlebois. +! See http:// factorcode.org/license.txt for BSD license. +USING: alien.c-types alien.syntax classes.struct kernel literals math unix.types ; +IN: macho + +TYPEDEF: int integer_t +TYPEDEF: int vm_prot_t +TYPEDEF: integer_t cpu_type_t +TYPEDEF: integer_t cpu_subtype_t +TYPEDEF: integer_t cpu_threadtype_t + +CONSTANT: VM_PROT_NONE HEX: 00 +CONSTANT: VM_PROT_READ HEX: 01 +CONSTANT: VM_PROT_WRITE HEX: 02 +CONSTANT: VM_PROT_EXECUTE HEX: 04 +CONSTANT: VM_PROT_DEFAULT HEX: 03 +CONSTANT: VM_PROT_ALL HEX: 07 +CONSTANT: VM_PROT_NO_CHANGE HEX: 08 +CONSTANT: VM_PROT_COPY HEX: 10 +CONSTANT: VM_PROT_WANTS_COPY HEX: 10 + +! loader.h +STRUCT: mach_header + { magic uint32_t } + { cputype cpu_type_t } + { cpusubtype cpu_subtype_t } + { filetype uint32_t } + { ncmds uint32_t } + { sizeofcmds uint32_t } + { flags uint32_t } ; + +CONSTANT: MH_MAGIC HEX: feedface +CONSTANT: MH_CIGAM HEX: cefaedfe + +STRUCT: mach_header_64 + { magic uint32_t } + { cputype cpu_type_t } + { cpusubtype cpu_subtype_t } + { filetype uint32_t } + { ncmds uint32_t } + { sizeofcmds uint32_t } + { flags uint32_t } + { reserved uint32_t } ; + +CONSTANT: MH_MAGIC_64 HEX: feedfacf +CONSTANT: MH_CIGAM_64 HEX: cffaedfe + +CONSTANT: MH_OBJECT HEX: 1 +CONSTANT: MH_EXECUTE HEX: 2 +CONSTANT: MH_FVMLIB HEX: 3 +CONSTANT: MH_CORE HEX: 4 +CONSTANT: MH_PRELOAD HEX: 5 +CONSTANT: MH_DYLIB HEX: 6 +CONSTANT: MH_DYLINKER HEX: 7 +CONSTANT: MH_BUNDLE HEX: 8 +CONSTANT: MH_DYLIB_STUB HEX: 9 +CONSTANT: MH_DSYM HEX: a +CONSTANT: MH_KEXT_BUNDLE HEX: b + +CONSTANT: MH_NOUNDEFS HEX: 1 +CONSTANT: MH_INCRLINK HEX: 2 +CONSTANT: MH_DYLDLINK HEX: 4 +CONSTANT: MH_BINDATLOAD HEX: 8 +CONSTANT: MH_PREBOUND HEX: 10 +CONSTANT: MH_SPLIT_SEGS HEX: 20 +CONSTANT: MH_LAZY_INIT HEX: 40 +CONSTANT: MH_TWOLEVEL HEX: 80 +CONSTANT: MH_FORCE_FLAT HEX: 100 +CONSTANT: MH_NOMULTIDEFS HEX: 200 +CONSTANT: MH_NOFIXPREBINDING HEX: 400 +CONSTANT: MH_PREBINDABLE HEX: 800 +CONSTANT: MH_ALLMODSBOUND HEX: 1000 +CONSTANT: MH_SUBSECTIONS_VIA_SYMBOLS HEX: 2000 +CONSTANT: MH_CANONICAL HEX: 4000 +CONSTANT: MH_WEAK_DEFINES HEX: 8000 +CONSTANT: MH_BINDS_TO_WEAK HEX: 10000 +CONSTANT: MH_ALLOW_STACK_EXECUTION HEX: 20000 +CONSTANT: MH_DEAD_STRIPPABLE_DYLIB HEX: 400000 +CONSTANT: MH_ROOT_SAFE HEX: 40000 +CONSTANT: MH_SETUID_SAFE HEX: 80000 +CONSTANT: MH_NO_REEXPORTED_DYLIBS HEX: 100000 +CONSTANT: MH_PIE HEX: 200000 + +STRUCT: load_command + { cmd uint32_t } + { cmdsize uint32_t } ; + +CONSTANT: LC_REQ_DYLD HEX: 80000000 + +CONSTANT: LC_SEGMENT HEX: 1 +CONSTANT: LC_SYMTAB HEX: 2 +CONSTANT: LC_SYMSEG HEX: 3 +CONSTANT: LC_THREAD HEX: 4 +CONSTANT: LC_UNIXTHREAD HEX: 5 +CONSTANT: LC_LOADFVMLIB HEX: 6 +CONSTANT: LC_IDFVMLIB HEX: 7 +CONSTANT: LC_IDENT HEX: 8 +CONSTANT: LC_FVMFILE HEX: 9 +CONSTANT: LC_PREPAGE HEX: a +CONSTANT: LC_DYSYMTAB HEX: b +CONSTANT: LC_LOAD_DYLIB HEX: c +CONSTANT: LC_ID_DYLIB HEX: d +CONSTANT: LC_LOAD_DYLINKER HEX: e +CONSTANT: LC_ID_DYLINKER HEX: f +CONSTANT: LC_PREBOUND_DYLIB HEX: 10 +CONSTANT: LC_ROUTINES HEX: 11 +CONSTANT: LC_SUB_FRAMEWORK HEX: 12 +CONSTANT: LC_SUB_UMBRELLA HEX: 13 +CONSTANT: LC_SUB_CLIENT HEX: 14 +CONSTANT: LC_SUB_LIBRARY HEX: 15 +CONSTANT: LC_TWOLEVEL_HINTS HEX: 16 +CONSTANT: LC_PREBIND_CKSUM HEX: 17 +CONSTANT: LC_LOAD_WEAK_DYLIB HEX: 80000018 +CONSTANT: LC_SEGMENT_64 HEX: 19 +CONSTANT: LC_ROUTINES_64 HEX: 1a +CONSTANT: LC_UUID HEX: 1b +CONSTANT: LC_RPATH HEX: 8000001c +CONSTANT: LC_CODE_SIGNATURE HEX: 1d +CONSTANT: LC_SEGMENT_SPLIT_INFO HEX: 1e +CONSTANT: LC_REEXPORT_DYLIB HEX: 8000001f +CONSTANT: LC_LAZY_LOAD_DYLIB HEX: 20 +CONSTANT: LC_ENCRYPTION_INFO HEX: 21 +CONSTANT: LC_DYLD_INFO HEX: 22 +CONSTANT: LC_DYLD_INFO_ONLY HEX: 80000022 + +UNION-STRUCT: lc_str + { offset uint32_t } + { ptr char* } ; + +STRUCT: segment_command + { cmd uint32_t } + { cmdsize uint32_t } + { segname char[16] } + { vmaddr uint32_t } + { vmsize uint32_t } + { fileoff uint32_t } + { filesize uint32_t } + { maxprot vm_prot_t } + { initprot vm_prot_t } + { nsects uint32_t } + { flags uint32_t } ; + +STRUCT: segment_command_64 + { cmd uint32_t } + { cmdsize uint32_t } + { segname char[16] } + { vmaddr uint64_t } + { vmsize uint64_t } + { fileoff uint64_t } + { filesize uint64_t } + { maxprot vm_prot_t } + { initprot vm_prot_t } + { nsects uint32_t } + { flags uint32_t } ; + +CONSTANT: SG_HIGHVM HEX: 1 +CONSTANT: SG_FVMLIB HEX: 2 +CONSTANT: SG_NORELOC HEX: 4 +CONSTANT: SG_PROTECTED_VERSION_1 HEX: 8 + +STRUCT: section + { sectname char[16] } + { segname char[16] } + { addr uint32_t } + { size uint32_t } + { offset uint32_t } + { align uint32_t } + { reloff uint32_t } + { nreloc uint32_t } + { flags uint32_t } + { reserved1 uint32_t } + { reserved2 uint32_t } ; + +STRUCT: section_64 + { sectname char[16] } + { segname char[16] } + { addr uint64_t } + { size uint64_t } + { offset uint32_t } + { align uint32_t } + { reloff uint32_t } + { nreloc uint32_t } + { flags uint32_t } + { reserved1 uint32_t } + { reserved2 uint32_t } + { reserved3 uint32_t } ; + +CONSTANT: SECTION_TYPE HEX: 000000ff +CONSTANT: SECTION_ATTRIBUTES HEX: ffffff00 + +CONSTANT: S_REGULAR HEX: 0 +CONSTANT: S_ZEROFILL HEX: 1 +CONSTANT: S_CSTRING_LITERALS HEX: 2 +CONSTANT: S_4BYTE_LITERALS HEX: 3 +CONSTANT: S_8BYTE_LITERALS HEX: 4 +CONSTANT: S_LITERAL_POINTERS HEX: 5 +CONSTANT: S_NON_LAZY_SYMBOL_POINTERS HEX: 6 +CONSTANT: S_LAZY_SYMBOL_POINTERS HEX: 7 +CONSTANT: S_SYMBOL_STUBS HEX: 8 +CONSTANT: S_MOD_INIT_FUNC_POINTERS HEX: 9 +CONSTANT: S_MOD_TERM_FUNC_POINTERS HEX: a +CONSTANT: S_COALESCED HEX: b +CONSTANT: S_GB_ZEROFILL HEX: c +CONSTANT: S_INTERPOSING HEX: d +CONSTANT: S_16BYTE_LITERALS HEX: e +CONSTANT: S_DTRACE_DOF HEX: f +CONSTANT: S_LAZY_DYLIB_SYMBOL_POINTERS HEX: 10 + +CONSTANT: SECTION_ATTRIBUTES_USR HEX: ff000000 +CONSTANT: S_ATTR_PURE_INSTRUCTIONS HEX: 80000000 +CONSTANT: S_ATTR_NO_TOC HEX: 40000000 +CONSTANT: S_ATTR_STRIP_STATIC_SYMS HEX: 20000000 +CONSTANT: S_ATTR_NO_DEAD_STRIP HEX: 10000000 +CONSTANT: S_ATTR_LIVE_SUPPORT HEX: 08000000 +CONSTANT: S_ATTR_SELF_MODIFYING_CODE HEX: 04000000 +CONSTANT: S_ATTR_DEBUG HEX: 02000000 +CONSTANT: SECTION_ATTRIBUTES_SYS HEX: 00ffff00 +CONSTANT: S_ATTR_SOME_INSTRUCTIONS HEX: 00000400 +CONSTANT: S_ATTR_EXT_RELOC HEX: 00000200 +CONSTANT: S_ATTR_LOC_RELOC HEX: 00000100 + +CONSTANT: SEG_PAGEZERO "__PAGEZERO" +CONSTANT: SEG_TEXT "__TEXT" +CONSTANT: SECT_TEXT "__text" +CONSTANT: SECT_FVMLIB_INIT0 "__fvmlib_init0" +CONSTANT: SECT_FVMLIB_INIT1 "__fvmlib_init1" +CONSTANT: SEG_DATA "__DATA" +CONSTANT: SECT_DATA "__data" +CONSTANT: SECT_BSS "__bss" +CONSTANT: SECT_COMMON "__common" +CONSTANT: SEG_OBJC "__OBJC" +CONSTANT: SECT_OBJC_SYMBOLS "__symbol_table" +CONSTANT: SECT_OBJC_MODULES "__module_info" +CONSTANT: SECT_OBJC_STRINGS "__selector_strs" +CONSTANT: SECT_OBJC_REFS "__selector_refs" +CONSTANT: SEG_ICON "__ICON" +CONSTANT: SECT_ICON_HEADER "__header" +CONSTANT: SECT_ICON_TIFF "__tiff" +CONSTANT: SEG_LINKEDIT "__LINKEDIT" +CONSTANT: SEG_UNIXSTACK "__UNIXSTACK" +CONSTANT: SEG_IMPORT "__IMPORT" + +STRUCT: fvmlib + { name lc_str } + { minor_version uint32_t } + { header_addr uint32_t } ; + +STRUCT: fvmlib_command + { cmd uint32_t } + { cmdsize uint32_t } + { fvmlib fvmlib } ; + +STRUCT: dylib + { name lc_str } + { timestamp uint32_t } + { current_version uint32_t } + { compatibility_version uint32_t } ; + +STRUCT: dylib_command + { cmd uint32_t } + { cmdsize uint32_t } + { dylib dylib } ; + +STRUCT: sub_framework_command + { cmd uint32_t } + { cmdsize uint32_t } + { umbrella lc_str } ; + +STRUCT: sub_client_command + { cmd uint32_t } + { cmdsize uint32_t } + { client lc_str } ; + +STRUCT: sub_umbrella_command + { cmd uint32_t } + { cmdsize uint32_t } + { sub_umbrella lc_str } ; + +STRUCT: sub_library_command + { cmd uint32_t } + { cmdsize uint32_t } + { sub_library lc_str } ; + +STRUCT: prebound_dylib_command + { cmd uint32_t } + { cmdsize uint32_t } + { name lc_str } + { nmodules uint32_t } + { linked_modules lc_str } ; + +STRUCT: dylinker_command + { cmd uint32_t } + { cmdsize uint32_t } + { name lc_str } ; + +STRUCT: thread_command + { cmd uint32_t } + { cmdsize uint32_t } ; + +STRUCT: routines_command + { cmd uint32_t } + { cmdsize uint32_t } + { init_address uint32_t } + { init_module uint32_t } + { reserved1 uint32_t } + { reserved2 uint32_t } + { reserved3 uint32_t } + { reserved4 uint32_t } + { reserved5 uint32_t } + { reserved6 uint32_t } ; + +STRUCT: routines_command_64 + { cmd uint32_t } + { cmdsize uint32_t } + { init_address uint64_t } + { init_module uint64_t } + { reserved1 uint64_t } + { reserved2 uint64_t } + { reserved3 uint64_t } + { reserved4 uint64_t } + { reserved5 uint64_t } + { reserved6 uint64_t } ; + +STRUCT: symtab_command + { cmd uint32_t } + { cmdsize uint32_t } + { symoff uint32_t } + { nsyms uint32_t } + { stroff uint32_t } + { strsize uint32_t } ; + +STRUCT: dysymtab_command + { cmd uint32_t } + { cmdsize uint32_t } + { ilocalsym uint32_t } + { nlocalsym uint32_t } + { iextdefsym uint32_t } + { nextdefsym uint32_t } + { iundefsym uint32_t } + { nundefsym uint32_t } + { tocoff uint32_t } + { ntoc uint32_t } + { modtaboff uint32_t } + { nmodtab uint32_t } + { extrefsymoff uint32_t } + { nextrefsyms uint32_t } + { indirectsymoff uint32_t } + { nindirectsyms uint32_t } + { extreloff uint32_t } + { nextrel uint32_t } + { locreloff uint32_t } + { nlocrel uint32_t } ; + +CONSTANT: INDIRECT_SYMBOL_LOCAL HEX: 80000000 +CONSTANT: INDIRECT_SYMBOL_ABS HEX: 40000000 + +STRUCT: dylib_table_of_contents + { symbol_index uint32_t } + { module_index uint32_t } ; + +STRUCT: dylib_module + { module_name uint32_t } + { iextdefsym uint32_t } + { nextdefsym uint32_t } + { irefsym uint32_t } + { nrefsym uint32_t } + { ilocalsym uint32_t } + { nlocalsym uint32_t } + { iextrel uint32_t } + { nextrel uint32_t } + { iinit_iterm uint32_t } + { ninit_nterm uint32_t } + { objc_module_info_addr uint32_t } + { objc_module_info_size uint32_t } ; + +STRUCT: dylib_module_64 + { module_name uint32_t } + { iextdefsym uint32_t } + { nextdefsym uint32_t } + { irefsym uint32_t } + { nrefsym uint32_t } + { ilocalsym uint32_t } + { nlocalsym uint32_t } + { iextrel uint32_t } + { nextrel uint32_t } + { iinit_iterm uint32_t } + { ninit_nterm uint32_t } + { objc_module_info_size uint32_t } + { objc_module_info_addr uint64_t } ; + +STRUCT: dylib_reference + { isym_flags uint32_t } ; + +STRUCT: twolevel_hints_command + { cmd uint32_t } + { cmdsize uint32_t } + { offset uint32_t } + { nhints uint32_t } ; + +STRUCT: twolevel_hint + { isub_image_itoc uint32_t } ; + +STRUCT: prebind_cksum_command + { cmd uint32_t } + { cmdsize uint32_t } + { cksum uint32_t } ; + +STRUCT: uuid_command + { cmd uint32_t } + { cmdsize uint32_t } + { uuid uint8_t[16] } ; + +STRUCT: rpath_command + { cmd uint32_t } + { cmdsize uint32_t } + { path lc_str } ; + +STRUCT: linkedit_data_command + { cmd uint32_t } + { cmdsize uint32_t } + { dataoff uint32_t } + { datasize uint32_t } ; + +STRUCT: encryption_info_command + { cmd uint32_t } + { cmdsize uint32_t } + { cryptoff uint32_t } + { cryptsize uint32_t } + { cryptid uint32_t } ; + +STRUCT: dyld_info_command + { cmd uint32_t } + { cmdsize uint32_t } + { rebase_off uint32_t } + { rebase_size uint32_t } + { bind_off uint32_t } + { bind_size uint32_t } + { weak_bind_off uint32_t } + { weak_bind_size uint32_t } + { lazy_bind_off uint32_t } + { lazy_bind_size uint32_t } + { export_off uint32_t } + { export_size uint32_t } ; + +CONSTANT: REBASE_TYPE_POINTER 1 +CONSTANT: REBASE_TYPE_TEXT_ABSOLUTE32 2 +CONSTANT: REBASE_TYPE_TEXT_PCREL32 3 + +CONSTANT: REBASE_OPCODE_MASK HEX: F0 +CONSTANT: REBASE_IMMEDIATE_MASK HEX: 0F +CONSTANT: REBASE_OPCODE_DONE HEX: 00 +CONSTANT: REBASE_OPCODE_SET_TYPE_IMM HEX: 10 +CONSTANT: REBASE_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB HEX: 20 +CONSTANT: REBASE_OPCODE_ADD_ADDR_ULEB HEX: 30 +CONSTANT: REBASE_OPCODE_ADD_ADDR_IMM_SCALED HEX: 40 +CONSTANT: REBASE_OPCODE_DO_REBASE_IMM_TIMES HEX: 50 +CONSTANT: REBASE_OPCODE_DO_REBASE_ULEB_TIMES HEX: 60 +CONSTANT: REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB HEX: 70 +CONSTANT: REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB HEX: 80 + +CONSTANT: BIND_TYPE_POINTER 1 +CONSTANT: BIND_TYPE_TEXT_ABSOLUTE32 2 +CONSTANT: BIND_TYPE_TEXT_PCREL32 3 + +CONSTANT: BIND_SPECIAL_DYLIB_SELF 0 +CONSTANT: BIND_SPECIAL_DYLIB_MAIN_EXECUTABLE -1 +CONSTANT: BIND_SPECIAL_DYLIB_FLAT_LOOKUP -2 + +CONSTANT: BIND_SYMBOL_FLAGS_WEAK_IMPORT HEX: 1 +CONSTANT: BIND_SYMBOL_FLAGS_NON_WEAK_DEFINITION HEX: 8 + +CONSTANT: BIND_OPCODE_MASK HEX: F0 +CONSTANT: BIND_IMMEDIATE_MASK HEX: 0F +CONSTANT: BIND_OPCODE_DONE HEX: 00 +CONSTANT: BIND_OPCODE_SET_DYLIB_ORDINAL_IMM HEX: 10 +CONSTANT: BIND_OPCODE_SET_DYLIB_ORDINAL_ULEB HEX: 20 +CONSTANT: BIND_OPCODE_SET_DYLIB_SPECIAL_IMM HEX: 30 +CONSTANT: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM HEX: 40 +CONSTANT: BIND_OPCODE_SET_TYPE_IMM HEX: 50 +CONSTANT: BIND_OPCODE_SET_ADDEND_SLEB HEX: 60 +CONSTANT: BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB HEX: 70 +CONSTANT: BIND_OPCODE_ADD_ADDR_ULEB HEX: 80 +CONSTANT: BIND_OPCODE_DO_BIND HEX: 90 +CONSTANT: BIND_OPCODE_DO_BIND_ADD_ADDR_ULEB HEX: A0 +CONSTANT: BIND_OPCODE_DO_BIND_ADD_ADDR_IMM_SCALED HEX: B0 +CONSTANT: BIND_OPCODE_DO_BIND_ULEB_TIMES_SKIPPING_ULEB HEX: C0 + +CONSTANT: EXPORT_SYMBOL_FLAGS_KIND_MASK HEX: 03 +CONSTANT: EXPORT_SYMBOL_FLAGS_KIND_REGULAR HEX: 00 +CONSTANT: EXPORT_SYMBOL_FLAGS_KIND_THREAD_LOCAL HEX: 01 +CONSTANT: EXPORT_SYMBOL_FLAGS_WEAK_DEFINITION HEX: 04 +CONSTANT: EXPORT_SYMBOL_FLAGS_INDIRECT_DEFINITION HEX: 08 +CONSTANT: EXPORT_SYMBOL_FLAGS_HAS_SPECIALIZATIONS HEX: 10 + +STRUCT: symseg_command + { cmd uint32_t } + { cmdsize uint32_t } + { offset uint32_t } + { size uint32_t } ; + +STRUCT: ident_command + { cmd uint32_t } + { cmdsize uint32_t } ; + +STRUCT: fvmfile_command + { cmd uint32_t } + { cmdsize uint32_t } + { name lc_str } + { header_addr uint32_t } ; + +! machine.h +CONSTANT: CPU_STATE_MAX 4 +CONSTANT: CPU_STATE_USER 0 +CONSTANT: CPU_STATE_SYSTEM 1 +CONSTANT: CPU_STATE_IDLE 2 +CONSTANT: CPU_STATE_NICE 3 + +CONSTANT: CPU_ARCH_MASK HEX: ff000000 +CONSTANT: CPU_ARCH_ABI64 HEX: 01000000 + +CONSTANT: CPU_TYPE_ANY -1 +CONSTANT: CPU_TYPE_VAX 1 +CONSTANT: CPU_TYPE_MC680x0 6 +CONSTANT: CPU_TYPE_X86 7 +ALIAS: CPU_TYPE_I386 CPU_TYPE_X86 +CONSTANT: CPU_TYPE_X86_64 flags{ CPU_TYPE_X86 CPU_ARCH_ABI64 } +CONSTANT: CPU_TYPE_MC98000 10 +CONSTANT: CPU_TYPE_HPPA 11 +CONSTANT: CPU_TYPE_ARM 12 +CONSTANT: CPU_TYPE_MC88000 13 +CONSTANT: CPU_TYPE_SPARC 14 +CONSTANT: CPU_TYPE_I860 15 +CONSTANT: CPU_TYPE_POWERPC 18 +CONSTANT: CPU_TYPE_POWERPC64 flags{ CPU_TYPE_POWERPC CPU_ARCH_ABI64 } + +CONSTANT: CPU_SUBTYPE_MASK HEX: ff000000 +CONSTANT: CPU_SUBTYPE_LIB64 HEX: 80000000 + +CONSTANT: CPU_SUBTYPE_MULTIPLE -1 +CONSTANT: CPU_SUBTYPE_LITTLE_ENDIAN 0 +CONSTANT: CPU_SUBTYPE_BIG_ENDIAN 1 + +CONSTANT: CPU_THREADTYPE_NONE 0 + +CONSTANT: CPU_SUBTYPE_VAX_ALL 0 +CONSTANT: CPU_SUBTYPE_VAX780 1 +CONSTANT: CPU_SUBTYPE_VAX785 2 +CONSTANT: CPU_SUBTYPE_VAX750 3 +CONSTANT: CPU_SUBTYPE_VAX730 4 +CONSTANT: CPU_SUBTYPE_UVAXI 5 +CONSTANT: CPU_SUBTYPE_UVAXII 6 +CONSTANT: CPU_SUBTYPE_VAX8200 7 +CONSTANT: CPU_SUBTYPE_VAX8500 8 +CONSTANT: CPU_SUBTYPE_VAX8600 9 +CONSTANT: CPU_SUBTYPE_VAX8650 10 +CONSTANT: CPU_SUBTYPE_VAX8800 11 +CONSTANT: CPU_SUBTYPE_UVAXIII 12 + +CONSTANT: CPU_SUBTYPE_MC680x0_ALL 1 +CONSTANT: CPU_SUBTYPE_MC68030 1 +CONSTANT: CPU_SUBTYPE_MC68040 2 +CONSTANT: CPU_SUBTYPE_MC68030_ONLY 3 + +: CPU_SUBTYPE_INTEL ( f m -- subtype ) 4 shift + ; inline + +CONSTANT: CPU_SUBTYPE_I386_ALL 3 +CONSTANT: CPU_SUBTYPE_386 3 +CONSTANT: CPU_SUBTYPE_486 4 +CONSTANT: CPU_SUBTYPE_486SX 132 +CONSTANT: CPU_SUBTYPE_586 5 +CONSTANT: CPU_SUBTYPE_PENT 5 +CONSTANT: CPU_SUBTYPE_PENTPRO 22 +CONSTANT: CPU_SUBTYPE_PENTII_M3 54 +CONSTANT: CPU_SUBTYPE_PENTII_M5 86 +CONSTANT: CPU_SUBTYPE_CELERON 103 +CONSTANT: CPU_SUBTYPE_CELERON_MOBILE 119 +CONSTANT: CPU_SUBTYPE_PENTIUM_3 8 +CONSTANT: CPU_SUBTYPE_PENTIUM_3_M 24 +CONSTANT: CPU_SUBTYPE_PENTIUM_3_XEON 40 +CONSTANT: CPU_SUBTYPE_PENTIUM_M 9 +CONSTANT: CPU_SUBTYPE_PENTIUM_4 10 +CONSTANT: CPU_SUBTYPE_PENTIUM_4_M 26 +CONSTANT: CPU_SUBTYPE_ITANIUM 11 +CONSTANT: CPU_SUBTYPE_ITANIUM_2 27 +CONSTANT: CPU_SUBTYPE_XEON 12 +CONSTANT: CPU_SUBTYPE_XEON_MP 28 + +: CPU_SUBTYPE_INTEL_FAMILY ( x -- family ) 15 bitand ; inline + +CONSTANT: CPU_SUBTYPE_INTEL_FAMILY_MAX 15 + +: CPU_SUBTYPE_INTEL_MODEL ( x -- model ) -4 shift ; inline + +CONSTANT: CPU_SUBTYPE_INTEL_MODEL_ALL 0 +CONSTANT: CPU_SUBTYPE_X86_ALL 3 +CONSTANT: CPU_SUBTYPE_X86_64_ALL 3 +CONSTANT: CPU_SUBTYPE_X86_ARCH1 4 +CONSTANT: CPU_THREADTYPE_INTEL_HTT 1 + +CONSTANT: CPU_SUBTYPE_MIPS_ALL 0 +CONSTANT: CPU_SUBTYPE_MIPS_R2300 1 +CONSTANT: CPU_SUBTYPE_MIPS_R2600 2 +CONSTANT: CPU_SUBTYPE_MIPS_R2800 3 +CONSTANT: CPU_SUBTYPE_MIPS_R2000a 4 +CONSTANT: CPU_SUBTYPE_MIPS_R2000 5 +CONSTANT: CPU_SUBTYPE_MIPS_R3000a 6 +CONSTANT: CPU_SUBTYPE_MIPS_R3000 7 + +CONSTANT: CPU_SUBTYPE_MC98000_ALL 0 +CONSTANT: CPU_SUBTYPE_MC98601 1 + +CONSTANT: CPU_SUBTYPE_HPPA_ALL 0 +CONSTANT: CPU_SUBTYPE_HPPA_7100 0 +CONSTANT: CPU_SUBTYPE_HPPA_7100LC 1 + +CONSTANT: CPU_SUBTYPE_MC88000_ALL 0 +CONSTANT: CPU_SUBTYPE_MC88100 1 +CONSTANT: CPU_SUBTYPE_MC88110 2 + +CONSTANT: CPU_SUBTYPE_SPARC_ALL 0 + +CONSTANT: CPU_SUBTYPE_I860_ALL 0 +CONSTANT: CPU_SUBTYPE_I860_860 1 + +CONSTANT: CPU_SUBTYPE_POWERPC_ALL 0 +CONSTANT: CPU_SUBTYPE_POWERPC_601 1 +CONSTANT: CPU_SUBTYPE_POWERPC_602 2 +CONSTANT: CPU_SUBTYPE_POWERPC_603 3 +CONSTANT: CPU_SUBTYPE_POWERPC_603e 4 +CONSTANT: CPU_SUBTYPE_POWERPC_603ev 5 +CONSTANT: CPU_SUBTYPE_POWERPC_604 6 +CONSTANT: CPU_SUBTYPE_POWERPC_604e 7 +CONSTANT: CPU_SUBTYPE_POWERPC_620 8 +CONSTANT: CPU_SUBTYPE_POWERPC_750 9 +CONSTANT: CPU_SUBTYPE_POWERPC_7400 10 +CONSTANT: CPU_SUBTYPE_POWERPC_7450 11 +CONSTANT: CPU_SUBTYPE_POWERPC_970 100 + +CONSTANT: CPU_SUBTYPE_ARM_ALL 0 +CONSTANT: CPU_SUBTYPE_ARM_V4T 5 +CONSTANT: CPU_SUBTYPE_ARM_V6 6 +CONSTANT: CPU_SUBTYPE_ARM_V5TEJ 7 +CONSTANT: CPU_SUBTYPE_ARM_XSCALE 8 +CONSTANT: CPU_SUBTYPE_ARM_V7 9 + +CONSTANT: CPUFAMILY_UNKNOWN 0 +CONSTANT: CPUFAMILY_POWERPC_G3 HEX: cee41549 +CONSTANT: CPUFAMILY_POWERPC_G4 HEX: 77c184ae +CONSTANT: CPUFAMILY_POWERPC_G5 HEX: ed76d8aa +CONSTANT: CPUFAMILY_INTEL_6_13 HEX: aa33392b +CONSTANT: CPUFAMILY_INTEL_6_14 HEX: 73d67300 +CONSTANT: CPUFAMILY_INTEL_6_15 HEX: 426f69ef +CONSTANT: CPUFAMILY_INTEL_6_23 HEX: 78ea4fbc +CONSTANT: CPUFAMILY_INTEL_6_26 HEX: 6b5a4cd2 +CONSTANT: CPUFAMILY_ARM_9 HEX: e73283ae +CONSTANT: CPUFAMILY_ARM_11 HEX: 8ff620d8 +CONSTANT: CPUFAMILY_ARM_XSCALE HEX: 53b005f5 +CONSTANT: CPUFAMILY_ARM_13 HEX: 0cc90e64 + +ALIAS: CPUFAMILY_INTEL_YONAH CPUFAMILY_INTEL_6_14 +ALIAS: CPUFAMILY_INTEL_MEROM CPUFAMILY_INTEL_6_15 +ALIAS: CPUFAMILY_INTEL_PENRYN CPUFAMILY_INTEL_6_23 +ALIAS: CPUFAMILY_INTEL_NEHALEM CPUFAMILY_INTEL_6_26 + +ALIAS: CPUFAMILY_INTEL_CORE CPUFAMILY_INTEL_6_14 +ALIAS: CPUFAMILY_INTEL_CORE2 CPUFAMILY_INTEL_6_15 + +! fat.h +CONSTANT: FAT_MAGIC HEX: cafebabe +CONSTANT: FAT_CIGAM HEX: bebafeca + +STRUCT: fat_header + { magic uint32_t } + { nfat_arch uint32_t } ; + +STRUCT: fat_arch + { cputype cpu_type_t } + { cpusubtype cpu_subtype_t } + { offset uint32_t } + { size uint32_t } + { align uint32_t } ; + +! nlist.h +STRUCT: nlist + { n_strx int32_t } + { n_type uint8_t } + { n_sect uint8_t } + { n_desc int16_t } + { n_value uint32_t } ; + +STRUCT: nlist_64 + { n_strx uint32_t } + { n_type uint8_t } + { n_sect uint8_t } + { n_desc uint16_t } + { n_value uint64_t } ; + +CONSTANT: N_STAB HEX: e0 +CONSTANT: N_PEXT HEX: 10 +CONSTANT: N_TYPE HEX: 0e +CONSTANT: N_EXT HEX: 01 + +CONSTANT: N_UNDF HEX: 0 +CONSTANT: N_ABS HEX: 2 +CONSTANT: N_SECT HEX: e +CONSTANT: N_PBUD HEX: c +CONSTANT: N_INDR HEX: a + +CONSTANT: NO_SECT 0 +CONSTANT: MAX_SECT 255 + +: GET_COMM_ALIGN ( n_desc -- align ) + -8 shift HEX: 0f bitand ; inline + +: SET_COMM_ALIGN ( n_desc align -- n_desc ) + [ HEX: f0ff bitand ] + [ HEX: 000f bitand 8 shift ] bi* bitor ; inline + +CONSTANT: REFERENCE_TYPE 7 +CONSTANT: REFERENCE_FLAG_UNDEFINED_NON_LAZY 0 +CONSTANT: REFERENCE_FLAG_UNDEFINED_LAZY 1 +CONSTANT: REFERENCE_FLAG_DEFINED 2 +CONSTANT: REFERENCE_FLAG_PRIVATE_DEFINED 3 +CONSTANT: REFERENCE_FLAG_PRIVATE_UNDEFINED_NON_LAZY 4 +CONSTANT: REFERENCE_FLAG_PRIVATE_UNDEFINED_LAZY 5 + +CONSTANT: REFERENCED_DYNAMICALLY HEX: 0010 + +: GET_LIBRARY_ORDINAL ( n_desc -- ordinal ) + -8 shift HEX: ff bitand ; inline + +: SET_LIBRARY_ORDINAL ( n_desc ordinal -- n_desc ) + [ HEX: 00ff bitand ] + [ HEX: 00ff bitand 8 shift ] bi* bitor ; inline + +CONSTANT: SELF_LIBRARY_ORDINAL HEX: 0 +CONSTANT: MAX_LIBRARY_ORDINAL HEX: fd +CONSTANT: DYNAMIC_LOOKUP_ORDINAL HEX: fe +CONSTANT: EXECUTABLE_ORDINAL HEX: ff + +CONSTANT: N_NO_DEAD_STRIP HEX: 0020 +CONSTANT: N_DESC_DISCARDED HEX: 0020 +CONSTANT: N_WEAK_REF HEX: 0040 +CONSTANT: N_WEAK_DEF HEX: 0080 +CONSTANT: N_REF_TO_WEAK HEX: 0080 +CONSTANT: N_ARM_THUMB_DEF HEX: 0008 + +! ranlib.h +CONSTANT: SYMDEF "__.SYMDEF" +CONSTANT: SYMDEF_SORTED "__.SYMDEF SORTED" + +STRUCT: ranlib + { ran_strx uint32_t } + { ran_off uint32_t } ; + +! reloc.h +STRUCT: relocation_info + { r_address int32_t } + { r_symbolnum_pcrel_length_extern_type uint32_t } ; + +CONSTANT: R_ABS 0 +CONSTANT: R_SCATTERED HEX: 80000000 + +STRUCT: scattered_relocation_info_big_endian + { r_scattered_pcrel_length_type_address uint32_t } + { r_value int32_t } ; + +STRUCT: scattered_relocation_info_little_endian + { r_address_type_length_pcrel_scattered uint32_t } + { r_value int32_t } ; + +C-ENUM: reloc_type_generic + GENERIC_RELOC_VANILLA + GENERIC_RELOC_PAIR + GENERIC_RELOC_SECTDIFF + GENERIC_RELOC_PB_LA_PTR + GENERIC_RELOC_LOCAL_SECTDIFF ; + +C-ENUM: reloc_type_x86_64 + X86_64_RELOC_UNSIGNED + X86_64_RELOC_SIGNED + X86_64_RELOC_BRANCH + X86_64_RELOC_GOT_LOAD + X86_64_RELOC_GOT + X86_64_RELOC_SUBTRACTOR + X86_64_RELOC_SIGNED_1 + X86_64_RELOC_SIGNED_2 + X86_64_RELOC_SIGNED_4 ; + +C-ENUM: reloc_type_ppc + PPC_RELOC_VANILLA + PPC_RELOC_PAIR + PPC_RELOC_BR14 + PPC_RELOC_BR24 + PPC_RELOC_HI16 + PPC_RELOC_LO16 + PPC_RELOC_HA16 + PPC_RELOC_LO14 + PPC_RELOC_SECTDIFF + PPC_RELOC_PB_LA_PTR + PPC_RELOC_HI16_SECTDIFF + PPC_RELOC_LO16_SECTDIFF + PPC_RELOC_HA16_SECTDIFF + PPC_RELOC_JBSR + PPC_RELOC_LO14_SECTDIFF + PPC_RELOC_LOCAL_SECTDIFF ; diff --git a/extra/macho/summary.txt b/extra/macho/summary.txt new file mode 100644 index 0000000000..aaef27545c --- /dev/null +++ b/extra/macho/summary.txt @@ -0,0 +1 @@ +Constants and structs related to the Mach object format. diff --git a/extra/mason/child/child-tests.factor b/extra/mason/child/child-tests.factor index f8046ac8e5..1018a1ec40 100644 --- a/extra/mason/child/child-tests.factor +++ b/extra/mason/child/child-tests.factor @@ -1,7 +1,7 @@ IN: mason.child.tests USING: mason.child mason.config tools.test namespaces io kernel sequences ; -[ { "nmake" "/f" "nmakefile" } ] [ +[ { "nmake" "/f" "nmakefile" "x86-32" } ] [ [ "winnt" target-os set "x86.32" target-cpu set diff --git a/extra/mason/child/child.factor b/extra/mason/child/child.factor index 017e4401d8..d9821f8fcc 100644 --- a/extra/mason/child/child.factor +++ b/extra/mason/child/child.factor @@ -4,13 +4,20 @@ USING: accessors arrays calendar combinators.short-circuit fry continuations debugger io.directories io.files io.launcher io.pathnames io.encodings.ascii kernel make mason.common mason.config mason.platform mason.report mason.notify namespaces sequences -quotations macros system combinators ; +quotations macros system combinators splitting ; IN: mason.child +: nmake-cmd ( -- args ) + { "nmake" "/f" "nmakefile" } + target-cpu get "." split "-" join suffix ; + +: gnu-make-cmd ( -- args ) + gnu-make platform 2array ; + : make-cmd ( -- args ) { - { [ target-os get "winnt" = ] [ { "nmake" "/f" "nmakefile" } ] } - [ gnu-make platform 2array ] + { [ target-os get "winnt" = ] [ nmake-cmd ] } + [ gnu-make-cmd ] } cond ; : make-vm ( -- ) diff --git a/extra/ogg/ogg.factor b/extra/ogg/ogg.factor index d7abece8bc..51e4621476 100644 --- a/extra/ogg/ogg.factor +++ b/extra/ogg/ogg.factor @@ -18,7 +18,7 @@ IN: ogg { [ os winnt? ] [ "ogg.dll" ] } { [ os macosx? ] [ "libogg.0.dylib" ] } { [ os unix? ] [ "libogg.so" ] } -} cond "cdecl" add-library +} cond cdecl add-library "ogg" deploy-library >> diff --git a/extra/ogg/theora/theora.factor b/extra/ogg/theora/theora.factor index eb79613496..82f4a7db51 100644 --- a/extra/ogg/theora/theora.factor +++ b/extra/ogg/theora/theora.factor @@ -19,13 +19,13 @@ IN: ogg.theora { [ os winnt? ] [ "theoradec.dll" ] } { [ os macosx? ] [ "libtheoradec.0.dylib" ] } { [ os unix? ] [ "libtheoradec.so" ] } -} cond "cdecl" add-library +} cond cdecl add-library "theoraenc" { { [ os winnt? ] [ "theoraenc.dll" ] } { [ os macosx? ] [ "libtheoraenc.0.dylib" ] } { [ os unix? ] [ "libtheoraenc.so" ] } -} cond "cdecl" add-library +} cond cdecl add-library >> CONSTANT: TH-EFAULT -1 diff --git a/extra/ogg/vorbis/vorbis.factor b/extra/ogg/vorbis/vorbis.factor index ad43750e27..3cefbeebec 100644 --- a/extra/ogg/vorbis/vorbis.factor +++ b/extra/ogg/vorbis/vorbis.factor @@ -19,7 +19,7 @@ IN: ogg.vorbis { [ os winnt? ] [ "vorbis.dll" ] } { [ os macosx? ] [ "libvorbis.0.dylib" ] } { [ os unix? ] [ "libvorbis.so" ] } -} cond "cdecl" add-library +} cond cdecl add-library "vorbis" deploy-library >> diff --git a/extra/openal/alut/alut.factor b/extra/openal/alut/alut.factor index 0bf8511647..07b2e4c2b6 100755 --- a/extra/openal/alut/alut.factor +++ b/extra/openal/alut/alut.factor @@ -14,7 +14,7 @@ IN: openal.alut "/System/Library/Frameworks/OpenAL.framework/OpenAL" ] } { [ os unix? ] [ "libalut.so" ] } - } cond "cdecl" add-library >> + } cond cdecl add-library >> << os macosx? [ "alut" deploy-library ] unless >> diff --git a/extra/openal/openal.factor b/extra/openal/openal.factor index bbe61f9dc3..853b33b386 100755 --- a/extra/openal/openal.factor +++ b/extra/openal/openal.factor @@ -14,7 +14,7 @@ IN: openal "/System/Library/Frameworks/OpenAL.framework/OpenAL" ] } { [ os unix? ] [ "libopenal.so" ] } - } cond "cdecl" add-library >> + } cond cdecl add-library >> << os macosx? [ "openal" deploy-library ] unless >> diff --git a/extra/opencl/ffi/ffi.factor b/extra/opencl/ffi/ffi.factor index 8f0400dd20..9ee2135cb6 100644 --- a/extra/opencl/ffi/ffi.factor +++ b/extra/opencl/ffi/ffi.factor @@ -8,7 +8,7 @@ IN: opencl.ffi { [ os windows? ] [ "OpenCL.dll" ] } { [ os macosx? ] [ "/System/Library/Frameworks/OpenCL.framework/OpenCL" ] } { [ os unix? ] [ "libOpenCL.so" ] } - } cond "stdcall" add-library >> + } cond stdcall add-library >> LIBRARY: opencl ! cl_platform.h diff --git a/extra/opengl/glu/glu.factor b/extra/opengl/glu/glu.factor index 86936fdd65..856740d229 100644 --- a/extra/opengl/glu/glu.factor +++ b/extra/opengl/glu/glu.factor @@ -9,7 +9,7 @@ IN: opengl.glu os { { [ dup macosx? ] [ drop ] } { [ dup windows? ] [ drop ] } - { [ dup unix? ] [ drop "glu" "libGLU.so.1" "cdecl" add-library ] } + { [ dup unix? ] [ drop "glu" "libGLU.so.1" cdecl add-library ] } } cond >> diff --git a/extra/tokyo/alien/tcadb/tcadb.factor b/extra/tokyo/alien/tcadb/tcadb.factor index 7e3a2d47c2..6107111be2 100644 --- a/extra/tokyo/alien/tcadb/tcadb.factor +++ b/extra/tokyo/alien/tcadb/tcadb.factor @@ -9,7 +9,7 @@ LIBRARY: tokyocabinet TYPEDEF: void* TCADB -C-ENUM: +C-ENUM: f ADBOVOID ADBOMDB ADBONDB diff --git a/extra/tokyo/alien/tcbdb/tcbdb.factor b/extra/tokyo/alien/tcbdb/tcbdb.factor index 6454e6b2fa..04913eba73 100644 --- a/extra/tokyo/alien/tcbdb/tcbdb.factor +++ b/extra/tokyo/alien/tcbdb/tcbdb.factor @@ -27,7 +27,7 @@ CONSTANT: BDBOTSYNC 64 TYPEDEF: void* BDBCUR -C-ENUM: +C-ENUM: f BDBCPCURRENT BDBCPBEFORE BDBCPAFTER ; diff --git a/extra/tokyo/alien/tcrdb/tcrdb.factor b/extra/tokyo/alien/tcrdb/tcrdb.factor index da4a750444..0da3feafb5 100644 --- a/extra/tokyo/alien/tcrdb/tcrdb.factor +++ b/extra/tokyo/alien/tcrdb/tcrdb.factor @@ -9,7 +9,7 @@ IN: tokyo.alien.tcrdb { [ os macosx? ] [ "/opt/local/lib/libtokyotyrant.dylib" ] } { [ os unix? ] [ "libtokyotyrant.so" ] } { [ os windows? ] [ "tokyotyrant.dll" ] } -} cond "cdecl" add-library >> +} cond cdecl add-library >> LIBRARY: tokyotyrant @@ -25,7 +25,7 @@ C-TYPE: TCRDB ! { timeout double } ! { opts int } ; -C-ENUM: +C-ENUM: f TTESUCCESS TTEINVALID TTENOHOST diff --git a/extra/tokyo/alien/tctdb/tctdb.factor b/extra/tokyo/alien/tctdb/tctdb.factor index 82100e23c8..e5a278e1b9 100644 --- a/extra/tokyo/alien/tctdb/tctdb.factor +++ b/extra/tokyo/alien/tctdb/tctdb.factor @@ -27,7 +27,7 @@ CONSTANT: TDBONOLCK 16 CONSTANT: TDBOLCKNB 32 CONSTANT: TDBOTSYNC 64 -C-ENUM: +C-ENUM: f TDBITLEXICAL TDBITDECIMAL ; @@ -38,7 +38,7 @@ CONSTANT: TDBITKEEP 16777216 C-TYPE: TDBCOND C-TYPE: TDBQRY -C-ENUM: +C-ENUM: f TDBQCSTREQ TDBQCSTRINC TDBQCSTRBW @@ -58,7 +58,7 @@ C-ENUM: CONSTANT: TDBQCNEGATE 16777216 CONSTANT: TDBQCNOIDX 33554432 -C-ENUM: +C-ENUM: f TDBQOSTRASC TDBQOSTRDESC TDBQONUMASC diff --git a/extra/tokyo/alien/tcutil/tcutil.factor b/extra/tokyo/alien/tcutil/tcutil.factor index afb78dba22..e5db5328cb 100644 --- a/extra/tokyo/alien/tcutil/tcutil.factor +++ b/extra/tokyo/alien/tcutil/tcutil.factor @@ -8,11 +8,11 @@ IN: tokyo.alien.tcutil { [ os macosx? ] [ "/opt/local/lib/libtokyocabinet.dylib" ] } { [ os unix? ] [ "libtokyocabinet.so" ] } { [ os windows? ] [ "tokyocabinet.dll" ] } -} cond "cdecl" add-library >> +} cond cdecl add-library >> LIBRARY: tokyocabinet -C-ENUM: +C-ENUM: f TCDBTHASH TCDBTBTREE TCDBTFIXED diff --git a/misc/fuel/fuel-font-lock.el b/misc/fuel/fuel-font-lock.el index 983e1bcb98..8d3990fcd8 100644 --- a/misc/fuel/fuel-font-lock.el +++ b/misc/fuel/fuel-font-lock.el @@ -126,6 +126,10 @@ (,fuel-syntax--type-definition-regex 2 'factor-font-lock-type-name) (,fuel-syntax--method-definition-regex (1 'factor-font-lock-type-name) (2 'factor-font-lock-word)) + (,fuel-syntax--before-definition-regex (1 'factor-font-lock-type-name) + (2 'factor-font-lock-word)) + (,fuel-syntax--after-definition-regex (1 'factor-font-lock-type-name) + (2 'factor-font-lock-word)) (,fuel-syntax--tuple-decl-regex 2 'factor-font-lock-type-name) (,fuel-syntax--constructor-regex . 'factor-font-lock-constructor) (,fuel-syntax--setter-regex . 'factor-font-lock-setter-word) diff --git a/misc/fuel/fuel-syntax.el b/misc/fuel/fuel-syntax.el index 114355b3db..026a7738e0 100644 --- a/misc/fuel/fuel-syntax.el +++ b/misc/fuel/fuel-syntax.el @@ -44,8 +44,8 @@ (defconst fuel-syntax--parsing-words '(":" "::" ";" "&:" "<<" ">" - "ABOUT:" "ALIAS:" "ALIEN:" "ARTICLE:" - "B" "BIN:" + "ABOUT:" "AFTER:" "ALIAS:" "ALIEN:" "ARTICLE:" + "B" "BEFORE:" "BIN:" "C:" "CALLBACK:" "C-ENUM:" "C-STRUCT:" "C-TYPE:" "C-UNION:" "CHAR:" "COM-INTERFACE:" "CONSTANT:" "call-next-method" "DEFER:" "EBNF:" ";EBNF" "ERROR:" "EXCLUDE:" @@ -88,6 +88,12 @@ (defconst fuel-syntax--method-definition-regex "^M::? +\\([^ ]+\\) +\\([^ ]+\\)") +(defconst fuel-syntax--before-definition-regex + "^BEFORE: +\\([^ ]+\\) +\\([^ ]+\\)") + +(defconst fuel-syntax--after-definition-regex + "^AFTER: +\\([^ ]+\\) +\\([^ ]+\\)") + (defconst fuel-syntax--integer-regex "\\_<-?[0-9]+\\_>") @@ -112,7 +118,7 @@ (format "\\_<\\(%s\\)?: +\\_<\\(\\w+\\)\\_>" (regexp-opt '(":" "GENERIC" "DEFER" "HOOK" "MAIN" "MATH" "POSTPONE" - "SYMBOL" "SYNTAX" "TYPED" "RENAME")))) + "SYMBOL" "SYNTAX" "TYPED" "TYPED:" "RENAME")))) (defconst fuel-syntax--alias-definition-regex "^ALIAS: +\\(\\_<.+?\\_>\\) +\\(\\_<.+?\\_>\\)") @@ -157,6 +163,7 @@ "\\_ : compile-c-library ( -- ) compile-library? [ compile-library ] when - c-library get dup library-path "cdecl" add-library ; + c-library get dup library-path cdecl add-library ; : define-c-function ( function types effect body -- ) [ diff --git a/unmaintained/cryptlib/libcl/libcl.factor b/unmaintained/cryptlib/libcl/libcl.factor index 38e6817f6c..02bd38d045 100644 --- a/unmaintained/cryptlib/libcl/libcl.factor +++ b/unmaintained/cryptlib/libcl/libcl.factor @@ -13,9 +13,9 @@ USING: alien kernel system combinators alien.syntax ; IN: cryptlib.libcl << "libcl" { - { [ win32? ] [ "cl32.dll" "stdcall" ] } - { [ macosx? ] [ "libcl.dylib" "cdecl" ] } - { [ unix? ] [ "libcl.so" "cdecl" ] } + { [ win32? ] [ "cl32.dll" stdcall ] } + { [ macosx? ] [ "libcl.dylib" cdecl ] } + { [ unix? ] [ "libcl.so" cdecl ] } } cond add-library >> ! =============================================== @@ -878,7 +878,7 @@ TYPEDEF: int CRYPT_KEYID_TYPE ! Internal keyset options ! (As _NONE but open for exclusive access, _CRYPT_DEFINED ! Last possible key option type, _CRYPT_DEFINED Last external keyset option) -C-ENUM: +C-ENUM: f CRYPT_KEYOPT_NONE CRYPT_KEYOPT_READONLY CRYPT_KEYOPT_CREATE diff --git a/unmaintained/db/mysql/ffi/ffi.factor b/unmaintained/db/mysql/ffi/ffi.factor index c047393c99..98fd0b38cb 100644 --- a/unmaintained/db/mysql/ffi/ffi.factor +++ b/unmaintained/db/mysql/ffi/ffi.factor @@ -6,9 +6,9 @@ USING: alien alien.syntax combinators kernel system ; IN: db.mysql.ffi << "mysql" { - { [ os winnt? ] [ "libmySQL.dll" "stdcall" ] } - { [ os macosx? ] [ "libmysqlclient.14.dylib" "cdecl" ] } - { [ os unix? ] [ "libmysqlclient.so.14" "cdecl" ] } + { [ os winnt? ] [ "libmySQL.dll" stdcall ] } + { [ os macosx? ] [ "libmysqlclient.14.dylib" cdecl ] } + { [ os unix? ] [ "libmysqlclient.so.14" cdecl ] } } cond add-library >> LIBRARY: mysql diff --git a/unmaintained/jni/jni-internals.factor b/unmaintained/jni/jni-internals.factor index 49bc57b108..d809d899de 100644 --- a/unmaintained/jni/jni-internals.factor +++ b/unmaintained/jni/jni-internals.factor @@ -296,61 +296,61 @@ FUNCTION: jint JNI_CreateJavaVM ( void** pvm, void** penv, void* args ) ; ] when ; : (destroy-java-vm) - "int" { "void*" } "cdecl" alien-indirect ; + "int" { "void*" } cdecl alien-indirect ; : (attach-current-thread) - "int" { "void*" "void*" "void*" } "cdecl" alien-indirect ; + "int" { "void*" "void*" "void*" } cdecl alien-indirect ; : (detach-current-thread) - "int" { "void*" } "cdecl" alien-indirect ; + "int" { "void*" } cdecl alien-indirect ; : (get-env) - "int" { "void*" "void*" "int" } "cdecl" alien-indirect ; + "int" { "void*" "void*" "int" } cdecl alien-indirect ; : (attach-current-thread-as-daemon) - "int" { "void*" "void*" "void*" } "cdecl" alien-indirect ; + "int" { "void*" "void*" "void*" } cdecl alien-indirect ; : destroy-java-vm ( javavm -- int ) dup JavaVM-functions JNIInvokeInterface-DestroyJavaVM (destroy-java-vm) ; : (get-version) - "jint" { "JNIEnv*" } "cdecl" alien-indirect ; + "jint" { "JNIEnv*" } cdecl alien-indirect ; : get-version ( jnienv -- int ) dup JNIEnv-functions JNINativeInterface-GetVersion (get-version) ; : (find-class) - "void*" { "JNINativeInterface*" "char*" } "cdecl" alien-indirect ; + "void*" { "JNINativeInterface*" "char*" } cdecl alien-indirect ; : find-class ( name jnienv -- int ) dup swapd JNIEnv-functions JNINativeInterface-FindClass (find-class) ; : (get-static-field-id) - "void*" { "JNINativeInterface*" "void*" "char*" "char*" } "cdecl" alien-indirect ; + "void*" { "JNINativeInterface*" "void*" "char*" "char*" } cdecl alien-indirect ; : get-static-field-id ( class name sig jnienv -- int ) dup >r >r 3array r> swap first3 r> JNIEnv-functions JNINativeInterface-GetStaticFieldID (get-static-field-id) ; : (get-static-object-field) - "void*" { "JNINativeInterface*" "void*" "void*" } "cdecl" alien-indirect ; + "void*" { "JNINativeInterface*" "void*" "void*" } cdecl alien-indirect ; : get-static-object-field ( class id jnienv -- int ) dup >r >r 2array r> swap first2 r> JNIEnv-functions JNINativeInterface-GetStaticObjectField (get-static-object-field) ; : (get-method-id) - "void*" { "JNINativeInterface*" "void*" "char*" "char*" } "cdecl" alien-indirect ; + "void*" { "JNINativeInterface*" "void*" "char*" "char*" } cdecl alien-indirect ; : get-method-id ( class name sig jnienv -- int ) dup >r >r 3array r> swap first3 r> JNIEnv-functions JNINativeInterface-GetMethodID (get-method-id) ; : (new-string) - "void*" { "JNINativeInterface*" "char*" "int" } "cdecl" alien-indirect ; + "void*" { "JNINativeInterface*" "char*" "int" } cdecl alien-indirect ; : new-string ( str jnienv -- str ) dup >r >r dup length 2array r> swap first2 r> JNIEnv-functions JNINativeInterface-NewString (new-string) ; : (call1) - "void" { "JNINativeInterface*" "void*" "void*" "int" } "cdecl" alien-indirect ; + "void" { "JNINativeInterface*" "void*" "void*" "int" } cdecl alien-indirect ; : call1 ( obj method-id jstr jnienv -- ) dup >r >r 3array r> swap first3 r> JNIEnv-functions JNINativeInterface-CallObjectMethod (call1) ; diff --git a/unmaintained/ldap/libldap/libldap.factor b/unmaintained/ldap/libldap/libldap.factor index 6db6884071..9b7dd36a69 100644 --- a/unmaintained/ldap/libldap/libldap.factor +++ b/unmaintained/ldap/libldap/libldap.factor @@ -10,9 +10,9 @@ USING: alien alien.syntax combinators kernel system ; IN: ldap.libldap << "libldap" { - { [ win32? ] [ "libldap.dll" "stdcall" ] } - { [ macosx? ] [ "libldap.dylib" "cdecl" ] } - { [ unix? ] [ "libldap.so" "cdecl" ] } + { [ win32? ] [ "libldap.dll" stdcall ] } + { [ macosx? ] [ "libldap.dylib" cdecl ] } + { [ unix? ] [ "libldap.so" cdecl ] } } cond add-library >> : LDAP_VERSION1 1 ; inline diff --git a/unmaintained/lint/lint.factor b/unmaintained/lint/lint.factor index 9877c70062..093a110fba 100644 --- a/unmaintained/lint/lint.factor +++ b/unmaintained/lint/lint.factor @@ -52,7 +52,7 @@ SYMBOL: def-hash-keys [ t ] [ f ] [ { } ] [ drop f ] - [ "cdecl" ] + [ cdecl ] [ first ] [ second ] [ third ] [ fourth ] [ ">" write ] [ "/>" write ] } ; diff --git a/unmaintained/odbc/odbc.factor b/unmaintained/odbc/odbc.factor index 06d47b8937..6dcddb5bd5 100644 --- a/unmaintained/odbc/odbc.factor +++ b/unmaintained/odbc/odbc.factor @@ -5,7 +5,7 @@ combinators alien.c-types strings sequences namespaces make words math threads io.encodings.ascii ; IN: odbc -<< "odbc" "odbc32.dll" "stdcall" add-library >> +<< "odbc" "odbc32.dll" stdcall add-library >> LIBRARY: odbc diff --git a/unmaintained/oracle/liboci/liboci.factor b/unmaintained/oracle/liboci/liboci.factor index aa04aef39f..4e8ebfc860 100644 --- a/unmaintained/oracle/liboci/liboci.factor +++ b/unmaintained/oracle/liboci/liboci.factor @@ -12,9 +12,9 @@ USING: alien alien.syntax combinators kernel system ; IN: oracle.liboci "oci" { - { [ os winnt? ] [ "oci.dll" "stdcall" ] } - { [ os macosx? ] [ "$DYLD_LIBRARY_PATH/libclntsh.dylib" "cdecl" ] } - { [ os unix? ] [ "$DYLD_LIBRARY_PATH/libclntsh.so.10.1" "cdecl" ] } + { [ os winnt? ] [ "oci.dll" stdcall ] } + { [ os macosx? ] [ "$DYLD_LIBRARY_PATH/libclntsh.dylib" cdecl ] } + { [ os unix? ] [ "$DYLD_LIBRARY_PATH/libclntsh.so.10.1" cdecl ] } } cond add-library ! =============================================== diff --git a/unmaintained/pdf/libhpdf/libhpdf.factor b/unmaintained/pdf/libhpdf/libhpdf.factor index a40b7cddee..f01feb494d 100644 --- a/unmaintained/pdf/libhpdf/libhpdf.factor +++ b/unmaintained/pdf/libhpdf/libhpdf.factor @@ -10,9 +10,9 @@ USING: alien alien.syntax combinators system ; IN: pdf.libhpdf << "libhpdf" { - { [ win32? ] [ "libhpdf.dll" "stdcall" ] } - { [ macosx? ] [ "libhpdf.dylib" "cdecl" ] } - { [ unix? ] [ "$LD_LIBRARY_PATH/libhpdf.so" "cdecl" ] } + { [ win32? ] [ "libhpdf.dll" stdcall ] } + { [ macosx? ] [ "libhpdf.dylib" cdecl ] } + { [ unix? ] [ "$LD_LIBRARY_PATH/libhpdf.so" cdecl ] } } cond add-library >> ! compression mode @@ -24,7 +24,7 @@ IN: pdf.libhpdf : HPDF_COMP_MASK HEX: FF ; inline ! page mode -C-ENUM: +C-ENUM: f HPDF_PAGE_MODE_USE_NONE HPDF_PAGE_MODE_USE_OUTLINE HPDF_PAGE_MODE_USE_THUMBS diff --git a/vm/Config.windows.nt.x86.32 b/vm/Config.windows.nt.x86.32 index d27629fe83..73bf064ce5 100644 --- a/vm/Config.windows.nt.x86.32 +++ b/vm/Config.windows.nt.x86.32 @@ -1,3 +1,4 @@ +PLAF_DLL_OBJS += vm/os-windows-nt-x86.32.o DLL_PATH=http://factorcode.org/dlls WINDRES=windres include vm/Config.windows.nt diff --git a/vm/Config.windows.nt.x86.64 b/vm/Config.windows.nt.x86.64 index ddb61480e5..495a3ccac9 100644 --- a/vm/Config.windows.nt.x86.64 +++ b/vm/Config.windows.nt.x86.64 @@ -1,3 +1,4 @@ +PLAF_DLL_OBJS += vm/os-windows-nt-x86.64.o DLL_PATH=http://factorcode.org/dlls/64 CC=$(WIN64_PATH)-gcc.exe WINDRES=$(WIN64_PATH)-windres.exe diff --git a/vm/code_heap.cpp b/vm/code_heap.cpp index 40fe00b0e9..96d9541665 100755 --- a/vm/code_heap.cpp +++ b/vm/code_heap.cpp @@ -7,8 +7,14 @@ code_heap::code_heap(cell size) { if(size > ((u64)1 << (sizeof(cell) * 8 - 6))) fatal_error("Heap too large",size); seg = new segment(align_page(size),true); - if(!seg) fatal_error("Out of memory in heap allocator",size); - allocator = new free_list_allocator(size,seg->start); + if(!seg) fatal_error("Out of memory in code_heap constructor",size); + + cell start = seg->start + seh_area_size; + + allocator = new free_list_allocator(seg->end - start,start); + + /* See os-windows-nt-x86.64.cpp for seh_area usage */ + seh_area = (char *)seg->start; } code_heap::~code_heap() diff --git a/vm/code_heap.hpp b/vm/code_heap.hpp index 78ffa6c76a..20ce03c835 100755 --- a/vm/code_heap.hpp +++ b/vm/code_heap.hpp @@ -1,10 +1,19 @@ namespace factor { +#if defined(WINDOWS) && defined(FACTOR_64) + const cell seh_area_size = 1024; +#else + const cell seh_area_size = 0; +#endif + struct code_heap { /* The actual memory area */ segment *seg; + /* Memory area reserved for SEH. Only used on Windows */ + char *seh_area; + /* Memory allocator */ free_list_allocator *allocator; diff --git a/vm/factor.cpp b/vm/factor.cpp index 89da7a2db7..60508e8a27 100755 --- a/vm/factor.cpp +++ b/vm/factor.cpp @@ -15,7 +15,9 @@ void factor_vm::default_parameters(vm_parameters *p) p->datastack_size = 32 * sizeof(cell); p->retainstack_size = 32 * sizeof(cell); -#ifdef FACTOR_PPC +#if defined(__OpenBSD__) && defined(FACTOR_X86) + p->callstack_size = 64 * sizeof(cell); +#elif defined(FACTOR_PPC) p->callstack_size = 256 * sizeof(cell); #else p->callstack_size = 128 * sizeof(cell); diff --git a/vm/ffi_test.c b/vm/ffi_test.c index 11f7498f30..993ca18fa3 100755 --- a/vm/ffi_test.c +++ b/vm/ffi_test.c @@ -329,3 +329,39 @@ short ffi_test_48(struct bool_field_test x) } #endif + +FACTOR_FASTCALL(int) ffi_test_49(int x) { return x + 1; } +FACTOR_FASTCALL(int) ffi_test_50(int x, int y) { return x + y + 1; } +FACTOR_FASTCALL(int) ffi_test_51(int x, int y, int z) { return x + y + z + 1; } +FACTOR_FASTCALL(int) ffi_test_52(int x, float y, int z) { return x + y + z + 1; } +FACTOR_FASTCALL(int) ffi_test_53(int x, float y, int z, int w) +{ + return x + y + z + w + 1; +} + +FACTOR_FASTCALL(int) ffi_test_54(struct test_struct_11 x, int y) +{ + return x.x + x.y + y + 1; +} + +FACTOR_FASTCALL(int) ffi_test_55(struct test_struct_11 x, int y, int z) +{ + return x.x + x.y + y + z + 1; +} + +FACTOR_FASTCALL(int) ffi_test_56(struct test_struct_11 x, int y, int z, int w) +{ + return x.x + x.y + y + z + w + 1; +} + +FACTOR_FASTCALL(struct test_struct_11) ffi_test_57(int x, int y) +{ + struct test_struct_11 r = { x + y, x - y }; + return r; +} + +FACTOR_FASTCALL(struct test_struct_11) ffi_test_58(int x, int y, int z) +{ + struct test_struct_11 r = { x + y, y - z }; + return r; +} diff --git a/vm/ffi_test.h b/vm/ffi_test.h index c61c95d6df..08b8f95c39 100755 --- a/vm/ffi_test.h +++ b/vm/ffi_test.h @@ -1,9 +1,12 @@ #if defined(_MSC_VER) #define FACTOR_STDCALL(return_type) return_type __stdcall + #define FACTOR_FASTCALL(return_type) return_type __fastcall #elif defined(i386) || defined(__i386) || defined(__i386__) #define FACTOR_STDCALL(return_type) __attribute__((stdcall)) return_type + #define FACTOR_FASTCALL(return_type) __attribute__((fastcall)) return_type #else #define FACTOR_STDCALL(return_type) return_type + #define FACTOR_FASTCALL(return_type) return_type #endif #if defined(__APPLE__) @@ -119,3 +122,14 @@ struct bool_field_test { FACTOR_EXPORT short ffi_test_48(struct bool_field_test x); #endif + +FACTOR_EXPORT FACTOR_FASTCALL(int) ffi_test_49(int x); +FACTOR_EXPORT FACTOR_FASTCALL(int) ffi_test_50(int x, int y); +FACTOR_EXPORT FACTOR_FASTCALL(int) ffi_test_51(int x, int y, int z); +FACTOR_EXPORT FACTOR_FASTCALL(int) ffi_test_52(int x, float y, int z); +FACTOR_EXPORT FACTOR_FASTCALL(int) ffi_test_53(int x, float y, int z, int w); +FACTOR_EXPORT FACTOR_FASTCALL(int) ffi_test_54(struct test_struct_11 x, int y); +FACTOR_EXPORT FACTOR_FASTCALL(int) ffi_test_55(struct test_struct_11 x, int y, int z); +FACTOR_EXPORT FACTOR_FASTCALL(int) ffi_test_56(struct test_struct_11 x, int y, int z, int w); +FACTOR_EXPORT FACTOR_FASTCALL(struct test_struct_11) ffi_test_57(int x, int y); +FACTOR_EXPORT FACTOR_FASTCALL(struct test_struct_11) ffi_test_58(int x, int y, int z); diff --git a/vm/image.cpp b/vm/image.cpp index c74351c191..ccce96a952 100755 --- a/vm/image.cpp +++ b/vm/image.cpp @@ -258,7 +258,7 @@ void factor_vm::load_image(vm_parameters *p) init_objects(&h); cell data_offset = data->tenured->start - h.data_relocation_base; - cell code_offset = code->seg->start - h.code_relocation_base; + cell code_offset = code->allocator->start - h.code_relocation_base; fixup_data(data_offset,code_offset); fixup_code(data_offset,code_offset); @@ -285,7 +285,7 @@ bool factor_vm::save_image(const vm_char *saving_filename, const vm_char *filena h.version = image_version; h.data_relocation_base = data->tenured->start; h.data_size = data->tenured->occupied_space(); - h.code_relocation_base = code->seg->start; + h.code_relocation_base = code->allocator->start; h.code_size = code->allocator->occupied_space(); h.true_object = true_object; diff --git a/vm/os-windows-nt-x86.32.cpp b/vm/os-windows-nt-x86.32.cpp new file mode 100644 index 0000000000..61cf9f6c4e --- /dev/null +++ b/vm/os-windows-nt-x86.32.cpp @@ -0,0 +1,12 @@ +#include "master.hpp" + +namespace factor +{ + +void factor_vm::c_to_factor_toplevel(cell quot) +{ + /* 32-bit Windows SEH is set up in basis/cpu/x86/32/winnt/bootstrap.factor */ + c_to_factor(quot); +} + +} diff --git a/vm/os-windows-nt-x86.64.cpp b/vm/os-windows-nt-x86.64.cpp new file mode 100644 index 0000000000..876d0c5771 --- /dev/null +++ b/vm/os-windows-nt-x86.64.cpp @@ -0,0 +1,85 @@ +#include "master.hpp" + +namespace factor { + +typedef unsigned char UBYTE; + +const UBYTE UNW_FLAG_EHANDLER = 0x1; + +struct UNWIND_INFO { + UBYTE Version:3; + UBYTE Flags:5; + UBYTE SizeOfProlog; + UBYTE CountOfCodes; + UBYTE FrameRegister:4; + UBYTE FrameOffset:4; + ULONG ExceptionHandler; + ULONG ExceptionData[1]; +}; + +struct seh_data { + UNWIND_INFO unwind_info; + RUNTIME_FUNCTION func; + UBYTE handler[32]; +}; + +void factor_vm::c_to_factor_toplevel(cell quot) +{ + /* The annoying thing about Win64 SEH is that the offsets in + * function tables are 32-bit integers, and the exception handler + * itself must reside between the start and end pointers, so + * we stick everything at the beginning of the code heap and + * generate a small trampoline that jumps to the real + * exception handler. */ + + seh_data *seh_area = (seh_data *)code->seh_area; + cell base = code->seg->start; + + /* Should look at generating this with the Factor assembler */ + + /* mov rax,0 */ + seh_area->handler[0] = 0x48; + seh_area->handler[1] = 0xb8; + seh_area->handler[2] = 0x0; + seh_area->handler[3] = 0x0; + seh_area->handler[4] = 0x0; + seh_area->handler[5] = 0x0; + seh_area->handler[6] = 0x0; + seh_area->handler[7] = 0x0; + seh_area->handler[8] = 0x0; + seh_area->handler[9] = 0x0; + + /* jmp rax */ + seh_area->handler[10] = 0x48; + seh_area->handler[11] = 0xff; + seh_area->handler[12] = 0xe0; + + /* Store address of exception handler in the operand of the 'mov' */ + cell handler = (cell)&factor::exception_handler; + memcpy(&seh_area->handler[2],&handler,sizeof(cell)); + + UNWIND_INFO *unwind_info = &seh_area->unwind_info; + unwind_info->Version = 1; + unwind_info->Flags = UNW_FLAG_EHANDLER; + unwind_info->SizeOfProlog = 0; + unwind_info->CountOfCodes = 0; + unwind_info->FrameRegister = 0; + unwind_info->FrameOffset = 0; + unwind_info->ExceptionHandler = (DWORD)((cell)&seh_area->handler[0] - base); + unwind_info->ExceptionData[0] = 0; + + RUNTIME_FUNCTION *func = &seh_area->func; + func->BeginAddress = 0; + func->EndAddress = (DWORD)(code->seg->end - base); + func->UnwindData = (DWORD)((cell)&seh_area->unwind_info - base); + + if(!RtlAddFunctionTable(func,1,base)) + fatal_error("RtlAddFunctionTable() failed",0); + + c_to_factor(quot); + + if(!RtlDeleteFunctionTable(func)) + fatal_error("RtlDeleteFunctionTable() failed",0); +} + +} diff --git a/vm/os-windows-nt.cpp b/vm/os-windows-nt.cpp index 0d43cdecc2..4fea294a12 100755 --- a/vm/os-windows-nt.cpp +++ b/vm/os-windows-nt.cpp @@ -92,11 +92,6 @@ VM_C_API LONG exception_handler(PEXCEPTION_RECORD e, void *frame, PCONTEXT c, vo return current_vm()->exception_handler(e,frame,c,dispatch); } -void factor_vm::c_to_factor_toplevel(cell quot) -{ - c_to_factor(quot); -} - void factor_vm::open_console() { }