@ -5,6 +5,8 @@
package charset
import (
"bytes"
"io"
"strings"
"testing"
@ -304,3 +306,145 @@ func stringMustEndWith(t *testing.T, expected, value string) {
func bytesMustStartWith ( t * testing . T , expected , value [ ] byte ) {
assert . Equal ( t , expected , value [ : len ( expected ) ] )
}
func TestToUTF8WithFallbackReader ( t * testing . T ) {
resetDefaultCharsetsOrder ( )
for testLen := 0 ; testLen < 2048 ; testLen ++ {
pattern := " test { () }\n"
input := ""
for len ( input ) < testLen {
input += pattern
}
input = input [ : testLen ]
input += "// Выключаем"
rd := ToUTF8WithFallbackReader ( bytes . NewReader ( [ ] byte ( input ) ) )
r , _ := io . ReadAll ( rd )
assert . EqualValuesf ( t , input , string ( r ) , "testing string len=%d" , testLen )
}
truncatedOneByteExtension := failFastBytes
encoding , _ := DetectEncoding ( truncatedOneByteExtension )
assert . Equal ( t , "UTF-8" , encoding )
truncatedTwoByteExtension := failFastBytes
truncatedTwoByteExtension [ len ( failFastBytes ) - 1 ] = 0x9b
truncatedTwoByteExtension [ len ( failFastBytes ) - 2 ] = 0xe2
encoding , _ = DetectEncoding ( truncatedTwoByteExtension )
assert . Equal ( t , "UTF-8" , encoding )
truncatedThreeByteExtension := failFastBytes
truncatedThreeByteExtension [ len ( failFastBytes ) - 1 ] = 0x92
truncatedThreeByteExtension [ len ( failFastBytes ) - 2 ] = 0x9f
truncatedThreeByteExtension [ len ( failFastBytes ) - 3 ] = 0xf0
encoding , _ = DetectEncoding ( truncatedThreeByteExtension )
assert . Equal ( t , "UTF-8" , encoding )
}
var failFastBytes = [ ] byte {
0x69 , 0x6d , 0x70 , 0x6f , 0x72 , 0x74 , 0x20 , 0x6f , 0x72 , 0x67 , 0x2e , 0x61 , 0x70 , 0x61 , 0x63 , 0x68 , 0x65 , 0x2e , 0x74 , 0x6f ,
0x6f , 0x6c , 0x73 , 0x2e , 0x61 , 0x6e , 0x74 , 0x2e , 0x74 , 0x61 , 0x73 , 0x6b , 0x64 , 0x65 , 0x66 , 0x73 , 0x2e , 0x63 , 0x6f , 0x6e ,
0x64 , 0x69 , 0x74 , 0x69 , 0x6f , 0x6e , 0x2e , 0x4f , 0x73 , 0x0a , 0x69 , 0x6d , 0x70 , 0x6f , 0x72 , 0x74 , 0x20 , 0x6f , 0x72 , 0x67 ,
0x2e , 0x73 , 0x70 , 0x72 , 0x69 , 0x6e , 0x67 , 0x66 , 0x72 , 0x61 , 0x6d , 0x65 , 0x77 , 0x6f , 0x72 , 0x6b , 0x2e , 0x62 , 0x6f , 0x6f ,
0x74 , 0x2e , 0x67 , 0x72 , 0x61 , 0x64 , 0x6c , 0x65 , 0x2e , 0x74 , 0x61 , 0x73 , 0x6b , 0x73 , 0x2e , 0x72 , 0x75 , 0x6e , 0x2e , 0x42 ,
0x6f , 0x6f , 0x74 , 0x52 , 0x75 , 0x6e , 0x0a , 0x0a , 0x70 , 0x6c , 0x75 , 0x67 , 0x69 , 0x6e , 0x73 , 0x20 , 0x7b , 0x0a , 0x20 , 0x20 ,
0x20 , 0x20 , 0x69 , 0x64 , 0x28 , 0x22 , 0x6f , 0x72 , 0x67 , 0x2e , 0x73 , 0x70 , 0x72 , 0x69 , 0x6e , 0x67 , 0x66 , 0x72 , 0x61 , 0x6d ,
0x65 , 0x77 , 0x6f , 0x72 , 0x6b , 0x2e , 0x62 , 0x6f , 0x6f , 0x74 , 0x22 , 0x29 , 0x0a , 0x7d , 0x0a , 0x0a , 0x64 , 0x65 , 0x70 , 0x65 ,
0x6e , 0x64 , 0x65 , 0x6e , 0x63 , 0x69 , 0x65 , 0x73 , 0x20 , 0x7b , 0x0a , 0x20 , 0x20 , 0x20 , 0x20 , 0x69 , 0x6d , 0x70 , 0x6c , 0x65 ,
0x6d , 0x65 , 0x6e , 0x74 , 0x61 , 0x74 , 0x69 , 0x6f , 0x6e , 0x28 , 0x70 , 0x72 , 0x6f , 0x6a , 0x65 , 0x63 , 0x74 , 0x28 , 0x22 , 0x3a ,
0x73 , 0x65 , 0x72 , 0x76 , 0x65 , 0x72 , 0x3a , 0x61 , 0x70 , 0x69 , 0x22 , 0x29 , 0x29 , 0x0a , 0x20 , 0x20 , 0x20 , 0x20 , 0x69 , 0x6d ,
0x70 , 0x6c , 0x65 , 0x6d , 0x65 , 0x6e , 0x74 , 0x61 , 0x74 , 0x69 , 0x6f , 0x6e , 0x28 , 0x70 , 0x72 , 0x6f , 0x6a , 0x65 , 0x63 , 0x74 ,
0x28 , 0x22 , 0x3a , 0x73 , 0x65 , 0x72 , 0x76 , 0x65 , 0x72 , 0x3a , 0x61 , 0x70 , 0x69 , 0x2d , 0x64 , 0x6f , 0x63 , 0x73 , 0x22 , 0x29 ,
0x29 , 0x0a , 0x20 , 0x20 , 0x20 , 0x20 , 0x69 , 0x6d , 0x70 , 0x6c , 0x65 , 0x6d , 0x65 , 0x6e , 0x74 , 0x61 , 0x74 , 0x69 , 0x6f , 0x6e ,
0x28 , 0x70 , 0x72 , 0x6f , 0x6a , 0x65 , 0x63 , 0x74 , 0x28 , 0x22 , 0x3a , 0x73 , 0x65 , 0x72 , 0x76 , 0x65 , 0x72 , 0x3a , 0x64 , 0x62 ,
0x22 , 0x29 , 0x29 , 0x0a , 0x20 , 0x20 , 0x20 , 0x20 , 0x69 , 0x6d , 0x70 , 0x6c , 0x65 , 0x6d , 0x65 , 0x6e , 0x74 , 0x61 , 0x74 , 0x69 ,
0x6f , 0x6e , 0x28 , 0x70 , 0x72 , 0x6f , 0x6a , 0x65 , 0x63 , 0x74 , 0x28 , 0x22 , 0x3a , 0x73 , 0x65 , 0x72 , 0x76 , 0x65 , 0x72 , 0x3a ,
0x73 , 0x65 , 0x72 , 0x76 , 0x69 , 0x63 , 0x65 , 0x22 , 0x29 , 0x29 , 0x0a , 0x20 , 0x20 , 0x20 , 0x20 , 0x69 , 0x6d , 0x70 , 0x6c , 0x65 ,
0x6d , 0x65 , 0x6e , 0x74 , 0x61 , 0x74 , 0x69 , 0x6f , 0x6e , 0x28 , 0x70 , 0x72 , 0x6f , 0x6a , 0x65 , 0x63 , 0x74 , 0x28 , 0x22 , 0x3a ,
0x73 , 0x65 , 0x72 , 0x76 , 0x65 , 0x72 , 0x3a , 0x69 , 0x6e , 0x74 , 0x65 , 0x67 , 0x72 , 0x61 , 0x74 , 0x69 , 0x6f , 0x6e , 0x2d , 0x66 ,
0x73 , 0x22 , 0x29 , 0x29 , 0x0a , 0x20 , 0x20 , 0x20 , 0x20 , 0x69 , 0x6d , 0x70 , 0x6c , 0x65 , 0x6d , 0x65 , 0x6e , 0x74 , 0x61 , 0x74 ,
0x69 , 0x6f , 0x6e , 0x28 , 0x70 , 0x72 , 0x6f , 0x6a , 0x65 , 0x63 , 0x74 , 0x28 , 0x22 , 0x3a , 0x73 , 0x65 , 0x72 , 0x76 , 0x65 , 0x72 ,
0x3a , 0x69 , 0x6e , 0x74 , 0x65 , 0x67 , 0x72 , 0x61 , 0x74 , 0x69 , 0x6f , 0x6e , 0x2d , 0x6d , 0x71 , 0x22 , 0x29 , 0x29 , 0x0a , 0x0a ,
0x20 , 0x20 , 0x20 , 0x20 , 0x69 , 0x6d , 0x70 , 0x6c , 0x65 , 0x6d , 0x65 , 0x6e , 0x74 , 0x61 , 0x74 , 0x69 , 0x6f , 0x6e , 0x28 , 0x22 ,
0x6a , 0x66 , 0x75 , 0x73 , 0x69 , 0x6f , 0x6e , 0x2e , 0x70 , 0x65 , 0x3a , 0x70 , 0x65 , 0x2d , 0x63 , 0x6f , 0x6d , 0x6d , 0x6f , 0x6e ,
0x2d , 0x61 , 0x75 , 0x74 , 0x68 , 0x2d , 0x72 , 0x65 , 0x73 , 0x6f , 0x75 , 0x72 , 0x63 , 0x65 , 0x2d , 0x73 , 0x74 , 0x61 , 0x72 , 0x74 ,
0x65 , 0x72 , 0x22 , 0x29 , 0x0a , 0x20 , 0x20 , 0x20 , 0x20 , 0x69 , 0x6d , 0x70 , 0x6c , 0x65 , 0x6d , 0x65 , 0x6e , 0x74 , 0x61 , 0x74 ,
0x69 , 0x6f , 0x6e , 0x28 , 0x22 , 0x6a , 0x66 , 0x75 , 0x73 , 0x69 , 0x6f , 0x6e , 0x2e , 0x70 , 0x65 , 0x3a , 0x70 , 0x65 , 0x2d , 0x63 ,
0x6f , 0x6d , 0x6d , 0x6f , 0x6e , 0x2d , 0x68 , 0x61 , 0x6c , 0x22 , 0x29 , 0x0a , 0x20 , 0x20 , 0x20 , 0x20 , 0x69 , 0x6d , 0x70 , 0x6c ,
0x65 , 0x6d , 0x65 , 0x6e , 0x74 , 0x61 , 0x74 , 0x69 , 0x6f , 0x6e , 0x28 , 0x22 , 0x6a , 0x66 , 0x75 , 0x73 , 0x69 , 0x6f , 0x6e , 0x2e ,
0x70 , 0x65 , 0x3a , 0x70 , 0x65 , 0x2d , 0x63 , 0x6f , 0x6d , 0x6d , 0x6f , 0x6e , 0x2d , 0x63 , 0x6f , 0x72 , 0x65 , 0x22 , 0x29 , 0x0a ,
0x0a , 0x20 , 0x20 , 0x20 , 0x20 , 0x69 , 0x6d , 0x70 , 0x6c , 0x65 , 0x6d , 0x65 , 0x6e , 0x74 , 0x61 , 0x74 , 0x69 , 0x6f , 0x6e , 0x28 ,
0x22 , 0x6f , 0x72 , 0x67 , 0x2e , 0x73 , 0x70 , 0x72 , 0x69 , 0x6e , 0x67 , 0x66 , 0x72 , 0x61 , 0x6d , 0x65 , 0x77 , 0x6f , 0x72 , 0x6b ,
0x2e , 0x62 , 0x6f , 0x6f , 0x74 , 0x3a , 0x73 , 0x70 , 0x72 , 0x69 , 0x6e , 0x67 , 0x2d , 0x62 , 0x6f , 0x6f , 0x74 , 0x2d , 0x73 , 0x74 ,
0x61 , 0x72 , 0x74 , 0x65 , 0x72 , 0x2d , 0x77 , 0x65 , 0x62 , 0x22 , 0x29 , 0x0a , 0x20 , 0x20 , 0x20 , 0x20 , 0x69 , 0x6d , 0x70 , 0x6c ,
0x65 , 0x6d , 0x65 , 0x6e , 0x74 , 0x61 , 0x74 , 0x69 , 0x6f , 0x6e , 0x28 , 0x22 , 0x6f , 0x72 , 0x67 , 0x2e , 0x73 , 0x70 , 0x72 , 0x69 ,
0x6e , 0x67 , 0x66 , 0x72 , 0x61 , 0x6d , 0x65 , 0x77 , 0x6f , 0x72 , 0x6b , 0x2e , 0x62 , 0x6f , 0x6f , 0x74 , 0x3a , 0x73 , 0x70 , 0x72 ,
0x69 , 0x6e , 0x67 , 0x2d , 0x62 , 0x6f , 0x6f , 0x74 , 0x2d , 0x73 , 0x74 , 0x61 , 0x72 , 0x74 , 0x65 , 0x72 , 0x2d , 0x61 , 0x6f , 0x70 ,
0x22 , 0x29 , 0x0a , 0x20 , 0x20 , 0x20 , 0x20 , 0x69 , 0x6d , 0x70 , 0x6c , 0x65 , 0x6d , 0x65 , 0x6e , 0x74 , 0x61 , 0x74 , 0x69 , 0x6f ,
0x6e , 0x28 , 0x22 , 0x6f , 0x72 , 0x67 , 0x2e , 0x73 , 0x70 , 0x72 , 0x69 , 0x6e , 0x67 , 0x66 , 0x72 , 0x61 , 0x6d , 0x65 , 0x77 , 0x6f ,
0x72 , 0x6b , 0x2e , 0x62 , 0x6f , 0x6f , 0x74 , 0x3a , 0x73 , 0x70 , 0x72 , 0x69 , 0x6e , 0x67 , 0x2d , 0x62 , 0x6f , 0x6f , 0x74 , 0x2d ,
0x73 , 0x74 , 0x61 , 0x72 , 0x74 , 0x65 , 0x72 , 0x2d , 0x61 , 0x63 , 0x74 , 0x75 , 0x61 , 0x74 , 0x6f , 0x72 , 0x22 , 0x29 , 0x0a , 0x20 ,
0x20 , 0x20 , 0x20 , 0x69 , 0x6d , 0x70 , 0x6c , 0x65 , 0x6d , 0x65 , 0x6e , 0x74 , 0x61 , 0x74 , 0x69 , 0x6f , 0x6e , 0x28 , 0x22 , 0x6f ,
0x72 , 0x67 , 0x2e , 0x73 , 0x70 , 0x72 , 0x69 , 0x6e , 0x67 , 0x66 , 0x72 , 0x61 , 0x6d , 0x65 , 0x77 , 0x6f , 0x72 , 0x6b , 0x2e , 0x63 ,
0x6c , 0x6f , 0x75 , 0x64 , 0x3a , 0x73 , 0x70 , 0x72 , 0x69 , 0x6e , 0x67 , 0x2d , 0x63 , 0x6c , 0x6f , 0x75 , 0x64 , 0x2d , 0x73 , 0x74 ,
0x61 , 0x72 , 0x74 , 0x65 , 0x72 , 0x2d , 0x62 , 0x6f , 0x6f , 0x74 , 0x73 , 0x74 , 0x72 , 0x61 , 0x70 , 0x22 , 0x29 , 0x0a , 0x20 , 0x20 ,
0x20 , 0x20 , 0x69 , 0x6d , 0x70 , 0x6c , 0x65 , 0x6d , 0x65 , 0x6e , 0x74 , 0x61 , 0x74 , 0x69 , 0x6f , 0x6e , 0x28 , 0x22 , 0x6f , 0x72 ,
0x67 , 0x2e , 0x73 , 0x70 , 0x72 , 0x69 , 0x6e , 0x67 , 0x66 , 0x72 , 0x61 , 0x6d , 0x65 , 0x77 , 0x6f , 0x72 , 0x6b , 0x2e , 0x63 , 0x6c ,
0x6f , 0x75 , 0x64 , 0x3a , 0x73 , 0x70 , 0x72 , 0x69 , 0x6e , 0x67 , 0x2d , 0x63 , 0x6c , 0x6f , 0x75 , 0x64 , 0x2d , 0x73 , 0x74 , 0x61 ,
0x72 , 0x74 , 0x65 , 0x72 , 0x2d , 0x63 , 0x6f , 0x6e , 0x73 , 0x75 , 0x6c , 0x2d , 0x61 , 0x6c , 0x6c , 0x22 , 0x29 , 0x0a , 0x20 , 0x20 ,
0x20 , 0x20 , 0x69 , 0x6d , 0x70 , 0x6c , 0x65 , 0x6d , 0x65 , 0x6e , 0x74 , 0x61 , 0x74 , 0x69 , 0x6f , 0x6e , 0x28 , 0x22 , 0x6f , 0x72 ,
0x67 , 0x2e , 0x73 , 0x70 , 0x72 , 0x69 , 0x6e , 0x67 , 0x66 , 0x72 , 0x61 , 0x6d , 0x65 , 0x77 , 0x6f , 0x72 , 0x6b , 0x2e , 0x63 , 0x6c ,
0x6f , 0x75 , 0x64 , 0x3a , 0x73 , 0x70 , 0x72 , 0x69 , 0x6e , 0x67 , 0x2d , 0x63 , 0x6c , 0x6f , 0x75 , 0x64 , 0x2d , 0x73 , 0x74 , 0x61 ,
0x72 , 0x74 , 0x65 , 0x72 , 0x2d , 0x73 , 0x6c , 0x65 , 0x75 , 0x74 , 0x68 , 0x22 , 0x29 , 0x0a , 0x20 , 0x20 , 0x20 , 0x20 , 0x69 , 0x6d ,
0x70 , 0x6c , 0x65 , 0x6d , 0x65 , 0x6e , 0x74 , 0x61 , 0x74 , 0x69 , 0x6f , 0x6e , 0x28 , 0x22 , 0x6f , 0x72 , 0x67 , 0x2e , 0x73 , 0x70 ,
0x72 , 0x69 , 0x6e , 0x67 , 0x66 , 0x72 , 0x61 , 0x6d , 0x65 , 0x77 , 0x6f , 0x72 , 0x6b , 0x2e , 0x72 , 0x65 , 0x74 , 0x72 , 0x79 , 0x3a ,
0x73 , 0x70 , 0x72 , 0x69 , 0x6e , 0x67 , 0x2d , 0x72 , 0x65 , 0x74 , 0x72 , 0x79 , 0x22 , 0x29 , 0x0a , 0x0a , 0x20 , 0x20 , 0x20 , 0x20 ,
0x69 , 0x6d , 0x70 , 0x6c , 0x65 , 0x6d , 0x65 , 0x6e , 0x74 , 0x61 , 0x74 , 0x69 , 0x6f , 0x6e , 0x28 , 0x22 , 0x63 , 0x68 , 0x2e , 0x71 ,
0x6f , 0x73 , 0x2e , 0x6c , 0x6f , 0x67 , 0x62 , 0x61 , 0x63 , 0x6b , 0x3a , 0x6c , 0x6f , 0x67 , 0x62 , 0x61 , 0x63 , 0x6b , 0x2d , 0x63 ,
0x6c , 0x61 , 0x73 , 0x73 , 0x69 , 0x63 , 0x22 , 0x29 , 0x0a , 0x0a , 0x20 , 0x20 , 0x20 , 0x20 , 0x69 , 0x6d , 0x70 , 0x6c , 0x65 , 0x6d ,
0x65 , 0x6e , 0x74 , 0x61 , 0x74 , 0x69 , 0x6f , 0x6e , 0x28 , 0x22 , 0x69 , 0x6f , 0x2e , 0x6d , 0x69 , 0x63 , 0x72 , 0x6f , 0x6d , 0x65 ,
0x74 , 0x65 , 0x72 , 0x3a , 0x6d , 0x69 , 0x63 , 0x72 , 0x6f , 0x6d , 0x65 , 0x74 , 0x65 , 0x72 , 0x2d , 0x72 , 0x65 , 0x67 , 0x69 , 0x73 ,
0x74 , 0x72 , 0x79 , 0x2d , 0x70 , 0x72 , 0x6f , 0x6d , 0x65 , 0x74 , 0x68 , 0x65 , 0x75 , 0x73 , 0x22 , 0x29 , 0x0a , 0x0a , 0x20 , 0x20 ,
0x20 , 0x20 , 0x69 , 0x6d , 0x70 , 0x6c , 0x65 , 0x6d , 0x65 , 0x6e , 0x74 , 0x61 , 0x74 , 0x69 , 0x6f , 0x6e , 0x28 , 0x6b , 0x6f , 0x74 ,
0x6c , 0x69 , 0x6e , 0x28 , 0x22 , 0x73 , 0x74 , 0x64 , 0x6c , 0x69 , 0x62 , 0x22 , 0x29 , 0x29 , 0x0a , 0x0a , 0x20 , 0x20 , 0x20 , 0x20 ,
0x2f , 0x2f , 0x2f , 0x2f , 0x2f , 0x2f , 0x2f , 0x2f , 0x2f , 0x2f , 0x2f , 0x2f , 0x2f , 0x2f , 0x2f , 0x2f , 0x2f , 0x2f , 0x2f , 0x2f ,
0x2f , 0x0a , 0x20 , 0x20 , 0x20 , 0x20 , 0x2f , 0x2f , 0x20 , 0x54 , 0x65 , 0x73 , 0x74 , 0x20 , 0x64 , 0x65 , 0x70 , 0x65 , 0x6e , 0x64 ,
0x65 , 0x6e , 0x63 , 0x69 , 0x65 , 0x73 , 0x2e , 0x0a , 0x20 , 0x20 , 0x20 , 0x20 , 0x2f , 0x2f , 0x2f , 0x2f , 0x2f , 0x2f , 0x2f , 0x2f ,
0x2f , 0x2f , 0x2f , 0x2f , 0x2f , 0x2f , 0x2f , 0x2f , 0x2f , 0x2f , 0x2f , 0x2f , 0x2f , 0x0a , 0x0a , 0x20 , 0x20 , 0x20 , 0x20 , 0x74 ,
0x65 , 0x73 , 0x74 , 0x49 , 0x6d , 0x70 , 0x6c , 0x65 , 0x6d , 0x65 , 0x6e , 0x74 , 0x61 , 0x74 , 0x69 , 0x6f , 0x6e , 0x28 , 0x22 , 0x6a ,
0x66 , 0x75 , 0x73 , 0x69 , 0x6f , 0x6e , 0x2e , 0x70 , 0x65 , 0x3a , 0x70 , 0x65 , 0x2d , 0x63 , 0x6f , 0x6d , 0x6d , 0x6f , 0x6e , 0x2d ,
0x74 , 0x65 , 0x73 , 0x74 , 0x22 , 0x29 , 0x0a , 0x7d , 0x0a , 0x0a , 0x76 , 0x61 , 0x6c , 0x20 , 0x70 , 0x61 , 0x74 , 0x63 , 0x68 , 0x4a ,
0x61 , 0x72 , 0x20 , 0x62 , 0x79 , 0x20 , 0x74 , 0x61 , 0x73 , 0x6b , 0x73 , 0x2e , 0x72 , 0x65 , 0x67 , 0x69 , 0x73 , 0x74 , 0x65 , 0x72 ,
0x69 , 0x6e , 0x67 , 0x28 , 0x4a , 0x61 , 0x72 , 0x3a , 0x3a , 0x63 , 0x6c , 0x61 , 0x73 , 0x73 , 0x29 , 0x20 , 0x7b , 0x0a , 0x20 , 0x20 ,
0x20 , 0x20 , 0x61 , 0x72 , 0x63 , 0x68 , 0x69 , 0x76 , 0x65 , 0x43 , 0x6c , 0x61 , 0x73 , 0x73 , 0x69 , 0x66 , 0x69 , 0x65 , 0x72 , 0x2e ,
0x73 , 0x65 , 0x74 , 0x28 , 0x22 , 0x70 , 0x61 , 0x74 , 0x63 , 0x68 , 0x65 , 0x64 , 0x22 , 0x29 , 0x0a , 0x0a , 0x20 , 0x20 , 0x20 , 0x20 ,
0x76 , 0x61 , 0x6c , 0x20 , 0x72 , 0x75 , 0x6e , 0x74 , 0x69 , 0x6d , 0x65 , 0x43 , 0x6c , 0x61 , 0x73 , 0x73 , 0x70 , 0x61 , 0x74 , 0x68 ,
0x20 , 0x62 , 0x79 , 0x20 , 0x63 , 0x6f , 0x6e , 0x66 , 0x69 , 0x67 , 0x75 , 0x72 , 0x61 , 0x74 , 0x69 , 0x6f , 0x6e , 0x73 , 0x2e , 0x67 ,
0x65 , 0x74 , 0x74 , 0x69 , 0x6e , 0x67 , 0x0a , 0x0a , 0x20 , 0x20 , 0x20 , 0x20 , 0x6d , 0x61 , 0x6e , 0x69 , 0x66 , 0x65 , 0x73 , 0x74 ,
0x20 , 0x7b , 0x0a , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x61 , 0x74 , 0x74 , 0x72 , 0x69 , 0x62 , 0x75 , 0x74 , 0x65 ,
0x73 , 0x28 , 0x22 , 0x43 , 0x6c , 0x61 , 0x73 , 0x73 , 0x2d , 0x50 , 0x61 , 0x74 , 0x68 , 0x22 , 0x20 , 0x74 , 0x6f , 0x20 , 0x6f , 0x62 ,
0x6a , 0x65 , 0x63 , 0x74 , 0x20 , 0x7b , 0x0a , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x70 ,
0x72 , 0x69 , 0x76 , 0x61 , 0x74 , 0x65 , 0x20 , 0x76 , 0x61 , 0x6c , 0x20 , 0x70 , 0x61 , 0x74 , 0x74 , 0x65 , 0x72 , 0x6e , 0x20 , 0x3d ,
0x20 , 0x22 , 0x66 , 0x69 , 0x6c , 0x65 , 0x3a , 0x2f , 0x2b , 0x22 , 0x2e , 0x74 , 0x6f , 0x52 , 0x65 , 0x67 , 0x65 , 0x78 , 0x28 , 0x29 ,
0x0a , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x6f , 0x76 , 0x65 , 0x72 , 0x72 , 0x69 , 0x64 ,
0x65 , 0x20 , 0x66 , 0x75 , 0x6e , 0x20 , 0x74 , 0x6f , 0x53 , 0x74 , 0x72 , 0x69 , 0x6e , 0x67 , 0x28 , 0x29 , 0x3a , 0x20 , 0x53 , 0x74 ,
0x72 , 0x69 , 0x6e , 0x67 , 0x20 , 0x3d , 0x20 , 0x72 , 0x75 , 0x6e , 0x74 , 0x69 , 0x6d , 0x65 , 0x43 , 0x6c , 0x61 , 0x73 , 0x73 , 0x70 ,
0x61 , 0x74 , 0x68 , 0x2e , 0x66 , 0x69 , 0x6c , 0x65 , 0x73 , 0x2e , 0x6a , 0x6f , 0x69 , 0x6e , 0x54 , 0x6f , 0x53 , 0x74 , 0x72 , 0x69 ,
0x6e , 0x67 , 0x28 , 0x22 , 0x20 , 0x22 , 0x29 , 0x20 , 0x7b , 0x0a , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 ,
0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x69 , 0x74 , 0x2e , 0x74 , 0x6f , 0x55 , 0x52 , 0x49 , 0x28 , 0x29 , 0x2e , 0x74 , 0x6f , 0x55 ,
0x52 , 0x4c , 0x28 , 0x29 , 0x2e , 0x74 , 0x6f , 0x53 , 0x74 , 0x72 , 0x69 , 0x6e , 0x67 , 0x28 , 0x29 , 0x2e , 0x72 , 0x65 , 0x70 , 0x6c ,
0x61 , 0x63 , 0x65 , 0x46 , 0x69 , 0x72 , 0x73 , 0x74 , 0x28 , 0x70 , 0x61 , 0x74 , 0x74 , 0x65 , 0x72 , 0x6e , 0x2c , 0x20 , 0x22 , 0x2f ,
0x22 , 0x29 , 0x0a , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x7d , 0x0a , 0x20 , 0x20 , 0x20 ,
0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x7d , 0x29 , 0x0a , 0x20 , 0x20 , 0x20 , 0x20 , 0x7d , 0x0a , 0x7d , 0x0a , 0x0a , 0x74 , 0x61 , 0x73 ,
0x6b , 0x73 , 0x2e , 0x6e , 0x61 , 0x6d , 0x65 , 0x64 , 0x3c , 0x42 , 0x6f , 0x6f , 0x74 , 0x52 , 0x75 , 0x6e , 0x3e , 0x28 , 0x22 , 0x62 ,
0x6f , 0x6f , 0x74 , 0x52 , 0x75 , 0x6e , 0x22 , 0x29 , 0x20 , 0x7b , 0x0a , 0x20 , 0x20 , 0x20 , 0x20 , 0x69 , 0x66 , 0x20 , 0x28 , 0x4f ,
0x73 , 0x2e , 0x69 , 0x73 , 0x46 , 0x61 , 0x6d , 0x69 , 0x6c , 0x79 , 0x28 , 0x4f , 0x73 , 0x2e , 0x46 , 0x41 , 0x4d , 0x49 , 0x4c , 0x59 ,
0x5f , 0x57 , 0x49 , 0x4e , 0x44 , 0x4f , 0x57 , 0x53 , 0x29 , 0x29 , 0x20 , 0x7b , 0x0a , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 , 0x20 ,
0x20 , 0x63 , 0x6c , 0x61 , 0x73 , 0x73 , 0x70 , 0x61 , 0x74 , 0x68 , 0x20 , 0x3d , 0x20 , 0x66 , 0x69 , 0x6c , 0x65 , 0x73 , 0x28 , 0x73 ,
0x6f , 0x75 , 0x72 , 0x63 , 0x65 , 0x53 , 0x65 , 0x74 , 0x73 , 0x2e , 0x6e , 0x61 , 0x6d , 0x65 , 0x64 , 0x28 , 0x22 , 0x6d , 0x61 , 0x69 ,
0x6e , 0x22 , 0x29 , 0x2e , 0x6d , 0x61 , 0x70 , 0x20 , 0x7b , 0x20 , 0x69 , 0x74 , 0x2e , 0x6f , 0x75 , 0x74 , 0x70 , 0x75 , 0x74 , 0x20 ,
0x7d , 0x2c , 0x20 , 0x70 , 0x61 , 0x74 , 0x63 , 0x68 , 0x4a , 0x61 , 0x72 , 0x29 , 0x0a , 0x20 , 0x20 , 0x20 , 0x20 , 0x7d , 0x0a , 0x0a ,
0x20 , 0x20 , 0x20 , 0x20 , 0x2f , 0x2f , 0x20 , 0xd0 ,
}