diff --git a/.gitignore b/.gitignore index f249169..2fe7175 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ .idea -run \ No newline at end of file +run +.~lock* +*.png \ No newline at end of file diff --git a/go.mod b/go.mod index 773df52..6ef966f 100644 --- a/go.mod +++ b/go.mod @@ -1 +1,3 @@ module git.kolaente.de/konrad/multiplication-table + +require github.com/lucasb-eyer/go-colorful v0.0.0-20181028223441-12d3b2882a08 diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..b0b2180 --- /dev/null +++ b/go.sum @@ -0,0 +1,2 @@ +github.com/lucasb-eyer/go-colorful v0.0.0-20181028223441-12d3b2882a08 h1:5MnxBC15uMxFv5FY/J/8vzyaBiArCOkMdFT9Jsw78iY= +github.com/lucasb-eyer/go-colorful v0.0.0-20181028223441-12d3b2882a08/go.mod h1:NXg0ArsFk0Y01623LgUqoqcouGDB+PwCCQlrwrG6xJ4= diff --git a/main.go b/main.go index f359329..23e086a 100644 --- a/main.go +++ b/main.go @@ -3,11 +3,18 @@ package main import ( "encoding/csv" "fmt" + "github.com/lucasb-eyer/go-colorful" + "image" + "image/draw" + "image/png" "log" "os" "strconv" ) +const OutputEnable = false +const CreateImage = true + func main() { fmt.Println("Enter Number:") var number int @@ -18,7 +25,6 @@ func main() { matrice := make([][]int, number+1) - for i := 0; i <= number; i++ { matrice[i] = make([]int, number+1) for j := 0; j <= number; j++ { @@ -32,20 +38,55 @@ func main() { } // output it - fmt.Print("\t") - for i := 0; i <= number; i++ { - fmt.Print(i, "\t") - } - fmt.Println() - - for rownumber, row := range matrice { - fmt.Print(rownumber, "\t") - for _, col := range row { - fmt.Print(col, "\t") + if OutputEnable { + fmt.Print("\t") + for i := 0; i <= number; i++ { + fmt.Print(i, "\t") } fmt.Println() + + for rownumber, row := range matrice { + fmt.Print(rownumber, "\t") + for _, col := range row { + fmt.Print(col, "\t") + } + fmt.Println() + } } + // Build an image + if CreateImage { + + log.Println("Starting image creation...") + + size := getImageBlockSize(number) + lightColor, _ := colorful.Hex("#00fbfb") + darkColor, _ := colorful.Hex("#330066") + + img := image.NewRGBA(image.Rect(0, 0, number*size, number*size)) + + for rownumber, row := range matrice { + for colnumber, col := range row { + x := colnumber*size - 1 + y := rownumber*size - 1 + draw.Draw(img, image.Rect(x, y, x+size, y+size), &image.Uniform{lightColor.BlendRgb(darkColor, float64(col)/float64(number-1))}, image.ZP, draw.Src) + } + } + + imgpath := strconv.Itoa(number) + "x.png" + toimg, err := os.Create(imgpath) + if err != nil { + log.Fatal(err) + } + defer toimg.Close() + + err = png.Encode(toimg, img) + if err != nil { + log.Fatal(err) + } + + log.Println("Image saved to " + imgpath) + } } func csvExport(data [][]int) error { @@ -73,4 +114,27 @@ func csvExport(data [][]int) error { } } return nil -} \ No newline at end of file +} + +func getImageBlockSize(number int) int { + if number < 1000 { + return 2 + } + if number < 600 { + return 3 + } + if number < 400 { + return 4 + } + if number < 200 { + return 6 + } + if number < 100 { + return 10 + } + if number < 50 { + return 15 + } + + return number +} diff --git a/result.csv b/result.csv index 265580b..54da1d2 100644 --- a/result.csv +++ b/result.csv @@ -1,15 +1,201 @@ -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -0,1,2,3,4,5,6,7,8,9,10,11,12,13,0 -0,2,4,6,8,10,12,0,2,4,6,8,10,12,0 -0,3,6,9,12,1,4,7,10,13,2,5,8,11,0 -0,4,8,12,2,6,10,0,4,8,12,2,6,10,0 -0,5,10,1,6,11,2,7,12,3,8,13,4,9,0 -0,6,12,4,10,2,8,0,6,12,4,10,2,8,0 -0,7,0,7,0,7,0,7,0,7,0,7,0,7,0 -0,8,2,10,4,12,6,0,8,2,10,4,12,6,0 -0,9,4,13,8,3,12,7,2,11,6,1,10,5,0 -0,10,6,2,12,8,4,0,10,6,2,12,8,4,0 -0,11,8,5,2,13,10,7,4,1,12,9,6,3,0 -0,12,10,8,6,4,2,0,12,10,8,6,4,2,0 -0,13,12,11,10,9,8,7,6,5,4,3,2,1,0 -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,0 +0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128,130,132,134,136,138,140,142,144,146,148,150,152,154,156,158,160,162,164,166,168,170,172,174,176,178,180,182,184,186,188,190,192,194,196,198,0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128,130,132,134,136,138,140,142,144,146,148,150,152,154,156,158,160,162,164,166,168,170,172,174,176,178,180,182,184,186,188,190,192,194,196,198,0 +0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57,60,63,66,69,72,75,78,81,84,87,90,93,96,99,102,105,108,111,114,117,120,123,126,129,132,135,138,141,144,147,150,153,156,159,162,165,168,171,174,177,180,183,186,189,192,195,198,1,4,7,10,13,16,19,22,25,28,31,34,37,40,43,46,49,52,55,58,61,64,67,70,73,76,79,82,85,88,91,94,97,100,103,106,109,112,115,118,121,124,127,130,133,136,139,142,145,148,151,154,157,160,163,166,169,172,175,178,181,184,187,190,193,196,199,2,5,8,11,14,17,20,23,26,29,32,35,38,41,44,47,50,53,56,59,62,65,68,71,74,77,80,83,86,89,92,95,98,101,104,107,110,113,116,119,122,125,128,131,134,137,140,143,146,149,152,155,158,161,164,167,170,173,176,179,182,185,188,191,194,197,0 +0,4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140,144,148,152,156,160,164,168,172,176,180,184,188,192,196,0,4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140,144,148,152,156,160,164,168,172,176,180,184,188,192,196,0,4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140,144,148,152,156,160,164,168,172,176,180,184,188,192,196,0,4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140,144,148,152,156,160,164,168,172,176,180,184,188,192,196,0 +0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110,115,120,125,130,135,140,145,150,155,160,165,170,175,180,185,190,195,0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110,115,120,125,130,135,140,145,150,155,160,165,170,175,180,185,190,195,0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110,115,120,125,130,135,140,145,150,155,160,165,170,175,180,185,190,195,0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110,115,120,125,130,135,140,145,150,155,160,165,170,175,180,185,190,195,0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110,115,120,125,130,135,140,145,150,155,160,165,170,175,180,185,190,195,0 +0,6,12,18,24,30,36,42,48,54,60,66,72,78,84,90,96,102,108,114,120,126,132,138,144,150,156,162,168,174,180,186,192,198,4,10,16,22,28,34,40,46,52,58,64,70,76,82,88,94,100,106,112,118,124,130,136,142,148,154,160,166,172,178,184,190,196,2,8,14,20,26,32,38,44,50,56,62,68,74,80,86,92,98,104,110,116,122,128,134,140,146,152,158,164,170,176,182,188,194,0,6,12,18,24,30,36,42,48,54,60,66,72,78,84,90,96,102,108,114,120,126,132,138,144,150,156,162,168,174,180,186,192,198,4,10,16,22,28,34,40,46,52,58,64,70,76,82,88,94,100,106,112,118,124,130,136,142,148,154,160,166,172,178,184,190,196,2,8,14,20,26,32,38,44,50,56,62,68,74,80,86,92,98,104,110,116,122,128,134,140,146,152,158,164,170,176,182,188,194,0 +0,7,14,21,28,35,42,49,56,63,70,77,84,91,98,105,112,119,126,133,140,147,154,161,168,175,182,189,196,3,10,17,24,31,38,45,52,59,66,73,80,87,94,101,108,115,122,129,136,143,150,157,164,171,178,185,192,199,6,13,20,27,34,41,48,55,62,69,76,83,90,97,104,111,118,125,132,139,146,153,160,167,174,181,188,195,2,9,16,23,30,37,44,51,58,65,72,79,86,93,100,107,114,121,128,135,142,149,156,163,170,177,184,191,198,5,12,19,26,33,40,47,54,61,68,75,82,89,96,103,110,117,124,131,138,145,152,159,166,173,180,187,194,1,8,15,22,29,36,43,50,57,64,71,78,85,92,99,106,113,120,127,134,141,148,155,162,169,176,183,190,197,4,11,18,25,32,39,46,53,60,67,74,81,88,95,102,109,116,123,130,137,144,151,158,165,172,179,186,193,0 +0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,128,136,144,152,160,168,176,184,192,0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,128,136,144,152,160,168,176,184,192,0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,128,136,144,152,160,168,176,184,192,0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,128,136,144,152,160,168,176,184,192,0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,128,136,144,152,160,168,176,184,192,0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,128,136,144,152,160,168,176,184,192,0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,128,136,144,152,160,168,176,184,192,0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,128,136,144,152,160,168,176,184,192,0 +0,9,18,27,36,45,54,63,72,81,90,99,108,117,126,135,144,153,162,171,180,189,198,7,16,25,34,43,52,61,70,79,88,97,106,115,124,133,142,151,160,169,178,187,196,5,14,23,32,41,50,59,68,77,86,95,104,113,122,131,140,149,158,167,176,185,194,3,12,21,30,39,48,57,66,75,84,93,102,111,120,129,138,147,156,165,174,183,192,1,10,19,28,37,46,55,64,73,82,91,100,109,118,127,136,145,154,163,172,181,190,199,8,17,26,35,44,53,62,71,80,89,98,107,116,125,134,143,152,161,170,179,188,197,6,15,24,33,42,51,60,69,78,87,96,105,114,123,132,141,150,159,168,177,186,195,4,13,22,31,40,49,58,67,76,85,94,103,112,121,130,139,148,157,166,175,184,193,2,11,20,29,38,47,56,65,74,83,92,101,110,119,128,137,146,155,164,173,182,191,0 +0,10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,0,10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,0,10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,0,10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,0,10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,0,10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,0,10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,0,10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,0,10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,0,10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,0 +0,11,22,33,44,55,66,77,88,99,110,121,132,143,154,165,176,187,198,9,20,31,42,53,64,75,86,97,108,119,130,141,152,163,174,185,196,7,18,29,40,51,62,73,84,95,106,117,128,139,150,161,172,183,194,5,16,27,38,49,60,71,82,93,104,115,126,137,148,159,170,181,192,3,14,25,36,47,58,69,80,91,102,113,124,135,146,157,168,179,190,1,12,23,34,45,56,67,78,89,100,111,122,133,144,155,166,177,188,199,10,21,32,43,54,65,76,87,98,109,120,131,142,153,164,175,186,197,8,19,30,41,52,63,74,85,96,107,118,129,140,151,162,173,184,195,6,17,28,39,50,61,72,83,94,105,116,127,138,149,160,171,182,193,4,15,26,37,48,59,70,81,92,103,114,125,136,147,158,169,180,191,2,13,24,35,46,57,68,79,90,101,112,123,134,145,156,167,178,189,0 +0,12,24,36,48,60,72,84,96,108,120,132,144,156,168,180,192,4,16,28,40,52,64,76,88,100,112,124,136,148,160,172,184,196,8,20,32,44,56,68,80,92,104,116,128,140,152,164,176,188,0,12,24,36,48,60,72,84,96,108,120,132,144,156,168,180,192,4,16,28,40,52,64,76,88,100,112,124,136,148,160,172,184,196,8,20,32,44,56,68,80,92,104,116,128,140,152,164,176,188,0,12,24,36,48,60,72,84,96,108,120,132,144,156,168,180,192,4,16,28,40,52,64,76,88,100,112,124,136,148,160,172,184,196,8,20,32,44,56,68,80,92,104,116,128,140,152,164,176,188,0,12,24,36,48,60,72,84,96,108,120,132,144,156,168,180,192,4,16,28,40,52,64,76,88,100,112,124,136,148,160,172,184,196,8,20,32,44,56,68,80,92,104,116,128,140,152,164,176,188,0 +0,13,26,39,52,65,78,91,104,117,130,143,156,169,182,195,8,21,34,47,60,73,86,99,112,125,138,151,164,177,190,3,16,29,42,55,68,81,94,107,120,133,146,159,172,185,198,11,24,37,50,63,76,89,102,115,128,141,154,167,180,193,6,19,32,45,58,71,84,97,110,123,136,149,162,175,188,1,14,27,40,53,66,79,92,105,118,131,144,157,170,183,196,9,22,35,48,61,74,87,100,113,126,139,152,165,178,191,4,17,30,43,56,69,82,95,108,121,134,147,160,173,186,199,12,25,38,51,64,77,90,103,116,129,142,155,168,181,194,7,20,33,46,59,72,85,98,111,124,137,150,163,176,189,2,15,28,41,54,67,80,93,106,119,132,145,158,171,184,197,10,23,36,49,62,75,88,101,114,127,140,153,166,179,192,5,18,31,44,57,70,83,96,109,122,135,148,161,174,187,0 +0,14,28,42,56,70,84,98,112,126,140,154,168,182,196,10,24,38,52,66,80,94,108,122,136,150,164,178,192,6,20,34,48,62,76,90,104,118,132,146,160,174,188,2,16,30,44,58,72,86,100,114,128,142,156,170,184,198,12,26,40,54,68,82,96,110,124,138,152,166,180,194,8,22,36,50,64,78,92,106,120,134,148,162,176,190,4,18,32,46,60,74,88,102,116,130,144,158,172,186,0,14,28,42,56,70,84,98,112,126,140,154,168,182,196,10,24,38,52,66,80,94,108,122,136,150,164,178,192,6,20,34,48,62,76,90,104,118,132,146,160,174,188,2,16,30,44,58,72,86,100,114,128,142,156,170,184,198,12,26,40,54,68,82,96,110,124,138,152,166,180,194,8,22,36,50,64,78,92,106,120,134,148,162,176,190,4,18,32,46,60,74,88,102,116,130,144,158,172,186,0 +0,15,30,45,60,75,90,105,120,135,150,165,180,195,10,25,40,55,70,85,100,115,130,145,160,175,190,5,20,35,50,65,80,95,110,125,140,155,170,185,0,15,30,45,60,75,90,105,120,135,150,165,180,195,10,25,40,55,70,85,100,115,130,145,160,175,190,5,20,35,50,65,80,95,110,125,140,155,170,185,0,15,30,45,60,75,90,105,120,135,150,165,180,195,10,25,40,55,70,85,100,115,130,145,160,175,190,5,20,35,50,65,80,95,110,125,140,155,170,185,0,15,30,45,60,75,90,105,120,135,150,165,180,195,10,25,40,55,70,85,100,115,130,145,160,175,190,5,20,35,50,65,80,95,110,125,140,155,170,185,0,15,30,45,60,75,90,105,120,135,150,165,180,195,10,25,40,55,70,85,100,115,130,145,160,175,190,5,20,35,50,65,80,95,110,125,140,155,170,185,0 +0,16,32,48,64,80,96,112,128,144,160,176,192,8,24,40,56,72,88,104,120,136,152,168,184,0,16,32,48,64,80,96,112,128,144,160,176,192,8,24,40,56,72,88,104,120,136,152,168,184,0,16,32,48,64,80,96,112,128,144,160,176,192,8,24,40,56,72,88,104,120,136,152,168,184,0,16,32,48,64,80,96,112,128,144,160,176,192,8,24,40,56,72,88,104,120,136,152,168,184,0,16,32,48,64,80,96,112,128,144,160,176,192,8,24,40,56,72,88,104,120,136,152,168,184,0,16,32,48,64,80,96,112,128,144,160,176,192,8,24,40,56,72,88,104,120,136,152,168,184,0,16,32,48,64,80,96,112,128,144,160,176,192,8,24,40,56,72,88,104,120,136,152,168,184,0,16,32,48,64,80,96,112,128,144,160,176,192,8,24,40,56,72,88,104,120,136,152,168,184,0 +0,17,34,51,68,85,102,119,136,153,170,187,4,21,38,55,72,89,106,123,140,157,174,191,8,25,42,59,76,93,110,127,144,161,178,195,12,29,46,63,80,97,114,131,148,165,182,199,16,33,50,67,84,101,118,135,152,169,186,3,20,37,54,71,88,105,122,139,156,173,190,7,24,41,58,75,92,109,126,143,160,177,194,11,28,45,62,79,96,113,130,147,164,181,198,15,32,49,66,83,100,117,134,151,168,185,2,19,36,53,70,87,104,121,138,155,172,189,6,23,40,57,74,91,108,125,142,159,176,193,10,27,44,61,78,95,112,129,146,163,180,197,14,31,48,65,82,99,116,133,150,167,184,1,18,35,52,69,86,103,120,137,154,171,188,5,22,39,56,73,90,107,124,141,158,175,192,9,26,43,60,77,94,111,128,145,162,179,196,13,30,47,64,81,98,115,132,149,166,183,0 +0,18,36,54,72,90,108,126,144,162,180,198,16,34,52,70,88,106,124,142,160,178,196,14,32,50,68,86,104,122,140,158,176,194,12,30,48,66,84,102,120,138,156,174,192,10,28,46,64,82,100,118,136,154,172,190,8,26,44,62,80,98,116,134,152,170,188,6,24,42,60,78,96,114,132,150,168,186,4,22,40,58,76,94,112,130,148,166,184,2,20,38,56,74,92,110,128,146,164,182,0,18,36,54,72,90,108,126,144,162,180,198,16,34,52,70,88,106,124,142,160,178,196,14,32,50,68,86,104,122,140,158,176,194,12,30,48,66,84,102,120,138,156,174,192,10,28,46,64,82,100,118,136,154,172,190,8,26,44,62,80,98,116,134,152,170,188,6,24,42,60,78,96,114,132,150,168,186,4,22,40,58,76,94,112,130,148,166,184,2,20,38,56,74,92,110,128,146,164,182,0 +0,19,38,57,76,95,114,133,152,171,190,9,28,47,66,85,104,123,142,161,180,199,18,37,56,75,94,113,132,151,170,189,8,27,46,65,84,103,122,141,160,179,198,17,36,55,74,93,112,131,150,169,188,7,26,45,64,83,102,121,140,159,178,197,16,35,54,73,92,111,130,149,168,187,6,25,44,63,82,101,120,139,158,177,196,15,34,53,72,91,110,129,148,167,186,5,24,43,62,81,100,119,138,157,176,195,14,33,52,71,90,109,128,147,166,185,4,23,42,61,80,99,118,137,156,175,194,13,32,51,70,89,108,127,146,165,184,3,22,41,60,79,98,117,136,155,174,193,12,31,50,69,88,107,126,145,164,183,2,21,40,59,78,97,116,135,154,173,192,11,30,49,68,87,106,125,144,163,182,1,20,39,58,77,96,115,134,153,172,191,10,29,48,67,86,105,124,143,162,181,0 +0,20,40,60,80,100,120,140,160,180,0,20,40,60,80,100,120,140,160,180,0,20,40,60,80,100,120,140,160,180,0,20,40,60,80,100,120,140,160,180,0,20,40,60,80,100,120,140,160,180,0,20,40,60,80,100,120,140,160,180,0,20,40,60,80,100,120,140,160,180,0,20,40,60,80,100,120,140,160,180,0,20,40,60,80,100,120,140,160,180,0,20,40,60,80,100,120,140,160,180,0,20,40,60,80,100,120,140,160,180,0,20,40,60,80,100,120,140,160,180,0,20,40,60,80,100,120,140,160,180,0,20,40,60,80,100,120,140,160,180,0,20,40,60,80,100,120,140,160,180,0,20,40,60,80,100,120,140,160,180,0,20,40,60,80,100,120,140,160,180,0,20,40,60,80,100,120,140,160,180,0,20,40,60,80,100,120,140,160,180,0,20,40,60,80,100,120,140,160,180,0 +0,21,42,63,84,105,126,147,168,189,10,31,52,73,94,115,136,157,178,199,20,41,62,83,104,125,146,167,188,9,30,51,72,93,114,135,156,177,198,19,40,61,82,103,124,145,166,187,8,29,50,71,92,113,134,155,176,197,18,39,60,81,102,123,144,165,186,7,28,49,70,91,112,133,154,175,196,17,38,59,80,101,122,143,164,185,6,27,48,69,90,111,132,153,174,195,16,37,58,79,100,121,142,163,184,5,26,47,68,89,110,131,152,173,194,15,36,57,78,99,120,141,162,183,4,25,46,67,88,109,130,151,172,193,14,35,56,77,98,119,140,161,182,3,24,45,66,87,108,129,150,171,192,13,34,55,76,97,118,139,160,181,2,23,44,65,86,107,128,149,170,191,12,33,54,75,96,117,138,159,180,1,22,43,64,85,106,127,148,169,190,11,32,53,74,95,116,137,158,179,0 +0,22,44,66,88,110,132,154,176,198,20,42,64,86,108,130,152,174,196,18,40,62,84,106,128,150,172,194,16,38,60,82,104,126,148,170,192,14,36,58,80,102,124,146,168,190,12,34,56,78,100,122,144,166,188,10,32,54,76,98,120,142,164,186,8,30,52,74,96,118,140,162,184,6,28,50,72,94,116,138,160,182,4,26,48,70,92,114,136,158,180,2,24,46,68,90,112,134,156,178,0,22,44,66,88,110,132,154,176,198,20,42,64,86,108,130,152,174,196,18,40,62,84,106,128,150,172,194,16,38,60,82,104,126,148,170,192,14,36,58,80,102,124,146,168,190,12,34,56,78,100,122,144,166,188,10,32,54,76,98,120,142,164,186,8,30,52,74,96,118,140,162,184,6,28,50,72,94,116,138,160,182,4,26,48,70,92,114,136,158,180,2,24,46,68,90,112,134,156,178,0 +0,23,46,69,92,115,138,161,184,7,30,53,76,99,122,145,168,191,14,37,60,83,106,129,152,175,198,21,44,67,90,113,136,159,182,5,28,51,74,97,120,143,166,189,12,35,58,81,104,127,150,173,196,19,42,65,88,111,134,157,180,3,26,49,72,95,118,141,164,187,10,33,56,79,102,125,148,171,194,17,40,63,86,109,132,155,178,1,24,47,70,93,116,139,162,185,8,31,54,77,100,123,146,169,192,15,38,61,84,107,130,153,176,199,22,45,68,91,114,137,160,183,6,29,52,75,98,121,144,167,190,13,36,59,82,105,128,151,174,197,20,43,66,89,112,135,158,181,4,27,50,73,96,119,142,165,188,11,34,57,80,103,126,149,172,195,18,41,64,87,110,133,156,179,2,25,48,71,94,117,140,163,186,9,32,55,78,101,124,147,170,193,16,39,62,85,108,131,154,177,0 +0,24,48,72,96,120,144,168,192,16,40,64,88,112,136,160,184,8,32,56,80,104,128,152,176,0,24,48,72,96,120,144,168,192,16,40,64,88,112,136,160,184,8,32,56,80,104,128,152,176,0,24,48,72,96,120,144,168,192,16,40,64,88,112,136,160,184,8,32,56,80,104,128,152,176,0,24,48,72,96,120,144,168,192,16,40,64,88,112,136,160,184,8,32,56,80,104,128,152,176,0,24,48,72,96,120,144,168,192,16,40,64,88,112,136,160,184,8,32,56,80,104,128,152,176,0,24,48,72,96,120,144,168,192,16,40,64,88,112,136,160,184,8,32,56,80,104,128,152,176,0,24,48,72,96,120,144,168,192,16,40,64,88,112,136,160,184,8,32,56,80,104,128,152,176,0,24,48,72,96,120,144,168,192,16,40,64,88,112,136,160,184,8,32,56,80,104,128,152,176,0 +0,25,50,75,100,125,150,175,0,25,50,75,100,125,150,175,0,25,50,75,100,125,150,175,0,25,50,75,100,125,150,175,0,25,50,75,100,125,150,175,0,25,50,75,100,125,150,175,0,25,50,75,100,125,150,175,0,25,50,75,100,125,150,175,0,25,50,75,100,125,150,175,0,25,50,75,100,125,150,175,0,25,50,75,100,125,150,175,0,25,50,75,100,125,150,175,0,25,50,75,100,125,150,175,0,25,50,75,100,125,150,175,0,25,50,75,100,125,150,175,0,25,50,75,100,125,150,175,0,25,50,75,100,125,150,175,0,25,50,75,100,125,150,175,0,25,50,75,100,125,150,175,0,25,50,75,100,125,150,175,0,25,50,75,100,125,150,175,0,25,50,75,100,125,150,175,0,25,50,75,100,125,150,175,0,25,50,75,100,125,150,175,0,25,50,75,100,125,150,175,0 +0,26,52,78,104,130,156,182,8,34,60,86,112,138,164,190,16,42,68,94,120,146,172,198,24,50,76,102,128,154,180,6,32,58,84,110,136,162,188,14,40,66,92,118,144,170,196,22,48,74,100,126,152,178,4,30,56,82,108,134,160,186,12,38,64,90,116,142,168,194,20,46,72,98,124,150,176,2,28,54,80,106,132,158,184,10,36,62,88,114,140,166,192,18,44,70,96,122,148,174,0,26,52,78,104,130,156,182,8,34,60,86,112,138,164,190,16,42,68,94,120,146,172,198,24,50,76,102,128,154,180,6,32,58,84,110,136,162,188,14,40,66,92,118,144,170,196,22,48,74,100,126,152,178,4,30,56,82,108,134,160,186,12,38,64,90,116,142,168,194,20,46,72,98,124,150,176,2,28,54,80,106,132,158,184,10,36,62,88,114,140,166,192,18,44,70,96,122,148,174,0 +0,27,54,81,108,135,162,189,16,43,70,97,124,151,178,5,32,59,86,113,140,167,194,21,48,75,102,129,156,183,10,37,64,91,118,145,172,199,26,53,80,107,134,161,188,15,42,69,96,123,150,177,4,31,58,85,112,139,166,193,20,47,74,101,128,155,182,9,36,63,90,117,144,171,198,25,52,79,106,133,160,187,14,41,68,95,122,149,176,3,30,57,84,111,138,165,192,19,46,73,100,127,154,181,8,35,62,89,116,143,170,197,24,51,78,105,132,159,186,13,40,67,94,121,148,175,2,29,56,83,110,137,164,191,18,45,72,99,126,153,180,7,34,61,88,115,142,169,196,23,50,77,104,131,158,185,12,39,66,93,120,147,174,1,28,55,82,109,136,163,190,17,44,71,98,125,152,179,6,33,60,87,114,141,168,195,22,49,76,103,130,157,184,11,38,65,92,119,146,173,0 +0,28,56,84,112,140,168,196,24,52,80,108,136,164,192,20,48,76,104,132,160,188,16,44,72,100,128,156,184,12,40,68,96,124,152,180,8,36,64,92,120,148,176,4,32,60,88,116,144,172,0,28,56,84,112,140,168,196,24,52,80,108,136,164,192,20,48,76,104,132,160,188,16,44,72,100,128,156,184,12,40,68,96,124,152,180,8,36,64,92,120,148,176,4,32,60,88,116,144,172,0,28,56,84,112,140,168,196,24,52,80,108,136,164,192,20,48,76,104,132,160,188,16,44,72,100,128,156,184,12,40,68,96,124,152,180,8,36,64,92,120,148,176,4,32,60,88,116,144,172,0,28,56,84,112,140,168,196,24,52,80,108,136,164,192,20,48,76,104,132,160,188,16,44,72,100,128,156,184,12,40,68,96,124,152,180,8,36,64,92,120,148,176,4,32,60,88,116,144,172,0 +0,29,58,87,116,145,174,3,32,61,90,119,148,177,6,35,64,93,122,151,180,9,38,67,96,125,154,183,12,41,70,99,128,157,186,15,44,73,102,131,160,189,18,47,76,105,134,163,192,21,50,79,108,137,166,195,24,53,82,111,140,169,198,27,56,85,114,143,172,1,30,59,88,117,146,175,4,33,62,91,120,149,178,7,36,65,94,123,152,181,10,39,68,97,126,155,184,13,42,71,100,129,158,187,16,45,74,103,132,161,190,19,48,77,106,135,164,193,22,51,80,109,138,167,196,25,54,83,112,141,170,199,28,57,86,115,144,173,2,31,60,89,118,147,176,5,34,63,92,121,150,179,8,37,66,95,124,153,182,11,40,69,98,127,156,185,14,43,72,101,130,159,188,17,46,75,104,133,162,191,20,49,78,107,136,165,194,23,52,81,110,139,168,197,26,55,84,113,142,171,0 +0,30,60,90,120,150,180,10,40,70,100,130,160,190,20,50,80,110,140,170,0,30,60,90,120,150,180,10,40,70,100,130,160,190,20,50,80,110,140,170,0,30,60,90,120,150,180,10,40,70,100,130,160,190,20,50,80,110,140,170,0,30,60,90,120,150,180,10,40,70,100,130,160,190,20,50,80,110,140,170,0,30,60,90,120,150,180,10,40,70,100,130,160,190,20,50,80,110,140,170,0,30,60,90,120,150,180,10,40,70,100,130,160,190,20,50,80,110,140,170,0,30,60,90,120,150,180,10,40,70,100,130,160,190,20,50,80,110,140,170,0,30,60,90,120,150,180,10,40,70,100,130,160,190,20,50,80,110,140,170,0,30,60,90,120,150,180,10,40,70,100,130,160,190,20,50,80,110,140,170,0,30,60,90,120,150,180,10,40,70,100,130,160,190,20,50,80,110,140,170,0 +0,31,62,93,124,155,186,17,48,79,110,141,172,3,34,65,96,127,158,189,20,51,82,113,144,175,6,37,68,99,130,161,192,23,54,85,116,147,178,9,40,71,102,133,164,195,26,57,88,119,150,181,12,43,74,105,136,167,198,29,60,91,122,153,184,15,46,77,108,139,170,1,32,63,94,125,156,187,18,49,80,111,142,173,4,35,66,97,128,159,190,21,52,83,114,145,176,7,38,69,100,131,162,193,24,55,86,117,148,179,10,41,72,103,134,165,196,27,58,89,120,151,182,13,44,75,106,137,168,199,30,61,92,123,154,185,16,47,78,109,140,171,2,33,64,95,126,157,188,19,50,81,112,143,174,5,36,67,98,129,160,191,22,53,84,115,146,177,8,39,70,101,132,163,194,25,56,87,118,149,180,11,42,73,104,135,166,197,28,59,90,121,152,183,14,45,76,107,138,169,0 +0,32,64,96,128,160,192,24,56,88,120,152,184,16,48,80,112,144,176,8,40,72,104,136,168,0,32,64,96,128,160,192,24,56,88,120,152,184,16,48,80,112,144,176,8,40,72,104,136,168,0,32,64,96,128,160,192,24,56,88,120,152,184,16,48,80,112,144,176,8,40,72,104,136,168,0,32,64,96,128,160,192,24,56,88,120,152,184,16,48,80,112,144,176,8,40,72,104,136,168,0,32,64,96,128,160,192,24,56,88,120,152,184,16,48,80,112,144,176,8,40,72,104,136,168,0,32,64,96,128,160,192,24,56,88,120,152,184,16,48,80,112,144,176,8,40,72,104,136,168,0,32,64,96,128,160,192,24,56,88,120,152,184,16,48,80,112,144,176,8,40,72,104,136,168,0,32,64,96,128,160,192,24,56,88,120,152,184,16,48,80,112,144,176,8,40,72,104,136,168,0 +0,33,66,99,132,165,198,31,64,97,130,163,196,29,62,95,128,161,194,27,60,93,126,159,192,25,58,91,124,157,190,23,56,89,122,155,188,21,54,87,120,153,186,19,52,85,118,151,184,17,50,83,116,149,182,15,48,81,114,147,180,13,46,79,112,145,178,11,44,77,110,143,176,9,42,75,108,141,174,7,40,73,106,139,172,5,38,71,104,137,170,3,36,69,102,135,168,1,34,67,100,133,166,199,32,65,98,131,164,197,30,63,96,129,162,195,28,61,94,127,160,193,26,59,92,125,158,191,24,57,90,123,156,189,22,55,88,121,154,187,20,53,86,119,152,185,18,51,84,117,150,183,16,49,82,115,148,181,14,47,80,113,146,179,12,45,78,111,144,177,10,43,76,109,142,175,8,41,74,107,140,173,6,39,72,105,138,171,4,37,70,103,136,169,2,35,68,101,134,167,0 +0,34,68,102,136,170,4,38,72,106,140,174,8,42,76,110,144,178,12,46,80,114,148,182,16,50,84,118,152,186,20,54,88,122,156,190,24,58,92,126,160,194,28,62,96,130,164,198,32,66,100,134,168,2,36,70,104,138,172,6,40,74,108,142,176,10,44,78,112,146,180,14,48,82,116,150,184,18,52,86,120,154,188,22,56,90,124,158,192,26,60,94,128,162,196,30,64,98,132,166,0,34,68,102,136,170,4,38,72,106,140,174,8,42,76,110,144,178,12,46,80,114,148,182,16,50,84,118,152,186,20,54,88,122,156,190,24,58,92,126,160,194,28,62,96,130,164,198,32,66,100,134,168,2,36,70,104,138,172,6,40,74,108,142,176,10,44,78,112,146,180,14,48,82,116,150,184,18,52,86,120,154,188,22,56,90,124,158,192,26,60,94,128,162,196,30,64,98,132,166,0 +0,35,70,105,140,175,10,45,80,115,150,185,20,55,90,125,160,195,30,65,100,135,170,5,40,75,110,145,180,15,50,85,120,155,190,25,60,95,130,165,0,35,70,105,140,175,10,45,80,115,150,185,20,55,90,125,160,195,30,65,100,135,170,5,40,75,110,145,180,15,50,85,120,155,190,25,60,95,130,165,0,35,70,105,140,175,10,45,80,115,150,185,20,55,90,125,160,195,30,65,100,135,170,5,40,75,110,145,180,15,50,85,120,155,190,25,60,95,130,165,0,35,70,105,140,175,10,45,80,115,150,185,20,55,90,125,160,195,30,65,100,135,170,5,40,75,110,145,180,15,50,85,120,155,190,25,60,95,130,165,0,35,70,105,140,175,10,45,80,115,150,185,20,55,90,125,160,195,30,65,100,135,170,5,40,75,110,145,180,15,50,85,120,155,190,25,60,95,130,165,0 +0,36,72,108,144,180,16,52,88,124,160,196,32,68,104,140,176,12,48,84,120,156,192,28,64,100,136,172,8,44,80,116,152,188,24,60,96,132,168,4,40,76,112,148,184,20,56,92,128,164,0,36,72,108,144,180,16,52,88,124,160,196,32,68,104,140,176,12,48,84,120,156,192,28,64,100,136,172,8,44,80,116,152,188,24,60,96,132,168,4,40,76,112,148,184,20,56,92,128,164,0,36,72,108,144,180,16,52,88,124,160,196,32,68,104,140,176,12,48,84,120,156,192,28,64,100,136,172,8,44,80,116,152,188,24,60,96,132,168,4,40,76,112,148,184,20,56,92,128,164,0,36,72,108,144,180,16,52,88,124,160,196,32,68,104,140,176,12,48,84,120,156,192,28,64,100,136,172,8,44,80,116,152,188,24,60,96,132,168,4,40,76,112,148,184,20,56,92,128,164,0 +0,37,74,111,148,185,22,59,96,133,170,7,44,81,118,155,192,29,66,103,140,177,14,51,88,125,162,199,36,73,110,147,184,21,58,95,132,169,6,43,80,117,154,191,28,65,102,139,176,13,50,87,124,161,198,35,72,109,146,183,20,57,94,131,168,5,42,79,116,153,190,27,64,101,138,175,12,49,86,123,160,197,34,71,108,145,182,19,56,93,130,167,4,41,78,115,152,189,26,63,100,137,174,11,48,85,122,159,196,33,70,107,144,181,18,55,92,129,166,3,40,77,114,151,188,25,62,99,136,173,10,47,84,121,158,195,32,69,106,143,180,17,54,91,128,165,2,39,76,113,150,187,24,61,98,135,172,9,46,83,120,157,194,31,68,105,142,179,16,53,90,127,164,1,38,75,112,149,186,23,60,97,134,171,8,45,82,119,156,193,30,67,104,141,178,15,52,89,126,163,0 +0,38,76,114,152,190,28,66,104,142,180,18,56,94,132,170,8,46,84,122,160,198,36,74,112,150,188,26,64,102,140,178,16,54,92,130,168,6,44,82,120,158,196,34,72,110,148,186,24,62,100,138,176,14,52,90,128,166,4,42,80,118,156,194,32,70,108,146,184,22,60,98,136,174,12,50,88,126,164,2,40,78,116,154,192,30,68,106,144,182,20,58,96,134,172,10,48,86,124,162,0,38,76,114,152,190,28,66,104,142,180,18,56,94,132,170,8,46,84,122,160,198,36,74,112,150,188,26,64,102,140,178,16,54,92,130,168,6,44,82,120,158,196,34,72,110,148,186,24,62,100,138,176,14,52,90,128,166,4,42,80,118,156,194,32,70,108,146,184,22,60,98,136,174,12,50,88,126,164,2,40,78,116,154,192,30,68,106,144,182,20,58,96,134,172,10,48,86,124,162,0 +0,39,78,117,156,195,34,73,112,151,190,29,68,107,146,185,24,63,102,141,180,19,58,97,136,175,14,53,92,131,170,9,48,87,126,165,4,43,82,121,160,199,38,77,116,155,194,33,72,111,150,189,28,67,106,145,184,23,62,101,140,179,18,57,96,135,174,13,52,91,130,169,8,47,86,125,164,3,42,81,120,159,198,37,76,115,154,193,32,71,110,149,188,27,66,105,144,183,22,61,100,139,178,17,56,95,134,173,12,51,90,129,168,7,46,85,124,163,2,41,80,119,158,197,36,75,114,153,192,31,70,109,148,187,26,65,104,143,182,21,60,99,138,177,16,55,94,133,172,11,50,89,128,167,6,45,84,123,162,1,40,79,118,157,196,35,74,113,152,191,30,69,108,147,186,25,64,103,142,181,20,59,98,137,176,15,54,93,132,171,10,49,88,127,166,5,44,83,122,161,0 +0,40,80,120,160,0,40,80,120,160,0,40,80,120,160,0,40,80,120,160,0,40,80,120,160,0,40,80,120,160,0,40,80,120,160,0,40,80,120,160,0,40,80,120,160,0,40,80,120,160,0,40,80,120,160,0,40,80,120,160,0,40,80,120,160,0,40,80,120,160,0,40,80,120,160,0,40,80,120,160,0,40,80,120,160,0,40,80,120,160,0,40,80,120,160,0,40,80,120,160,0,40,80,120,160,0,40,80,120,160,0,40,80,120,160,0,40,80,120,160,0,40,80,120,160,0,40,80,120,160,0,40,80,120,160,0,40,80,120,160,0,40,80,120,160,0,40,80,120,160,0,40,80,120,160,0,40,80,120,160,0,40,80,120,160,0,40,80,120,160,0,40,80,120,160,0,40,80,120,160,0,40,80,120,160,0,40,80,120,160,0,40,80,120,160,0,40,80,120,160,0 +0,41,82,123,164,5,46,87,128,169,10,51,92,133,174,15,56,97,138,179,20,61,102,143,184,25,66,107,148,189,30,71,112,153,194,35,76,117,158,199,40,81,122,163,4,45,86,127,168,9,50,91,132,173,14,55,96,137,178,19,60,101,142,183,24,65,106,147,188,29,70,111,152,193,34,75,116,157,198,39,80,121,162,3,44,85,126,167,8,49,90,131,172,13,54,95,136,177,18,59,100,141,182,23,64,105,146,187,28,69,110,151,192,33,74,115,156,197,38,79,120,161,2,43,84,125,166,7,48,89,130,171,12,53,94,135,176,17,58,99,140,181,22,63,104,145,186,27,68,109,150,191,32,73,114,155,196,37,78,119,160,1,42,83,124,165,6,47,88,129,170,11,52,93,134,175,16,57,98,139,180,21,62,103,144,185,26,67,108,149,190,31,72,113,154,195,36,77,118,159,0 +0,42,84,126,168,10,52,94,136,178,20,62,104,146,188,30,72,114,156,198,40,82,124,166,8,50,92,134,176,18,60,102,144,186,28,70,112,154,196,38,80,122,164,6,48,90,132,174,16,58,100,142,184,26,68,110,152,194,36,78,120,162,4,46,88,130,172,14,56,98,140,182,24,66,108,150,192,34,76,118,160,2,44,86,128,170,12,54,96,138,180,22,64,106,148,190,32,74,116,158,0,42,84,126,168,10,52,94,136,178,20,62,104,146,188,30,72,114,156,198,40,82,124,166,8,50,92,134,176,18,60,102,144,186,28,70,112,154,196,38,80,122,164,6,48,90,132,174,16,58,100,142,184,26,68,110,152,194,36,78,120,162,4,46,88,130,172,14,56,98,140,182,24,66,108,150,192,34,76,118,160,2,44,86,128,170,12,54,96,138,180,22,64,106,148,190,32,74,116,158,0 +0,43,86,129,172,15,58,101,144,187,30,73,116,159,2,45,88,131,174,17,60,103,146,189,32,75,118,161,4,47,90,133,176,19,62,105,148,191,34,77,120,163,6,49,92,135,178,21,64,107,150,193,36,79,122,165,8,51,94,137,180,23,66,109,152,195,38,81,124,167,10,53,96,139,182,25,68,111,154,197,40,83,126,169,12,55,98,141,184,27,70,113,156,199,42,85,128,171,14,57,100,143,186,29,72,115,158,1,44,87,130,173,16,59,102,145,188,31,74,117,160,3,46,89,132,175,18,61,104,147,190,33,76,119,162,5,48,91,134,177,20,63,106,149,192,35,78,121,164,7,50,93,136,179,22,65,108,151,194,37,80,123,166,9,52,95,138,181,24,67,110,153,196,39,82,125,168,11,54,97,140,183,26,69,112,155,198,41,84,127,170,13,56,99,142,185,28,71,114,157,0 +0,44,88,132,176,20,64,108,152,196,40,84,128,172,16,60,104,148,192,36,80,124,168,12,56,100,144,188,32,76,120,164,8,52,96,140,184,28,72,116,160,4,48,92,136,180,24,68,112,156,0,44,88,132,176,20,64,108,152,196,40,84,128,172,16,60,104,148,192,36,80,124,168,12,56,100,144,188,32,76,120,164,8,52,96,140,184,28,72,116,160,4,48,92,136,180,24,68,112,156,0,44,88,132,176,20,64,108,152,196,40,84,128,172,16,60,104,148,192,36,80,124,168,12,56,100,144,188,32,76,120,164,8,52,96,140,184,28,72,116,160,4,48,92,136,180,24,68,112,156,0,44,88,132,176,20,64,108,152,196,40,84,128,172,16,60,104,148,192,36,80,124,168,12,56,100,144,188,32,76,120,164,8,52,96,140,184,28,72,116,160,4,48,92,136,180,24,68,112,156,0 +0,45,90,135,180,25,70,115,160,5,50,95,140,185,30,75,120,165,10,55,100,145,190,35,80,125,170,15,60,105,150,195,40,85,130,175,20,65,110,155,0,45,90,135,180,25,70,115,160,5,50,95,140,185,30,75,120,165,10,55,100,145,190,35,80,125,170,15,60,105,150,195,40,85,130,175,20,65,110,155,0,45,90,135,180,25,70,115,160,5,50,95,140,185,30,75,120,165,10,55,100,145,190,35,80,125,170,15,60,105,150,195,40,85,130,175,20,65,110,155,0,45,90,135,180,25,70,115,160,5,50,95,140,185,30,75,120,165,10,55,100,145,190,35,80,125,170,15,60,105,150,195,40,85,130,175,20,65,110,155,0,45,90,135,180,25,70,115,160,5,50,95,140,185,30,75,120,165,10,55,100,145,190,35,80,125,170,15,60,105,150,195,40,85,130,175,20,65,110,155,0 +0,46,92,138,184,30,76,122,168,14,60,106,152,198,44,90,136,182,28,74,120,166,12,58,104,150,196,42,88,134,180,26,72,118,164,10,56,102,148,194,40,86,132,178,24,70,116,162,8,54,100,146,192,38,84,130,176,22,68,114,160,6,52,98,144,190,36,82,128,174,20,66,112,158,4,50,96,142,188,34,80,126,172,18,64,110,156,2,48,94,140,186,32,78,124,170,16,62,108,154,0,46,92,138,184,30,76,122,168,14,60,106,152,198,44,90,136,182,28,74,120,166,12,58,104,150,196,42,88,134,180,26,72,118,164,10,56,102,148,194,40,86,132,178,24,70,116,162,8,54,100,146,192,38,84,130,176,22,68,114,160,6,52,98,144,190,36,82,128,174,20,66,112,158,4,50,96,142,188,34,80,126,172,18,64,110,156,2,48,94,140,186,32,78,124,170,16,62,108,154,0 +0,47,94,141,188,35,82,129,176,23,70,117,164,11,58,105,152,199,46,93,140,187,34,81,128,175,22,69,116,163,10,57,104,151,198,45,92,139,186,33,80,127,174,21,68,115,162,9,56,103,150,197,44,91,138,185,32,79,126,173,20,67,114,161,8,55,102,149,196,43,90,137,184,31,78,125,172,19,66,113,160,7,54,101,148,195,42,89,136,183,30,77,124,171,18,65,112,159,6,53,100,147,194,41,88,135,182,29,76,123,170,17,64,111,158,5,52,99,146,193,40,87,134,181,28,75,122,169,16,63,110,157,4,51,98,145,192,39,86,133,180,27,74,121,168,15,62,109,156,3,50,97,144,191,38,85,132,179,26,73,120,167,14,61,108,155,2,49,96,143,190,37,84,131,178,25,72,119,166,13,60,107,154,1,48,95,142,189,36,83,130,177,24,71,118,165,12,59,106,153,0 +0,48,96,144,192,40,88,136,184,32,80,128,176,24,72,120,168,16,64,112,160,8,56,104,152,0,48,96,144,192,40,88,136,184,32,80,128,176,24,72,120,168,16,64,112,160,8,56,104,152,0,48,96,144,192,40,88,136,184,32,80,128,176,24,72,120,168,16,64,112,160,8,56,104,152,0,48,96,144,192,40,88,136,184,32,80,128,176,24,72,120,168,16,64,112,160,8,56,104,152,0,48,96,144,192,40,88,136,184,32,80,128,176,24,72,120,168,16,64,112,160,8,56,104,152,0,48,96,144,192,40,88,136,184,32,80,128,176,24,72,120,168,16,64,112,160,8,56,104,152,0,48,96,144,192,40,88,136,184,32,80,128,176,24,72,120,168,16,64,112,160,8,56,104,152,0,48,96,144,192,40,88,136,184,32,80,128,176,24,72,120,168,16,64,112,160,8,56,104,152,0 +0,49,98,147,196,45,94,143,192,41,90,139,188,37,86,135,184,33,82,131,180,29,78,127,176,25,74,123,172,21,70,119,168,17,66,115,164,13,62,111,160,9,58,107,156,5,54,103,152,1,50,99,148,197,46,95,144,193,42,91,140,189,38,87,136,185,34,83,132,181,30,79,128,177,26,75,124,173,22,71,120,169,18,67,116,165,14,63,112,161,10,59,108,157,6,55,104,153,2,51,100,149,198,47,96,145,194,43,92,141,190,39,88,137,186,35,84,133,182,31,80,129,178,27,76,125,174,23,72,121,170,19,68,117,166,15,64,113,162,11,60,109,158,7,56,105,154,3,52,101,150,199,48,97,146,195,44,93,142,191,40,89,138,187,36,85,134,183,32,81,130,179,28,77,126,175,24,73,122,171,20,69,118,167,16,65,114,163,12,61,110,159,8,57,106,155,4,53,102,151,0 +0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0,50,100,150,0 +0,51,102,153,4,55,106,157,8,59,110,161,12,63,114,165,16,67,118,169,20,71,122,173,24,75,126,177,28,79,130,181,32,83,134,185,36,87,138,189,40,91,142,193,44,95,146,197,48,99,150,1,52,103,154,5,56,107,158,9,60,111,162,13,64,115,166,17,68,119,170,21,72,123,174,25,76,127,178,29,80,131,182,33,84,135,186,37,88,139,190,41,92,143,194,45,96,147,198,49,100,151,2,53,104,155,6,57,108,159,10,61,112,163,14,65,116,167,18,69,120,171,22,73,124,175,26,77,128,179,30,81,132,183,34,85,136,187,38,89,140,191,42,93,144,195,46,97,148,199,50,101,152,3,54,105,156,7,58,109,160,11,62,113,164,15,66,117,168,19,70,121,172,23,74,125,176,27,78,129,180,31,82,133,184,35,86,137,188,39,90,141,192,43,94,145,196,47,98,149,0 +0,52,104,156,8,60,112,164,16,68,120,172,24,76,128,180,32,84,136,188,40,92,144,196,48,100,152,4,56,108,160,12,64,116,168,20,72,124,176,28,80,132,184,36,88,140,192,44,96,148,0,52,104,156,8,60,112,164,16,68,120,172,24,76,128,180,32,84,136,188,40,92,144,196,48,100,152,4,56,108,160,12,64,116,168,20,72,124,176,28,80,132,184,36,88,140,192,44,96,148,0,52,104,156,8,60,112,164,16,68,120,172,24,76,128,180,32,84,136,188,40,92,144,196,48,100,152,4,56,108,160,12,64,116,168,20,72,124,176,28,80,132,184,36,88,140,192,44,96,148,0,52,104,156,8,60,112,164,16,68,120,172,24,76,128,180,32,84,136,188,40,92,144,196,48,100,152,4,56,108,160,12,64,116,168,20,72,124,176,28,80,132,184,36,88,140,192,44,96,148,0 +0,53,106,159,12,65,118,171,24,77,130,183,36,89,142,195,48,101,154,7,60,113,166,19,72,125,178,31,84,137,190,43,96,149,2,55,108,161,14,67,120,173,26,79,132,185,38,91,144,197,50,103,156,9,62,115,168,21,74,127,180,33,86,139,192,45,98,151,4,57,110,163,16,69,122,175,28,81,134,187,40,93,146,199,52,105,158,11,64,117,170,23,76,129,182,35,88,141,194,47,100,153,6,59,112,165,18,71,124,177,30,83,136,189,42,95,148,1,54,107,160,13,66,119,172,25,78,131,184,37,90,143,196,49,102,155,8,61,114,167,20,73,126,179,32,85,138,191,44,97,150,3,56,109,162,15,68,121,174,27,80,133,186,39,92,145,198,51,104,157,10,63,116,169,22,75,128,181,34,87,140,193,46,99,152,5,58,111,164,17,70,123,176,29,82,135,188,41,94,147,0 +0,54,108,162,16,70,124,178,32,86,140,194,48,102,156,10,64,118,172,26,80,134,188,42,96,150,4,58,112,166,20,74,128,182,36,90,144,198,52,106,160,14,68,122,176,30,84,138,192,46,100,154,8,62,116,170,24,78,132,186,40,94,148,2,56,110,164,18,72,126,180,34,88,142,196,50,104,158,12,66,120,174,28,82,136,190,44,98,152,6,60,114,168,22,76,130,184,38,92,146,0,54,108,162,16,70,124,178,32,86,140,194,48,102,156,10,64,118,172,26,80,134,188,42,96,150,4,58,112,166,20,74,128,182,36,90,144,198,52,106,160,14,68,122,176,30,84,138,192,46,100,154,8,62,116,170,24,78,132,186,40,94,148,2,56,110,164,18,72,126,180,34,88,142,196,50,104,158,12,66,120,174,28,82,136,190,44,98,152,6,60,114,168,22,76,130,184,38,92,146,0 +0,55,110,165,20,75,130,185,40,95,150,5,60,115,170,25,80,135,190,45,100,155,10,65,120,175,30,85,140,195,50,105,160,15,70,125,180,35,90,145,0,55,110,165,20,75,130,185,40,95,150,5,60,115,170,25,80,135,190,45,100,155,10,65,120,175,30,85,140,195,50,105,160,15,70,125,180,35,90,145,0,55,110,165,20,75,130,185,40,95,150,5,60,115,170,25,80,135,190,45,100,155,10,65,120,175,30,85,140,195,50,105,160,15,70,125,180,35,90,145,0,55,110,165,20,75,130,185,40,95,150,5,60,115,170,25,80,135,190,45,100,155,10,65,120,175,30,85,140,195,50,105,160,15,70,125,180,35,90,145,0,55,110,165,20,75,130,185,40,95,150,5,60,115,170,25,80,135,190,45,100,155,10,65,120,175,30,85,140,195,50,105,160,15,70,125,180,35,90,145,0 +0,56,112,168,24,80,136,192,48,104,160,16,72,128,184,40,96,152,8,64,120,176,32,88,144,0,56,112,168,24,80,136,192,48,104,160,16,72,128,184,40,96,152,8,64,120,176,32,88,144,0,56,112,168,24,80,136,192,48,104,160,16,72,128,184,40,96,152,8,64,120,176,32,88,144,0,56,112,168,24,80,136,192,48,104,160,16,72,128,184,40,96,152,8,64,120,176,32,88,144,0,56,112,168,24,80,136,192,48,104,160,16,72,128,184,40,96,152,8,64,120,176,32,88,144,0,56,112,168,24,80,136,192,48,104,160,16,72,128,184,40,96,152,8,64,120,176,32,88,144,0,56,112,168,24,80,136,192,48,104,160,16,72,128,184,40,96,152,8,64,120,176,32,88,144,0,56,112,168,24,80,136,192,48,104,160,16,72,128,184,40,96,152,8,64,120,176,32,88,144,0 +0,57,114,171,28,85,142,199,56,113,170,27,84,141,198,55,112,169,26,83,140,197,54,111,168,25,82,139,196,53,110,167,24,81,138,195,52,109,166,23,80,137,194,51,108,165,22,79,136,193,50,107,164,21,78,135,192,49,106,163,20,77,134,191,48,105,162,19,76,133,190,47,104,161,18,75,132,189,46,103,160,17,74,131,188,45,102,159,16,73,130,187,44,101,158,15,72,129,186,43,100,157,14,71,128,185,42,99,156,13,70,127,184,41,98,155,12,69,126,183,40,97,154,11,68,125,182,39,96,153,10,67,124,181,38,95,152,9,66,123,180,37,94,151,8,65,122,179,36,93,150,7,64,121,178,35,92,149,6,63,120,177,34,91,148,5,62,119,176,33,90,147,4,61,118,175,32,89,146,3,60,117,174,31,88,145,2,59,116,173,30,87,144,1,58,115,172,29,86,143,0 +0,58,116,174,32,90,148,6,64,122,180,38,96,154,12,70,128,186,44,102,160,18,76,134,192,50,108,166,24,82,140,198,56,114,172,30,88,146,4,62,120,178,36,94,152,10,68,126,184,42,100,158,16,74,132,190,48,106,164,22,80,138,196,54,112,170,28,86,144,2,60,118,176,34,92,150,8,66,124,182,40,98,156,14,72,130,188,46,104,162,20,78,136,194,52,110,168,26,84,142,0,58,116,174,32,90,148,6,64,122,180,38,96,154,12,70,128,186,44,102,160,18,76,134,192,50,108,166,24,82,140,198,56,114,172,30,88,146,4,62,120,178,36,94,152,10,68,126,184,42,100,158,16,74,132,190,48,106,164,22,80,138,196,54,112,170,28,86,144,2,60,118,176,34,92,150,8,66,124,182,40,98,156,14,72,130,188,46,104,162,20,78,136,194,52,110,168,26,84,142,0 +0,59,118,177,36,95,154,13,72,131,190,49,108,167,26,85,144,3,62,121,180,39,98,157,16,75,134,193,52,111,170,29,88,147,6,65,124,183,42,101,160,19,78,137,196,55,114,173,32,91,150,9,68,127,186,45,104,163,22,81,140,199,58,117,176,35,94,153,12,71,130,189,48,107,166,25,84,143,2,61,120,179,38,97,156,15,74,133,192,51,110,169,28,87,146,5,64,123,182,41,100,159,18,77,136,195,54,113,172,31,90,149,8,67,126,185,44,103,162,21,80,139,198,57,116,175,34,93,152,11,70,129,188,47,106,165,24,83,142,1,60,119,178,37,96,155,14,73,132,191,50,109,168,27,86,145,4,63,122,181,40,99,158,17,76,135,194,53,112,171,30,89,148,7,66,125,184,43,102,161,20,79,138,197,56,115,174,33,92,151,10,69,128,187,46,105,164,23,82,141,0 +0,60,120,180,40,100,160,20,80,140,0,60,120,180,40,100,160,20,80,140,0,60,120,180,40,100,160,20,80,140,0,60,120,180,40,100,160,20,80,140,0,60,120,180,40,100,160,20,80,140,0,60,120,180,40,100,160,20,80,140,0,60,120,180,40,100,160,20,80,140,0,60,120,180,40,100,160,20,80,140,0,60,120,180,40,100,160,20,80,140,0,60,120,180,40,100,160,20,80,140,0,60,120,180,40,100,160,20,80,140,0,60,120,180,40,100,160,20,80,140,0,60,120,180,40,100,160,20,80,140,0,60,120,180,40,100,160,20,80,140,0,60,120,180,40,100,160,20,80,140,0,60,120,180,40,100,160,20,80,140,0,60,120,180,40,100,160,20,80,140,0,60,120,180,40,100,160,20,80,140,0,60,120,180,40,100,160,20,80,140,0,60,120,180,40,100,160,20,80,140,0 +0,61,122,183,44,105,166,27,88,149,10,71,132,193,54,115,176,37,98,159,20,81,142,3,64,125,186,47,108,169,30,91,152,13,74,135,196,57,118,179,40,101,162,23,84,145,6,67,128,189,50,111,172,33,94,155,16,77,138,199,60,121,182,43,104,165,26,87,148,9,70,131,192,53,114,175,36,97,158,19,80,141,2,63,124,185,46,107,168,29,90,151,12,73,134,195,56,117,178,39,100,161,22,83,144,5,66,127,188,49,110,171,32,93,154,15,76,137,198,59,120,181,42,103,164,25,86,147,8,69,130,191,52,113,174,35,96,157,18,79,140,1,62,123,184,45,106,167,28,89,150,11,72,133,194,55,116,177,38,99,160,21,82,143,4,65,126,187,48,109,170,31,92,153,14,75,136,197,58,119,180,41,102,163,24,85,146,7,68,129,190,51,112,173,34,95,156,17,78,139,0 +0,62,124,186,48,110,172,34,96,158,20,82,144,6,68,130,192,54,116,178,40,102,164,26,88,150,12,74,136,198,60,122,184,46,108,170,32,94,156,18,80,142,4,66,128,190,52,114,176,38,100,162,24,86,148,10,72,134,196,58,120,182,44,106,168,30,92,154,16,78,140,2,64,126,188,50,112,174,36,98,160,22,84,146,8,70,132,194,56,118,180,42,104,166,28,90,152,14,76,138,0,62,124,186,48,110,172,34,96,158,20,82,144,6,68,130,192,54,116,178,40,102,164,26,88,150,12,74,136,198,60,122,184,46,108,170,32,94,156,18,80,142,4,66,128,190,52,114,176,38,100,162,24,86,148,10,72,134,196,58,120,182,44,106,168,30,92,154,16,78,140,2,64,126,188,50,112,174,36,98,160,22,84,146,8,70,132,194,56,118,180,42,104,166,28,90,152,14,76,138,0 +0,63,126,189,52,115,178,41,104,167,30,93,156,19,82,145,8,71,134,197,60,123,186,49,112,175,38,101,164,27,90,153,16,79,142,5,68,131,194,57,120,183,46,109,172,35,98,161,24,87,150,13,76,139,2,65,128,191,54,117,180,43,106,169,32,95,158,21,84,147,10,73,136,199,62,125,188,51,114,177,40,103,166,29,92,155,18,81,144,7,70,133,196,59,122,185,48,111,174,37,100,163,26,89,152,15,78,141,4,67,130,193,56,119,182,45,108,171,34,97,160,23,86,149,12,75,138,1,64,127,190,53,116,179,42,105,168,31,94,157,20,83,146,9,72,135,198,61,124,187,50,113,176,39,102,165,28,91,154,17,80,143,6,69,132,195,58,121,184,47,110,173,36,99,162,25,88,151,14,77,140,3,66,129,192,55,118,181,44,107,170,33,96,159,22,85,148,11,74,137,0 +0,64,128,192,56,120,184,48,112,176,40,104,168,32,96,160,24,88,152,16,80,144,8,72,136,0,64,128,192,56,120,184,48,112,176,40,104,168,32,96,160,24,88,152,16,80,144,8,72,136,0,64,128,192,56,120,184,48,112,176,40,104,168,32,96,160,24,88,152,16,80,144,8,72,136,0,64,128,192,56,120,184,48,112,176,40,104,168,32,96,160,24,88,152,16,80,144,8,72,136,0,64,128,192,56,120,184,48,112,176,40,104,168,32,96,160,24,88,152,16,80,144,8,72,136,0,64,128,192,56,120,184,48,112,176,40,104,168,32,96,160,24,88,152,16,80,144,8,72,136,0,64,128,192,56,120,184,48,112,176,40,104,168,32,96,160,24,88,152,16,80,144,8,72,136,0,64,128,192,56,120,184,48,112,176,40,104,168,32,96,160,24,88,152,16,80,144,8,72,136,0 +0,65,130,195,60,125,190,55,120,185,50,115,180,45,110,175,40,105,170,35,100,165,30,95,160,25,90,155,20,85,150,15,80,145,10,75,140,5,70,135,0,65,130,195,60,125,190,55,120,185,50,115,180,45,110,175,40,105,170,35,100,165,30,95,160,25,90,155,20,85,150,15,80,145,10,75,140,5,70,135,0,65,130,195,60,125,190,55,120,185,50,115,180,45,110,175,40,105,170,35,100,165,30,95,160,25,90,155,20,85,150,15,80,145,10,75,140,5,70,135,0,65,130,195,60,125,190,55,120,185,50,115,180,45,110,175,40,105,170,35,100,165,30,95,160,25,90,155,20,85,150,15,80,145,10,75,140,5,70,135,0,65,130,195,60,125,190,55,120,185,50,115,180,45,110,175,40,105,170,35,100,165,30,95,160,25,90,155,20,85,150,15,80,145,10,75,140,5,70,135,0 +0,66,132,198,64,130,196,62,128,194,60,126,192,58,124,190,56,122,188,54,120,186,52,118,184,50,116,182,48,114,180,46,112,178,44,110,176,42,108,174,40,106,172,38,104,170,36,102,168,34,100,166,32,98,164,30,96,162,28,94,160,26,92,158,24,90,156,22,88,154,20,86,152,18,84,150,16,82,148,14,80,146,12,78,144,10,76,142,8,74,140,6,72,138,4,70,136,2,68,134,0,66,132,198,64,130,196,62,128,194,60,126,192,58,124,190,56,122,188,54,120,186,52,118,184,50,116,182,48,114,180,46,112,178,44,110,176,42,108,174,40,106,172,38,104,170,36,102,168,34,100,166,32,98,164,30,96,162,28,94,160,26,92,158,24,90,156,22,88,154,20,86,152,18,84,150,16,82,148,14,80,146,12,78,144,10,76,142,8,74,140,6,72,138,4,70,136,2,68,134,0 +0,67,134,1,68,135,2,69,136,3,70,137,4,71,138,5,72,139,6,73,140,7,74,141,8,75,142,9,76,143,10,77,144,11,78,145,12,79,146,13,80,147,14,81,148,15,82,149,16,83,150,17,84,151,18,85,152,19,86,153,20,87,154,21,88,155,22,89,156,23,90,157,24,91,158,25,92,159,26,93,160,27,94,161,28,95,162,29,96,163,30,97,164,31,98,165,32,99,166,33,100,167,34,101,168,35,102,169,36,103,170,37,104,171,38,105,172,39,106,173,40,107,174,41,108,175,42,109,176,43,110,177,44,111,178,45,112,179,46,113,180,47,114,181,48,115,182,49,116,183,50,117,184,51,118,185,52,119,186,53,120,187,54,121,188,55,122,189,56,123,190,57,124,191,58,125,192,59,126,193,60,127,194,61,128,195,62,129,196,63,130,197,64,131,198,65,132,199,66,133,0 +0,68,136,4,72,140,8,76,144,12,80,148,16,84,152,20,88,156,24,92,160,28,96,164,32,100,168,36,104,172,40,108,176,44,112,180,48,116,184,52,120,188,56,124,192,60,128,196,64,132,0,68,136,4,72,140,8,76,144,12,80,148,16,84,152,20,88,156,24,92,160,28,96,164,32,100,168,36,104,172,40,108,176,44,112,180,48,116,184,52,120,188,56,124,192,60,128,196,64,132,0,68,136,4,72,140,8,76,144,12,80,148,16,84,152,20,88,156,24,92,160,28,96,164,32,100,168,36,104,172,40,108,176,44,112,180,48,116,184,52,120,188,56,124,192,60,128,196,64,132,0,68,136,4,72,140,8,76,144,12,80,148,16,84,152,20,88,156,24,92,160,28,96,164,32,100,168,36,104,172,40,108,176,44,112,180,48,116,184,52,120,188,56,124,192,60,128,196,64,132,0 +0,69,138,7,76,145,14,83,152,21,90,159,28,97,166,35,104,173,42,111,180,49,118,187,56,125,194,63,132,1,70,139,8,77,146,15,84,153,22,91,160,29,98,167,36,105,174,43,112,181,50,119,188,57,126,195,64,133,2,71,140,9,78,147,16,85,154,23,92,161,30,99,168,37,106,175,44,113,182,51,120,189,58,127,196,65,134,3,72,141,10,79,148,17,86,155,24,93,162,31,100,169,38,107,176,45,114,183,52,121,190,59,128,197,66,135,4,73,142,11,80,149,18,87,156,25,94,163,32,101,170,39,108,177,46,115,184,53,122,191,60,129,198,67,136,5,74,143,12,81,150,19,88,157,26,95,164,33,102,171,40,109,178,47,116,185,54,123,192,61,130,199,68,137,6,75,144,13,82,151,20,89,158,27,96,165,34,103,172,41,110,179,48,117,186,55,124,193,62,131,0 +0,70,140,10,80,150,20,90,160,30,100,170,40,110,180,50,120,190,60,130,0,70,140,10,80,150,20,90,160,30,100,170,40,110,180,50,120,190,60,130,0,70,140,10,80,150,20,90,160,30,100,170,40,110,180,50,120,190,60,130,0,70,140,10,80,150,20,90,160,30,100,170,40,110,180,50,120,190,60,130,0,70,140,10,80,150,20,90,160,30,100,170,40,110,180,50,120,190,60,130,0,70,140,10,80,150,20,90,160,30,100,170,40,110,180,50,120,190,60,130,0,70,140,10,80,150,20,90,160,30,100,170,40,110,180,50,120,190,60,130,0,70,140,10,80,150,20,90,160,30,100,170,40,110,180,50,120,190,60,130,0,70,140,10,80,150,20,90,160,30,100,170,40,110,180,50,120,190,60,130,0,70,140,10,80,150,20,90,160,30,100,170,40,110,180,50,120,190,60,130,0 +0,71,142,13,84,155,26,97,168,39,110,181,52,123,194,65,136,7,78,149,20,91,162,33,104,175,46,117,188,59,130,1,72,143,14,85,156,27,98,169,40,111,182,53,124,195,66,137,8,79,150,21,92,163,34,105,176,47,118,189,60,131,2,73,144,15,86,157,28,99,170,41,112,183,54,125,196,67,138,9,80,151,22,93,164,35,106,177,48,119,190,61,132,3,74,145,16,87,158,29,100,171,42,113,184,55,126,197,68,139,10,81,152,23,94,165,36,107,178,49,120,191,62,133,4,75,146,17,88,159,30,101,172,43,114,185,56,127,198,69,140,11,82,153,24,95,166,37,108,179,50,121,192,63,134,5,76,147,18,89,160,31,102,173,44,115,186,57,128,199,70,141,12,83,154,25,96,167,38,109,180,51,122,193,64,135,6,77,148,19,90,161,32,103,174,45,116,187,58,129,0 +0,72,144,16,88,160,32,104,176,48,120,192,64,136,8,80,152,24,96,168,40,112,184,56,128,0,72,144,16,88,160,32,104,176,48,120,192,64,136,8,80,152,24,96,168,40,112,184,56,128,0,72,144,16,88,160,32,104,176,48,120,192,64,136,8,80,152,24,96,168,40,112,184,56,128,0,72,144,16,88,160,32,104,176,48,120,192,64,136,8,80,152,24,96,168,40,112,184,56,128,0,72,144,16,88,160,32,104,176,48,120,192,64,136,8,80,152,24,96,168,40,112,184,56,128,0,72,144,16,88,160,32,104,176,48,120,192,64,136,8,80,152,24,96,168,40,112,184,56,128,0,72,144,16,88,160,32,104,176,48,120,192,64,136,8,80,152,24,96,168,40,112,184,56,128,0,72,144,16,88,160,32,104,176,48,120,192,64,136,8,80,152,24,96,168,40,112,184,56,128,0 +0,73,146,19,92,165,38,111,184,57,130,3,76,149,22,95,168,41,114,187,60,133,6,79,152,25,98,171,44,117,190,63,136,9,82,155,28,101,174,47,120,193,66,139,12,85,158,31,104,177,50,123,196,69,142,15,88,161,34,107,180,53,126,199,72,145,18,91,164,37,110,183,56,129,2,75,148,21,94,167,40,113,186,59,132,5,78,151,24,97,170,43,116,189,62,135,8,81,154,27,100,173,46,119,192,65,138,11,84,157,30,103,176,49,122,195,68,141,14,87,160,33,106,179,52,125,198,71,144,17,90,163,36,109,182,55,128,1,74,147,20,93,166,39,112,185,58,131,4,77,150,23,96,169,42,115,188,61,134,7,80,153,26,99,172,45,118,191,64,137,10,83,156,29,102,175,48,121,194,67,140,13,86,159,32,105,178,51,124,197,70,143,16,89,162,35,108,181,54,127,0 +0,74,148,22,96,170,44,118,192,66,140,14,88,162,36,110,184,58,132,6,80,154,28,102,176,50,124,198,72,146,20,94,168,42,116,190,64,138,12,86,160,34,108,182,56,130,4,78,152,26,100,174,48,122,196,70,144,18,92,166,40,114,188,62,136,10,84,158,32,106,180,54,128,2,76,150,24,98,172,46,120,194,68,142,16,90,164,38,112,186,60,134,8,82,156,30,104,178,52,126,0,74,148,22,96,170,44,118,192,66,140,14,88,162,36,110,184,58,132,6,80,154,28,102,176,50,124,198,72,146,20,94,168,42,116,190,64,138,12,86,160,34,108,182,56,130,4,78,152,26,100,174,48,122,196,70,144,18,92,166,40,114,188,62,136,10,84,158,32,106,180,54,128,2,76,150,24,98,172,46,120,194,68,142,16,90,164,38,112,186,60,134,8,82,156,30,104,178,52,126,0 +0,75,150,25,100,175,50,125,0,75,150,25,100,175,50,125,0,75,150,25,100,175,50,125,0,75,150,25,100,175,50,125,0,75,150,25,100,175,50,125,0,75,150,25,100,175,50,125,0,75,150,25,100,175,50,125,0,75,150,25,100,175,50,125,0,75,150,25,100,175,50,125,0,75,150,25,100,175,50,125,0,75,150,25,100,175,50,125,0,75,150,25,100,175,50,125,0,75,150,25,100,175,50,125,0,75,150,25,100,175,50,125,0,75,150,25,100,175,50,125,0,75,150,25,100,175,50,125,0,75,150,25,100,175,50,125,0,75,150,25,100,175,50,125,0,75,150,25,100,175,50,125,0,75,150,25,100,175,50,125,0,75,150,25,100,175,50,125,0,75,150,25,100,175,50,125,0,75,150,25,100,175,50,125,0,75,150,25,100,175,50,125,0,75,150,25,100,175,50,125,0 +0,76,152,28,104,180,56,132,8,84,160,36,112,188,64,140,16,92,168,44,120,196,72,148,24,100,176,52,128,4,80,156,32,108,184,60,136,12,88,164,40,116,192,68,144,20,96,172,48,124,0,76,152,28,104,180,56,132,8,84,160,36,112,188,64,140,16,92,168,44,120,196,72,148,24,100,176,52,128,4,80,156,32,108,184,60,136,12,88,164,40,116,192,68,144,20,96,172,48,124,0,76,152,28,104,180,56,132,8,84,160,36,112,188,64,140,16,92,168,44,120,196,72,148,24,100,176,52,128,4,80,156,32,108,184,60,136,12,88,164,40,116,192,68,144,20,96,172,48,124,0,76,152,28,104,180,56,132,8,84,160,36,112,188,64,140,16,92,168,44,120,196,72,148,24,100,176,52,128,4,80,156,32,108,184,60,136,12,88,164,40,116,192,68,144,20,96,172,48,124,0 +0,77,154,31,108,185,62,139,16,93,170,47,124,1,78,155,32,109,186,63,140,17,94,171,48,125,2,79,156,33,110,187,64,141,18,95,172,49,126,3,80,157,34,111,188,65,142,19,96,173,50,127,4,81,158,35,112,189,66,143,20,97,174,51,128,5,82,159,36,113,190,67,144,21,98,175,52,129,6,83,160,37,114,191,68,145,22,99,176,53,130,7,84,161,38,115,192,69,146,23,100,177,54,131,8,85,162,39,116,193,70,147,24,101,178,55,132,9,86,163,40,117,194,71,148,25,102,179,56,133,10,87,164,41,118,195,72,149,26,103,180,57,134,11,88,165,42,119,196,73,150,27,104,181,58,135,12,89,166,43,120,197,74,151,28,105,182,59,136,13,90,167,44,121,198,75,152,29,106,183,60,137,14,91,168,45,122,199,76,153,30,107,184,61,138,15,92,169,46,123,0 +0,78,156,34,112,190,68,146,24,102,180,58,136,14,92,170,48,126,4,82,160,38,116,194,72,150,28,106,184,62,140,18,96,174,52,130,8,86,164,42,120,198,76,154,32,110,188,66,144,22,100,178,56,134,12,90,168,46,124,2,80,158,36,114,192,70,148,26,104,182,60,138,16,94,172,50,128,6,84,162,40,118,196,74,152,30,108,186,64,142,20,98,176,54,132,10,88,166,44,122,0,78,156,34,112,190,68,146,24,102,180,58,136,14,92,170,48,126,4,82,160,38,116,194,72,150,28,106,184,62,140,18,96,174,52,130,8,86,164,42,120,198,76,154,32,110,188,66,144,22,100,178,56,134,12,90,168,46,124,2,80,158,36,114,192,70,148,26,104,182,60,138,16,94,172,50,128,6,84,162,40,118,196,74,152,30,108,186,64,142,20,98,176,54,132,10,88,166,44,122,0 +0,79,158,37,116,195,74,153,32,111,190,69,148,27,106,185,64,143,22,101,180,59,138,17,96,175,54,133,12,91,170,49,128,7,86,165,44,123,2,81,160,39,118,197,76,155,34,113,192,71,150,29,108,187,66,145,24,103,182,61,140,19,98,177,56,135,14,93,172,51,130,9,88,167,46,125,4,83,162,41,120,199,78,157,36,115,194,73,152,31,110,189,68,147,26,105,184,63,142,21,100,179,58,137,16,95,174,53,132,11,90,169,48,127,6,85,164,43,122,1,80,159,38,117,196,75,154,33,112,191,70,149,28,107,186,65,144,23,102,181,60,139,18,97,176,55,134,13,92,171,50,129,8,87,166,45,124,3,82,161,40,119,198,77,156,35,114,193,72,151,30,109,188,67,146,25,104,183,62,141,20,99,178,57,136,15,94,173,52,131,10,89,168,47,126,5,84,163,42,121,0 +0,80,160,40,120,0,80,160,40,120,0,80,160,40,120,0,80,160,40,120,0,80,160,40,120,0,80,160,40,120,0,80,160,40,120,0,80,160,40,120,0,80,160,40,120,0,80,160,40,120,0,80,160,40,120,0,80,160,40,120,0,80,160,40,120,0,80,160,40,120,0,80,160,40,120,0,80,160,40,120,0,80,160,40,120,0,80,160,40,120,0,80,160,40,120,0,80,160,40,120,0,80,160,40,120,0,80,160,40,120,0,80,160,40,120,0,80,160,40,120,0,80,160,40,120,0,80,160,40,120,0,80,160,40,120,0,80,160,40,120,0,80,160,40,120,0,80,160,40,120,0,80,160,40,120,0,80,160,40,120,0,80,160,40,120,0,80,160,40,120,0,80,160,40,120,0,80,160,40,120,0,80,160,40,120,0,80,160,40,120,0,80,160,40,120,0,80,160,40,120,0 +0,81,162,43,124,5,86,167,48,129,10,91,172,53,134,15,96,177,58,139,20,101,182,63,144,25,106,187,68,149,30,111,192,73,154,35,116,197,78,159,40,121,2,83,164,45,126,7,88,169,50,131,12,93,174,55,136,17,98,179,60,141,22,103,184,65,146,27,108,189,70,151,32,113,194,75,156,37,118,199,80,161,42,123,4,85,166,47,128,9,90,171,52,133,14,95,176,57,138,19,100,181,62,143,24,105,186,67,148,29,110,191,72,153,34,115,196,77,158,39,120,1,82,163,44,125,6,87,168,49,130,11,92,173,54,135,16,97,178,59,140,21,102,183,64,145,26,107,188,69,150,31,112,193,74,155,36,117,198,79,160,41,122,3,84,165,46,127,8,89,170,51,132,13,94,175,56,137,18,99,180,61,142,23,104,185,66,147,28,109,190,71,152,33,114,195,76,157,38,119,0 +0,82,164,46,128,10,92,174,56,138,20,102,184,66,148,30,112,194,76,158,40,122,4,86,168,50,132,14,96,178,60,142,24,106,188,70,152,34,116,198,80,162,44,126,8,90,172,54,136,18,100,182,64,146,28,110,192,74,156,38,120,2,84,166,48,130,12,94,176,58,140,22,104,186,68,150,32,114,196,78,160,42,124,6,88,170,52,134,16,98,180,62,144,26,108,190,72,154,36,118,0,82,164,46,128,10,92,174,56,138,20,102,184,66,148,30,112,194,76,158,40,122,4,86,168,50,132,14,96,178,60,142,24,106,188,70,152,34,116,198,80,162,44,126,8,90,172,54,136,18,100,182,64,146,28,110,192,74,156,38,120,2,84,166,48,130,12,94,176,58,140,22,104,186,68,150,32,114,196,78,160,42,124,6,88,170,52,134,16,98,180,62,144,26,108,190,72,154,36,118,0 +0,83,166,49,132,15,98,181,64,147,30,113,196,79,162,45,128,11,94,177,60,143,26,109,192,75,158,41,124,7,90,173,56,139,22,105,188,71,154,37,120,3,86,169,52,135,18,101,184,67,150,33,116,199,82,165,48,131,14,97,180,63,146,29,112,195,78,161,44,127,10,93,176,59,142,25,108,191,74,157,40,123,6,89,172,55,138,21,104,187,70,153,36,119,2,85,168,51,134,17,100,183,66,149,32,115,198,81,164,47,130,13,96,179,62,145,28,111,194,77,160,43,126,9,92,175,58,141,24,107,190,73,156,39,122,5,88,171,54,137,20,103,186,69,152,35,118,1,84,167,50,133,16,99,182,65,148,31,114,197,80,163,46,129,12,95,178,61,144,27,110,193,76,159,42,125,8,91,174,57,140,23,106,189,72,155,38,121,4,87,170,53,136,19,102,185,68,151,34,117,0 +0,84,168,52,136,20,104,188,72,156,40,124,8,92,176,60,144,28,112,196,80,164,48,132,16,100,184,68,152,36,120,4,88,172,56,140,24,108,192,76,160,44,128,12,96,180,64,148,32,116,0,84,168,52,136,20,104,188,72,156,40,124,8,92,176,60,144,28,112,196,80,164,48,132,16,100,184,68,152,36,120,4,88,172,56,140,24,108,192,76,160,44,128,12,96,180,64,148,32,116,0,84,168,52,136,20,104,188,72,156,40,124,8,92,176,60,144,28,112,196,80,164,48,132,16,100,184,68,152,36,120,4,88,172,56,140,24,108,192,76,160,44,128,12,96,180,64,148,32,116,0,84,168,52,136,20,104,188,72,156,40,124,8,92,176,60,144,28,112,196,80,164,48,132,16,100,184,68,152,36,120,4,88,172,56,140,24,108,192,76,160,44,128,12,96,180,64,148,32,116,0 +0,85,170,55,140,25,110,195,80,165,50,135,20,105,190,75,160,45,130,15,100,185,70,155,40,125,10,95,180,65,150,35,120,5,90,175,60,145,30,115,0,85,170,55,140,25,110,195,80,165,50,135,20,105,190,75,160,45,130,15,100,185,70,155,40,125,10,95,180,65,150,35,120,5,90,175,60,145,30,115,0,85,170,55,140,25,110,195,80,165,50,135,20,105,190,75,160,45,130,15,100,185,70,155,40,125,10,95,180,65,150,35,120,5,90,175,60,145,30,115,0,85,170,55,140,25,110,195,80,165,50,135,20,105,190,75,160,45,130,15,100,185,70,155,40,125,10,95,180,65,150,35,120,5,90,175,60,145,30,115,0,85,170,55,140,25,110,195,80,165,50,135,20,105,190,75,160,45,130,15,100,185,70,155,40,125,10,95,180,65,150,35,120,5,90,175,60,145,30,115,0 +0,86,172,58,144,30,116,2,88,174,60,146,32,118,4,90,176,62,148,34,120,6,92,178,64,150,36,122,8,94,180,66,152,38,124,10,96,182,68,154,40,126,12,98,184,70,156,42,128,14,100,186,72,158,44,130,16,102,188,74,160,46,132,18,104,190,76,162,48,134,20,106,192,78,164,50,136,22,108,194,80,166,52,138,24,110,196,82,168,54,140,26,112,198,84,170,56,142,28,114,0,86,172,58,144,30,116,2,88,174,60,146,32,118,4,90,176,62,148,34,120,6,92,178,64,150,36,122,8,94,180,66,152,38,124,10,96,182,68,154,40,126,12,98,184,70,156,42,128,14,100,186,72,158,44,130,16,102,188,74,160,46,132,18,104,190,76,162,48,134,20,106,192,78,164,50,136,22,108,194,80,166,52,138,24,110,196,82,168,54,140,26,112,198,84,170,56,142,28,114,0 +0,87,174,61,148,35,122,9,96,183,70,157,44,131,18,105,192,79,166,53,140,27,114,1,88,175,62,149,36,123,10,97,184,71,158,45,132,19,106,193,80,167,54,141,28,115,2,89,176,63,150,37,124,11,98,185,72,159,46,133,20,107,194,81,168,55,142,29,116,3,90,177,64,151,38,125,12,99,186,73,160,47,134,21,108,195,82,169,56,143,30,117,4,91,178,65,152,39,126,13,100,187,74,161,48,135,22,109,196,83,170,57,144,31,118,5,92,179,66,153,40,127,14,101,188,75,162,49,136,23,110,197,84,171,58,145,32,119,6,93,180,67,154,41,128,15,102,189,76,163,50,137,24,111,198,85,172,59,146,33,120,7,94,181,68,155,42,129,16,103,190,77,164,51,138,25,112,199,86,173,60,147,34,121,8,95,182,69,156,43,130,17,104,191,78,165,52,139,26,113,0 +0,88,176,64,152,40,128,16,104,192,80,168,56,144,32,120,8,96,184,72,160,48,136,24,112,0,88,176,64,152,40,128,16,104,192,80,168,56,144,32,120,8,96,184,72,160,48,136,24,112,0,88,176,64,152,40,128,16,104,192,80,168,56,144,32,120,8,96,184,72,160,48,136,24,112,0,88,176,64,152,40,128,16,104,192,80,168,56,144,32,120,8,96,184,72,160,48,136,24,112,0,88,176,64,152,40,128,16,104,192,80,168,56,144,32,120,8,96,184,72,160,48,136,24,112,0,88,176,64,152,40,128,16,104,192,80,168,56,144,32,120,8,96,184,72,160,48,136,24,112,0,88,176,64,152,40,128,16,104,192,80,168,56,144,32,120,8,96,184,72,160,48,136,24,112,0,88,176,64,152,40,128,16,104,192,80,168,56,144,32,120,8,96,184,72,160,48,136,24,112,0 +0,89,178,67,156,45,134,23,112,1,90,179,68,157,46,135,24,113,2,91,180,69,158,47,136,25,114,3,92,181,70,159,48,137,26,115,4,93,182,71,160,49,138,27,116,5,94,183,72,161,50,139,28,117,6,95,184,73,162,51,140,29,118,7,96,185,74,163,52,141,30,119,8,97,186,75,164,53,142,31,120,9,98,187,76,165,54,143,32,121,10,99,188,77,166,55,144,33,122,11,100,189,78,167,56,145,34,123,12,101,190,79,168,57,146,35,124,13,102,191,80,169,58,147,36,125,14,103,192,81,170,59,148,37,126,15,104,193,82,171,60,149,38,127,16,105,194,83,172,61,150,39,128,17,106,195,84,173,62,151,40,129,18,107,196,85,174,63,152,41,130,19,108,197,86,175,64,153,42,131,20,109,198,87,176,65,154,43,132,21,110,199,88,177,66,155,44,133,22,111,0 +0,90,180,70,160,50,140,30,120,10,100,190,80,170,60,150,40,130,20,110,0,90,180,70,160,50,140,30,120,10,100,190,80,170,60,150,40,130,20,110,0,90,180,70,160,50,140,30,120,10,100,190,80,170,60,150,40,130,20,110,0,90,180,70,160,50,140,30,120,10,100,190,80,170,60,150,40,130,20,110,0,90,180,70,160,50,140,30,120,10,100,190,80,170,60,150,40,130,20,110,0,90,180,70,160,50,140,30,120,10,100,190,80,170,60,150,40,130,20,110,0,90,180,70,160,50,140,30,120,10,100,190,80,170,60,150,40,130,20,110,0,90,180,70,160,50,140,30,120,10,100,190,80,170,60,150,40,130,20,110,0,90,180,70,160,50,140,30,120,10,100,190,80,170,60,150,40,130,20,110,0,90,180,70,160,50,140,30,120,10,100,190,80,170,60,150,40,130,20,110,0 +0,91,182,73,164,55,146,37,128,19,110,1,92,183,74,165,56,147,38,129,20,111,2,93,184,75,166,57,148,39,130,21,112,3,94,185,76,167,58,149,40,131,22,113,4,95,186,77,168,59,150,41,132,23,114,5,96,187,78,169,60,151,42,133,24,115,6,97,188,79,170,61,152,43,134,25,116,7,98,189,80,171,62,153,44,135,26,117,8,99,190,81,172,63,154,45,136,27,118,9,100,191,82,173,64,155,46,137,28,119,10,101,192,83,174,65,156,47,138,29,120,11,102,193,84,175,66,157,48,139,30,121,12,103,194,85,176,67,158,49,140,31,122,13,104,195,86,177,68,159,50,141,32,123,14,105,196,87,178,69,160,51,142,33,124,15,106,197,88,179,70,161,52,143,34,125,16,107,198,89,180,71,162,53,144,35,126,17,108,199,90,181,72,163,54,145,36,127,18,109,0 +0,92,184,76,168,60,152,44,136,28,120,12,104,196,88,180,72,164,56,148,40,132,24,116,8,100,192,84,176,68,160,52,144,36,128,20,112,4,96,188,80,172,64,156,48,140,32,124,16,108,0,92,184,76,168,60,152,44,136,28,120,12,104,196,88,180,72,164,56,148,40,132,24,116,8,100,192,84,176,68,160,52,144,36,128,20,112,4,96,188,80,172,64,156,48,140,32,124,16,108,0,92,184,76,168,60,152,44,136,28,120,12,104,196,88,180,72,164,56,148,40,132,24,116,8,100,192,84,176,68,160,52,144,36,128,20,112,4,96,188,80,172,64,156,48,140,32,124,16,108,0,92,184,76,168,60,152,44,136,28,120,12,104,196,88,180,72,164,56,148,40,132,24,116,8,100,192,84,176,68,160,52,144,36,128,20,112,4,96,188,80,172,64,156,48,140,32,124,16,108,0 +0,93,186,79,172,65,158,51,144,37,130,23,116,9,102,195,88,181,74,167,60,153,46,139,32,125,18,111,4,97,190,83,176,69,162,55,148,41,134,27,120,13,106,199,92,185,78,171,64,157,50,143,36,129,22,115,8,101,194,87,180,73,166,59,152,45,138,31,124,17,110,3,96,189,82,175,68,161,54,147,40,133,26,119,12,105,198,91,184,77,170,63,156,49,142,35,128,21,114,7,100,193,86,179,72,165,58,151,44,137,30,123,16,109,2,95,188,81,174,67,160,53,146,39,132,25,118,11,104,197,90,183,76,169,62,155,48,141,34,127,20,113,6,99,192,85,178,71,164,57,150,43,136,29,122,15,108,1,94,187,80,173,66,159,52,145,38,131,24,117,10,103,196,89,182,75,168,61,154,47,140,33,126,19,112,5,98,191,84,177,70,163,56,149,42,135,28,121,14,107,0 +0,94,188,82,176,70,164,58,152,46,140,34,128,22,116,10,104,198,92,186,80,174,68,162,56,150,44,138,32,126,20,114,8,102,196,90,184,78,172,66,160,54,148,42,136,30,124,18,112,6,100,194,88,182,76,170,64,158,52,146,40,134,28,122,16,110,4,98,192,86,180,74,168,62,156,50,144,38,132,26,120,14,108,2,96,190,84,178,72,166,60,154,48,142,36,130,24,118,12,106,0,94,188,82,176,70,164,58,152,46,140,34,128,22,116,10,104,198,92,186,80,174,68,162,56,150,44,138,32,126,20,114,8,102,196,90,184,78,172,66,160,54,148,42,136,30,124,18,112,6,100,194,88,182,76,170,64,158,52,146,40,134,28,122,16,110,4,98,192,86,180,74,168,62,156,50,144,38,132,26,120,14,108,2,96,190,84,178,72,166,60,154,48,142,36,130,24,118,12,106,0 +0,95,190,85,180,75,170,65,160,55,150,45,140,35,130,25,120,15,110,5,100,195,90,185,80,175,70,165,60,155,50,145,40,135,30,125,20,115,10,105,0,95,190,85,180,75,170,65,160,55,150,45,140,35,130,25,120,15,110,5,100,195,90,185,80,175,70,165,60,155,50,145,40,135,30,125,20,115,10,105,0,95,190,85,180,75,170,65,160,55,150,45,140,35,130,25,120,15,110,5,100,195,90,185,80,175,70,165,60,155,50,145,40,135,30,125,20,115,10,105,0,95,190,85,180,75,170,65,160,55,150,45,140,35,130,25,120,15,110,5,100,195,90,185,80,175,70,165,60,155,50,145,40,135,30,125,20,115,10,105,0,95,190,85,180,75,170,65,160,55,150,45,140,35,130,25,120,15,110,5,100,195,90,185,80,175,70,165,60,155,50,145,40,135,30,125,20,115,10,105,0 +0,96,192,88,184,80,176,72,168,64,160,56,152,48,144,40,136,32,128,24,120,16,112,8,104,0,96,192,88,184,80,176,72,168,64,160,56,152,48,144,40,136,32,128,24,120,16,112,8,104,0,96,192,88,184,80,176,72,168,64,160,56,152,48,144,40,136,32,128,24,120,16,112,8,104,0,96,192,88,184,80,176,72,168,64,160,56,152,48,144,40,136,32,128,24,120,16,112,8,104,0,96,192,88,184,80,176,72,168,64,160,56,152,48,144,40,136,32,128,24,120,16,112,8,104,0,96,192,88,184,80,176,72,168,64,160,56,152,48,144,40,136,32,128,24,120,16,112,8,104,0,96,192,88,184,80,176,72,168,64,160,56,152,48,144,40,136,32,128,24,120,16,112,8,104,0,96,192,88,184,80,176,72,168,64,160,56,152,48,144,40,136,32,128,24,120,16,112,8,104,0 +0,97,194,91,188,85,182,79,176,73,170,67,164,61,158,55,152,49,146,43,140,37,134,31,128,25,122,19,116,13,110,7,104,1,98,195,92,189,86,183,80,177,74,171,68,165,62,159,56,153,50,147,44,141,38,135,32,129,26,123,20,117,14,111,8,105,2,99,196,93,190,87,184,81,178,75,172,69,166,63,160,57,154,51,148,45,142,39,136,33,130,27,124,21,118,15,112,9,106,3,100,197,94,191,88,185,82,179,76,173,70,167,64,161,58,155,52,149,46,143,40,137,34,131,28,125,22,119,16,113,10,107,4,101,198,95,192,89,186,83,180,77,174,71,168,65,162,59,156,53,150,47,144,41,138,35,132,29,126,23,120,17,114,11,108,5,102,199,96,193,90,187,84,181,78,175,72,169,66,163,60,157,54,151,48,145,42,139,36,133,30,127,24,121,18,115,12,109,6,103,0 +0,98,196,94,192,90,188,86,184,82,180,78,176,74,172,70,168,66,164,62,160,58,156,54,152,50,148,46,144,42,140,38,136,34,132,30,128,26,124,22,120,18,116,14,112,10,108,6,104,2,100,198,96,194,92,190,88,186,84,182,80,178,76,174,72,170,68,166,64,162,60,158,56,154,52,150,48,146,44,142,40,138,36,134,32,130,28,126,24,122,20,118,16,114,12,110,8,106,4,102,0,98,196,94,192,90,188,86,184,82,180,78,176,74,172,70,168,66,164,62,160,58,156,54,152,50,148,46,144,42,140,38,136,34,132,30,128,26,124,22,120,18,116,14,112,10,108,6,104,2,100,198,96,194,92,190,88,186,84,182,80,178,76,174,72,170,68,166,64,162,60,158,56,154,52,150,48,146,44,142,40,138,36,134,32,130,28,126,24,122,20,118,16,114,12,110,8,106,4,102,0 +0,99,198,97,196,95,194,93,192,91,190,89,188,87,186,85,184,83,182,81,180,79,178,77,176,75,174,73,172,71,170,69,168,67,166,65,164,63,162,61,160,59,158,57,156,55,154,53,152,51,150,49,148,47,146,45,144,43,142,41,140,39,138,37,136,35,134,33,132,31,130,29,128,27,126,25,124,23,122,21,120,19,118,17,116,15,114,13,112,11,110,9,108,7,106,5,104,3,102,1,100,199,98,197,96,195,94,193,92,191,90,189,88,187,86,185,84,183,82,181,80,179,78,177,76,175,74,173,72,171,70,169,68,167,66,165,64,163,62,161,60,159,58,157,56,155,54,153,52,151,50,149,48,147,46,145,44,143,42,141,40,139,38,137,36,135,34,133,32,131,30,129,28,127,26,125,24,123,22,121,20,119,18,117,16,115,14,113,12,111,10,109,8,107,6,105,4,103,2,101,0 +0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,0 +0,101,2,103,4,105,6,107,8,109,10,111,12,113,14,115,16,117,18,119,20,121,22,123,24,125,26,127,28,129,30,131,32,133,34,135,36,137,38,139,40,141,42,143,44,145,46,147,48,149,50,151,52,153,54,155,56,157,58,159,60,161,62,163,64,165,66,167,68,169,70,171,72,173,74,175,76,177,78,179,80,181,82,183,84,185,86,187,88,189,90,191,92,193,94,195,96,197,98,199,100,1,102,3,104,5,106,7,108,9,110,11,112,13,114,15,116,17,118,19,120,21,122,23,124,25,126,27,128,29,130,31,132,33,134,35,136,37,138,39,140,41,142,43,144,45,146,47,148,49,150,51,152,53,154,55,156,57,158,59,160,61,162,63,164,65,166,67,168,69,170,71,172,73,174,75,176,77,178,79,180,81,182,83,184,85,186,87,188,89,190,91,192,93,194,95,196,97,198,99,0 +0,102,4,106,8,110,12,114,16,118,20,122,24,126,28,130,32,134,36,138,40,142,44,146,48,150,52,154,56,158,60,162,64,166,68,170,72,174,76,178,80,182,84,186,88,190,92,194,96,198,100,2,104,6,108,10,112,14,116,18,120,22,124,26,128,30,132,34,136,38,140,42,144,46,148,50,152,54,156,58,160,62,164,66,168,70,172,74,176,78,180,82,184,86,188,90,192,94,196,98,0,102,4,106,8,110,12,114,16,118,20,122,24,126,28,130,32,134,36,138,40,142,44,146,48,150,52,154,56,158,60,162,64,166,68,170,72,174,76,178,80,182,84,186,88,190,92,194,96,198,100,2,104,6,108,10,112,14,116,18,120,22,124,26,128,30,132,34,136,38,140,42,144,46,148,50,152,54,156,58,160,62,164,66,168,70,172,74,176,78,180,82,184,86,188,90,192,94,196,98,0 +0,103,6,109,12,115,18,121,24,127,30,133,36,139,42,145,48,151,54,157,60,163,66,169,72,175,78,181,84,187,90,193,96,199,102,5,108,11,114,17,120,23,126,29,132,35,138,41,144,47,150,53,156,59,162,65,168,71,174,77,180,83,186,89,192,95,198,101,4,107,10,113,16,119,22,125,28,131,34,137,40,143,46,149,52,155,58,161,64,167,70,173,76,179,82,185,88,191,94,197,100,3,106,9,112,15,118,21,124,27,130,33,136,39,142,45,148,51,154,57,160,63,166,69,172,75,178,81,184,87,190,93,196,99,2,105,8,111,14,117,20,123,26,129,32,135,38,141,44,147,50,153,56,159,62,165,68,171,74,177,80,183,86,189,92,195,98,1,104,7,110,13,116,19,122,25,128,31,134,37,140,43,146,49,152,55,158,61,164,67,170,73,176,79,182,85,188,91,194,97,0 +0,104,8,112,16,120,24,128,32,136,40,144,48,152,56,160,64,168,72,176,80,184,88,192,96,0,104,8,112,16,120,24,128,32,136,40,144,48,152,56,160,64,168,72,176,80,184,88,192,96,0,104,8,112,16,120,24,128,32,136,40,144,48,152,56,160,64,168,72,176,80,184,88,192,96,0,104,8,112,16,120,24,128,32,136,40,144,48,152,56,160,64,168,72,176,80,184,88,192,96,0,104,8,112,16,120,24,128,32,136,40,144,48,152,56,160,64,168,72,176,80,184,88,192,96,0,104,8,112,16,120,24,128,32,136,40,144,48,152,56,160,64,168,72,176,80,184,88,192,96,0,104,8,112,16,120,24,128,32,136,40,144,48,152,56,160,64,168,72,176,80,184,88,192,96,0,104,8,112,16,120,24,128,32,136,40,144,48,152,56,160,64,168,72,176,80,184,88,192,96,0 +0,105,10,115,20,125,30,135,40,145,50,155,60,165,70,175,80,185,90,195,100,5,110,15,120,25,130,35,140,45,150,55,160,65,170,75,180,85,190,95,0,105,10,115,20,125,30,135,40,145,50,155,60,165,70,175,80,185,90,195,100,5,110,15,120,25,130,35,140,45,150,55,160,65,170,75,180,85,190,95,0,105,10,115,20,125,30,135,40,145,50,155,60,165,70,175,80,185,90,195,100,5,110,15,120,25,130,35,140,45,150,55,160,65,170,75,180,85,190,95,0,105,10,115,20,125,30,135,40,145,50,155,60,165,70,175,80,185,90,195,100,5,110,15,120,25,130,35,140,45,150,55,160,65,170,75,180,85,190,95,0,105,10,115,20,125,30,135,40,145,50,155,60,165,70,175,80,185,90,195,100,5,110,15,120,25,130,35,140,45,150,55,160,65,170,75,180,85,190,95,0 +0,106,12,118,24,130,36,142,48,154,60,166,72,178,84,190,96,2,108,14,120,26,132,38,144,50,156,62,168,74,180,86,192,98,4,110,16,122,28,134,40,146,52,158,64,170,76,182,88,194,100,6,112,18,124,30,136,42,148,54,160,66,172,78,184,90,196,102,8,114,20,126,32,138,44,150,56,162,68,174,80,186,92,198,104,10,116,22,128,34,140,46,152,58,164,70,176,82,188,94,0,106,12,118,24,130,36,142,48,154,60,166,72,178,84,190,96,2,108,14,120,26,132,38,144,50,156,62,168,74,180,86,192,98,4,110,16,122,28,134,40,146,52,158,64,170,76,182,88,194,100,6,112,18,124,30,136,42,148,54,160,66,172,78,184,90,196,102,8,114,20,126,32,138,44,150,56,162,68,174,80,186,92,198,104,10,116,22,128,34,140,46,152,58,164,70,176,82,188,94,0 +0,107,14,121,28,135,42,149,56,163,70,177,84,191,98,5,112,19,126,33,140,47,154,61,168,75,182,89,196,103,10,117,24,131,38,145,52,159,66,173,80,187,94,1,108,15,122,29,136,43,150,57,164,71,178,85,192,99,6,113,20,127,34,141,48,155,62,169,76,183,90,197,104,11,118,25,132,39,146,53,160,67,174,81,188,95,2,109,16,123,30,137,44,151,58,165,72,179,86,193,100,7,114,21,128,35,142,49,156,63,170,77,184,91,198,105,12,119,26,133,40,147,54,161,68,175,82,189,96,3,110,17,124,31,138,45,152,59,166,73,180,87,194,101,8,115,22,129,36,143,50,157,64,171,78,185,92,199,106,13,120,27,134,41,148,55,162,69,176,83,190,97,4,111,18,125,32,139,46,153,60,167,74,181,88,195,102,9,116,23,130,37,144,51,158,65,172,79,186,93,0 +0,108,16,124,32,140,48,156,64,172,80,188,96,4,112,20,128,36,144,52,160,68,176,84,192,100,8,116,24,132,40,148,56,164,72,180,88,196,104,12,120,28,136,44,152,60,168,76,184,92,0,108,16,124,32,140,48,156,64,172,80,188,96,4,112,20,128,36,144,52,160,68,176,84,192,100,8,116,24,132,40,148,56,164,72,180,88,196,104,12,120,28,136,44,152,60,168,76,184,92,0,108,16,124,32,140,48,156,64,172,80,188,96,4,112,20,128,36,144,52,160,68,176,84,192,100,8,116,24,132,40,148,56,164,72,180,88,196,104,12,120,28,136,44,152,60,168,76,184,92,0,108,16,124,32,140,48,156,64,172,80,188,96,4,112,20,128,36,144,52,160,68,176,84,192,100,8,116,24,132,40,148,56,164,72,180,88,196,104,12,120,28,136,44,152,60,168,76,184,92,0 +0,109,18,127,36,145,54,163,72,181,90,199,108,17,126,35,144,53,162,71,180,89,198,107,16,125,34,143,52,161,70,179,88,197,106,15,124,33,142,51,160,69,178,87,196,105,14,123,32,141,50,159,68,177,86,195,104,13,122,31,140,49,158,67,176,85,194,103,12,121,30,139,48,157,66,175,84,193,102,11,120,29,138,47,156,65,174,83,192,101,10,119,28,137,46,155,64,173,82,191,100,9,118,27,136,45,154,63,172,81,190,99,8,117,26,135,44,153,62,171,80,189,98,7,116,25,134,43,152,61,170,79,188,97,6,115,24,133,42,151,60,169,78,187,96,5,114,23,132,41,150,59,168,77,186,95,4,113,22,131,40,149,58,167,76,185,94,3,112,21,130,39,148,57,166,75,184,93,2,111,20,129,38,147,56,165,74,183,92,1,110,19,128,37,146,55,164,73,182,91,0 +0,110,20,130,40,150,60,170,80,190,100,10,120,30,140,50,160,70,180,90,0,110,20,130,40,150,60,170,80,190,100,10,120,30,140,50,160,70,180,90,0,110,20,130,40,150,60,170,80,190,100,10,120,30,140,50,160,70,180,90,0,110,20,130,40,150,60,170,80,190,100,10,120,30,140,50,160,70,180,90,0,110,20,130,40,150,60,170,80,190,100,10,120,30,140,50,160,70,180,90,0,110,20,130,40,150,60,170,80,190,100,10,120,30,140,50,160,70,180,90,0,110,20,130,40,150,60,170,80,190,100,10,120,30,140,50,160,70,180,90,0,110,20,130,40,150,60,170,80,190,100,10,120,30,140,50,160,70,180,90,0,110,20,130,40,150,60,170,80,190,100,10,120,30,140,50,160,70,180,90,0,110,20,130,40,150,60,170,80,190,100,10,120,30,140,50,160,70,180,90,0 +0,111,22,133,44,155,66,177,88,199,110,21,132,43,154,65,176,87,198,109,20,131,42,153,64,175,86,197,108,19,130,41,152,63,174,85,196,107,18,129,40,151,62,173,84,195,106,17,128,39,150,61,172,83,194,105,16,127,38,149,60,171,82,193,104,15,126,37,148,59,170,81,192,103,14,125,36,147,58,169,80,191,102,13,124,35,146,57,168,79,190,101,12,123,34,145,56,167,78,189,100,11,122,33,144,55,166,77,188,99,10,121,32,143,54,165,76,187,98,9,120,31,142,53,164,75,186,97,8,119,30,141,52,163,74,185,96,7,118,29,140,51,162,73,184,95,6,117,28,139,50,161,72,183,94,5,116,27,138,49,160,71,182,93,4,115,26,137,48,159,70,181,92,3,114,25,136,47,158,69,180,91,2,113,24,135,46,157,68,179,90,1,112,23,134,45,156,67,178,89,0 +0,112,24,136,48,160,72,184,96,8,120,32,144,56,168,80,192,104,16,128,40,152,64,176,88,0,112,24,136,48,160,72,184,96,8,120,32,144,56,168,80,192,104,16,128,40,152,64,176,88,0,112,24,136,48,160,72,184,96,8,120,32,144,56,168,80,192,104,16,128,40,152,64,176,88,0,112,24,136,48,160,72,184,96,8,120,32,144,56,168,80,192,104,16,128,40,152,64,176,88,0,112,24,136,48,160,72,184,96,8,120,32,144,56,168,80,192,104,16,128,40,152,64,176,88,0,112,24,136,48,160,72,184,96,8,120,32,144,56,168,80,192,104,16,128,40,152,64,176,88,0,112,24,136,48,160,72,184,96,8,120,32,144,56,168,80,192,104,16,128,40,152,64,176,88,0,112,24,136,48,160,72,184,96,8,120,32,144,56,168,80,192,104,16,128,40,152,64,176,88,0 +0,113,26,139,52,165,78,191,104,17,130,43,156,69,182,95,8,121,34,147,60,173,86,199,112,25,138,51,164,77,190,103,16,129,42,155,68,181,94,7,120,33,146,59,172,85,198,111,24,137,50,163,76,189,102,15,128,41,154,67,180,93,6,119,32,145,58,171,84,197,110,23,136,49,162,75,188,101,14,127,40,153,66,179,92,5,118,31,144,57,170,83,196,109,22,135,48,161,74,187,100,13,126,39,152,65,178,91,4,117,30,143,56,169,82,195,108,21,134,47,160,73,186,99,12,125,38,151,64,177,90,3,116,29,142,55,168,81,194,107,20,133,46,159,72,185,98,11,124,37,150,63,176,89,2,115,28,141,54,167,80,193,106,19,132,45,158,71,184,97,10,123,36,149,62,175,88,1,114,27,140,53,166,79,192,105,18,131,44,157,70,183,96,9,122,35,148,61,174,87,0 +0,114,28,142,56,170,84,198,112,26,140,54,168,82,196,110,24,138,52,166,80,194,108,22,136,50,164,78,192,106,20,134,48,162,76,190,104,18,132,46,160,74,188,102,16,130,44,158,72,186,100,14,128,42,156,70,184,98,12,126,40,154,68,182,96,10,124,38,152,66,180,94,8,122,36,150,64,178,92,6,120,34,148,62,176,90,4,118,32,146,60,174,88,2,116,30,144,58,172,86,0,114,28,142,56,170,84,198,112,26,140,54,168,82,196,110,24,138,52,166,80,194,108,22,136,50,164,78,192,106,20,134,48,162,76,190,104,18,132,46,160,74,188,102,16,130,44,158,72,186,100,14,128,42,156,70,184,98,12,126,40,154,68,182,96,10,124,38,152,66,180,94,8,122,36,150,64,178,92,6,120,34,148,62,176,90,4,118,32,146,60,174,88,2,116,30,144,58,172,86,0 +0,115,30,145,60,175,90,5,120,35,150,65,180,95,10,125,40,155,70,185,100,15,130,45,160,75,190,105,20,135,50,165,80,195,110,25,140,55,170,85,0,115,30,145,60,175,90,5,120,35,150,65,180,95,10,125,40,155,70,185,100,15,130,45,160,75,190,105,20,135,50,165,80,195,110,25,140,55,170,85,0,115,30,145,60,175,90,5,120,35,150,65,180,95,10,125,40,155,70,185,100,15,130,45,160,75,190,105,20,135,50,165,80,195,110,25,140,55,170,85,0,115,30,145,60,175,90,5,120,35,150,65,180,95,10,125,40,155,70,185,100,15,130,45,160,75,190,105,20,135,50,165,80,195,110,25,140,55,170,85,0,115,30,145,60,175,90,5,120,35,150,65,180,95,10,125,40,155,70,185,100,15,130,45,160,75,190,105,20,135,50,165,80,195,110,25,140,55,170,85,0 +0,116,32,148,64,180,96,12,128,44,160,76,192,108,24,140,56,172,88,4,120,36,152,68,184,100,16,132,48,164,80,196,112,28,144,60,176,92,8,124,40,156,72,188,104,20,136,52,168,84,0,116,32,148,64,180,96,12,128,44,160,76,192,108,24,140,56,172,88,4,120,36,152,68,184,100,16,132,48,164,80,196,112,28,144,60,176,92,8,124,40,156,72,188,104,20,136,52,168,84,0,116,32,148,64,180,96,12,128,44,160,76,192,108,24,140,56,172,88,4,120,36,152,68,184,100,16,132,48,164,80,196,112,28,144,60,176,92,8,124,40,156,72,188,104,20,136,52,168,84,0,116,32,148,64,180,96,12,128,44,160,76,192,108,24,140,56,172,88,4,120,36,152,68,184,100,16,132,48,164,80,196,112,28,144,60,176,92,8,124,40,156,72,188,104,20,136,52,168,84,0 +0,117,34,151,68,185,102,19,136,53,170,87,4,121,38,155,72,189,106,23,140,57,174,91,8,125,42,159,76,193,110,27,144,61,178,95,12,129,46,163,80,197,114,31,148,65,182,99,16,133,50,167,84,1,118,35,152,69,186,103,20,137,54,171,88,5,122,39,156,73,190,107,24,141,58,175,92,9,126,43,160,77,194,111,28,145,62,179,96,13,130,47,164,81,198,115,32,149,66,183,100,17,134,51,168,85,2,119,36,153,70,187,104,21,138,55,172,89,6,123,40,157,74,191,108,25,142,59,176,93,10,127,44,161,78,195,112,29,146,63,180,97,14,131,48,165,82,199,116,33,150,67,184,101,18,135,52,169,86,3,120,37,154,71,188,105,22,139,56,173,90,7,124,41,158,75,192,109,26,143,60,177,94,11,128,45,162,79,196,113,30,147,64,181,98,15,132,49,166,83,0 +0,118,36,154,72,190,108,26,144,62,180,98,16,134,52,170,88,6,124,42,160,78,196,114,32,150,68,186,104,22,140,58,176,94,12,130,48,166,84,2,120,38,156,74,192,110,28,146,64,182,100,18,136,54,172,90,8,126,44,162,80,198,116,34,152,70,188,106,24,142,60,178,96,14,132,50,168,86,4,122,40,158,76,194,112,30,148,66,184,102,20,138,56,174,92,10,128,46,164,82,0,118,36,154,72,190,108,26,144,62,180,98,16,134,52,170,88,6,124,42,160,78,196,114,32,150,68,186,104,22,140,58,176,94,12,130,48,166,84,2,120,38,156,74,192,110,28,146,64,182,100,18,136,54,172,90,8,126,44,162,80,198,116,34,152,70,188,106,24,142,60,178,96,14,132,50,168,86,4,122,40,158,76,194,112,30,148,66,184,102,20,138,56,174,92,10,128,46,164,82,0 +0,119,38,157,76,195,114,33,152,71,190,109,28,147,66,185,104,23,142,61,180,99,18,137,56,175,94,13,132,51,170,89,8,127,46,165,84,3,122,41,160,79,198,117,36,155,74,193,112,31,150,69,188,107,26,145,64,183,102,21,140,59,178,97,16,135,54,173,92,11,130,49,168,87,6,125,44,163,82,1,120,39,158,77,196,115,34,153,72,191,110,29,148,67,186,105,24,143,62,181,100,19,138,57,176,95,14,133,52,171,90,9,128,47,166,85,4,123,42,161,80,199,118,37,156,75,194,113,32,151,70,189,108,27,146,65,184,103,22,141,60,179,98,17,136,55,174,93,12,131,50,169,88,7,126,45,164,83,2,121,40,159,78,197,116,35,154,73,192,111,30,149,68,187,106,25,144,63,182,101,20,139,58,177,96,15,134,53,172,91,10,129,48,167,86,5,124,43,162,81,0 +0,120,40,160,80,0,120,40,160,80,0,120,40,160,80,0,120,40,160,80,0,120,40,160,80,0,120,40,160,80,0,120,40,160,80,0,120,40,160,80,0,120,40,160,80,0,120,40,160,80,0,120,40,160,80,0,120,40,160,80,0,120,40,160,80,0,120,40,160,80,0,120,40,160,80,0,120,40,160,80,0,120,40,160,80,0,120,40,160,80,0,120,40,160,80,0,120,40,160,80,0,120,40,160,80,0,120,40,160,80,0,120,40,160,80,0,120,40,160,80,0,120,40,160,80,0,120,40,160,80,0,120,40,160,80,0,120,40,160,80,0,120,40,160,80,0,120,40,160,80,0,120,40,160,80,0,120,40,160,80,0,120,40,160,80,0,120,40,160,80,0,120,40,160,80,0,120,40,160,80,0,120,40,160,80,0,120,40,160,80,0,120,40,160,80,0,120,40,160,80,0 +0,121,42,163,84,5,126,47,168,89,10,131,52,173,94,15,136,57,178,99,20,141,62,183,104,25,146,67,188,109,30,151,72,193,114,35,156,77,198,119,40,161,82,3,124,45,166,87,8,129,50,171,92,13,134,55,176,97,18,139,60,181,102,23,144,65,186,107,28,149,70,191,112,33,154,75,196,117,38,159,80,1,122,43,164,85,6,127,48,169,90,11,132,53,174,95,16,137,58,179,100,21,142,63,184,105,26,147,68,189,110,31,152,73,194,115,36,157,78,199,120,41,162,83,4,125,46,167,88,9,130,51,172,93,14,135,56,177,98,19,140,61,182,103,24,145,66,187,108,29,150,71,192,113,34,155,76,197,118,39,160,81,2,123,44,165,86,7,128,49,170,91,12,133,54,175,96,17,138,59,180,101,22,143,64,185,106,27,148,69,190,111,32,153,74,195,116,37,158,79,0 +0,122,44,166,88,10,132,54,176,98,20,142,64,186,108,30,152,74,196,118,40,162,84,6,128,50,172,94,16,138,60,182,104,26,148,70,192,114,36,158,80,2,124,46,168,90,12,134,56,178,100,22,144,66,188,110,32,154,76,198,120,42,164,86,8,130,52,174,96,18,140,62,184,106,28,150,72,194,116,38,160,82,4,126,48,170,92,14,136,58,180,102,24,146,68,190,112,34,156,78,0,122,44,166,88,10,132,54,176,98,20,142,64,186,108,30,152,74,196,118,40,162,84,6,128,50,172,94,16,138,60,182,104,26,148,70,192,114,36,158,80,2,124,46,168,90,12,134,56,178,100,22,144,66,188,110,32,154,76,198,120,42,164,86,8,130,52,174,96,18,140,62,184,106,28,150,72,194,116,38,160,82,4,126,48,170,92,14,136,58,180,102,24,146,68,190,112,34,156,78,0 +0,123,46,169,92,15,138,61,184,107,30,153,76,199,122,45,168,91,14,137,60,183,106,29,152,75,198,121,44,167,90,13,136,59,182,105,28,151,74,197,120,43,166,89,12,135,58,181,104,27,150,73,196,119,42,165,88,11,134,57,180,103,26,149,72,195,118,41,164,87,10,133,56,179,102,25,148,71,194,117,40,163,86,9,132,55,178,101,24,147,70,193,116,39,162,85,8,131,54,177,100,23,146,69,192,115,38,161,84,7,130,53,176,99,22,145,68,191,114,37,160,83,6,129,52,175,98,21,144,67,190,113,36,159,82,5,128,51,174,97,20,143,66,189,112,35,158,81,4,127,50,173,96,19,142,65,188,111,34,157,80,3,126,49,172,95,18,141,64,187,110,33,156,79,2,125,48,171,94,17,140,63,186,109,32,155,78,1,124,47,170,93,16,139,62,185,108,31,154,77,0 +0,124,48,172,96,20,144,68,192,116,40,164,88,12,136,60,184,108,32,156,80,4,128,52,176,100,24,148,72,196,120,44,168,92,16,140,64,188,112,36,160,84,8,132,56,180,104,28,152,76,0,124,48,172,96,20,144,68,192,116,40,164,88,12,136,60,184,108,32,156,80,4,128,52,176,100,24,148,72,196,120,44,168,92,16,140,64,188,112,36,160,84,8,132,56,180,104,28,152,76,0,124,48,172,96,20,144,68,192,116,40,164,88,12,136,60,184,108,32,156,80,4,128,52,176,100,24,148,72,196,120,44,168,92,16,140,64,188,112,36,160,84,8,132,56,180,104,28,152,76,0,124,48,172,96,20,144,68,192,116,40,164,88,12,136,60,184,108,32,156,80,4,128,52,176,100,24,148,72,196,120,44,168,92,16,140,64,188,112,36,160,84,8,132,56,180,104,28,152,76,0 +0,125,50,175,100,25,150,75,0,125,50,175,100,25,150,75,0,125,50,175,100,25,150,75,0,125,50,175,100,25,150,75,0,125,50,175,100,25,150,75,0,125,50,175,100,25,150,75,0,125,50,175,100,25,150,75,0,125,50,175,100,25,150,75,0,125,50,175,100,25,150,75,0,125,50,175,100,25,150,75,0,125,50,175,100,25,150,75,0,125,50,175,100,25,150,75,0,125,50,175,100,25,150,75,0,125,50,175,100,25,150,75,0,125,50,175,100,25,150,75,0,125,50,175,100,25,150,75,0,125,50,175,100,25,150,75,0,125,50,175,100,25,150,75,0,125,50,175,100,25,150,75,0,125,50,175,100,25,150,75,0,125,50,175,100,25,150,75,0,125,50,175,100,25,150,75,0,125,50,175,100,25,150,75,0,125,50,175,100,25,150,75,0,125,50,175,100,25,150,75,0 +0,126,52,178,104,30,156,82,8,134,60,186,112,38,164,90,16,142,68,194,120,46,172,98,24,150,76,2,128,54,180,106,32,158,84,10,136,62,188,114,40,166,92,18,144,70,196,122,48,174,100,26,152,78,4,130,56,182,108,34,160,86,12,138,64,190,116,42,168,94,20,146,72,198,124,50,176,102,28,154,80,6,132,58,184,110,36,162,88,14,140,66,192,118,44,170,96,22,148,74,0,126,52,178,104,30,156,82,8,134,60,186,112,38,164,90,16,142,68,194,120,46,172,98,24,150,76,2,128,54,180,106,32,158,84,10,136,62,188,114,40,166,92,18,144,70,196,122,48,174,100,26,152,78,4,130,56,182,108,34,160,86,12,138,64,190,116,42,168,94,20,146,72,198,124,50,176,102,28,154,80,6,132,58,184,110,36,162,88,14,140,66,192,118,44,170,96,22,148,74,0 +0,127,54,181,108,35,162,89,16,143,70,197,124,51,178,105,32,159,86,13,140,67,194,121,48,175,102,29,156,83,10,137,64,191,118,45,172,99,26,153,80,7,134,61,188,115,42,169,96,23,150,77,4,131,58,185,112,39,166,93,20,147,74,1,128,55,182,109,36,163,90,17,144,71,198,125,52,179,106,33,160,87,14,141,68,195,122,49,176,103,30,157,84,11,138,65,192,119,46,173,100,27,154,81,8,135,62,189,116,43,170,97,24,151,78,5,132,59,186,113,40,167,94,21,148,75,2,129,56,183,110,37,164,91,18,145,72,199,126,53,180,107,34,161,88,15,142,69,196,123,50,177,104,31,158,85,12,139,66,193,120,47,174,101,28,155,82,9,136,63,190,117,44,171,98,25,152,79,6,133,60,187,114,41,168,95,22,149,76,3,130,57,184,111,38,165,92,19,146,73,0 +0,128,56,184,112,40,168,96,24,152,80,8,136,64,192,120,48,176,104,32,160,88,16,144,72,0,128,56,184,112,40,168,96,24,152,80,8,136,64,192,120,48,176,104,32,160,88,16,144,72,0,128,56,184,112,40,168,96,24,152,80,8,136,64,192,120,48,176,104,32,160,88,16,144,72,0,128,56,184,112,40,168,96,24,152,80,8,136,64,192,120,48,176,104,32,160,88,16,144,72,0,128,56,184,112,40,168,96,24,152,80,8,136,64,192,120,48,176,104,32,160,88,16,144,72,0,128,56,184,112,40,168,96,24,152,80,8,136,64,192,120,48,176,104,32,160,88,16,144,72,0,128,56,184,112,40,168,96,24,152,80,8,136,64,192,120,48,176,104,32,160,88,16,144,72,0,128,56,184,112,40,168,96,24,152,80,8,136,64,192,120,48,176,104,32,160,88,16,144,72,0 +0,129,58,187,116,45,174,103,32,161,90,19,148,77,6,135,64,193,122,51,180,109,38,167,96,25,154,83,12,141,70,199,128,57,186,115,44,173,102,31,160,89,18,147,76,5,134,63,192,121,50,179,108,37,166,95,24,153,82,11,140,69,198,127,56,185,114,43,172,101,30,159,88,17,146,75,4,133,62,191,120,49,178,107,36,165,94,23,152,81,10,139,68,197,126,55,184,113,42,171,100,29,158,87,16,145,74,3,132,61,190,119,48,177,106,35,164,93,22,151,80,9,138,67,196,125,54,183,112,41,170,99,28,157,86,15,144,73,2,131,60,189,118,47,176,105,34,163,92,21,150,79,8,137,66,195,124,53,182,111,40,169,98,27,156,85,14,143,72,1,130,59,188,117,46,175,104,33,162,91,20,149,78,7,136,65,194,123,52,181,110,39,168,97,26,155,84,13,142,71,0 +0,130,60,190,120,50,180,110,40,170,100,30,160,90,20,150,80,10,140,70,0,130,60,190,120,50,180,110,40,170,100,30,160,90,20,150,80,10,140,70,0,130,60,190,120,50,180,110,40,170,100,30,160,90,20,150,80,10,140,70,0,130,60,190,120,50,180,110,40,170,100,30,160,90,20,150,80,10,140,70,0,130,60,190,120,50,180,110,40,170,100,30,160,90,20,150,80,10,140,70,0,130,60,190,120,50,180,110,40,170,100,30,160,90,20,150,80,10,140,70,0,130,60,190,120,50,180,110,40,170,100,30,160,90,20,150,80,10,140,70,0,130,60,190,120,50,180,110,40,170,100,30,160,90,20,150,80,10,140,70,0,130,60,190,120,50,180,110,40,170,100,30,160,90,20,150,80,10,140,70,0,130,60,190,120,50,180,110,40,170,100,30,160,90,20,150,80,10,140,70,0 +0,131,62,193,124,55,186,117,48,179,110,41,172,103,34,165,96,27,158,89,20,151,82,13,144,75,6,137,68,199,130,61,192,123,54,185,116,47,178,109,40,171,102,33,164,95,26,157,88,19,150,81,12,143,74,5,136,67,198,129,60,191,122,53,184,115,46,177,108,39,170,101,32,163,94,25,156,87,18,149,80,11,142,73,4,135,66,197,128,59,190,121,52,183,114,45,176,107,38,169,100,31,162,93,24,155,86,17,148,79,10,141,72,3,134,65,196,127,58,189,120,51,182,113,44,175,106,37,168,99,30,161,92,23,154,85,16,147,78,9,140,71,2,133,64,195,126,57,188,119,50,181,112,43,174,105,36,167,98,29,160,91,22,153,84,15,146,77,8,139,70,1,132,63,194,125,56,187,118,49,180,111,42,173,104,35,166,97,28,159,90,21,152,83,14,145,76,7,138,69,0 +0,132,64,196,128,60,192,124,56,188,120,52,184,116,48,180,112,44,176,108,40,172,104,36,168,100,32,164,96,28,160,92,24,156,88,20,152,84,16,148,80,12,144,76,8,140,72,4,136,68,0,132,64,196,128,60,192,124,56,188,120,52,184,116,48,180,112,44,176,108,40,172,104,36,168,100,32,164,96,28,160,92,24,156,88,20,152,84,16,148,80,12,144,76,8,140,72,4,136,68,0,132,64,196,128,60,192,124,56,188,120,52,184,116,48,180,112,44,176,108,40,172,104,36,168,100,32,164,96,28,160,92,24,156,88,20,152,84,16,148,80,12,144,76,8,140,72,4,136,68,0,132,64,196,128,60,192,124,56,188,120,52,184,116,48,180,112,44,176,108,40,172,104,36,168,100,32,164,96,28,160,92,24,156,88,20,152,84,16,148,80,12,144,76,8,140,72,4,136,68,0 +0,133,66,199,132,65,198,131,64,197,130,63,196,129,62,195,128,61,194,127,60,193,126,59,192,125,58,191,124,57,190,123,56,189,122,55,188,121,54,187,120,53,186,119,52,185,118,51,184,117,50,183,116,49,182,115,48,181,114,47,180,113,46,179,112,45,178,111,44,177,110,43,176,109,42,175,108,41,174,107,40,173,106,39,172,105,38,171,104,37,170,103,36,169,102,35,168,101,34,167,100,33,166,99,32,165,98,31,164,97,30,163,96,29,162,95,28,161,94,27,160,93,26,159,92,25,158,91,24,157,90,23,156,89,22,155,88,21,154,87,20,153,86,19,152,85,18,151,84,17,150,83,16,149,82,15,148,81,14,147,80,13,146,79,12,145,78,11,144,77,10,143,76,9,142,75,8,141,74,7,140,73,6,139,72,5,138,71,4,137,70,3,136,69,2,135,68,1,134,67,0 +0,134,68,2,136,70,4,138,72,6,140,74,8,142,76,10,144,78,12,146,80,14,148,82,16,150,84,18,152,86,20,154,88,22,156,90,24,158,92,26,160,94,28,162,96,30,164,98,32,166,100,34,168,102,36,170,104,38,172,106,40,174,108,42,176,110,44,178,112,46,180,114,48,182,116,50,184,118,52,186,120,54,188,122,56,190,124,58,192,126,60,194,128,62,196,130,64,198,132,66,0,134,68,2,136,70,4,138,72,6,140,74,8,142,76,10,144,78,12,146,80,14,148,82,16,150,84,18,152,86,20,154,88,22,156,90,24,158,92,26,160,94,28,162,96,30,164,98,32,166,100,34,168,102,36,170,104,38,172,106,40,174,108,42,176,110,44,178,112,46,180,114,48,182,116,50,184,118,52,186,120,54,188,122,56,190,124,58,192,126,60,194,128,62,196,130,64,198,132,66,0 +0,135,70,5,140,75,10,145,80,15,150,85,20,155,90,25,160,95,30,165,100,35,170,105,40,175,110,45,180,115,50,185,120,55,190,125,60,195,130,65,0,135,70,5,140,75,10,145,80,15,150,85,20,155,90,25,160,95,30,165,100,35,170,105,40,175,110,45,180,115,50,185,120,55,190,125,60,195,130,65,0,135,70,5,140,75,10,145,80,15,150,85,20,155,90,25,160,95,30,165,100,35,170,105,40,175,110,45,180,115,50,185,120,55,190,125,60,195,130,65,0,135,70,5,140,75,10,145,80,15,150,85,20,155,90,25,160,95,30,165,100,35,170,105,40,175,110,45,180,115,50,185,120,55,190,125,60,195,130,65,0,135,70,5,140,75,10,145,80,15,150,85,20,155,90,25,160,95,30,165,100,35,170,105,40,175,110,45,180,115,50,185,120,55,190,125,60,195,130,65,0 +0,136,72,8,144,80,16,152,88,24,160,96,32,168,104,40,176,112,48,184,120,56,192,128,64,0,136,72,8,144,80,16,152,88,24,160,96,32,168,104,40,176,112,48,184,120,56,192,128,64,0,136,72,8,144,80,16,152,88,24,160,96,32,168,104,40,176,112,48,184,120,56,192,128,64,0,136,72,8,144,80,16,152,88,24,160,96,32,168,104,40,176,112,48,184,120,56,192,128,64,0,136,72,8,144,80,16,152,88,24,160,96,32,168,104,40,176,112,48,184,120,56,192,128,64,0,136,72,8,144,80,16,152,88,24,160,96,32,168,104,40,176,112,48,184,120,56,192,128,64,0,136,72,8,144,80,16,152,88,24,160,96,32,168,104,40,176,112,48,184,120,56,192,128,64,0,136,72,8,144,80,16,152,88,24,160,96,32,168,104,40,176,112,48,184,120,56,192,128,64,0 +0,137,74,11,148,85,22,159,96,33,170,107,44,181,118,55,192,129,66,3,140,77,14,151,88,25,162,99,36,173,110,47,184,121,58,195,132,69,6,143,80,17,154,91,28,165,102,39,176,113,50,187,124,61,198,135,72,9,146,83,20,157,94,31,168,105,42,179,116,53,190,127,64,1,138,75,12,149,86,23,160,97,34,171,108,45,182,119,56,193,130,67,4,141,78,15,152,89,26,163,100,37,174,111,48,185,122,59,196,133,70,7,144,81,18,155,92,29,166,103,40,177,114,51,188,125,62,199,136,73,10,147,84,21,158,95,32,169,106,43,180,117,54,191,128,65,2,139,76,13,150,87,24,161,98,35,172,109,46,183,120,57,194,131,68,5,142,79,16,153,90,27,164,101,38,175,112,49,186,123,60,197,134,71,8,145,82,19,156,93,30,167,104,41,178,115,52,189,126,63,0 +0,138,76,14,152,90,28,166,104,42,180,118,56,194,132,70,8,146,84,22,160,98,36,174,112,50,188,126,64,2,140,78,16,154,92,30,168,106,44,182,120,58,196,134,72,10,148,86,24,162,100,38,176,114,52,190,128,66,4,142,80,18,156,94,32,170,108,46,184,122,60,198,136,74,12,150,88,26,164,102,40,178,116,54,192,130,68,6,144,82,20,158,96,34,172,110,48,186,124,62,0,138,76,14,152,90,28,166,104,42,180,118,56,194,132,70,8,146,84,22,160,98,36,174,112,50,188,126,64,2,140,78,16,154,92,30,168,106,44,182,120,58,196,134,72,10,148,86,24,162,100,38,176,114,52,190,128,66,4,142,80,18,156,94,32,170,108,46,184,122,60,198,136,74,12,150,88,26,164,102,40,178,116,54,192,130,68,6,144,82,20,158,96,34,172,110,48,186,124,62,0 +0,139,78,17,156,95,34,173,112,51,190,129,68,7,146,85,24,163,102,41,180,119,58,197,136,75,14,153,92,31,170,109,48,187,126,65,4,143,82,21,160,99,38,177,116,55,194,133,72,11,150,89,28,167,106,45,184,123,62,1,140,79,18,157,96,35,174,113,52,191,130,69,8,147,86,25,164,103,42,181,120,59,198,137,76,15,154,93,32,171,110,49,188,127,66,5,144,83,22,161,100,39,178,117,56,195,134,73,12,151,90,29,168,107,46,185,124,63,2,141,80,19,158,97,36,175,114,53,192,131,70,9,148,87,26,165,104,43,182,121,60,199,138,77,16,155,94,33,172,111,50,189,128,67,6,145,84,23,162,101,40,179,118,57,196,135,74,13,152,91,30,169,108,47,186,125,64,3,142,81,20,159,98,37,176,115,54,193,132,71,10,149,88,27,166,105,44,183,122,61,0 +0,140,80,20,160,100,40,180,120,60,0,140,80,20,160,100,40,180,120,60,0,140,80,20,160,100,40,180,120,60,0,140,80,20,160,100,40,180,120,60,0,140,80,20,160,100,40,180,120,60,0,140,80,20,160,100,40,180,120,60,0,140,80,20,160,100,40,180,120,60,0,140,80,20,160,100,40,180,120,60,0,140,80,20,160,100,40,180,120,60,0,140,80,20,160,100,40,180,120,60,0,140,80,20,160,100,40,180,120,60,0,140,80,20,160,100,40,180,120,60,0,140,80,20,160,100,40,180,120,60,0,140,80,20,160,100,40,180,120,60,0,140,80,20,160,100,40,180,120,60,0,140,80,20,160,100,40,180,120,60,0,140,80,20,160,100,40,180,120,60,0,140,80,20,160,100,40,180,120,60,0,140,80,20,160,100,40,180,120,60,0,140,80,20,160,100,40,180,120,60,0 +0,141,82,23,164,105,46,187,128,69,10,151,92,33,174,115,56,197,138,79,20,161,102,43,184,125,66,7,148,89,30,171,112,53,194,135,76,17,158,99,40,181,122,63,4,145,86,27,168,109,50,191,132,73,14,155,96,37,178,119,60,1,142,83,24,165,106,47,188,129,70,11,152,93,34,175,116,57,198,139,80,21,162,103,44,185,126,67,8,149,90,31,172,113,54,195,136,77,18,159,100,41,182,123,64,5,146,87,28,169,110,51,192,133,74,15,156,97,38,179,120,61,2,143,84,25,166,107,48,189,130,71,12,153,94,35,176,117,58,199,140,81,22,163,104,45,186,127,68,9,150,91,32,173,114,55,196,137,78,19,160,101,42,183,124,65,6,147,88,29,170,111,52,193,134,75,16,157,98,39,180,121,62,3,144,85,26,167,108,49,190,131,72,13,154,95,36,177,118,59,0 +0,142,84,26,168,110,52,194,136,78,20,162,104,46,188,130,72,14,156,98,40,182,124,66,8,150,92,34,176,118,60,2,144,86,28,170,112,54,196,138,80,22,164,106,48,190,132,74,16,158,100,42,184,126,68,10,152,94,36,178,120,62,4,146,88,30,172,114,56,198,140,82,24,166,108,50,192,134,76,18,160,102,44,186,128,70,12,154,96,38,180,122,64,6,148,90,32,174,116,58,0,142,84,26,168,110,52,194,136,78,20,162,104,46,188,130,72,14,156,98,40,182,124,66,8,150,92,34,176,118,60,2,144,86,28,170,112,54,196,138,80,22,164,106,48,190,132,74,16,158,100,42,184,126,68,10,152,94,36,178,120,62,4,146,88,30,172,114,56,198,140,82,24,166,108,50,192,134,76,18,160,102,44,186,128,70,12,154,96,38,180,122,64,6,148,90,32,174,116,58,0 +0,143,86,29,172,115,58,1,144,87,30,173,116,59,2,145,88,31,174,117,60,3,146,89,32,175,118,61,4,147,90,33,176,119,62,5,148,91,34,177,120,63,6,149,92,35,178,121,64,7,150,93,36,179,122,65,8,151,94,37,180,123,66,9,152,95,38,181,124,67,10,153,96,39,182,125,68,11,154,97,40,183,126,69,12,155,98,41,184,127,70,13,156,99,42,185,128,71,14,157,100,43,186,129,72,15,158,101,44,187,130,73,16,159,102,45,188,131,74,17,160,103,46,189,132,75,18,161,104,47,190,133,76,19,162,105,48,191,134,77,20,163,106,49,192,135,78,21,164,107,50,193,136,79,22,165,108,51,194,137,80,23,166,109,52,195,138,81,24,167,110,53,196,139,82,25,168,111,54,197,140,83,26,169,112,55,198,141,84,27,170,113,56,199,142,85,28,171,114,57,0 +0,144,88,32,176,120,64,8,152,96,40,184,128,72,16,160,104,48,192,136,80,24,168,112,56,0,144,88,32,176,120,64,8,152,96,40,184,128,72,16,160,104,48,192,136,80,24,168,112,56,0,144,88,32,176,120,64,8,152,96,40,184,128,72,16,160,104,48,192,136,80,24,168,112,56,0,144,88,32,176,120,64,8,152,96,40,184,128,72,16,160,104,48,192,136,80,24,168,112,56,0,144,88,32,176,120,64,8,152,96,40,184,128,72,16,160,104,48,192,136,80,24,168,112,56,0,144,88,32,176,120,64,8,152,96,40,184,128,72,16,160,104,48,192,136,80,24,168,112,56,0,144,88,32,176,120,64,8,152,96,40,184,128,72,16,160,104,48,192,136,80,24,168,112,56,0,144,88,32,176,120,64,8,152,96,40,184,128,72,16,160,104,48,192,136,80,24,168,112,56,0 +0,145,90,35,180,125,70,15,160,105,50,195,140,85,30,175,120,65,10,155,100,45,190,135,80,25,170,115,60,5,150,95,40,185,130,75,20,165,110,55,0,145,90,35,180,125,70,15,160,105,50,195,140,85,30,175,120,65,10,155,100,45,190,135,80,25,170,115,60,5,150,95,40,185,130,75,20,165,110,55,0,145,90,35,180,125,70,15,160,105,50,195,140,85,30,175,120,65,10,155,100,45,190,135,80,25,170,115,60,5,150,95,40,185,130,75,20,165,110,55,0,145,90,35,180,125,70,15,160,105,50,195,140,85,30,175,120,65,10,155,100,45,190,135,80,25,170,115,60,5,150,95,40,185,130,75,20,165,110,55,0,145,90,35,180,125,70,15,160,105,50,195,140,85,30,175,120,65,10,155,100,45,190,135,80,25,170,115,60,5,150,95,40,185,130,75,20,165,110,55,0 +0,146,92,38,184,130,76,22,168,114,60,6,152,98,44,190,136,82,28,174,120,66,12,158,104,50,196,142,88,34,180,126,72,18,164,110,56,2,148,94,40,186,132,78,24,170,116,62,8,154,100,46,192,138,84,30,176,122,68,14,160,106,52,198,144,90,36,182,128,74,20,166,112,58,4,150,96,42,188,134,80,26,172,118,64,10,156,102,48,194,140,86,32,178,124,70,16,162,108,54,0,146,92,38,184,130,76,22,168,114,60,6,152,98,44,190,136,82,28,174,120,66,12,158,104,50,196,142,88,34,180,126,72,18,164,110,56,2,148,94,40,186,132,78,24,170,116,62,8,154,100,46,192,138,84,30,176,122,68,14,160,106,52,198,144,90,36,182,128,74,20,166,112,58,4,150,96,42,188,134,80,26,172,118,64,10,156,102,48,194,140,86,32,178,124,70,16,162,108,54,0 +0,147,94,41,188,135,82,29,176,123,70,17,164,111,58,5,152,99,46,193,140,87,34,181,128,75,22,169,116,63,10,157,104,51,198,145,92,39,186,133,80,27,174,121,68,15,162,109,56,3,150,97,44,191,138,85,32,179,126,73,20,167,114,61,8,155,102,49,196,143,90,37,184,131,78,25,172,119,66,13,160,107,54,1,148,95,42,189,136,83,30,177,124,71,18,165,112,59,6,153,100,47,194,141,88,35,182,129,76,23,170,117,64,11,158,105,52,199,146,93,40,187,134,81,28,175,122,69,16,163,110,57,4,151,98,45,192,139,86,33,180,127,74,21,168,115,62,9,156,103,50,197,144,91,38,185,132,79,26,173,120,67,14,161,108,55,2,149,96,43,190,137,84,31,178,125,72,19,166,113,60,7,154,101,48,195,142,89,36,183,130,77,24,171,118,65,12,159,106,53,0 +0,148,96,44,192,140,88,36,184,132,80,28,176,124,72,20,168,116,64,12,160,108,56,4,152,100,48,196,144,92,40,188,136,84,32,180,128,76,24,172,120,68,16,164,112,60,8,156,104,52,0,148,96,44,192,140,88,36,184,132,80,28,176,124,72,20,168,116,64,12,160,108,56,4,152,100,48,196,144,92,40,188,136,84,32,180,128,76,24,172,120,68,16,164,112,60,8,156,104,52,0,148,96,44,192,140,88,36,184,132,80,28,176,124,72,20,168,116,64,12,160,108,56,4,152,100,48,196,144,92,40,188,136,84,32,180,128,76,24,172,120,68,16,164,112,60,8,156,104,52,0,148,96,44,192,140,88,36,184,132,80,28,176,124,72,20,168,116,64,12,160,108,56,4,152,100,48,196,144,92,40,188,136,84,32,180,128,76,24,172,120,68,16,164,112,60,8,156,104,52,0 +0,149,98,47,196,145,94,43,192,141,90,39,188,137,86,35,184,133,82,31,180,129,78,27,176,125,74,23,172,121,70,19,168,117,66,15,164,113,62,11,160,109,58,7,156,105,54,3,152,101,50,199,148,97,46,195,144,93,42,191,140,89,38,187,136,85,34,183,132,81,30,179,128,77,26,175,124,73,22,171,120,69,18,167,116,65,14,163,112,61,10,159,108,57,6,155,104,53,2,151,100,49,198,147,96,45,194,143,92,41,190,139,88,37,186,135,84,33,182,131,80,29,178,127,76,25,174,123,72,21,170,119,68,17,166,115,64,13,162,111,60,9,158,107,56,5,154,103,52,1,150,99,48,197,146,95,44,193,142,91,40,189,138,87,36,185,134,83,32,181,130,79,28,177,126,75,24,173,122,71,20,169,118,67,16,165,114,63,12,161,110,59,8,157,106,55,4,153,102,51,0 +0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0,150,100,50,0 +0,151,102,53,4,155,106,57,8,159,110,61,12,163,114,65,16,167,118,69,20,171,122,73,24,175,126,77,28,179,130,81,32,183,134,85,36,187,138,89,40,191,142,93,44,195,146,97,48,199,150,101,52,3,154,105,56,7,158,109,60,11,162,113,64,15,166,117,68,19,170,121,72,23,174,125,76,27,178,129,80,31,182,133,84,35,186,137,88,39,190,141,92,43,194,145,96,47,198,149,100,51,2,153,104,55,6,157,108,59,10,161,112,63,14,165,116,67,18,169,120,71,22,173,124,75,26,177,128,79,30,181,132,83,34,185,136,87,38,189,140,91,42,193,144,95,46,197,148,99,50,1,152,103,54,5,156,107,58,9,160,111,62,13,164,115,66,17,168,119,70,21,172,123,74,25,176,127,78,29,180,131,82,33,184,135,86,37,188,139,90,41,192,143,94,45,196,147,98,49,0 +0,152,104,56,8,160,112,64,16,168,120,72,24,176,128,80,32,184,136,88,40,192,144,96,48,0,152,104,56,8,160,112,64,16,168,120,72,24,176,128,80,32,184,136,88,40,192,144,96,48,0,152,104,56,8,160,112,64,16,168,120,72,24,176,128,80,32,184,136,88,40,192,144,96,48,0,152,104,56,8,160,112,64,16,168,120,72,24,176,128,80,32,184,136,88,40,192,144,96,48,0,152,104,56,8,160,112,64,16,168,120,72,24,176,128,80,32,184,136,88,40,192,144,96,48,0,152,104,56,8,160,112,64,16,168,120,72,24,176,128,80,32,184,136,88,40,192,144,96,48,0,152,104,56,8,160,112,64,16,168,120,72,24,176,128,80,32,184,136,88,40,192,144,96,48,0,152,104,56,8,160,112,64,16,168,120,72,24,176,128,80,32,184,136,88,40,192,144,96,48,0 +0,153,106,59,12,165,118,71,24,177,130,83,36,189,142,95,48,1,154,107,60,13,166,119,72,25,178,131,84,37,190,143,96,49,2,155,108,61,14,167,120,73,26,179,132,85,38,191,144,97,50,3,156,109,62,15,168,121,74,27,180,133,86,39,192,145,98,51,4,157,110,63,16,169,122,75,28,181,134,87,40,193,146,99,52,5,158,111,64,17,170,123,76,29,182,135,88,41,194,147,100,53,6,159,112,65,18,171,124,77,30,183,136,89,42,195,148,101,54,7,160,113,66,19,172,125,78,31,184,137,90,43,196,149,102,55,8,161,114,67,20,173,126,79,32,185,138,91,44,197,150,103,56,9,162,115,68,21,174,127,80,33,186,139,92,45,198,151,104,57,10,163,116,69,22,175,128,81,34,187,140,93,46,199,152,105,58,11,164,117,70,23,176,129,82,35,188,141,94,47,0 +0,154,108,62,16,170,124,78,32,186,140,94,48,2,156,110,64,18,172,126,80,34,188,142,96,50,4,158,112,66,20,174,128,82,36,190,144,98,52,6,160,114,68,22,176,130,84,38,192,146,100,54,8,162,116,70,24,178,132,86,40,194,148,102,56,10,164,118,72,26,180,134,88,42,196,150,104,58,12,166,120,74,28,182,136,90,44,198,152,106,60,14,168,122,76,30,184,138,92,46,0,154,108,62,16,170,124,78,32,186,140,94,48,2,156,110,64,18,172,126,80,34,188,142,96,50,4,158,112,66,20,174,128,82,36,190,144,98,52,6,160,114,68,22,176,130,84,38,192,146,100,54,8,162,116,70,24,178,132,86,40,194,148,102,56,10,164,118,72,26,180,134,88,42,196,150,104,58,12,166,120,74,28,182,136,90,44,198,152,106,60,14,168,122,76,30,184,138,92,46,0 +0,155,110,65,20,175,130,85,40,195,150,105,60,15,170,125,80,35,190,145,100,55,10,165,120,75,30,185,140,95,50,5,160,115,70,25,180,135,90,45,0,155,110,65,20,175,130,85,40,195,150,105,60,15,170,125,80,35,190,145,100,55,10,165,120,75,30,185,140,95,50,5,160,115,70,25,180,135,90,45,0,155,110,65,20,175,130,85,40,195,150,105,60,15,170,125,80,35,190,145,100,55,10,165,120,75,30,185,140,95,50,5,160,115,70,25,180,135,90,45,0,155,110,65,20,175,130,85,40,195,150,105,60,15,170,125,80,35,190,145,100,55,10,165,120,75,30,185,140,95,50,5,160,115,70,25,180,135,90,45,0,155,110,65,20,175,130,85,40,195,150,105,60,15,170,125,80,35,190,145,100,55,10,165,120,75,30,185,140,95,50,5,160,115,70,25,180,135,90,45,0 +0,156,112,68,24,180,136,92,48,4,160,116,72,28,184,140,96,52,8,164,120,76,32,188,144,100,56,12,168,124,80,36,192,148,104,60,16,172,128,84,40,196,152,108,64,20,176,132,88,44,0,156,112,68,24,180,136,92,48,4,160,116,72,28,184,140,96,52,8,164,120,76,32,188,144,100,56,12,168,124,80,36,192,148,104,60,16,172,128,84,40,196,152,108,64,20,176,132,88,44,0,156,112,68,24,180,136,92,48,4,160,116,72,28,184,140,96,52,8,164,120,76,32,188,144,100,56,12,168,124,80,36,192,148,104,60,16,172,128,84,40,196,152,108,64,20,176,132,88,44,0,156,112,68,24,180,136,92,48,4,160,116,72,28,184,140,96,52,8,164,120,76,32,188,144,100,56,12,168,124,80,36,192,148,104,60,16,172,128,84,40,196,152,108,64,20,176,132,88,44,0 +0,157,114,71,28,185,142,99,56,13,170,127,84,41,198,155,112,69,26,183,140,97,54,11,168,125,82,39,196,153,110,67,24,181,138,95,52,9,166,123,80,37,194,151,108,65,22,179,136,93,50,7,164,121,78,35,192,149,106,63,20,177,134,91,48,5,162,119,76,33,190,147,104,61,18,175,132,89,46,3,160,117,74,31,188,145,102,59,16,173,130,87,44,1,158,115,72,29,186,143,100,57,14,171,128,85,42,199,156,113,70,27,184,141,98,55,12,169,126,83,40,197,154,111,68,25,182,139,96,53,10,167,124,81,38,195,152,109,66,23,180,137,94,51,8,165,122,79,36,193,150,107,64,21,178,135,92,49,6,163,120,77,34,191,148,105,62,19,176,133,90,47,4,161,118,75,32,189,146,103,60,17,174,131,88,45,2,159,116,73,30,187,144,101,58,15,172,129,86,43,0 +0,158,116,74,32,190,148,106,64,22,180,138,96,54,12,170,128,86,44,2,160,118,76,34,192,150,108,66,24,182,140,98,56,14,172,130,88,46,4,162,120,78,36,194,152,110,68,26,184,142,100,58,16,174,132,90,48,6,164,122,80,38,196,154,112,70,28,186,144,102,60,18,176,134,92,50,8,166,124,82,40,198,156,114,72,30,188,146,104,62,20,178,136,94,52,10,168,126,84,42,0,158,116,74,32,190,148,106,64,22,180,138,96,54,12,170,128,86,44,2,160,118,76,34,192,150,108,66,24,182,140,98,56,14,172,130,88,46,4,162,120,78,36,194,152,110,68,26,184,142,100,58,16,174,132,90,48,6,164,122,80,38,196,154,112,70,28,186,144,102,60,18,176,134,92,50,8,166,124,82,40,198,156,114,72,30,188,146,104,62,20,178,136,94,52,10,168,126,84,42,0 +0,159,118,77,36,195,154,113,72,31,190,149,108,67,26,185,144,103,62,21,180,139,98,57,16,175,134,93,52,11,170,129,88,47,6,165,124,83,42,1,160,119,78,37,196,155,114,73,32,191,150,109,68,27,186,145,104,63,22,181,140,99,58,17,176,135,94,53,12,171,130,89,48,7,166,125,84,43,2,161,120,79,38,197,156,115,74,33,192,151,110,69,28,187,146,105,64,23,182,141,100,59,18,177,136,95,54,13,172,131,90,49,8,167,126,85,44,3,162,121,80,39,198,157,116,75,34,193,152,111,70,29,188,147,106,65,24,183,142,101,60,19,178,137,96,55,14,173,132,91,50,9,168,127,86,45,4,163,122,81,40,199,158,117,76,35,194,153,112,71,30,189,148,107,66,25,184,143,102,61,20,179,138,97,56,15,174,133,92,51,10,169,128,87,46,5,164,123,82,41,0 +0,160,120,80,40,0,160,120,80,40,0,160,120,80,40,0,160,120,80,40,0,160,120,80,40,0,160,120,80,40,0,160,120,80,40,0,160,120,80,40,0,160,120,80,40,0,160,120,80,40,0,160,120,80,40,0,160,120,80,40,0,160,120,80,40,0,160,120,80,40,0,160,120,80,40,0,160,120,80,40,0,160,120,80,40,0,160,120,80,40,0,160,120,80,40,0,160,120,80,40,0,160,120,80,40,0,160,120,80,40,0,160,120,80,40,0,160,120,80,40,0,160,120,80,40,0,160,120,80,40,0,160,120,80,40,0,160,120,80,40,0,160,120,80,40,0,160,120,80,40,0,160,120,80,40,0,160,120,80,40,0,160,120,80,40,0,160,120,80,40,0,160,120,80,40,0,160,120,80,40,0,160,120,80,40,0,160,120,80,40,0,160,120,80,40,0,160,120,80,40,0 +0,161,122,83,44,5,166,127,88,49,10,171,132,93,54,15,176,137,98,59,20,181,142,103,64,25,186,147,108,69,30,191,152,113,74,35,196,157,118,79,40,1,162,123,84,45,6,167,128,89,50,11,172,133,94,55,16,177,138,99,60,21,182,143,104,65,26,187,148,109,70,31,192,153,114,75,36,197,158,119,80,41,2,163,124,85,46,7,168,129,90,51,12,173,134,95,56,17,178,139,100,61,22,183,144,105,66,27,188,149,110,71,32,193,154,115,76,37,198,159,120,81,42,3,164,125,86,47,8,169,130,91,52,13,174,135,96,57,18,179,140,101,62,23,184,145,106,67,28,189,150,111,72,33,194,155,116,77,38,199,160,121,82,43,4,165,126,87,48,9,170,131,92,53,14,175,136,97,58,19,180,141,102,63,24,185,146,107,68,29,190,151,112,73,34,195,156,117,78,39,0 +0,162,124,86,48,10,172,134,96,58,20,182,144,106,68,30,192,154,116,78,40,2,164,126,88,50,12,174,136,98,60,22,184,146,108,70,32,194,156,118,80,42,4,166,128,90,52,14,176,138,100,62,24,186,148,110,72,34,196,158,120,82,44,6,168,130,92,54,16,178,140,102,64,26,188,150,112,74,36,198,160,122,84,46,8,170,132,94,56,18,180,142,104,66,28,190,152,114,76,38,0,162,124,86,48,10,172,134,96,58,20,182,144,106,68,30,192,154,116,78,40,2,164,126,88,50,12,174,136,98,60,22,184,146,108,70,32,194,156,118,80,42,4,166,128,90,52,14,176,138,100,62,24,186,148,110,72,34,196,158,120,82,44,6,168,130,92,54,16,178,140,102,64,26,188,150,112,74,36,198,160,122,84,46,8,170,132,94,56,18,180,142,104,66,28,190,152,114,76,38,0 +0,163,126,89,52,15,178,141,104,67,30,193,156,119,82,45,8,171,134,97,60,23,186,149,112,75,38,1,164,127,90,53,16,179,142,105,68,31,194,157,120,83,46,9,172,135,98,61,24,187,150,113,76,39,2,165,128,91,54,17,180,143,106,69,32,195,158,121,84,47,10,173,136,99,62,25,188,151,114,77,40,3,166,129,92,55,18,181,144,107,70,33,196,159,122,85,48,11,174,137,100,63,26,189,152,115,78,41,4,167,130,93,56,19,182,145,108,71,34,197,160,123,86,49,12,175,138,101,64,27,190,153,116,79,42,5,168,131,94,57,20,183,146,109,72,35,198,161,124,87,50,13,176,139,102,65,28,191,154,117,80,43,6,169,132,95,58,21,184,147,110,73,36,199,162,125,88,51,14,177,140,103,66,29,192,155,118,81,44,7,170,133,96,59,22,185,148,111,74,37,0 +0,164,128,92,56,20,184,148,112,76,40,4,168,132,96,60,24,188,152,116,80,44,8,172,136,100,64,28,192,156,120,84,48,12,176,140,104,68,32,196,160,124,88,52,16,180,144,108,72,36,0,164,128,92,56,20,184,148,112,76,40,4,168,132,96,60,24,188,152,116,80,44,8,172,136,100,64,28,192,156,120,84,48,12,176,140,104,68,32,196,160,124,88,52,16,180,144,108,72,36,0,164,128,92,56,20,184,148,112,76,40,4,168,132,96,60,24,188,152,116,80,44,8,172,136,100,64,28,192,156,120,84,48,12,176,140,104,68,32,196,160,124,88,52,16,180,144,108,72,36,0,164,128,92,56,20,184,148,112,76,40,4,168,132,96,60,24,188,152,116,80,44,8,172,136,100,64,28,192,156,120,84,48,12,176,140,104,68,32,196,160,124,88,52,16,180,144,108,72,36,0 +0,165,130,95,60,25,190,155,120,85,50,15,180,145,110,75,40,5,170,135,100,65,30,195,160,125,90,55,20,185,150,115,80,45,10,175,140,105,70,35,0,165,130,95,60,25,190,155,120,85,50,15,180,145,110,75,40,5,170,135,100,65,30,195,160,125,90,55,20,185,150,115,80,45,10,175,140,105,70,35,0,165,130,95,60,25,190,155,120,85,50,15,180,145,110,75,40,5,170,135,100,65,30,195,160,125,90,55,20,185,150,115,80,45,10,175,140,105,70,35,0,165,130,95,60,25,190,155,120,85,50,15,180,145,110,75,40,5,170,135,100,65,30,195,160,125,90,55,20,185,150,115,80,45,10,175,140,105,70,35,0,165,130,95,60,25,190,155,120,85,50,15,180,145,110,75,40,5,170,135,100,65,30,195,160,125,90,55,20,185,150,115,80,45,10,175,140,105,70,35,0 +0,166,132,98,64,30,196,162,128,94,60,26,192,158,124,90,56,22,188,154,120,86,52,18,184,150,116,82,48,14,180,146,112,78,44,10,176,142,108,74,40,6,172,138,104,70,36,2,168,134,100,66,32,198,164,130,96,62,28,194,160,126,92,58,24,190,156,122,88,54,20,186,152,118,84,50,16,182,148,114,80,46,12,178,144,110,76,42,8,174,140,106,72,38,4,170,136,102,68,34,0,166,132,98,64,30,196,162,128,94,60,26,192,158,124,90,56,22,188,154,120,86,52,18,184,150,116,82,48,14,180,146,112,78,44,10,176,142,108,74,40,6,172,138,104,70,36,2,168,134,100,66,32,198,164,130,96,62,28,194,160,126,92,58,24,190,156,122,88,54,20,186,152,118,84,50,16,182,148,114,80,46,12,178,144,110,76,42,8,174,140,106,72,38,4,170,136,102,68,34,0 +0,167,134,101,68,35,2,169,136,103,70,37,4,171,138,105,72,39,6,173,140,107,74,41,8,175,142,109,76,43,10,177,144,111,78,45,12,179,146,113,80,47,14,181,148,115,82,49,16,183,150,117,84,51,18,185,152,119,86,53,20,187,154,121,88,55,22,189,156,123,90,57,24,191,158,125,92,59,26,193,160,127,94,61,28,195,162,129,96,63,30,197,164,131,98,65,32,199,166,133,100,67,34,1,168,135,102,69,36,3,170,137,104,71,38,5,172,139,106,73,40,7,174,141,108,75,42,9,176,143,110,77,44,11,178,145,112,79,46,13,180,147,114,81,48,15,182,149,116,83,50,17,184,151,118,85,52,19,186,153,120,87,54,21,188,155,122,89,56,23,190,157,124,91,58,25,192,159,126,93,60,27,194,161,128,95,62,29,196,163,130,97,64,31,198,165,132,99,66,33,0 +0,168,136,104,72,40,8,176,144,112,80,48,16,184,152,120,88,56,24,192,160,128,96,64,32,0,168,136,104,72,40,8,176,144,112,80,48,16,184,152,120,88,56,24,192,160,128,96,64,32,0,168,136,104,72,40,8,176,144,112,80,48,16,184,152,120,88,56,24,192,160,128,96,64,32,0,168,136,104,72,40,8,176,144,112,80,48,16,184,152,120,88,56,24,192,160,128,96,64,32,0,168,136,104,72,40,8,176,144,112,80,48,16,184,152,120,88,56,24,192,160,128,96,64,32,0,168,136,104,72,40,8,176,144,112,80,48,16,184,152,120,88,56,24,192,160,128,96,64,32,0,168,136,104,72,40,8,176,144,112,80,48,16,184,152,120,88,56,24,192,160,128,96,64,32,0,168,136,104,72,40,8,176,144,112,80,48,16,184,152,120,88,56,24,192,160,128,96,64,32,0 +0,169,138,107,76,45,14,183,152,121,90,59,28,197,166,135,104,73,42,11,180,149,118,87,56,25,194,163,132,101,70,39,8,177,146,115,84,53,22,191,160,129,98,67,36,5,174,143,112,81,50,19,188,157,126,95,64,33,2,171,140,109,78,47,16,185,154,123,92,61,30,199,168,137,106,75,44,13,182,151,120,89,58,27,196,165,134,103,72,41,10,179,148,117,86,55,24,193,162,131,100,69,38,7,176,145,114,83,52,21,190,159,128,97,66,35,4,173,142,111,80,49,18,187,156,125,94,63,32,1,170,139,108,77,46,15,184,153,122,91,60,29,198,167,136,105,74,43,12,181,150,119,88,57,26,195,164,133,102,71,40,9,178,147,116,85,54,23,192,161,130,99,68,37,6,175,144,113,82,51,20,189,158,127,96,65,34,3,172,141,110,79,48,17,186,155,124,93,62,31,0 +0,170,140,110,80,50,20,190,160,130,100,70,40,10,180,150,120,90,60,30,0,170,140,110,80,50,20,190,160,130,100,70,40,10,180,150,120,90,60,30,0,170,140,110,80,50,20,190,160,130,100,70,40,10,180,150,120,90,60,30,0,170,140,110,80,50,20,190,160,130,100,70,40,10,180,150,120,90,60,30,0,170,140,110,80,50,20,190,160,130,100,70,40,10,180,150,120,90,60,30,0,170,140,110,80,50,20,190,160,130,100,70,40,10,180,150,120,90,60,30,0,170,140,110,80,50,20,190,160,130,100,70,40,10,180,150,120,90,60,30,0,170,140,110,80,50,20,190,160,130,100,70,40,10,180,150,120,90,60,30,0,170,140,110,80,50,20,190,160,130,100,70,40,10,180,150,120,90,60,30,0,170,140,110,80,50,20,190,160,130,100,70,40,10,180,150,120,90,60,30,0 +0,171,142,113,84,55,26,197,168,139,110,81,52,23,194,165,136,107,78,49,20,191,162,133,104,75,46,17,188,159,130,101,72,43,14,185,156,127,98,69,40,11,182,153,124,95,66,37,8,179,150,121,92,63,34,5,176,147,118,89,60,31,2,173,144,115,86,57,28,199,170,141,112,83,54,25,196,167,138,109,80,51,22,193,164,135,106,77,48,19,190,161,132,103,74,45,16,187,158,129,100,71,42,13,184,155,126,97,68,39,10,181,152,123,94,65,36,7,178,149,120,91,62,33,4,175,146,117,88,59,30,1,172,143,114,85,56,27,198,169,140,111,82,53,24,195,166,137,108,79,50,21,192,163,134,105,76,47,18,189,160,131,102,73,44,15,186,157,128,99,70,41,12,183,154,125,96,67,38,9,180,151,122,93,64,35,6,177,148,119,90,61,32,3,174,145,116,87,58,29,0 +0,172,144,116,88,60,32,4,176,148,120,92,64,36,8,180,152,124,96,68,40,12,184,156,128,100,72,44,16,188,160,132,104,76,48,20,192,164,136,108,80,52,24,196,168,140,112,84,56,28,0,172,144,116,88,60,32,4,176,148,120,92,64,36,8,180,152,124,96,68,40,12,184,156,128,100,72,44,16,188,160,132,104,76,48,20,192,164,136,108,80,52,24,196,168,140,112,84,56,28,0,172,144,116,88,60,32,4,176,148,120,92,64,36,8,180,152,124,96,68,40,12,184,156,128,100,72,44,16,188,160,132,104,76,48,20,192,164,136,108,80,52,24,196,168,140,112,84,56,28,0,172,144,116,88,60,32,4,176,148,120,92,64,36,8,180,152,124,96,68,40,12,184,156,128,100,72,44,16,188,160,132,104,76,48,20,192,164,136,108,80,52,24,196,168,140,112,84,56,28,0 +0,173,146,119,92,65,38,11,184,157,130,103,76,49,22,195,168,141,114,87,60,33,6,179,152,125,98,71,44,17,190,163,136,109,82,55,28,1,174,147,120,93,66,39,12,185,158,131,104,77,50,23,196,169,142,115,88,61,34,7,180,153,126,99,72,45,18,191,164,137,110,83,56,29,2,175,148,121,94,67,40,13,186,159,132,105,78,51,24,197,170,143,116,89,62,35,8,181,154,127,100,73,46,19,192,165,138,111,84,57,30,3,176,149,122,95,68,41,14,187,160,133,106,79,52,25,198,171,144,117,90,63,36,9,182,155,128,101,74,47,20,193,166,139,112,85,58,31,4,177,150,123,96,69,42,15,188,161,134,107,80,53,26,199,172,145,118,91,64,37,10,183,156,129,102,75,48,21,194,167,140,113,86,59,32,5,178,151,124,97,70,43,16,189,162,135,108,81,54,27,0 +0,174,148,122,96,70,44,18,192,166,140,114,88,62,36,10,184,158,132,106,80,54,28,2,176,150,124,98,72,46,20,194,168,142,116,90,64,38,12,186,160,134,108,82,56,30,4,178,152,126,100,74,48,22,196,170,144,118,92,66,40,14,188,162,136,110,84,58,32,6,180,154,128,102,76,50,24,198,172,146,120,94,68,42,16,190,164,138,112,86,60,34,8,182,156,130,104,78,52,26,0,174,148,122,96,70,44,18,192,166,140,114,88,62,36,10,184,158,132,106,80,54,28,2,176,150,124,98,72,46,20,194,168,142,116,90,64,38,12,186,160,134,108,82,56,30,4,178,152,126,100,74,48,22,196,170,144,118,92,66,40,14,188,162,136,110,84,58,32,6,180,154,128,102,76,50,24,198,172,146,120,94,68,42,16,190,164,138,112,86,60,34,8,182,156,130,104,78,52,26,0 +0,175,150,125,100,75,50,25,0,175,150,125,100,75,50,25,0,175,150,125,100,75,50,25,0,175,150,125,100,75,50,25,0,175,150,125,100,75,50,25,0,175,150,125,100,75,50,25,0,175,150,125,100,75,50,25,0,175,150,125,100,75,50,25,0,175,150,125,100,75,50,25,0,175,150,125,100,75,50,25,0,175,150,125,100,75,50,25,0,175,150,125,100,75,50,25,0,175,150,125,100,75,50,25,0,175,150,125,100,75,50,25,0,175,150,125,100,75,50,25,0,175,150,125,100,75,50,25,0,175,150,125,100,75,50,25,0,175,150,125,100,75,50,25,0,175,150,125,100,75,50,25,0,175,150,125,100,75,50,25,0,175,150,125,100,75,50,25,0,175,150,125,100,75,50,25,0,175,150,125,100,75,50,25,0,175,150,125,100,75,50,25,0,175,150,125,100,75,50,25,0 +0,176,152,128,104,80,56,32,8,184,160,136,112,88,64,40,16,192,168,144,120,96,72,48,24,0,176,152,128,104,80,56,32,8,184,160,136,112,88,64,40,16,192,168,144,120,96,72,48,24,0,176,152,128,104,80,56,32,8,184,160,136,112,88,64,40,16,192,168,144,120,96,72,48,24,0,176,152,128,104,80,56,32,8,184,160,136,112,88,64,40,16,192,168,144,120,96,72,48,24,0,176,152,128,104,80,56,32,8,184,160,136,112,88,64,40,16,192,168,144,120,96,72,48,24,0,176,152,128,104,80,56,32,8,184,160,136,112,88,64,40,16,192,168,144,120,96,72,48,24,0,176,152,128,104,80,56,32,8,184,160,136,112,88,64,40,16,192,168,144,120,96,72,48,24,0,176,152,128,104,80,56,32,8,184,160,136,112,88,64,40,16,192,168,144,120,96,72,48,24,0 +0,177,154,131,108,85,62,39,16,193,170,147,124,101,78,55,32,9,186,163,140,117,94,71,48,25,2,179,156,133,110,87,64,41,18,195,172,149,126,103,80,57,34,11,188,165,142,119,96,73,50,27,4,181,158,135,112,89,66,43,20,197,174,151,128,105,82,59,36,13,190,167,144,121,98,75,52,29,6,183,160,137,114,91,68,45,22,199,176,153,130,107,84,61,38,15,192,169,146,123,100,77,54,31,8,185,162,139,116,93,70,47,24,1,178,155,132,109,86,63,40,17,194,171,148,125,102,79,56,33,10,187,164,141,118,95,72,49,26,3,180,157,134,111,88,65,42,19,196,173,150,127,104,81,58,35,12,189,166,143,120,97,74,51,28,5,182,159,136,113,90,67,44,21,198,175,152,129,106,83,60,37,14,191,168,145,122,99,76,53,30,7,184,161,138,115,92,69,46,23,0 +0,178,156,134,112,90,68,46,24,2,180,158,136,114,92,70,48,26,4,182,160,138,116,94,72,50,28,6,184,162,140,118,96,74,52,30,8,186,164,142,120,98,76,54,32,10,188,166,144,122,100,78,56,34,12,190,168,146,124,102,80,58,36,14,192,170,148,126,104,82,60,38,16,194,172,150,128,106,84,62,40,18,196,174,152,130,108,86,64,42,20,198,176,154,132,110,88,66,44,22,0,178,156,134,112,90,68,46,24,2,180,158,136,114,92,70,48,26,4,182,160,138,116,94,72,50,28,6,184,162,140,118,96,74,52,30,8,186,164,142,120,98,76,54,32,10,188,166,144,122,100,78,56,34,12,190,168,146,124,102,80,58,36,14,192,170,148,126,104,82,60,38,16,194,172,150,128,106,84,62,40,18,196,174,152,130,108,86,64,42,20,198,176,154,132,110,88,66,44,22,0 +0,179,158,137,116,95,74,53,32,11,190,169,148,127,106,85,64,43,22,1,180,159,138,117,96,75,54,33,12,191,170,149,128,107,86,65,44,23,2,181,160,139,118,97,76,55,34,13,192,171,150,129,108,87,66,45,24,3,182,161,140,119,98,77,56,35,14,193,172,151,130,109,88,67,46,25,4,183,162,141,120,99,78,57,36,15,194,173,152,131,110,89,68,47,26,5,184,163,142,121,100,79,58,37,16,195,174,153,132,111,90,69,48,27,6,185,164,143,122,101,80,59,38,17,196,175,154,133,112,91,70,49,28,7,186,165,144,123,102,81,60,39,18,197,176,155,134,113,92,71,50,29,8,187,166,145,124,103,82,61,40,19,198,177,156,135,114,93,72,51,30,9,188,167,146,125,104,83,62,41,20,199,178,157,136,115,94,73,52,31,10,189,168,147,126,105,84,63,42,21,0 +0,180,160,140,120,100,80,60,40,20,0,180,160,140,120,100,80,60,40,20,0,180,160,140,120,100,80,60,40,20,0,180,160,140,120,100,80,60,40,20,0,180,160,140,120,100,80,60,40,20,0,180,160,140,120,100,80,60,40,20,0,180,160,140,120,100,80,60,40,20,0,180,160,140,120,100,80,60,40,20,0,180,160,140,120,100,80,60,40,20,0,180,160,140,120,100,80,60,40,20,0,180,160,140,120,100,80,60,40,20,0,180,160,140,120,100,80,60,40,20,0,180,160,140,120,100,80,60,40,20,0,180,160,140,120,100,80,60,40,20,0,180,160,140,120,100,80,60,40,20,0,180,160,140,120,100,80,60,40,20,0,180,160,140,120,100,80,60,40,20,0,180,160,140,120,100,80,60,40,20,0,180,160,140,120,100,80,60,40,20,0,180,160,140,120,100,80,60,40,20,0 +0,181,162,143,124,105,86,67,48,29,10,191,172,153,134,115,96,77,58,39,20,1,182,163,144,125,106,87,68,49,30,11,192,173,154,135,116,97,78,59,40,21,2,183,164,145,126,107,88,69,50,31,12,193,174,155,136,117,98,79,60,41,22,3,184,165,146,127,108,89,70,51,32,13,194,175,156,137,118,99,80,61,42,23,4,185,166,147,128,109,90,71,52,33,14,195,176,157,138,119,100,81,62,43,24,5,186,167,148,129,110,91,72,53,34,15,196,177,158,139,120,101,82,63,44,25,6,187,168,149,130,111,92,73,54,35,16,197,178,159,140,121,102,83,64,45,26,7,188,169,150,131,112,93,74,55,36,17,198,179,160,141,122,103,84,65,46,27,8,189,170,151,132,113,94,75,56,37,18,199,180,161,142,123,104,85,66,47,28,9,190,171,152,133,114,95,76,57,38,19,0 +0,182,164,146,128,110,92,74,56,38,20,2,184,166,148,130,112,94,76,58,40,22,4,186,168,150,132,114,96,78,60,42,24,6,188,170,152,134,116,98,80,62,44,26,8,190,172,154,136,118,100,82,64,46,28,10,192,174,156,138,120,102,84,66,48,30,12,194,176,158,140,122,104,86,68,50,32,14,196,178,160,142,124,106,88,70,52,34,16,198,180,162,144,126,108,90,72,54,36,18,0,182,164,146,128,110,92,74,56,38,20,2,184,166,148,130,112,94,76,58,40,22,4,186,168,150,132,114,96,78,60,42,24,6,188,170,152,134,116,98,80,62,44,26,8,190,172,154,136,118,100,82,64,46,28,10,192,174,156,138,120,102,84,66,48,30,12,194,176,158,140,122,104,86,68,50,32,14,196,178,160,142,124,106,88,70,52,34,16,198,180,162,144,126,108,90,72,54,36,18,0 +0,183,166,149,132,115,98,81,64,47,30,13,196,179,162,145,128,111,94,77,60,43,26,9,192,175,158,141,124,107,90,73,56,39,22,5,188,171,154,137,120,103,86,69,52,35,18,1,184,167,150,133,116,99,82,65,48,31,14,197,180,163,146,129,112,95,78,61,44,27,10,193,176,159,142,125,108,91,74,57,40,23,6,189,172,155,138,121,104,87,70,53,36,19,2,185,168,151,134,117,100,83,66,49,32,15,198,181,164,147,130,113,96,79,62,45,28,11,194,177,160,143,126,109,92,75,58,41,24,7,190,173,156,139,122,105,88,71,54,37,20,3,186,169,152,135,118,101,84,67,50,33,16,199,182,165,148,131,114,97,80,63,46,29,12,195,178,161,144,127,110,93,76,59,42,25,8,191,174,157,140,123,106,89,72,55,38,21,4,187,170,153,136,119,102,85,68,51,34,17,0 +0,184,168,152,136,120,104,88,72,56,40,24,8,192,176,160,144,128,112,96,80,64,48,32,16,0,184,168,152,136,120,104,88,72,56,40,24,8,192,176,160,144,128,112,96,80,64,48,32,16,0,184,168,152,136,120,104,88,72,56,40,24,8,192,176,160,144,128,112,96,80,64,48,32,16,0,184,168,152,136,120,104,88,72,56,40,24,8,192,176,160,144,128,112,96,80,64,48,32,16,0,184,168,152,136,120,104,88,72,56,40,24,8,192,176,160,144,128,112,96,80,64,48,32,16,0,184,168,152,136,120,104,88,72,56,40,24,8,192,176,160,144,128,112,96,80,64,48,32,16,0,184,168,152,136,120,104,88,72,56,40,24,8,192,176,160,144,128,112,96,80,64,48,32,16,0,184,168,152,136,120,104,88,72,56,40,24,8,192,176,160,144,128,112,96,80,64,48,32,16,0 +0,185,170,155,140,125,110,95,80,65,50,35,20,5,190,175,160,145,130,115,100,85,70,55,40,25,10,195,180,165,150,135,120,105,90,75,60,45,30,15,0,185,170,155,140,125,110,95,80,65,50,35,20,5,190,175,160,145,130,115,100,85,70,55,40,25,10,195,180,165,150,135,120,105,90,75,60,45,30,15,0,185,170,155,140,125,110,95,80,65,50,35,20,5,190,175,160,145,130,115,100,85,70,55,40,25,10,195,180,165,150,135,120,105,90,75,60,45,30,15,0,185,170,155,140,125,110,95,80,65,50,35,20,5,190,175,160,145,130,115,100,85,70,55,40,25,10,195,180,165,150,135,120,105,90,75,60,45,30,15,0,185,170,155,140,125,110,95,80,65,50,35,20,5,190,175,160,145,130,115,100,85,70,55,40,25,10,195,180,165,150,135,120,105,90,75,60,45,30,15,0 +0,186,172,158,144,130,116,102,88,74,60,46,32,18,4,190,176,162,148,134,120,106,92,78,64,50,36,22,8,194,180,166,152,138,124,110,96,82,68,54,40,26,12,198,184,170,156,142,128,114,100,86,72,58,44,30,16,2,188,174,160,146,132,118,104,90,76,62,48,34,20,6,192,178,164,150,136,122,108,94,80,66,52,38,24,10,196,182,168,154,140,126,112,98,84,70,56,42,28,14,0,186,172,158,144,130,116,102,88,74,60,46,32,18,4,190,176,162,148,134,120,106,92,78,64,50,36,22,8,194,180,166,152,138,124,110,96,82,68,54,40,26,12,198,184,170,156,142,128,114,100,86,72,58,44,30,16,2,188,174,160,146,132,118,104,90,76,62,48,34,20,6,192,178,164,150,136,122,108,94,80,66,52,38,24,10,196,182,168,154,140,126,112,98,84,70,56,42,28,14,0 +0,187,174,161,148,135,122,109,96,83,70,57,44,31,18,5,192,179,166,153,140,127,114,101,88,75,62,49,36,23,10,197,184,171,158,145,132,119,106,93,80,67,54,41,28,15,2,189,176,163,150,137,124,111,98,85,72,59,46,33,20,7,194,181,168,155,142,129,116,103,90,77,64,51,38,25,12,199,186,173,160,147,134,121,108,95,82,69,56,43,30,17,4,191,178,165,152,139,126,113,100,87,74,61,48,35,22,9,196,183,170,157,144,131,118,105,92,79,66,53,40,27,14,1,188,175,162,149,136,123,110,97,84,71,58,45,32,19,6,193,180,167,154,141,128,115,102,89,76,63,50,37,24,11,198,185,172,159,146,133,120,107,94,81,68,55,42,29,16,3,190,177,164,151,138,125,112,99,86,73,60,47,34,21,8,195,182,169,156,143,130,117,104,91,78,65,52,39,26,13,0 +0,188,176,164,152,140,128,116,104,92,80,68,56,44,32,20,8,196,184,172,160,148,136,124,112,100,88,76,64,52,40,28,16,4,192,180,168,156,144,132,120,108,96,84,72,60,48,36,24,12,0,188,176,164,152,140,128,116,104,92,80,68,56,44,32,20,8,196,184,172,160,148,136,124,112,100,88,76,64,52,40,28,16,4,192,180,168,156,144,132,120,108,96,84,72,60,48,36,24,12,0,188,176,164,152,140,128,116,104,92,80,68,56,44,32,20,8,196,184,172,160,148,136,124,112,100,88,76,64,52,40,28,16,4,192,180,168,156,144,132,120,108,96,84,72,60,48,36,24,12,0,188,176,164,152,140,128,116,104,92,80,68,56,44,32,20,8,196,184,172,160,148,136,124,112,100,88,76,64,52,40,28,16,4,192,180,168,156,144,132,120,108,96,84,72,60,48,36,24,12,0 +0,189,178,167,156,145,134,123,112,101,90,79,68,57,46,35,24,13,2,191,180,169,158,147,136,125,114,103,92,81,70,59,48,37,26,15,4,193,182,171,160,149,138,127,116,105,94,83,72,61,50,39,28,17,6,195,184,173,162,151,140,129,118,107,96,85,74,63,52,41,30,19,8,197,186,175,164,153,142,131,120,109,98,87,76,65,54,43,32,21,10,199,188,177,166,155,144,133,122,111,100,89,78,67,56,45,34,23,12,1,190,179,168,157,146,135,124,113,102,91,80,69,58,47,36,25,14,3,192,181,170,159,148,137,126,115,104,93,82,71,60,49,38,27,16,5,194,183,172,161,150,139,128,117,106,95,84,73,62,51,40,29,18,7,196,185,174,163,152,141,130,119,108,97,86,75,64,53,42,31,20,9,198,187,176,165,154,143,132,121,110,99,88,77,66,55,44,33,22,11,0 +0,190,180,170,160,150,140,130,120,110,100,90,80,70,60,50,40,30,20,10,0,190,180,170,160,150,140,130,120,110,100,90,80,70,60,50,40,30,20,10,0,190,180,170,160,150,140,130,120,110,100,90,80,70,60,50,40,30,20,10,0,190,180,170,160,150,140,130,120,110,100,90,80,70,60,50,40,30,20,10,0,190,180,170,160,150,140,130,120,110,100,90,80,70,60,50,40,30,20,10,0,190,180,170,160,150,140,130,120,110,100,90,80,70,60,50,40,30,20,10,0,190,180,170,160,150,140,130,120,110,100,90,80,70,60,50,40,30,20,10,0,190,180,170,160,150,140,130,120,110,100,90,80,70,60,50,40,30,20,10,0,190,180,170,160,150,140,130,120,110,100,90,80,70,60,50,40,30,20,10,0,190,180,170,160,150,140,130,120,110,100,90,80,70,60,50,40,30,20,10,0 +0,191,182,173,164,155,146,137,128,119,110,101,92,83,74,65,56,47,38,29,20,11,2,193,184,175,166,157,148,139,130,121,112,103,94,85,76,67,58,49,40,31,22,13,4,195,186,177,168,159,150,141,132,123,114,105,96,87,78,69,60,51,42,33,24,15,6,197,188,179,170,161,152,143,134,125,116,107,98,89,80,71,62,53,44,35,26,17,8,199,190,181,172,163,154,145,136,127,118,109,100,91,82,73,64,55,46,37,28,19,10,1,192,183,174,165,156,147,138,129,120,111,102,93,84,75,66,57,48,39,30,21,12,3,194,185,176,167,158,149,140,131,122,113,104,95,86,77,68,59,50,41,32,23,14,5,196,187,178,169,160,151,142,133,124,115,106,97,88,79,70,61,52,43,34,25,16,7,198,189,180,171,162,153,144,135,126,117,108,99,90,81,72,63,54,45,36,27,18,9,0 +0,192,184,176,168,160,152,144,136,128,120,112,104,96,88,80,72,64,56,48,40,32,24,16,8,0,192,184,176,168,160,152,144,136,128,120,112,104,96,88,80,72,64,56,48,40,32,24,16,8,0,192,184,176,168,160,152,144,136,128,120,112,104,96,88,80,72,64,56,48,40,32,24,16,8,0,192,184,176,168,160,152,144,136,128,120,112,104,96,88,80,72,64,56,48,40,32,24,16,8,0,192,184,176,168,160,152,144,136,128,120,112,104,96,88,80,72,64,56,48,40,32,24,16,8,0,192,184,176,168,160,152,144,136,128,120,112,104,96,88,80,72,64,56,48,40,32,24,16,8,0,192,184,176,168,160,152,144,136,128,120,112,104,96,88,80,72,64,56,48,40,32,24,16,8,0,192,184,176,168,160,152,144,136,128,120,112,104,96,88,80,72,64,56,48,40,32,24,16,8,0 +0,193,186,179,172,165,158,151,144,137,130,123,116,109,102,95,88,81,74,67,60,53,46,39,32,25,18,11,4,197,190,183,176,169,162,155,148,141,134,127,120,113,106,99,92,85,78,71,64,57,50,43,36,29,22,15,8,1,194,187,180,173,166,159,152,145,138,131,124,117,110,103,96,89,82,75,68,61,54,47,40,33,26,19,12,5,198,191,184,177,170,163,156,149,142,135,128,121,114,107,100,93,86,79,72,65,58,51,44,37,30,23,16,9,2,195,188,181,174,167,160,153,146,139,132,125,118,111,104,97,90,83,76,69,62,55,48,41,34,27,20,13,6,199,192,185,178,171,164,157,150,143,136,129,122,115,108,101,94,87,80,73,66,59,52,45,38,31,24,17,10,3,196,189,182,175,168,161,154,147,140,133,126,119,112,105,98,91,84,77,70,63,56,49,42,35,28,21,14,7,0 +0,194,188,182,176,170,164,158,152,146,140,134,128,122,116,110,104,98,92,86,80,74,68,62,56,50,44,38,32,26,20,14,8,2,196,190,184,178,172,166,160,154,148,142,136,130,124,118,112,106,100,94,88,82,76,70,64,58,52,46,40,34,28,22,16,10,4,198,192,186,180,174,168,162,156,150,144,138,132,126,120,114,108,102,96,90,84,78,72,66,60,54,48,42,36,30,24,18,12,6,0,194,188,182,176,170,164,158,152,146,140,134,128,122,116,110,104,98,92,86,80,74,68,62,56,50,44,38,32,26,20,14,8,2,196,190,184,178,172,166,160,154,148,142,136,130,124,118,112,106,100,94,88,82,76,70,64,58,52,46,40,34,28,22,16,10,4,198,192,186,180,174,168,162,156,150,144,138,132,126,120,114,108,102,96,90,84,78,72,66,60,54,48,42,36,30,24,18,12,6,0 +0,195,190,185,180,175,170,165,160,155,150,145,140,135,130,125,120,115,110,105,100,95,90,85,80,75,70,65,60,55,50,45,40,35,30,25,20,15,10,5,0,195,190,185,180,175,170,165,160,155,150,145,140,135,130,125,120,115,110,105,100,95,90,85,80,75,70,65,60,55,50,45,40,35,30,25,20,15,10,5,0,195,190,185,180,175,170,165,160,155,150,145,140,135,130,125,120,115,110,105,100,95,90,85,80,75,70,65,60,55,50,45,40,35,30,25,20,15,10,5,0,195,190,185,180,175,170,165,160,155,150,145,140,135,130,125,120,115,110,105,100,95,90,85,80,75,70,65,60,55,50,45,40,35,30,25,20,15,10,5,0,195,190,185,180,175,170,165,160,155,150,145,140,135,130,125,120,115,110,105,100,95,90,85,80,75,70,65,60,55,50,45,40,35,30,25,20,15,10,5,0 +0,196,192,188,184,180,176,172,168,164,160,156,152,148,144,140,136,132,128,124,120,116,112,108,104,100,96,92,88,84,80,76,72,68,64,60,56,52,48,44,40,36,32,28,24,20,16,12,8,4,0,196,192,188,184,180,176,172,168,164,160,156,152,148,144,140,136,132,128,124,120,116,112,108,104,100,96,92,88,84,80,76,72,68,64,60,56,52,48,44,40,36,32,28,24,20,16,12,8,4,0,196,192,188,184,180,176,172,168,164,160,156,152,148,144,140,136,132,128,124,120,116,112,108,104,100,96,92,88,84,80,76,72,68,64,60,56,52,48,44,40,36,32,28,24,20,16,12,8,4,0,196,192,188,184,180,176,172,168,164,160,156,152,148,144,140,136,132,128,124,120,116,112,108,104,100,96,92,88,84,80,76,72,68,64,60,56,52,48,44,40,36,32,28,24,20,16,12,8,4,0 +0,197,194,191,188,185,182,179,176,173,170,167,164,161,158,155,152,149,146,143,140,137,134,131,128,125,122,119,116,113,110,107,104,101,98,95,92,89,86,83,80,77,74,71,68,65,62,59,56,53,50,47,44,41,38,35,32,29,26,23,20,17,14,11,8,5,2,199,196,193,190,187,184,181,178,175,172,169,166,163,160,157,154,151,148,145,142,139,136,133,130,127,124,121,118,115,112,109,106,103,100,97,94,91,88,85,82,79,76,73,70,67,64,61,58,55,52,49,46,43,40,37,34,31,28,25,22,19,16,13,10,7,4,1,198,195,192,189,186,183,180,177,174,171,168,165,162,159,156,153,150,147,144,141,138,135,132,129,126,123,120,117,114,111,108,105,102,99,96,93,90,87,84,81,78,75,72,69,66,63,60,57,54,51,48,45,42,39,36,33,30,27,24,21,18,15,12,9,6,3,0 +0,198,196,194,192,190,188,186,184,182,180,178,176,174,172,170,168,166,164,162,160,158,156,154,152,150,148,146,144,142,140,138,136,134,132,130,128,126,124,122,120,118,116,114,112,110,108,106,104,102,100,98,96,94,92,90,88,86,84,82,80,78,76,74,72,70,68,66,64,62,60,58,56,54,52,50,48,46,44,42,40,38,36,34,32,30,28,26,24,22,20,18,16,14,12,10,8,6,4,2,0,198,196,194,192,190,188,186,184,182,180,178,176,174,172,170,168,166,164,162,160,158,156,154,152,150,148,146,144,142,140,138,136,134,132,130,128,126,124,122,120,118,116,114,112,110,108,106,104,102,100,98,96,94,92,90,88,86,84,82,80,78,76,74,72,70,68,66,64,62,60,58,56,54,52,50,48,46,44,42,40,38,36,34,32,30,28,26,24,22,20,18,16,14,12,10,8,6,4,2,0 +0,199,198,197,196,195,194,193,192,191,190,189,188,187,186,185,184,183,182,181,180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165,164,163,162,161,160,159,158,157,156,155,154,153,152,151,150,149,148,147,146,145,144,143,142,141,140,139,138,137,136,135,134,133,132,131,130,129,128,127,126,125,124,123,122,121,120,119,118,117,116,115,114,113,112,111,110,109,108,107,106,105,104,103,102,101,100,99,98,97,96,95,94,93,92,91,90,89,88,87,86,85,84,83,82,81,80,79,78,77,76,75,74,73,72,71,70,69,68,67,66,65,64,63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/vendor/github.com/lucasb-eyer/go-colorful/.gitignore b/vendor/github.com/lucasb-eyer/go-colorful/.gitignore new file mode 100644 index 0000000..47fda8e --- /dev/null +++ b/vendor/github.com/lucasb-eyer/go-colorful/.gitignore @@ -0,0 +1,28 @@ +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so + +# Folders +_obj +_test + +# Vim swap files +.*.sw? + +# Architecture specific extensions/prefixes +*.[568vq] +[568vq].out + +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +_testmain.go + +*.exe + +# Code coverage stuff +coverage.out diff --git a/vendor/github.com/lucasb-eyer/go-colorful/.travis.yml b/vendor/github.com/lucasb-eyer/go-colorful/.travis.yml new file mode 100644 index 0000000..ca5aed4 --- /dev/null +++ b/vendor/github.com/lucasb-eyer/go-colorful/.travis.yml @@ -0,0 +1,8 @@ +language: go +install: + - go get golang.org/x/tools/cmd/cover + - go get gopkg.in/DATA-DOG/go-sqlmock.v1 + - go get github.com/mattn/goveralls +script: + - go test -v -covermode=count -coverprofile=coverage.out + - if [[ "$TRAVIS_PULL_REQUEST" = "false" ]]; then $HOME/gopath/bin/goveralls -coverprofile=coverage.out -service=travis-ci -repotoken $COVERALLS_TOKEN; fi diff --git a/vendor/github.com/lucasb-eyer/go-colorful/LICENSE b/vendor/github.com/lucasb-eyer/go-colorful/LICENSE new file mode 100644 index 0000000..4e402a0 --- /dev/null +++ b/vendor/github.com/lucasb-eyer/go-colorful/LICENSE @@ -0,0 +1,7 @@ +Copyright (c) 2013 Lucas Beyer + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/lucasb-eyer/go-colorful/README.md b/vendor/github.com/lucasb-eyer/go-colorful/README.md new file mode 100644 index 0000000..2cb0c42 --- /dev/null +++ b/vendor/github.com/lucasb-eyer/go-colorful/README.md @@ -0,0 +1,492 @@ +go-colorful +=========== +A library for playing with colors in go (golang). + +[![Build Status](https://travis-ci.org/lucasb-eyer/go-colorful.svg?branch=master)](https://travis-ci.org/lucasb-eyer/go-colorful) +[![Coverage Status](https://coveralls.io/repos/github/lucasb-eyer/go-colorful/badge.svg?branch=master)](https://coveralls.io/github/lucasb-eyer/go-colorful?branch=master) + +Why? +==== +I love games. I make games. I love detail and I get lost in detail. +One such detail popped up during the development of [Memory Which Does Not Suck](https://github.com/lucasb-eyer/mwdns/), +when we wanted the server to assign the players random colors. Sometimes +two players got very similar colors, which bugged me. The very same evening, +[I want hue](http://tools.medialab.sciences-po.fr/iwanthue/) was the top post +on HackerNews' frontpage and showed me how to Do It Right™. Last but not +least, there was no library for handling color spaces available in go. Colorful +does just that and implements Go's `color.Color` interface. + +What? +===== +Go-Colorful stores colors in RGB and provides methods from converting these to various color-spaces. Currently supported colorspaces are: + +- **RGB:** All three of Red, Green and Blue in [0..1]. +- **HSL:** Hue in [0..360], Saturation and Luminance in [0..1]. For legacy reasons; please forget that it exists. +- **HSV:** Hue in [0..360], Saturation and Value in [0..1]. You're better off using HCL, see below. +- **Hex RGB:** The "internet" color format, as in #FF00FF. +- **Linear RGB:** See [gamma correct rendering](http://www.sjbrown.co.uk/2004/05/14/gamma-correct-rendering/). +- **CIE-XYZ:** CIE's standard color space, almost in [0..1]. +- **CIE-xyY:** encodes chromacity in x and y and luminance in Y, all in [0..1] +- **CIE-L\*a\*b\*:** A *perceptually uniform* color space, i.e. distances are meaningful. L\* in [0..1] and a\*, b\* almost in [-1..1]. +- **CIE-L\*u\*v\*:** Very similar to CIE-L\*a\*b\*, there is [no consensus](http://en.wikipedia.org/wiki/CIELUV#Historical_background) on which one is "better". +- **CIE-L\*C\*h° (HCL):** This is generally the [most useful](http://vis4.net/blog/posts/avoid-equidistant-hsv-colors/) one; CIE-L\*a\*b\* space in polar coordinates, i.e. a *better* HSV. H° is in [0..360], C\* almost in [-1..1] and L\* as in CIE-L\*a\*b\*. + +For the colorspaces where it makes sense (XYZ, Lab, Luv, HCl), the +[D65](http://en.wikipedia.org/wiki/Illuminant_D65) is used as reference white +by default but methods for using your own reference white are provided. + +A coordinate being *almost in* a range means that generally it is, but for very +bright colors and depending on the reference white, it might overflow this +range slightly. For example, C\* of #0000ff is 1.338. + +Unit-tests are provided. + +Nice, but what's it useful for? +------------------------------- + +- Converting color spaces. Some people like to do that. +- Blending (interpolating) between colors in a "natural" look by using the right colorspace. +- Generating random colors under some constraints (e.g. colors of the same shade, or shades of one color.) +- Generating gorgeous random palettes with distinct colors of a same temperature. + +What not (yet)? +=============== +There are a few features which are currently missing and might be useful. +I just haven't implemented them yet because I didn't have the need for it. +Pull requests welcome. + +- Sorting colors (potentially using above mentioned distances) + +So which colorspace should I use? +================================= +It depends on what you want to do. I think the folks from *I want hue* are +on-spot when they say that RGB fits to how *screens produce* color, CIE L\*a\*b\* +fits how *humans perceive* color and HCL fits how *humans think* colors. + +Whenever you'd use HSV, rather go for CIE-L\*C\*h°. for fixed lightness L\* and +chroma C\* values, the hue angle h° rotates through colors of the same +perceived brightness and intensity. + +How? +==== + +### Installing +Installing the library is as easy as + +```bash +$ go get github.com/lucasb-eyer/go-colorful +``` + +The package can then be used through an + +```go +import "github.com/lucasb-eyer/go-colorful" +``` + +### Basic usage + +Create a beautiful blue color using different source space: + +```go +// Any of the following should be the same +c := colorful.Color{0.313725, 0.478431, 0.721569} +c, err := colorful.Hex("#517AB8") +if err != nil { + log.Fatal(err) +} +c = colorful.Hsv(216.0, 0.56, 0.722) +c = colorful.Xyz(0.189165, 0.190837, 0.480248) +c = colorful.Xyy(0.219895, 0.221839, 0.190837) +c = colorful.Lab(0.507850, 0.040585,-0.370945) +c = colorful.Luv(0.507849,-0.194172,-0.567924) +c = colorful.Hcl(276.2440, 0.373160, 0.507849) +fmt.Printf("RGB values: %v, %v, %v", c.R, c.G, c.B) +``` + +And then converting this color back into various color spaces: + +```go +hex := c.Hex() +h, s, v := c.Hsv() +x, y, z := c.Xyz() +x, y, Y := c.Xyy() +l, a, b := c.Lab() +l, u, v := c.Luv() +h, c, l := c.Hcl() +``` + +Note that, because of Go's unfortunate choice of requiring an initial uppercase, +the name of the functions relating to the xyY space are just off. If you have +any good suggestion, please open an issue. (I don't consider XyY good.) + +### The `color.Color` interface +Because a `colorful.Color` implements Go's `color.Color` interface (found in the +`image/color` package), it can be used anywhere that expects a `color.Color`. + +Furthermore, you can convert anything that implements the `color.Color` interface +into a `colorful.Color` using the `MakeColor` function: + +```go +c, ok := colorful.MakeColor(color.Gray16{12345}) +``` + +**Caveat:** Be aware that this latter conversion (using `MakeColor`) hits a +corner-case when alpha is exactly zero. Because `color.Color` uses pre-multiplied +alpha colors, this means the RGB values are lost (set to 0) and it's impossible +to recover them. In such a case `MakeColor` will return `false` as its second value. + +### Comparing colors +In the RGB color space, the Euclidian distance between colors *doesn't* correspond +to visual/perceptual distance. This means that two pairs of colors which have the +same distance in RGB space can look much further apart. This is fixed by the +CIE-L\*a\*b\*, CIE-L\*u\*v\* and CIE-L\*C\*h° color spaces. +Thus you should only compare colors in any of these space. +(Note that the distance in CIE-L\*a\*b\* and CIE-L\*C\*h° are the same, since it's the same space but in cylindrical coordinates) + +![Color distance comparison](doc/colordist/colordist.png) + +The two colors shown on the top look much more different than the two shown on +the bottom. Still, in RGB space, their distance is the same. +Here is a little example program which shows the distances between the top two +and bottom two colors in RGB, CIE-L\*a\*b\* and CIE-L\*u\*v\* space. You can find it in `doc/colordist/colordist.go`. + +```go +package main + +import "fmt" +import "github.com/lucasb-eyer/go-colorful" + +func main() { + c1a := colorful.Color{150.0 / 255.0, 10.0 / 255.0, 150.0 / 255.0} + c1b := colorful.Color{53.0 / 255.0, 10.0 / 255.0, 150.0 / 255.0} + c2a := colorful.Color{10.0 / 255.0, 150.0 / 255.0, 50.0 / 255.0} + c2b := colorful.Color{99.9 / 255.0, 150.0 / 255.0, 10.0 / 255.0} + + fmt.Printf("DistanceRgb: c1: %v\tand c2: %v\n", c1a.DistanceRgb(c1b), c2a.DistanceRgb(c2b)) + fmt.Printf("DistanceLab: c1: %v\tand c2: %v\n", c1a.DistanceLab(c1b), c2a.DistanceLab(c2b)) + fmt.Printf("DistanceLuv: c1: %v\tand c2: %v\n", c1a.DistanceLuv(c1b), c2a.DistanceLuv(c2b)) + fmt.Printf("DistanceCIE76: c1: %v\tand c2: %v\n", c1a.DistanceCIE76(c1b), c2a.DistanceCIE76(c2b)) + fmt.Printf("DistanceCIE94: c1: %v\tand c2: %v\n", c1a.DistanceCIE94(c1b), c2a.DistanceCIE94(c2b)) + fmt.Printf("DistanceCIEDE2000: c1: %v\tand c2: %v\n", c1a.DistanceCIEDE2000(c1b), c2a.DistanceCIEDE2000(c2b)) +} +``` + +Running the above program shows that you should always prefer any of the CIE distances: + +```bash +$ go run colordist.go +DistanceRgb: c1: 0.3803921568627451 and c2: 0.3858713931171159 +DistanceLab: c1: 0.32048458312798056 and c2: 0.24397151758565272 +DistanceLuv: c1: 0.5134369614199698 and c2: 0.2568692839860636 +DistanceCIE76: c1: 0.32048458312798056 and c2: 0.24397151758565272 +DistanceCIE94: c1: 0.19799168128511324 and c2: 0.12207136371167401 +DistanceCIEDE2000: c1: 0.17274551120971166 and c2: 0.10665210031428465 +``` + +It also shows that `DistanceLab` is more formally known as `DistanceCIE76` and +has been superseded by the slightly more accurate, but much more expensive +`DistanceCIE94` and `DistanceCIEDE2000`. + +Note that `AlmostEqualRgb` is provided mainly for (unit-)testing purposes. Use +it only if you really know what you're doing. It will eat your cat. + +### Blending colors +Blending is highly connected to distance, since it basically "walks through" the +colorspace thus, if the colorspace maps distances well, the walk is "smooth". + +Colorful comes with blending functions in RGB, HSV and any of the LAB spaces. +Of course, you'd rather want to use the blending functions of the LAB spaces since +these spaces map distances well but, just in case, here is an example showing +you how the blendings (`#fdffcc` to `#242a42`) are done in the various spaces: + +![Blending colors in different spaces.](doc/colorblend/colorblend.png) + +What you see is that HSV is really bad: it adds some green, which is not present +in the original colors at all! RGB is much better, but it stays light a little +too long. LUV and LAB both hit the right lightness but LAB has a little more +color. HCL works in the same vein as HSV (both cylindrical interpolations) but +it does it right in that there is no green appearing and the lighthness changes +in a linear manner. + +While this seems all good, you need to know one thing: When interpolating in any +of the CIE color spaces, you might get invalid RGB colors! This is important if +the starting and ending colors are user-input or random. An example of where this +happens is when blending between `#eeef61` and `#1e3140`: + +![Invalid RGB colors may crop up when blending in CIE spaces.](doc/colorblend/invalid.png) + +You can test whether a color is a valid RGB color by calling the `IsValid` method +and indeed, calling IsValid will return false for the redish colors on the bottom. +One way to "fix" this is to get a valid color close to the invalid one by calling +`Clamped`, which always returns a nearby valid color. Doing this, we get the +following result, which is satisfactory: + +![Fixing invalid RGB colors by clamping them to the valid range.](doc/colorblend/clamped.png) + +The following is the code creating the above three images; it can be found in `doc/colorblend/colorblend.go` + +```go +package main + +import "fmt" +import "github.com/lucasb-eyer/go-colorful" +import "image" +import "image/draw" +import "image/png" +import "os" + +func main() { + blocks := 10 + blockw := 40 + img := image.NewRGBA(image.Rect(0,0,blocks*blockw,200)) + + c1, _ := colorful.Hex("#fdffcc") + c2, _ := colorful.Hex("#242a42") + + // Use these colors to get invalid RGB in the gradient. + //c1, _ := colorful.Hex("#EEEF61") + //c2, _ := colorful.Hex("#1E3140") + + for i := 0 ; i < blocks ; i++ { + draw.Draw(img, image.Rect(i*blockw, 0,(i+1)*blockw, 40), &image.Uniform{c1.BlendHsv(c2, float64(i)/float64(blocks-1))}, image.ZP, draw.Src) + draw.Draw(img, image.Rect(i*blockw, 40,(i+1)*blockw, 80), &image.Uniform{c1.BlendLuv(c2, float64(i)/float64(blocks-1))}, image.ZP, draw.Src) + draw.Draw(img, image.Rect(i*blockw, 80,(i+1)*blockw,120), &image.Uniform{c1.BlendRgb(c2, float64(i)/float64(blocks-1))}, image.ZP, draw.Src) + draw.Draw(img, image.Rect(i*blockw,120,(i+1)*blockw,160), &image.Uniform{c1.BlendLab(c2, float64(i)/float64(blocks-1))}, image.ZP, draw.Src) + draw.Draw(img, image.Rect(i*blockw,160,(i+1)*blockw,200), &image.Uniform{c1.BlendHcl(c2, float64(i)/float64(blocks-1))}, image.ZP, draw.Src) + + // This can be used to "fix" invalid colors in the gradient. + //draw.Draw(img, image.Rect(i*blockw,160,(i+1)*blockw,200), &image.Uniform{c1.BlendHcl(c2, float64(i)/float64(blocks-1)).Clamped()}, image.ZP, draw.Src) + } + + toimg, err := os.Create("colorblend.png") + if err != nil { + fmt.Printf("Error: %v", err) + return + } + defer toimg.Close() + + png.Encode(toimg, img) +} +``` + +#### Generating color gradients +A very common reason to blend colors is creating gradients. There is an example +program in [doc/gradientgen.go](doc/gradientgen/gradientgen.go); it doesn't use any API +which hasn't been used in the previous example code, so I won't bother pasting +the code in here. Just look at that gorgeous gradient it generated in HCL space: + +!["Spectral" colorbrewer gradient in HCL space.](doc/gradientgen/gradientgen.png) + +### Getting random colors +It is sometimes necessary to generate random colors. You could simply do this +on your own by generating colors with random values. By restricting the random +values to a range smaller than [0..1] and using a space such as CIE-H\*C\*l° or +HSV, you can generate both random shades of a color or random colors of a +lightness: + +```go +random_blue := colorful.Hcl(180.0+rand.Float64()*50.0, 0.2+rand.Float64()*0.8, 0.3+rand.Float64()*0.7) +random_dark := colorful.Hcl(rand.Float64()*360.0, rand.Float64(), rand.Float64()*0.4) +random_light := colorful.Hcl(rand.Float64()*360.0, rand.Float64(), 0.6+rand.Float64()*0.4) +``` + +Since getting random "warm" and "happy" colors is quite a common task, there +are some helper functions: + +```go +colorful.WarmColor() +colorful.HappyColor() +colorful.FastWarmColor() +colorful.FastHappyColor() +``` + +The ones prefixed by `Fast` are faster but less coherent since they use the HSV +space as opposed to the regular ones which use CIE-L\*C\*h° space. The +following picture shows the warm colors in the top two rows and happy colors +in the bottom two rows. Within these, the first is the regular one and the +second is the fast one. + +![Warm, fast warm, happy and fast happy random colors, respectively.](doc/colorgens/colorgens.png) + +Don't forget to initialize the random seed! You can see the code used for +generating this picture in `doc/colorgens/colorgens.go`. + +### Getting random palettes +As soon as you need to generate more than one random color, you probably want +them to be distinguishible. Playing against an opponent which has almost the +same blue as I do is not fun. This is where random palettes can help. + +These palettes are generated using an algorithm which ensures that all colors +on the palette are as distinguishible as possible. Again, there is a `Fast` +method which works in HSV and is less perceptually uniform and a non-`Fast` +method which works in CIE spaces. For more theory on `SoftPalette`, check out +[I want hue](http://tools.medialab.sciences-po.fr/iwanthue/theory.php). Yet +again, there is a `Happy` and a `Warm` version, which do what you expect, but +now there is an additional `Soft` version, which is more configurable: you can +give a constraint on the color space in order to get colors within a certain *feel*. + +Let's start with the simple methods first, all they take is the amount of +colors to generate, which could, for example, be the player count. They return +an array of `colorful.Color` objects: + +```go +pal1, err1 := colorful.WarmPalette(10) +pal2 := colorful.FastWarmPalette(10) +pal3, err3 := colorful.HappyPalette(10) +pal4 := colorful.FastHappyPalette(10) +pal5, err5 := colorful.SoftPalette(10) +``` + +Note that the non-fast methods *may* fail if you ask for way too many colors. +Let's move on to the advanced one, namely `SoftPaletteEx`. Besides the color +count, this function takes a `SoftPaletteSettings` object as argument. The +interesting part here is its `CheckColor` member, which is a boolean function +taking three floating points as arguments: `l`, `a` and `b`. This function +should return `true` for colors which lie within the region you want and `false` +otherwise. The other members are `Iteration`, which should be within [5..100] +where higher means slower but more exact palette, and `ManySamples` which you +should set to `true` in case your `CheckColor` constraint rejects a large part +of the color space. + +For example, to create a palette of 10 brownish colors, you'd call it like this: + +```go +func isbrowny(l, a, b float64) bool { + h, c, L := colorful.LabToHcl(l, a, b) + return 10.0 < h && h < 50.0 && 0.1 < c && c < 0.5 && L < 0.5 +} +// Since the above function is pretty restrictive, we set ManySamples to true. +brownies := colorful.SoftPaletteEx(10, colorful.SoftPaletteSettings{isbrowny, 50, true}) +``` + +The following picture shows the palettes generated by all of these methods +(sourcecode in `doc/palettegens/palettegens.go`), in the order they were presented, i.e. +from top to bottom: `Warm`, `FastWarm`, `Happy`, `FastHappy`, `Soft`, +`SoftEx(isbrowny)`. All of them contain some randomness, so YMMV. + +![All example palettes](doc/palettegens/palettegens.png) + +Again, the code used for generating the above image is available as [doc/palettegens/palettegens.go](https://github.com/lucasb-eyer/go-colorful/blob/master/doc/palettegens/palettegens.go). + +### Sorting colors +TODO: Sort using dist fn. + +### Using linear RGB for computations +There are two methods for transforming RGB<->Linear RGB: a fast and almost precise one, +and a slow and precise one. + +```go +r, g, b := colorful.Hex("#FF0000").FastLinearRgb() +``` + +TODO: describe some more. + +### Want to use some other reference point? + +```go +c := colorful.LabWhiteRef(0.507850, 0.040585,-0.370945, colorful.D50) +l, a, b := c.LabWhiteRef(colorful.D50) +``` + +### Reading and writing colors from databases + +The type `HexColor` makes it easy to store colors as strings in a database. It +implements the [https://godoc.org/database/sql#Scanner](database/sql.Scanner) +and [database/sql/driver.Value](https://godoc.org/database/sql/driver.Value) +interfaces which provide automatic type conversion. + +Example: + +```go +var hc HexColor +_, err := db.QueryRow("SELECT '#ff0000';").Scan(&hc) +// hc == HexColor{R: 1, G: 0, B: 0}; err == nil +``` + +FAQ +=== + +### Q: I get all f!@#ed up values! Your library sucks! +A: You probably provided values in the wrong range. For example, RGB values are +expected to reside between 0 and 1, *not* between 0 and 255. Normalize your colors. + +### Q: Lab/Luv/HCl seem broken! Your library sucks! +They look like this: + + + +A: You're likely trying to generate and display colors that can't be represented by RGB, +and thus monitors. When you're trying to convert, say, `HCL(190.0, 1.0, 1.0).RGB255()`, +you're asking for RGB values of `(-2105.254 300.680 286.185)`, which clearly don't exist, +and the `RGB255` function just casts these numbers to `uint8`, creating wrap-around and +what looks like a completely broken gradient. What you want to do, is either use more +reasonable values of colors which actually exist in RGB, or just `Clamp()` the resulting +color to its nearest existing one, living with the consequences: +`HCL(190.0, 1.0, 1.0).Clamp().RGB255()`. It will look something like this: + + + +[Here's an issue going in-depth about this](https://github.com/lucasb-eyer/go-colorful/issues/14), +as well as [my answer](https://github.com/lucasb-eyer/go-colorful/issues/14#issuecomment-324205385), +both with code and pretty pictures. Also note that this was somewhat covered above in the +["Blending colors" section](https://github.com/lucasb-eyer/go-colorful#blending-colors). + +### Q: In a tight loop, conversion to Lab/Luv/HCl/... are slooooow! +A: Yes, they are. +This library aims for correctness, readability, and modularity; it wasn't written with speed in mind. +A large part of the slowness comes from these conversions going through `LinearRgb` which uses powers. +I implemented a fast approximation to `LinearRgb` called `FastLinearRgb` by using Taylor approximations. +The approximation is roughly 5x faster and precise up to roughly 0.5%, +the major caveat being that if the input values are outside the range 0-1, accuracy drops dramatically. +You can use these in your conversions as follows: + +```go +col := // Get your color somehow +l, a, b := XyzToLab(LinearRgbToXyz(col.LinearRgb())) +``` + +If you need faster versions of `Distance*` and `Blend*` that make use of this fast approximation, +feel free to implement them and open a pull-request, I'll happily accept. + +The derivation of these functions can be followed in [this Jupyter notebook](doc/LinearRGB Approximations.ipynb). +Here's the main figure showing the approximation quality: + +![approximation quality](doc/approx-quality.png) + +More speed could be gained by using SIMD instructions in many places. +You can also get more speed for specific conversions by approximating the full conversion function, +but that is outside the scope of this library. +Thanks to [@ZirconiumX](https://github.com/ZirconiumX) for starting this investigation, +see [issue #18](https://github.com/lucasb-eyer/go-colorful/issues/18) for details. + +### Q: Why would `MakeColor` ever fail!? +A: `MakeColor` fails when the alpha channel is zero. In that case, the +conversion is undefined. See [issue 21](https://github.com/lucasb-eyer/go-colorful/issues/21) +as well as the short caveat note in the ["The `color.Color` interface"](README.md#the-colorcolor-interface) +section above. + +Who? +==== + +This library has been developed by Lucas Beyer with contributions from +Bastien Dejean (@baskerville), Phil Kulak (@pkulak) and Christian Muehlhaeuser (@muesli). + +Release Notes +============= + +### Version 1.0 +- API Breaking change in `MakeColor`: instead of `panic`ing when alpha is zero, it now returns a secondary, boolean return value indicating success. See [the color.Color interface](https://github.com/lucasb-eyer/go-colorful#the-colorcolor-interface) section and [this FAQ entry](https://github.com/lucasb-eyer/go-colorful#q-why-would-makecolor-ever-fail) for details. + +### Version 0.9 +- Initial version number after having ignored versioning for a long time :) + +License: MIT +============ +Copyright (c) 2013 Lucas Beyer + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/vendor/github.com/lucasb-eyer/go-colorful/colorgens.go b/vendor/github.com/lucasb-eyer/go-colorful/colorgens.go new file mode 100644 index 0000000..2e2e49e --- /dev/null +++ b/vendor/github.com/lucasb-eyer/go-colorful/colorgens.go @@ -0,0 +1,55 @@ +// Various ways to generate single random colors + +package colorful + +import ( + "math/rand" +) + +// Creates a random dark, "warm" color through a restricted HSV space. +func FastWarmColor() Color { + return Hsv( + rand.Float64()*360.0, + 0.5+rand.Float64()*0.3, + 0.3+rand.Float64()*0.3) +} + +// Creates a random dark, "warm" color through restricted HCL space. +// This is slower than FastWarmColor but will likely give you colors which have +// the same "warmness" if you run it many times. +func WarmColor() (c Color) { + for c = randomWarm(); !c.IsValid(); c = randomWarm() { + } + return +} + +func randomWarm() Color { + return Hcl( + rand.Float64()*360.0, + 0.1+rand.Float64()*0.3, + 0.2+rand.Float64()*0.3) +} + +// Creates a random bright, "pimpy" color through a restricted HSV space. +func FastHappyColor() Color { + return Hsv( + rand.Float64()*360.0, + 0.7+rand.Float64()*0.3, + 0.6+rand.Float64()*0.3) +} + +// Creates a random bright, "pimpy" color through restricted HCL space. +// This is slower than FastHappyColor but will likely give you colors which +// have the same "brightness" if you run it many times. +func HappyColor() (c Color) { + for c = randomPimp(); !c.IsValid(); c = randomPimp() { + } + return +} + +func randomPimp() Color { + return Hcl( + rand.Float64()*360.0, + 0.5+rand.Float64()*0.3, + 0.5+rand.Float64()*0.3) +} diff --git a/vendor/github.com/lucasb-eyer/go-colorful/colors.go b/vendor/github.com/lucasb-eyer/go-colorful/colors.go new file mode 100644 index 0000000..441a4e2 --- /dev/null +++ b/vendor/github.com/lucasb-eyer/go-colorful/colors.go @@ -0,0 +1,903 @@ +// The colorful package provides all kinds of functions for working with colors. +package colorful + +import ( + "fmt" + "image/color" + "math" +) + +// A color is stored internally using sRGB (standard RGB) values in the range 0-1 +type Color struct { + R, G, B float64 +} + +// Implement the Go color.Color interface. +func (col Color) RGBA() (r, g, b, a uint32) { + r = uint32(col.R*65535.0 + 0.5) + g = uint32(col.G*65535.0 + 0.5) + b = uint32(col.B*65535.0 + 0.5) + a = 0xFFFF + return +} + +// Constructs a colorful.Color from something implementing color.Color +func MakeColor(col color.Color) (Color, bool) { + r, g, b, a := col.RGBA() + if a == 0 { + return Color{0, 0, 0}, false + } + + // Since color.Color is alpha pre-multiplied, we need to divide the + // RGB values by alpha again in order to get back the original RGB. + r *= 0xffff + r /= a + g *= 0xffff + g /= a + b *= 0xffff + b /= a + + return Color{float64(r) / 65535.0, float64(g) / 65535.0, float64(b) / 65535.0}, true +} + +// Might come in handy sometimes to reduce boilerplate code. +func (col Color) RGB255() (r, g, b uint8) { + r = uint8(col.R*255.0 + 0.5) + g = uint8(col.G*255.0 + 0.5) + b = uint8(col.B*255.0 + 0.5) + return +} + +// This is the tolerance used when comparing colors using AlmostEqualRgb. +const Delta = 1.0 / 255.0 + +// This is the default reference white point. +var D65 = [3]float64{0.95047, 1.00000, 1.08883} + +// And another one. +var D50 = [3]float64{0.96422, 1.00000, 0.82521} + +// Checks whether the color exists in RGB space, i.e. all values are in [0..1] +func (c Color) IsValid() bool { + return 0.0 <= c.R && c.R <= 1.0 && + 0.0 <= c.G && c.G <= 1.0 && + 0.0 <= c.B && c.B <= 1.0 +} + +func clamp01(v float64) float64 { + return math.Max(0.0, math.Min(v, 1.0)) +} + +// Returns Clamps the color into valid range, clamping each value to [0..1] +// If the color is valid already, this is a no-op. +func (c Color) Clamped() Color { + return Color{clamp01(c.R), clamp01(c.G), clamp01(c.B)} +} + +func sq(v float64) float64 { + return v * v +} + +func cub(v float64) float64 { + return v * v * v +} + +// DistanceRgb computes the distance between two colors in RGB space. +// This is not a good measure! Rather do it in Lab space. +func (c1 Color) DistanceRgb(c2 Color) float64 { + return math.Sqrt(sq(c1.R-c2.R) + sq(c1.G-c2.G) + sq(c1.B-c2.B)) +} + +// Check for equality between colors within the tolerance Delta (1/255). +func (c1 Color) AlmostEqualRgb(c2 Color) bool { + return math.Abs(c1.R-c2.R)+ + math.Abs(c1.G-c2.G)+ + math.Abs(c1.B-c2.B) < 3.0*Delta +} + +// You don't really want to use this, do you? Go for BlendLab, BlendLuv or BlendHcl. +func (c1 Color) BlendRgb(c2 Color, t float64) Color { + return Color{c1.R + t*(c2.R-c1.R), + c1.G + t*(c2.G-c1.G), + c1.B + t*(c2.B-c1.B)} +} + +// Utility used by Hxx color-spaces for interpolating between two angles in [0,360]. +func interp_angle(a0, a1, t float64) float64 { + // Based on the answer here: http://stackoverflow.com/a/14498790/2366315 + // With potential proof that it works here: http://math.stackexchange.com/a/2144499 + delta := math.Mod(math.Mod(a1-a0, 360.0)+540, 360.0) - 180.0 + return math.Mod(a0+t*delta+360.0, 360.0) +} + +/// HSV /// +/////////// +// From http://en.wikipedia.org/wiki/HSL_and_HSV +// Note that h is in [0..360] and s,v in [0..1] + +// Hsv returns the Hue [0..360], Saturation and Value [0..1] of the color. +func (col Color) Hsv() (h, s, v float64) { + min := math.Min(math.Min(col.R, col.G), col.B) + v = math.Max(math.Max(col.R, col.G), col.B) + C := v - min + + s = 0.0 + if v != 0.0 { + s = C / v + } + + h = 0.0 // We use 0 instead of undefined as in wp. + if min != v { + if v == col.R { + h = math.Mod((col.G-col.B)/C, 6.0) + } + if v == col.G { + h = (col.B-col.R)/C + 2.0 + } + if v == col.B { + h = (col.R-col.G)/C + 4.0 + } + h *= 60.0 + if h < 0.0 { + h += 360.0 + } + } + return +} + +// Hsv creates a new Color given a Hue in [0..360], a Saturation and a Value in [0..1] +func Hsv(H, S, V float64) Color { + Hp := H / 60.0 + C := V * S + X := C * (1.0 - math.Abs(math.Mod(Hp, 2.0)-1.0)) + + m := V - C + r, g, b := 0.0, 0.0, 0.0 + + switch { + case 0.0 <= Hp && Hp < 1.0: + r = C + g = X + case 1.0 <= Hp && Hp < 2.0: + r = X + g = C + case 2.0 <= Hp && Hp < 3.0: + g = C + b = X + case 3.0 <= Hp && Hp < 4.0: + g = X + b = C + case 4.0 <= Hp && Hp < 5.0: + r = X + b = C + case 5.0 <= Hp && Hp < 6.0: + r = C + b = X + } + + return Color{m + r, m + g, m + b} +} + +// You don't really want to use this, do you? Go for BlendLab, BlendLuv or BlendHcl. +func (c1 Color) BlendHsv(c2 Color, t float64) Color { + h1, s1, v1 := c1.Hsv() + h2, s2, v2 := c2.Hsv() + + // We know that h are both in [0..360] + return Hsv(interp_angle(h1, h2, t), s1+t*(s2-s1), v1+t*(v2-v1)) +} + +/// HSL /// +/////////// + +// Hsl returns the Hue [0..360], Saturation [0..1], and Luminance (lightness) [0..1] of the color. +func (col Color) Hsl() (h, s, l float64) { + min := math.Min(math.Min(col.R, col.G), col.B) + max := math.Max(math.Max(col.R, col.G), col.B) + + l = (max + min) / 2 + + if min == max { + s = 0 + h = 0 + } else { + if l < 0.5 { + s = (max - min) / (max + min) + } else { + s = (max - min) / (2.0 - max - min) + } + + if max == col.R { + h = (col.G - col.B) / (max - min) + } else if max == col.G { + h = 2.0 + (col.B-col.R)/(max-min) + } else { + h = 4.0 + (col.R-col.G)/(max-min) + } + + h *= 60 + + if h < 0 { + h += 360 + } + } + + return +} + +// Hsl creates a new Color given a Hue in [0..360], a Saturation [0..1], and a Luminance (lightness) in [0..1] +func Hsl(h, s, l float64) Color { + if s == 0 { + return Color{l, l, l} + } + + var r, g, b float64 + var t1 float64 + var t2 float64 + var tr float64 + var tg float64 + var tb float64 + + if l < 0.5 { + t1 = l * (1.0 + s) + } else { + t1 = l + s - l*s + } + + t2 = 2*l - t1 + h = h / 360 + tr = h + 1.0/3.0 + tg = h + tb = h - 1.0/3.0 + + if tr < 0 { + tr++ + } + if tr > 1 { + tr-- + } + if tg < 0 { + tg++ + } + if tg > 1 { + tg-- + } + if tb < 0 { + tb++ + } + if tb > 1 { + tb-- + } + + // Red + if 6*tr < 1 { + r = t2 + (t1-t2)*6*tr + } else if 2*tr < 1 { + r = t1 + } else if 3*tr < 2 { + r = t2 + (t1-t2)*(2.0/3.0-tr)*6 + } else { + r = t2 + } + + // Green + if 6*tg < 1 { + g = t2 + (t1-t2)*6*tg + } else if 2*tg < 1 { + g = t1 + } else if 3*tg < 2 { + g = t2 + (t1-t2)*(2.0/3.0-tg)*6 + } else { + g = t2 + } + + // Blue + if 6*tb < 1 { + b = t2 + (t1-t2)*6*tb + } else if 2*tb < 1 { + b = t1 + } else if 3*tb < 2 { + b = t2 + (t1-t2)*(2.0/3.0-tb)*6 + } else { + b = t2 + } + + return Color{r, g, b} +} + +/// Hex /// +/////////// + +// Hex returns the hex "html" representation of the color, as in #ff0080. +func (col Color) Hex() string { + // Add 0.5 for rounding + return fmt.Sprintf("#%02x%02x%02x", uint8(col.R*255.0+0.5), uint8(col.G*255.0+0.5), uint8(col.B*255.0+0.5)) +} + +// Hex parses a "html" hex color-string, either in the 3 "#f0c" or 6 "#ff1034" digits form. +func Hex(scol string) (Color, error) { + format := "#%02x%02x%02x" + factor := 1.0 / 255.0 + if len(scol) == 4 { + format = "#%1x%1x%1x" + factor = 1.0 / 15.0 + } + + var r, g, b uint8 + n, err := fmt.Sscanf(scol, format, &r, &g, &b) + if err != nil { + return Color{}, err + } + if n != 3 { + return Color{}, fmt.Errorf("color: %v is not a hex-color", scol) + } + + return Color{float64(r) * factor, float64(g) * factor, float64(b) * factor}, nil +} + +/// Linear /// +////////////// +// http://www.sjbrown.co.uk/2004/05/14/gamma-correct-rendering/ +// http://www.brucelindbloom.com/Eqn_RGB_to_XYZ.html + +func linearize(v float64) float64 { + if v <= 0.04045 { + return v / 12.92 + } + return math.Pow((v+0.055)/1.055, 2.4) +} + +// LinearRgb converts the color into the linear RGB space (see http://www.sjbrown.co.uk/2004/05/14/gamma-correct-rendering/). +func (col Color) LinearRgb() (r, g, b float64) { + r = linearize(col.R) + g = linearize(col.G) + b = linearize(col.B) + return +} + +// A much faster and still quite precise linearization using a 6th-order Taylor approximation. +// See the accompanying Jupyter notebook for derivation of the constants. +func linearize_fast(v float64) float64 { + v1 := v - 0.5 + v2 := v1 * v1 + v3 := v2 * v1 + v4 := v2 * v2 + //v5 := v3*v2 + return -0.248750514614486 + 0.925583310193438*v + 1.16740237321695*v2 + 0.280457026598666*v3 - 0.0757991963780179*v4 //+ 0.0437040411548932*v5 +} + +// FastLinearRgb is much faster than and almost as accurate as LinearRgb. +// BUT it is important to NOTE that they only produce good results for valid colors r,g,b in [0,1]. +func (col Color) FastLinearRgb() (r, g, b float64) { + r = linearize_fast(col.R) + g = linearize_fast(col.G) + b = linearize_fast(col.B) + return +} + +func delinearize(v float64) float64 { + if v <= 0.0031308 { + return 12.92 * v + } + return 1.055*math.Pow(v, 1.0/2.4) - 0.055 +} + +// LinearRgb creates an sRGB color out of the given linear RGB color (see http://www.sjbrown.co.uk/2004/05/14/gamma-correct-rendering/). +func LinearRgb(r, g, b float64) Color { + return Color{delinearize(r), delinearize(g), delinearize(b)} +} + +func delinearize_fast(v float64) float64 { + // This function (fractional root) is much harder to linearize, so we need to split. + if v > 0.2 { + v1 := v - 0.6 + v2 := v1 * v1 + v3 := v2 * v1 + v4 := v2 * v2 + v5 := v3 * v2 + return 0.442430344268235 + 0.592178981271708*v - 0.287864782562636*v2 + 0.253214392068985*v3 - 0.272557158129811*v4 + 0.325554383321718*v5 + } else if v > 0.03 { + v1 := v - 0.115 + v2 := v1 * v1 + v3 := v2 * v1 + v4 := v2 * v2 + v5 := v3 * v2 + return 0.194915592891669 + 1.55227076330229*v - 3.93691860257828*v2 + 18.0679839248761*v3 - 101.468750302746*v4 + 632.341487393927*v5 + } else { + v1 := v - 0.015 + v2 := v1 * v1 + v3 := v2 * v1 + v4 := v2 * v2 + v5 := v3 * v2 + // You can clearly see from the involved constants that the low-end is highly nonlinear. + return 0.0519565234928877 + 5.09316778537561*v - 99.0338180489702*v2 + 3484.52322764895*v3 - 150028.083412663*v4 + 7168008.42971613*v5 + } +} + +// FastLinearRgb is much faster than and almost as accurate as LinearRgb. +// BUT it is important to NOTE that they only produce good results for valid inputs r,g,b in [0,1]. +func FastLinearRgb(r, g, b float64) Color { + return Color{delinearize_fast(r), delinearize_fast(g), delinearize_fast(b)} +} + +// XyzToLinearRgb converts from CIE XYZ-space to Linear RGB space. +func XyzToLinearRgb(x, y, z float64) (r, g, b float64) { + r = 3.2404542*x - 1.5371385*y - 0.4985314*z + g = -0.9692660*x + 1.8760108*y + 0.0415560*z + b = 0.0556434*x - 0.2040259*y + 1.0572252*z + return +} + +func LinearRgbToXyz(r, g, b float64) (x, y, z float64) { + x = 0.4124564*r + 0.3575761*g + 0.1804375*b + y = 0.2126729*r + 0.7151522*g + 0.0721750*b + z = 0.0193339*r + 0.1191920*g + 0.9503041*b + return +} + +/// XYZ /// +/////////// +// http://www.sjbrown.co.uk/2004/05/14/gamma-correct-rendering/ + +func (col Color) Xyz() (x, y, z float64) { + return LinearRgbToXyz(col.LinearRgb()) +} + +func Xyz(x, y, z float64) Color { + return LinearRgb(XyzToLinearRgb(x, y, z)) +} + +/// xyY /// +/////////// +// http://www.brucelindbloom.com/Eqn_XYZ_to_xyY.html + +// Well, the name is bad, since it's xyY but Golang needs me to start with a +// capital letter to make the method public. +func XyzToXyy(X, Y, Z float64) (x, y, Yout float64) { + return XyzToXyyWhiteRef(X, Y, Z, D65) +} + +func XyzToXyyWhiteRef(X, Y, Z float64, wref [3]float64) (x, y, Yout float64) { + Yout = Y + N := X + Y + Z + if math.Abs(N) < 1e-14 { + // When we have black, Bruce Lindbloom recommends to use + // the reference white's chromacity for x and y. + x = wref[0] / (wref[0] + wref[1] + wref[2]) + y = wref[1] / (wref[0] + wref[1] + wref[2]) + } else { + x = X / N + y = Y / N + } + return +} + +func XyyToXyz(x, y, Y float64) (X, Yout, Z float64) { + Yout = Y + + if -1e-14 < y && y < 1e-14 { + X = 0.0 + Z = 0.0 + } else { + X = Y / y * x + Z = Y / y * (1.0 - x - y) + } + + return +} + +// Converts the given color to CIE xyY space using D65 as reference white. +// (Note that the reference white is only used for black input.) +// x, y and Y are in [0..1] +func (col Color) Xyy() (x, y, Y float64) { + return XyzToXyy(col.Xyz()) +} + +// Converts the given color to CIE xyY space, taking into account +// a given reference white. (i.e. the monitor's white) +// (Note that the reference white is only used for black input.) +// x, y and Y are in [0..1] +func (col Color) XyyWhiteRef(wref [3]float64) (x, y, Y float64) { + X, Y2, Z := col.Xyz() + return XyzToXyyWhiteRef(X, Y2, Z, wref) +} + +// Generates a color by using data given in CIE xyY space. +// x, y and Y are in [0..1] +func Xyy(x, y, Y float64) Color { + return Xyz(XyyToXyz(x, y, Y)) +} + +/// L*a*b* /// +////////////// +// http://en.wikipedia.org/wiki/Lab_color_space#CIELAB-CIEXYZ_conversions +// For L*a*b*, we need to L*a*b*<->XYZ->RGB and the first one is device dependent. + +func lab_f(t float64) float64 { + if t > 6.0/29.0*6.0/29.0*6.0/29.0 { + return math.Cbrt(t) + } + return t/3.0*29.0/6.0*29.0/6.0 + 4.0/29.0 +} + +func XyzToLab(x, y, z float64) (l, a, b float64) { + // Use D65 white as reference point by default. + // http://www.fredmiranda.com/forum/topic/1035332 + // http://en.wikipedia.org/wiki/Standard_illuminant + return XyzToLabWhiteRef(x, y, z, D65) +} + +func XyzToLabWhiteRef(x, y, z float64, wref [3]float64) (l, a, b float64) { + fy := lab_f(y / wref[1]) + l = 1.16*fy - 0.16 + a = 5.0 * (lab_f(x/wref[0]) - fy) + b = 2.0 * (fy - lab_f(z/wref[2])) + return +} + +func lab_finv(t float64) float64 { + if t > 6.0/29.0 { + return t * t * t + } + return 3.0 * 6.0 / 29.0 * 6.0 / 29.0 * (t - 4.0/29.0) +} + +func LabToXyz(l, a, b float64) (x, y, z float64) { + // D65 white (see above). + return LabToXyzWhiteRef(l, a, b, D65) +} + +func LabToXyzWhiteRef(l, a, b float64, wref [3]float64) (x, y, z float64) { + l2 := (l + 0.16) / 1.16 + x = wref[0] * lab_finv(l2+a/5.0) + y = wref[1] * lab_finv(l2) + z = wref[2] * lab_finv(l2-b/2.0) + return +} + +// Converts the given color to CIE L*a*b* space using D65 as reference white. +func (col Color) Lab() (l, a, b float64) { + return XyzToLab(col.Xyz()) +} + +// Converts the given color to CIE L*a*b* space, taking into account +// a given reference white. (i.e. the monitor's white) +func (col Color) LabWhiteRef(wref [3]float64) (l, a, b float64) { + x, y, z := col.Xyz() + return XyzToLabWhiteRef(x, y, z, wref) +} + +// Generates a color by using data given in CIE L*a*b* space using D65 as reference white. +// WARNING: many combinations of `l`, `a`, and `b` values do not have corresponding +// valid RGB values, check the FAQ in the README if you're unsure. +func Lab(l, a, b float64) Color { + return Xyz(LabToXyz(l, a, b)) +} + +// Generates a color by using data given in CIE L*a*b* space, taking +// into account a given reference white. (i.e. the monitor's white) +func LabWhiteRef(l, a, b float64, wref [3]float64) Color { + return Xyz(LabToXyzWhiteRef(l, a, b, wref)) +} + +// DistanceLab is a good measure of visual similarity between two colors! +// A result of 0 would mean identical colors, while a result of 1 or higher +// means the colors differ a lot. +func (c1 Color) DistanceLab(c2 Color) float64 { + l1, a1, b1 := c1.Lab() + l2, a2, b2 := c2.Lab() + return math.Sqrt(sq(l1-l2) + sq(a1-a2) + sq(b1-b2)) +} + +// That's actually the same, but I don't want to break code. +func (c1 Color) DistanceCIE76(c2 Color) float64 { + return c1.DistanceLab(c2) +} + +// Uses the CIE94 formula to calculate color distance. More accurate than +// DistanceLab, but also more work. +func (cl Color) DistanceCIE94(cr Color) float64 { + l1, a1, b1 := cl.Lab() + l2, a2, b2 := cr.Lab() + + // NOTE: Since all those formulas expect L,a,b values 100x larger than we + // have them in this library, we either need to adjust all constants + // in the formula, or convert the ranges of L,a,b before, and then + // scale the distances down again. The latter is less error-prone. + l1, a1, b1 = l1*100.0, a1*100.0, b1*100.0 + l2, a2, b2 = l2*100.0, a2*100.0, b2*100.0 + + kl := 1.0 // 2.0 for textiles + kc := 1.0 + kh := 1.0 + k1 := 0.045 // 0.048 for textiles + k2 := 0.015 // 0.014 for textiles. + + deltaL := l1 - l2 + c1 := math.Sqrt(sq(a1) + sq(b1)) + c2 := math.Sqrt(sq(a2) + sq(b2)) + deltaCab := c1 - c2 + + // Not taking Sqrt here for stability, and it's unnecessary. + deltaHab2 := sq(a1-a2) + sq(b1-b2) - sq(deltaCab) + sl := 1.0 + sc := 1.0 + k1*c1 + sh := 1.0 + k2*c1 + + vL2 := sq(deltaL / (kl * sl)) + vC2 := sq(deltaCab / (kc * sc)) + vH2 := deltaHab2 / sq(kh*sh) + + return math.Sqrt(vL2+vC2+vH2) * 0.01 // See above. +} + +// DistanceCIEDE2000 uses the Delta E 2000 formula to calculate color +// distance. It is more expensive but more accurate than both DistanceLab +// and DistanceCIE94. +func (cl Color) DistanceCIEDE2000(cr Color) float64 { + return cl.DistanceCIEDE2000klch(cr, 1.0, 1.0, 1.0) +} + +// DistanceCIEDE2000klch uses the Delta E 2000 formula with custom values +// for the weighting factors kL, kC, and kH. +func (cl Color) DistanceCIEDE2000klch(cr Color, kl, kc, kh float64) float64 { + l1, a1, b1 := cl.Lab() + l2, a2, b2 := cr.Lab() + + // As with CIE94, we scale up the ranges of L,a,b beforehand and scale + // them down again afterwards. + l1, a1, b1 = l1*100.0, a1*100.0, b1*100.0 + l2, a2, b2 = l2*100.0, a2*100.0, b2*100.0 + + cab1 := math.Sqrt(sq(a1) + sq(b1)) + cab2 := math.Sqrt(sq(a2) + sq(b2)) + cabmean := (cab1 + cab2) / 2 + + g := 0.5 * (1 - math.Sqrt(math.Pow(cabmean, 7)/(math.Pow(cabmean, 7)+math.Pow(25, 7)))) + ap1 := (1 + g) * a1 + ap2 := (1 + g) * a2 + cp1 := math.Sqrt(sq(ap1) + sq(b1)) + cp2 := math.Sqrt(sq(ap2) + sq(b2)) + + hp1 := 0.0 + if b1 != ap1 || ap1 != 0 { + hp1 = math.Atan2(b1, ap1) + if hp1 < 0 { + hp1 += math.Pi * 2 + } + hp1 *= 180 / math.Pi + } + hp2 := 0.0 + if b2 != ap2 || ap2 != 0 { + hp2 = math.Atan2(b2, ap2) + if hp2 < 0 { + hp2 += math.Pi * 2 + } + hp2 *= 180 / math.Pi + } + + deltaLp := l2 - l1 + deltaCp := cp2 - cp1 + dhp := 0.0 + cpProduct := cp1 * cp2 + if cpProduct != 0 { + dhp = hp2 - hp1 + if dhp > 180 { + dhp -= 360 + } else if dhp < -180 { + dhp += 360 + } + } + deltaHp := 2 * math.Sqrt(cpProduct) * math.Sin(dhp/2*math.Pi/180) + + lpmean := (l1 + l2) / 2 + cpmean := (cp1 + cp2) / 2 + hpmean := hp1 + hp2 + if cpProduct != 0 { + hpmean /= 2 + if math.Abs(hp1-hp2) > 180 { + if hp1+hp2 < 360 { + hpmean += 180 + } else { + hpmean -= 180 + } + } + } + + t := 1 - 0.17*math.Cos((hpmean-30)*math.Pi/180) + 0.24*math.Cos(2*hpmean*math.Pi/180) + 0.32*math.Cos((3*hpmean+6)*math.Pi/180) - 0.2*math.Cos((4*hpmean-63)*math.Pi/180) + deltaTheta := 30 * math.Exp(-sq((hpmean-275)/25)) + rc := 2 * math.Sqrt(math.Pow(cpmean, 7)/(math.Pow(cpmean, 7)+math.Pow(25, 7))) + sl := 1 + (0.015*sq(lpmean-50))/math.Sqrt(20+sq(lpmean-50)) + sc := 1 + 0.045*cpmean + sh := 1 + 0.015*cpmean*t + rt := -math.Sin(2*deltaTheta*math.Pi/180) * rc + + return math.Sqrt(sq(deltaLp/(kl*sl))+sq(deltaCp/(kc*sc))+sq(deltaHp/(kh*sh))+rt*(deltaCp/(kc*sc))*(deltaHp/(kh*sh))) * 0.01 +} + +// BlendLab blends two colors in the L*a*b* color-space, which should result in a smoother blend. +// t == 0 results in c1, t == 1 results in c2 +func (c1 Color) BlendLab(c2 Color, t float64) Color { + l1, a1, b1 := c1.Lab() + l2, a2, b2 := c2.Lab() + return Lab(l1+t*(l2-l1), + a1+t*(a2-a1), + b1+t*(b2-b1)) +} + +/// L*u*v* /// +////////////// +// http://en.wikipedia.org/wiki/CIELUV#XYZ_.E2.86.92_CIELUV_and_CIELUV_.E2.86.92_XYZ_conversions +// For L*u*v*, we need to L*u*v*<->XYZ<->RGB and the first one is device dependent. + +func XyzToLuv(x, y, z float64) (l, a, b float64) { + // Use D65 white as reference point by default. + // http://www.fredmiranda.com/forum/topic/1035332 + // http://en.wikipedia.org/wiki/Standard_illuminant + return XyzToLuvWhiteRef(x, y, z, D65) +} + +func XyzToLuvWhiteRef(x, y, z float64, wref [3]float64) (l, u, v float64) { + if y/wref[1] <= 6.0/29.0*6.0/29.0*6.0/29.0 { + l = y / wref[1] * 29.0 / 3.0 * 29.0 / 3.0 * 29.0 / 3.0 + } else { + l = 1.16*math.Cbrt(y/wref[1]) - 0.16 + } + ubis, vbis := xyz_to_uv(x, y, z) + un, vn := xyz_to_uv(wref[0], wref[1], wref[2]) + u = 13.0 * l * (ubis - un) + v = 13.0 * l * (vbis - vn) + return +} + +// For this part, we do as R's graphics.hcl does, not as wikipedia does. +// Or is it the same? +func xyz_to_uv(x, y, z float64) (u, v float64) { + denom := x + 15.0*y + 3.0*z + if denom == 0.0 { + u, v = 0.0, 0.0 + } else { + u = 4.0 * x / denom + v = 9.0 * y / denom + } + return +} + +func LuvToXyz(l, u, v float64) (x, y, z float64) { + // D65 white (see above). + return LuvToXyzWhiteRef(l, u, v, D65) +} + +func LuvToXyzWhiteRef(l, u, v float64, wref [3]float64) (x, y, z float64) { + //y = wref[1] * lab_finv((l + 0.16) / 1.16) + if l <= 0.08 { + y = wref[1] * l * 100.0 * 3.0 / 29.0 * 3.0 / 29.0 * 3.0 / 29.0 + } else { + y = wref[1] * cub((l+0.16)/1.16) + } + un, vn := xyz_to_uv(wref[0], wref[1], wref[2]) + if l != 0.0 { + ubis := u/(13.0*l) + un + vbis := v/(13.0*l) + vn + x = y * 9.0 * ubis / (4.0 * vbis) + z = y * (12.0 - 3.0*ubis - 20.0*vbis) / (4.0 * vbis) + } else { + x, y = 0.0, 0.0 + } + return +} + +// Converts the given color to CIE L*u*v* space using D65 as reference white. +// L* is in [0..1] and both u* and v* are in about [-1..1] +func (col Color) Luv() (l, u, v float64) { + return XyzToLuv(col.Xyz()) +} + +// Converts the given color to CIE L*u*v* space, taking into account +// a given reference white. (i.e. the monitor's white) +// L* is in [0..1] and both u* and v* are in about [-1..1] +func (col Color) LuvWhiteRef(wref [3]float64) (l, u, v float64) { + x, y, z := col.Xyz() + return XyzToLuvWhiteRef(x, y, z, wref) +} + +// Generates a color by using data given in CIE L*u*v* space using D65 as reference white. +// L* is in [0..1] and both u* and v* are in about [-1..1] +// WARNING: many combinations of `l`, `a`, and `b` values do not have corresponding +// valid RGB values, check the FAQ in the README if you're unsure. +func Luv(l, u, v float64) Color { + return Xyz(LuvToXyz(l, u, v)) +} + +// Generates a color by using data given in CIE L*u*v* space, taking +// into account a given reference white. (i.e. the monitor's white) +// L* is in [0..1] and both u* and v* are in about [-1..1] +func LuvWhiteRef(l, u, v float64, wref [3]float64) Color { + return Xyz(LuvToXyzWhiteRef(l, u, v, wref)) +} + +// DistanceLuv is a good measure of visual similarity between two colors! +// A result of 0 would mean identical colors, while a result of 1 or higher +// means the colors differ a lot. +func (c1 Color) DistanceLuv(c2 Color) float64 { + l1, u1, v1 := c1.Luv() + l2, u2, v2 := c2.Luv() + return math.Sqrt(sq(l1-l2) + sq(u1-u2) + sq(v1-v2)) +} + +// BlendLuv blends two colors in the CIE-L*u*v* color-space, which should result in a smoother blend. +// t == 0 results in c1, t == 1 results in c2 +func (c1 Color) BlendLuv(c2 Color, t float64) Color { + l1, u1, v1 := c1.Luv() + l2, u2, v2 := c2.Luv() + return Luv(l1+t*(l2-l1), + u1+t*(u2-u1), + v1+t*(v2-v1)) +} + +/// HCL /// +/////////// +// HCL is nothing else than L*a*b* in cylindrical coordinates! +// (this was wrong on English wikipedia, I fixed it, let's hope the fix stays.) +// But it is widely popular since it is a "correct HSV" +// http://www.hunterlab.com/appnotes/an09_96a.pdf + +// Converts the given color to HCL space using D65 as reference white. +// H values are in [0..360], C and L values are in [0..1] although C can overshoot 1.0 +func (col Color) Hcl() (h, c, l float64) { + return col.HclWhiteRef(D65) +} + +func LabToHcl(L, a, b float64) (h, c, l float64) { + // Oops, floating point workaround necessary if a ~= b and both are very small (i.e. almost zero). + if math.Abs(b-a) > 1e-4 && math.Abs(a) > 1e-4 { + h = math.Mod(57.29577951308232087721*math.Atan2(b, a)+360.0, 360.0) // Rad2Deg + } else { + h = 0.0 + } + c = math.Sqrt(sq(a) + sq(b)) + l = L + return +} + +// Converts the given color to HCL space, taking into account +// a given reference white. (i.e. the monitor's white) +// H values are in [0..360], C and L values are in [0..1] +func (col Color) HclWhiteRef(wref [3]float64) (h, c, l float64) { + L, a, b := col.LabWhiteRef(wref) + return LabToHcl(L, a, b) +} + +// Generates a color by using data given in HCL space using D65 as reference white. +// H values are in [0..360], C and L values are in [0..1] +// WARNING: many combinations of `l`, `a`, and `b` values do not have corresponding +// valid RGB values, check the FAQ in the README if you're unsure. +func Hcl(h, c, l float64) Color { + return HclWhiteRef(h, c, l, D65) +} + +func HclToLab(h, c, l float64) (L, a, b float64) { + H := 0.01745329251994329576 * h // Deg2Rad + a = c * math.Cos(H) + b = c * math.Sin(H) + L = l + return +} + +// Generates a color by using data given in HCL space, taking +// into account a given reference white. (i.e. the monitor's white) +// H values are in [0..360], C and L values are in [0..1] +func HclWhiteRef(h, c, l float64, wref [3]float64) Color { + L, a, b := HclToLab(h, c, l) + return LabWhiteRef(L, a, b, wref) +} + +// BlendHcl blends two colors in the CIE-L*C*h° color-space, which should result in a smoother blend. +// t == 0 results in c1, t == 1 results in c2 +func (col1 Color) BlendHcl(col2 Color, t float64) Color { + h1, c1, l1 := col1.Hcl() + h2, c2, l2 := col2.Hcl() + + // We know that h are both in [0..360] + return Hcl(interp_angle(h1, h2, t), c1+t*(c2-c1), l1+t*(l2-l1)) +} diff --git a/vendor/github.com/lucasb-eyer/go-colorful/happy_palettegen.go b/vendor/github.com/lucasb-eyer/go-colorful/happy_palettegen.go new file mode 100644 index 0000000..bb66dfa --- /dev/null +++ b/vendor/github.com/lucasb-eyer/go-colorful/happy_palettegen.go @@ -0,0 +1,25 @@ +package colorful + +import ( + "math/rand" +) + +// Uses the HSV color space to generate colors with similar S,V but distributed +// evenly along their Hue. This is fast but not always pretty. +// If you've got time to spare, use Lab (the non-fast below). +func FastHappyPalette(colorsCount int) (colors []Color) { + colors = make([]Color, colorsCount) + + for i := 0; i < colorsCount; i++ { + colors[i] = Hsv(float64(i)*(360.0/float64(colorsCount)), 0.8+rand.Float64()*0.2, 0.65+rand.Float64()*0.2) + } + return +} + +func HappyPalette(colorsCount int) ([]Color, error) { + pimpy := func(l, a, b float64) bool { + _, c, _ := LabToHcl(l, a, b) + return 0.3 <= c && 0.4 <= l && l <= 0.8 + } + return SoftPaletteEx(colorsCount, SoftPaletteSettings{pimpy, 50, true}) +} diff --git a/vendor/github.com/lucasb-eyer/go-colorful/hexcolor.go b/vendor/github.com/lucasb-eyer/go-colorful/hexcolor.go new file mode 100644 index 0000000..86a5ed9 --- /dev/null +++ b/vendor/github.com/lucasb-eyer/go-colorful/hexcolor.go @@ -0,0 +1,37 @@ +package colorful + +import ( + "database/sql/driver" + "fmt" + "reflect" +) + +// A HexColor is a Color stored as a hex string "#rrggbb". It implements the +// database/sql.Scanner and database/sql/driver.Value interfaces. +type HexColor Color + +type errUnsupportedType struct { + got interface{} + want reflect.Type +} + +func (hc *HexColor) Scan(value interface{}) error { + s, ok := value.(string) + if !ok { + return errUnsupportedType{got: reflect.TypeOf(value), want: reflect.TypeOf("")} + } + c, err := Hex(s) + if err != nil { + return err + } + *hc = HexColor(c) + return nil +} + +func (hc *HexColor) Value() (driver.Value, error) { + return Color(*hc).Hex(), nil +} + +func (e errUnsupportedType) Error() string { + return fmt.Sprintf("unsupported type: got %v, want a %s", e.got, e.want) +} diff --git a/vendor/github.com/lucasb-eyer/go-colorful/soft_palettegen.go b/vendor/github.com/lucasb-eyer/go-colorful/soft_palettegen.go new file mode 100644 index 0000000..0154ac9 --- /dev/null +++ b/vendor/github.com/lucasb-eyer/go-colorful/soft_palettegen.go @@ -0,0 +1,185 @@ +// Largely inspired by the descriptions in http://lab.medialab.sciences-po.fr/iwanthue/ +// but written from scratch. + +package colorful + +import ( + "fmt" + "math" + "math/rand" +) + +// The algorithm works in L*a*b* color space and converts to RGB in the end. +// L* in [0..1], a* and b* in [-1..1] +type lab_t struct { + L, A, B float64 +} + +type SoftPaletteSettings struct { + // A function which can be used to restrict the allowed color-space. + CheckColor func(l, a, b float64) bool + + // The higher, the better quality but the slower. Usually two figures. + Iterations int + + // Use up to 160000 or 8000 samples of the L*a*b* space (and thus calls to CheckColor). + // Set this to true only if your CheckColor shapes the Lab space weirdly. + ManySamples bool +} + +// Yeah, windows-stype Foo, FooEx, screw you golang... +// Uses K-means to cluster the color-space and return the means of the clusters +// as a new palette of distinctive colors. Falls back to K-medoid if the mean +// happens to fall outside of the color-space, which can only happen if you +// specify a CheckColor function. +func SoftPaletteEx(colorsCount int, settings SoftPaletteSettings) ([]Color, error) { + + // Checks whether it's a valid RGB and also fulfills the potentially provided constraint. + check := func(col lab_t) bool { + c := Lab(col.L, col.A, col.B) + return c.IsValid() && (settings.CheckColor == nil || settings.CheckColor(col.L, col.A, col.B)) + } + + // Sample the color space. These will be the points k-means is run on. + dl := 0.05 + dab := 0.1 + if settings.ManySamples { + dl = 0.01 + dab = 0.05 + } + + samples := make([]lab_t, 0, int(1.0/dl*2.0/dab*2.0/dab)) + for l := 0.0; l <= 1.0; l += dl { + for a := -1.0; a <= 1.0; a += dab { + for b := -1.0; b <= 1.0; b += dab { + if check(lab_t{l, a, b}) { + samples = append(samples, lab_t{l, a, b}) + } + } + } + } + + // That would cause some infinite loops down there... + if len(samples) < colorsCount { + return nil, fmt.Errorf("palettegen: more colors requested (%v) than samples available (%v). Your requested color count may be wrong, you might want to use many samples or your constraint function makes the valid color space too small.", colorsCount, len(samples)) + } else if len(samples) == colorsCount { + return labs2cols(samples), nil // Oops? + } + + // We take the initial means out of the samples, so they are in fact medoids. + // This helps us avoid infinite loops or arbitrary cutoffs with too restrictive constraints. + means := make([]lab_t, colorsCount) + for i := 0; i < colorsCount; i++ { + for means[i] = samples[rand.Intn(len(samples))]; in(means, i, means[i]); means[i] = samples[rand.Intn(len(samples))] { + } + } + + clusters := make([]int, len(samples)) + samples_used := make([]bool, len(samples)) + + // The actual k-means/medoid iterations + for i := 0; i < settings.Iterations; i++ { + // Reassing the samples to clusters, i.e. to their closest mean. + // By the way, also check if any sample is used as a medoid and if so, mark that. + for isample, sample := range samples { + samples_used[isample] = false + mindist := math.Inf(+1) + for imean, mean := range means { + dist := lab_dist(sample, mean) + if dist < mindist { + mindist = dist + clusters[isample] = imean + } + + // Mark samples which are used as a medoid. + if lab_eq(sample, mean) { + samples_used[isample] = true + } + } + } + + // Compute new means according to the samples. + for imean := range means { + // The new mean is the average of all samples belonging to it.. + nsamples := 0 + newmean := lab_t{0.0, 0.0, 0.0} + for isample, sample := range samples { + if clusters[isample] == imean { + nsamples++ + newmean.L += sample.L + newmean.A += sample.A + newmean.B += sample.B + } + } + if nsamples > 0 { + newmean.L /= float64(nsamples) + newmean.A /= float64(nsamples) + newmean.B /= float64(nsamples) + } else { + // That mean doesn't have any samples? Get a new mean from the sample list! + var inewmean int + for inewmean = rand.Intn(len(samples_used)); samples_used[inewmean]; inewmean = rand.Intn(len(samples_used)) { + } + newmean = samples[inewmean] + samples_used[inewmean] = true + } + + // But now we still need to check whether the new mean is an allowed color. + if nsamples > 0 && check(newmean) { + // It does, life's good (TM) + means[imean] = newmean + } else { + // New mean isn't an allowed color or doesn't have any samples! + // Switch to medoid mode and pick the closest (unused) sample. + // This should always find something thanks to len(samples) >= colorsCount + mindist := math.Inf(+1) + for isample, sample := range samples { + if !samples_used[isample] { + dist := lab_dist(sample, newmean) + if dist < mindist { + mindist = dist + newmean = sample + } + } + } + } + } + } + return labs2cols(means), nil +} + +// A wrapper which uses common parameters. +func SoftPalette(colorsCount int) ([]Color, error) { + return SoftPaletteEx(colorsCount, SoftPaletteSettings{nil, 50, false}) +} + +func in(haystack []lab_t, upto int, needle lab_t) bool { + for i := 0; i < upto && i < len(haystack); i++ { + if haystack[i] == needle { + return true + } + } + return false +} + +const LAB_DELTA = 1e-6 + +func lab_eq(lab1, lab2 lab_t) bool { + return math.Abs(lab1.L-lab2.L) < LAB_DELTA && + math.Abs(lab1.A-lab2.A) < LAB_DELTA && + math.Abs(lab1.B-lab2.B) < LAB_DELTA +} + +// That's faster than using colorful's DistanceLab since we would have to +// convert back and forth for that. Here is no conversion. +func lab_dist(lab1, lab2 lab_t) float64 { + return math.Sqrt(sq(lab1.L-lab2.L) + sq(lab1.A-lab2.A) + sq(lab1.B-lab2.B)) +} + +func labs2cols(labs []lab_t) (cols []Color) { + cols = make([]Color, len(labs)) + for k, v := range labs { + cols[k] = Lab(v.L, v.A, v.B) + } + return cols +} diff --git a/vendor/github.com/lucasb-eyer/go-colorful/warm_palettegen.go b/vendor/github.com/lucasb-eyer/go-colorful/warm_palettegen.go new file mode 100644 index 0000000..00f42a5 --- /dev/null +++ b/vendor/github.com/lucasb-eyer/go-colorful/warm_palettegen.go @@ -0,0 +1,25 @@ +package colorful + +import ( + "math/rand" +) + +// Uses the HSV color space to generate colors with similar S,V but distributed +// evenly along their Hue. This is fast but not always pretty. +// If you've got time to spare, use Lab (the non-fast below). +func FastWarmPalette(colorsCount int) (colors []Color) { + colors = make([]Color, colorsCount) + + for i := 0; i < colorsCount; i++ { + colors[i] = Hsv(float64(i)*(360.0/float64(colorsCount)), 0.55+rand.Float64()*0.2, 0.35+rand.Float64()*0.2) + } + return +} + +func WarmPalette(colorsCount int) ([]Color, error) { + warmy := func(l, a, b float64) bool { + _, c, _ := LabToHcl(l, a, b) + return 0.1 <= c && c <= 0.4 && 0.2 <= l && l <= 0.5 + } + return SoftPaletteEx(colorsCount, SoftPaletteSettings{warmy, 50, true}) +} diff --git a/vendor/modules.txt b/vendor/modules.txt new file mode 100644 index 0000000..bd6a176 --- /dev/null +++ b/vendor/modules.txt @@ -0,0 +1,2 @@ +# github.com/lucasb-eyer/go-colorful v0.0.0-20181028223441-12d3b2882a08 +github.com/lucasb-eyer/go-colorful