├── go.mod ├── README.md ├── .gitignore ├── utils_rsa_test.go ├── user_data.go ├── utils_time.go ├── mm_pb ├── get_login_qr_code_request.proto ├── get_login_qr_code_response.proto ├── long_link_cmd_id.go ├── cgi_type.go ├── base_common.proto ├── get_login_qr_code_request.pb.go ├── get_login_qr_code_response.pb.go └── base_common.pb.go ├── client_utils_test.go ├── apis.go ├── logger.go ├── utils_zip.go ├── utils_encode.go ├── utils_aes_test.go ├── utils_assert.go ├── utils_encode_test.go ├── utils_rsa.go ├── utils_string.go ├── utils_aes.go ├── client.go ├── go.sum ├── http.go ├── utils_calc.go └── client_test.go /go.mod: -------------------------------------------------------------------------------- 1 | module wxxx 2 | 3 | go 1.14 4 | 5 | require ( 6 | github.com/golang/protobuf v1.4.2 7 | github.com/pkg/errors v0.9.1 8 | github.com/stretchr/testify v1.6.1 9 | google.golang.org/protobuf v1.23.0 10 | ) 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # wxxx# golang-ipad 2 | 3 | golang版本的微信ipad协议,了解更多加QQ 4 | 5 | ### 声明 6 | 7 | 仅供自己学习研究使用,引起任何法律纠纷概不负责 8 | 9 | ### 交流QQ(golang版本) 10 | 11 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | .vscode/ 3 | vendor/ 4 | Gopkg.lock 5 | build/ 6 | test*.db 7 | static 8 | playground 9 | env/consts.go 10 | #pb3 11 | # Binaries for programs and plugins 12 | *.exe 13 | *.exe~ 14 | *.dll 15 | *.so 16 | *.dylib 17 | 18 | # Test binary, built with `go test -c` 19 | *.test 20 | 21 | # Output of the go coverage tool, specifically when used with LiteIDE 22 | *.out -------------------------------------------------------------------------------- /utils_rsa_test.go: -------------------------------------------------------------------------------- 1 | package wxxx 2 | 3 | import ( 4 | "fmt" 5 | "github.com/stretchr/testify/assert" 6 | "testing" 7 | ) 8 | 9 | func TestRsaEncrypt(t *testing.T) { 10 | data := []byte{0x01, 0x02, 0x03} 11 | res, err := RsaEncrypt(data) 12 | if !assert.NoError(t, err) { 13 | t.FailNow() 14 | } 15 | fmt.Printf(" rsa res :len= %d >> %s\n", len(res), ArrToHexStrWithSp(res, "")) 16 | } 17 | -------------------------------------------------------------------------------- /user_data.go: -------------------------------------------------------------------------------- 1 | package wxxx 2 | 3 | type UserDataStorage interface { 4 | GetUserData() interface{} 5 | SetUserData(interface{}) 6 | } 7 | 8 | type BaseUserData struct { 9 | userData interface{} 10 | } 11 | 12 | func (this *BaseUserData) GetUserData() interface{} { 13 | return this.userData 14 | } 15 | 16 | func (this *BaseUserData) SetUserData(data interface{}) { 17 | this.userData = data 18 | } 19 | -------------------------------------------------------------------------------- /utils_time.go: -------------------------------------------------------------------------------- 1 | package wxxx 2 | 3 | import "time" 4 | 5 | var location = time.FixedZone("UTC", int((time.Hour * 8).Seconds())) 6 | 7 | const longTimeFormat = "2006-01-02 15:04:05" 8 | const longTimeWithMsFormat = "2006-01-02 15:04:05.999999999" 9 | 10 | func TimeNow() time.Time { 11 | now := LocalTime(time.Now()) 12 | return now 13 | } 14 | func LocalTime(t time.Time) time.Time { 15 | return t.In(location) 16 | } 17 | -------------------------------------------------------------------------------- /mm_pb/get_login_qr_code_request.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto2"; 2 | 3 | import "base_common.proto"; 4 | 5 | package mm_pb; 6 | 7 | option go_package =".;mm_pb"; 8 | 9 | message GetLoginQRCodeRequest { 10 | required BaseRequest baseRequest = 1; 11 | required AesKey aes = 2; 12 | required uint32 opcode = 3; 13 | optional string deviceName = 4; 14 | optional string userName = 5; 15 | required uint32 extDevLoginType = 6; 16 | optional string hardwareExtra = 7; 17 | optional string softType = 8; 18 | optional RSAPem rsa = 9; 19 | } -------------------------------------------------------------------------------- /mm_pb/get_login_qr_code_response.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto2"; 2 | 3 | import "base_common.proto"; 4 | 5 | package mm_pb; 6 | 7 | option go_package = ".;mm_pb"; 8 | 9 | message GetLoginQRCodeResponse { 10 | required BaseResponse baseResponse = 1; 11 | required QRCode qRCode = 2; 12 | required string uuid = 3; 13 | required uint32 checkTime = 4; 14 | required AesKey AESKey = 5; 15 | required uint32 expiredTime = 6; 16 | optional string blueToothBroadCastUuid = 7; 17 | optional SKBuiltinStringBuffer blueToothBroadCastContent = 8; 18 | } 19 | message QRCode { 20 | required uint32 len = 1; 21 | required bytes src = 2; 22 | } 23 | -------------------------------------------------------------------------------- /client_utils_test.go: -------------------------------------------------------------------------------- 1 | package wxxx 2 | 3 | import ( 4 | "fmt" 5 | "github.com/stretchr/testify/assert" 6 | "testing" 7 | ) 8 | 9 | func TestClient_RQTSign(t *testing.T) { 10 | cli := newClient(&defaultHttpCli{}) 11 | sign, err := cli.RQTSign([]byte{0x01, 0x02, 0x03}) 12 | if !assert.NoError(t, err) { 13 | t.FailNow() 14 | } 15 | fmt.Printf("sign :%X\n", sign) 16 | if !assert.Equal(t, sign, uint32(0x21191A11)) { 17 | t.FailNow() 18 | } 19 | sign, err = cli.RQTSign([]byte{0x01, 0x02, 0x03, 0x04}) 20 | if !assert.NoError(t, err) { 21 | t.FailNow() 22 | } 23 | fmt.Printf("sign :%X\n", sign) 24 | if !assert.Equal(t, sign, uint32(0x213D3B33)) { 25 | t.FailNow() 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /apis.go: -------------------------------------------------------------------------------- 1 | package wxxx 2 | 3 | func NewClient(shortLink HttpCli) Client { 4 | return newClient(shortLink) 5 | } 6 | 7 | type ( 8 | Client interface { 9 | // get login qr code 10 | GetLoginQrCode(deviceId string) (*GetLoginQrCodeResponse, error) 11 | // check login qr code state 12 | CheckLoginQrCode(qrCodeId string, aesKey []byte) (*CheckLoginQrCodeResponse, error) 13 | } 14 | 15 | GetLoginQrCodeResponse struct { 16 | QRCodeId string `json:"qrCodeId"` 17 | Uin uint32 `json:"uin"` 18 | AesKey []byte `json:"aesKey"` 19 | Cookies []byte `json:"cookies"` 20 | QRCodeContent []byte `json:"qrCodeContent"` 21 | } 22 | CheckLoginQrCodeResponse struct { 23 | } 24 | ) 25 | -------------------------------------------------------------------------------- /logger.go: -------------------------------------------------------------------------------- 1 | package wxxx 2 | 3 | import "fmt" 4 | 5 | type Logger interface { 6 | PrintLn() 7 | Printf() 8 | } 9 | 10 | type logger struct { 11 | } 12 | 13 | const logTag = "[WXXX]" 14 | 15 | //noinspection ALL 16 | func (*logger) PrintLn(a ...interface{}) { 17 | vWithTimeAndTag := make([]interface{}, 0, len(a)+2) 18 | vWithTimeAndTag = append(vWithTimeAndTag, TimeNow().Format(longTimeWithMsFormat), logTag) 19 | vWithTimeAndTag = append(vWithTimeAndTag, a...) 20 | fmt.Println(vWithTimeAndTag...) 21 | } 22 | 23 | //noinspection ALL 24 | func (*logger) Printf(format string, a ...interface{}) { 25 | fmt.Printf(fmt.Sprintf("%s %s %s\n", TimeNow().Format(longTimeWithMsFormat), logTag, format), a...) 26 | } 27 | -------------------------------------------------------------------------------- /utils_zip.go: -------------------------------------------------------------------------------- 1 | package wxxx 2 | 3 | import ( 4 | "bytes" 5 | "compress/zlib" 6 | "io" 7 | ) 8 | 9 | func deflateZip(src []byte) ([]byte, error) { 10 | var buf bytes.Buffer 11 | w := zlib.NewWriter(&buf) 12 | if _, err := w.Write(src); err != nil { 13 | return nil, err 14 | } 15 | if err := w.Close(); err != nil { 16 | return nil, err 17 | } 18 | return buf.Bytes(), nil 19 | } 20 | 21 | func deflateUnZip(src []byte) ([]byte, error) { 22 | buf := bytes.NewReader(src) 23 | var out bytes.Buffer 24 | r, err := zlib.NewReader(buf) 25 | if err != nil { 26 | return nil, err 27 | } 28 | _, err = io.Copy(&out, r) 29 | if err != nil { 30 | return nil, err 31 | } 32 | return out.Bytes(), nil 33 | } 34 | -------------------------------------------------------------------------------- /utils_encode.go: -------------------------------------------------------------------------------- 1 | package wxxx 2 | 3 | import ( 4 | "bytes" 5 | "math" 6 | ) 7 | 8 | // encode uint32 value to variant 9 | func VariantEncode(v uint32) []byte { 10 | out := bytes.Buffer{} 11 | tmp := v 12 | for tmp >= 0x80 { 13 | out.WriteByte((byte)(0x80 + tmp&0x7f)) 14 | tmp = tmp >> 7 15 | } 16 | out.WriteByte(byte(tmp)) 17 | return out.Bytes() 18 | } 19 | 20 | // decode uint32 value from variant byte[5] 21 | func VariantDecode(buf []byte, offset int) (n int, v uint32) { 22 | v = uint32(0) 23 | min := int(math.Min(float64(len(buf)-offset), 5)) 24 | var i int 25 | for i = 0; i < min; i++ { 26 | v |= uint32(buf[offset+i]&0x7f) << (7 * i) 27 | if buf[offset+i]&0x80 == 0 { 28 | break 29 | } 30 | } 31 | n = i + 1 32 | return n, v 33 | } 34 | -------------------------------------------------------------------------------- /utils_aes_test.go: -------------------------------------------------------------------------------- 1 | package wxxx 2 | 3 | import ( 4 | "fmt" 5 | "github.com/stretchr/testify/assert" 6 | "strings" 7 | "testing" 8 | ) 9 | 10 | func TestAesEncryptECB(t *testing.T) { 11 | data := []byte{0x01, 0x02, 0x03} 12 | key := []byte{0x32, 0x7b, 0xd9, 0xa0, 0xed, 0x80, 0x8a, 0xc4, 0x02, 0x80, 0xcd, 0xa8, 0xf7, 0xb5, 0x26, 0x45} 13 | encrypted := AESCbcEncrypt(data, key) 14 | fmt.Printf("encrypted : len = %d , >> %s \n", len(encrypted), ArrToHexStrWithSp(encrypted, "")) 15 | if !assert.Equal(t, "5b7c420244edc4c445f4f1f913020c09", strings.ToLower(ArrToHexStrWithSp(encrypted, ""))) { 16 | t.FailNow() 17 | } 18 | decrypted := AESCbcDecrypt(encrypted, key) 19 | fmt.Printf("decrypted : len = %d >> %s \n", len(decrypted), ArrToHexStrWithSp(decrypted, "")) 20 | if !assert.Equal(t, "010203", strings.ToLower(ArrToHexStrWithSp(decrypted, ""))) { 21 | t.FailNow() 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /utils_assert.go: -------------------------------------------------------------------------------- 1 | package wxxx 2 | 3 | import ( 4 | "github.com/pkg/errors" 5 | ) 6 | 7 | func AssertNotNil(o interface{}, msg string) { 8 | if o != nil { 9 | return 10 | } 11 | panic(errors.Errorf("assert not nil failed ! %s", msg)) 12 | } 13 | 14 | func AssertTrue(cond bool, msg string) { 15 | if cond { 16 | return 17 | } 18 | panic(errors.Errorf("assert must be true failed ! %s", msg)) 19 | } 20 | 21 | func AssertFalse(cond bool, msg string) { 22 | if !cond { 23 | return 24 | } 25 | panic(errors.Errorf("assert must be false failed ! %s", msg)) 26 | } 27 | 28 | func AssertNotEmpty(str string, msg string) { 29 | if IsNotEmptyStr(str) { 30 | return 31 | } 32 | panic(errors.Errorf("assert must not empty failed ! %s", msg)) 33 | } 34 | 35 | func AssertError(err error, msg string) { 36 | if err == nil { 37 | return 38 | } 39 | panic(errors.Wrapf(err, "%s :causedBy", msg)) 40 | } 41 | -------------------------------------------------------------------------------- /mm_pb/long_link_cmd_id.go: -------------------------------------------------------------------------------- 1 | package mm_pb 2 | 3 | //noinspection ALL 4 | const ( 5 | SEND_DOWNLOADVOICE = 20 6 | RECV_DOWNLOADVOICE = 1000000020 7 | SEND_GETPROFILE = 118 8 | RECV_GETPROFILE = 1000000118 9 | SEND_GETLOGINQRCODE = 232 10 | RECV_GETLOGINQRCODE = 1000000232 11 | SEND_CHECKLOGINQRCODE_CMDID = 233 12 | RECV_CHECKLOGINQRCODE_CMDID = 1000000233 13 | RECV_PUSH_CMDID = 24 14 | SEND_NOOP_CMDID = 6 15 | SEND_MSGIMG_CMDID = 9 16 | RECV_MSGIMG_CMDID = 1000000009 17 | RECV_NOOP_CMDID = 1000000006 18 | SEND_NEWSYNC_CMDID = 121 19 | RECV_NEWSYNC_CMDID = 1000000121 20 | LONGLINK_IDENTIFY_REQ = 205 21 | LONGLINK_IDENTIFY_RESP = 1000000205 22 | PUSH_DATA_CMDID = 122 23 | SEND_SYNC_SUCCESS = 1000000190 24 | SIGNALKEEP_CMDID = 243 25 | NEWSENDMSG = 237 26 | SEND_MANUALAUTH_CMDID = 253 27 | ) 28 | -------------------------------------------------------------------------------- /utils_encode_test.go: -------------------------------------------------------------------------------- 1 | package wxxx 2 | 3 | import ( 4 | "fmt" 5 | "github.com/stretchr/testify/assert" 6 | "testing" 7 | ) 8 | 9 | func TestVariantEncode(t *testing.T) { 10 | v := []uint32{25, 502, 174, 0x01004567} 11 | vAfterEncode := []string{"19", "F6 03", "AE 01", "E7 8A 81 08"} 12 | for i := range v { 13 | encodeV := VariantEncode(v[i]) 14 | hexStr := ArrToHexStr(encodeV) 15 | fmt.Printf(" number %d variant encode : %s\n", v[i], hexStr) 16 | if !assert.Equal(t, vAfterEncode[i], hexStr) { 17 | t.FailNow() 18 | } 19 | } 20 | } 21 | func TestVariantDecode(t *testing.T) { 22 | encodeV := [][]byte{{0x19, 0x00, 0x00, 0x00}, {0xF6, 0x03}, {0xE7, 0x8A, 0x81, 0x08}} 23 | rawV := []uint32{25, 502, 0x01004567} 24 | 25 | for i := range encodeV { 26 | n, v := VariantDecode(encodeV[i], 0) 27 | hexStr := ArrToHexStr(encodeV[i][:]) 28 | fmt.Printf(" variant encode %s after decode is : %d , len = %d \n", hexStr, v, n) 29 | if !assert.Equal(t, rawV[i], v) { 30 | t.FailNow() 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /utils_rsa.go: -------------------------------------------------------------------------------- 1 | package wxxx 2 | 3 | import ( 4 | "crypto/rand" 5 | "crypto/rsa" 6 | "math/big" 7 | ) 8 | 9 | var kRsaPubKeyModules = "D153E8A2B314D2110250A0A550DDACDCD77F5801F3D1CC21CB1B477E4F2DE8697D40F10265D066BE8200876BB7135EDC74CDBC7C4428064E0CDCBE1B6B92D93CEAD69EC27126DEBDE564AAE1519ACA836AA70487346C85931273E3AA9D24A721D0B854A7FCB9DED49EE03A44C189124FBEB8B17BB1DBE47A534637777D33EEC88802CD56D0C7683A796027474FEBF237FA5BF85C044ADC63885A70388CD3696D1F2E466EB6666EC8EFE1F91BC9353F8F0EAC67CC7B3281F819A17501E15D03291A2A189F6A35592130DE2FE5ED8E3ED59F65C488391E2D9557748D4065D00CBEA74EB8CA19867C65B3E57237BAA8BF0C0F79EBFC72E78AC29621C8AD61A2B79B" 10 | 11 | const kRsaPubKeyE = "010001" 12 | 13 | // RsaEncrypt 14 | func RsaEncrypt(src []byte) ([]byte, error) { 15 | n := big.NewInt(0) 16 | n.SetString(kRsaPubKeyModules, 16) 17 | pubKey := &rsa.PublicKey{N: n, E: 0x010001} 18 | var data = packageData(src, pubKey.N.BitLen()/8-11) 19 | cipher := make([]byte, 0, 0) 20 | for _, d := range data { 21 | var c, e = rsa.EncryptPKCS1v15(rand.Reader, pubKey, d) 22 | if e != nil { 23 | return nil, e 24 | } 25 | cipher = append(cipher, c...) 26 | } 27 | return cipher, nil 28 | } 29 | 30 | func packageData(rawData []byte, packageSize int) (r [][]byte) { 31 | var src = make([]byte, len(rawData)) 32 | copy(src, rawData) 33 | 34 | r = make([][]byte, 0) 35 | if len(src) <= packageSize { 36 | return append(r, src) 37 | } 38 | for len(src) > 0 { 39 | var p = src[:packageSize] 40 | r = append(r, p) 41 | src = src[packageSize:] 42 | if len(src) <= packageSize { 43 | r = append(r, src) 44 | break 45 | } 46 | } 47 | return r 48 | } 49 | -------------------------------------------------------------------------------- /utils_string.go: -------------------------------------------------------------------------------- 1 | package wxxx 2 | 3 | import "strings" 4 | 5 | func Trim(str *string) string { 6 | if str == nil { 7 | return "" 8 | } 9 | return strings.Trim(*str, " ") 10 | } 11 | 12 | func TrimStr(str string) string { 13 | return strings.Trim(str, " ") 14 | } 15 | 16 | func IsEmpty(str *string) bool { 17 | return str == nil || len(strings.Trim(*str, " ")) == 0 18 | } 19 | func IsEmptyStr(str string) bool { 20 | return len(strings.Trim(str, " ")) == 0 21 | } 22 | 23 | //noinspection ALL 24 | func IsNotEmpty(str *string) bool { 25 | return !IsEmpty(str) 26 | } 27 | 28 | //noinspection ALL 29 | func IsNotEmptyStr(str string) bool { 30 | return !IsEmptyStr(str) 31 | } 32 | 33 | //noinspection ALL 34 | func IsStrEqual(str1 string, str2 string) bool { 35 | if IsEmptyStr(str1) && IsEmptyStr(str2) { 36 | return true 37 | } 38 | return str1 == str2 39 | } 40 | 41 | //noinspection ALL 42 | func IsStrNotEqual(str1 string, str2 string) bool { 43 | return !IsStrEqual(str1, str2) 44 | } 45 | 46 | //noinspection ALL 47 | func IsEqual(str1 *string, str2 *string) bool { 48 | if IsEmpty(str1) && IsEmpty(str2) { 49 | return true 50 | } 51 | return *str1 == *str2 52 | } 53 | 54 | //noinspection ALL 55 | func IsNotEqual(str1 *string, str2 *string) bool { 56 | return !IsEqual(str1, str2) 57 | } 58 | 59 | //noinspection ALL 60 | func IsEqualStrIgnoreCase(str1 string, str2 string) bool { 61 | if IsEmptyStr(str1) && IsEmptyStr(str2) { 62 | return true 63 | } 64 | return strings.ToLower(TrimStr(str1)) == strings.ToLower(TrimStr(str2)) 65 | } 66 | 67 | //noinspection ALL 68 | func ToUpper(str string) string { 69 | return strings.ToUpper(TrimStr(str)) 70 | } 71 | -------------------------------------------------------------------------------- /utils_aes.go: -------------------------------------------------------------------------------- 1 | package wxxx 2 | 3 | import ( 4 | "bytes" 5 | "crypto/aes" 6 | "crypto/cipher" 7 | ) 8 | 9 | func PKCS7Padding(cipherText []byte, blockSize int) []byte { 10 | padding := blockSize - len(cipherText)%blockSize 11 | paddingText := bytes.Repeat([]byte{byte(padding)}, padding) 12 | return append(cipherText, paddingText...) 13 | } 14 | 15 | func PKCS7UnPadding(origData []byte) []byte { 16 | length := len(origData) 17 | unPadding := int(origData[length-1]) 18 | return origData[:(length - unPadding)] 19 | } 20 | 21 | //noinspection ALL 22 | func AESEcbDecrypt(data, key []byte) []byte { 23 | block, _ := aes.NewCipher(key) 24 | decrypted := make([]byte, len(data)) 25 | size := block.BlockSize() 26 | for bs, be := 0, size; bs < len(data); bs, be = bs+size, be+size { 27 | block.Decrypt(decrypted[bs:be], data[bs:be]) 28 | } 29 | return PKCS7UnPadding(decrypted) 30 | } 31 | 32 | func AESCbcDecrypt(data, key []byte) []byte { 33 | block, _ := aes.NewCipher(key) 34 | decrypted := make([]byte, len(data)) 35 | iv := key 36 | mode := cipher.NewCBCDecrypter(block, iv) 37 | mode.CryptBlocks(decrypted, data) 38 | return PKCS7UnPadding(decrypted) 39 | } 40 | 41 | func AESEcbEncrypt(data, key []byte) []byte { 42 | block, _ := aes.NewCipher(key) 43 | data = PKCS7Padding(data, block.BlockSize()) 44 | encrypted := make([]byte, len(data)) 45 | size := block.BlockSize() 46 | for bs, be := 0, size; bs < len(data); bs, be = bs+size, be+size { 47 | block.Encrypt(encrypted[bs:be], data[bs:be]) 48 | } 49 | return encrypted 50 | } 51 | 52 | func AESCbcEncrypt(data, key []byte) []byte { 53 | block, _ := aes.NewCipher(key) 54 | blockSize := block.BlockSize() 55 | data = PKCS7Padding(data, blockSize) 56 | encrypted := make([]byte, len(data)) 57 | iv := key 58 | mode := cipher.NewCBCEncrypter(block, iv) 59 | mode.CryptBlocks(encrypted, data) 60 | //for bs, be := 0, size; bs < len(data); bs, be = bs+size, be+size { 61 | // block.Encrypt(encrypted[bs:be], data[bs:be]) 62 | //} 63 | return encrypted 64 | } 65 | -------------------------------------------------------------------------------- /client.go: -------------------------------------------------------------------------------- 1 | package wxxx 2 | 3 | import ( 4 | "wxxx/mm_pb" 5 | ) 6 | 7 | var Log = &logger{} 8 | 9 | const shortUrl = "http://szshort.weixin.qq.com" 10 | 11 | type client struct { 12 | shortLink HttpCli 13 | clientVersion int32 14 | loginRsaVersion uint32 15 | osType string 16 | } 17 | 18 | func newClient(shortLink HttpCli) *client { 19 | cli := &client{ 20 | shortLink: shortLink, 21 | clientVersion: 0x17000523, 22 | loginRsaVersion: 174, 23 | osType: "iPad iPhone OS9.3.3", 24 | } 25 | return cli 26 | } 27 | 28 | func (this *client) GetLoginQrCode(deviceId string) (*GetLoginQrCodeResponse, error) { 29 | var deviceIdBytes []byte 30 | if deviceId == "" { 31 | deviceId = this.newRandomDeviceId() 32 | deviceIdBytes = Md5Bytes(deviceId) 33 | deviceIdBytes[0] = 0x49 34 | } else { 35 | deviceIdBytes = []byte(deviceId) 36 | } 37 | //generate a random aes key 38 | //rsaLen := uint32(2048) 39 | aesKey := this.newRandomAesKey() 40 | req := &mm_pb.GetLoginQRCodeRequest{ 41 | BaseRequest: this.newBasRequest(aesKey.Key, deviceIdBytes, 0, 0), 42 | Aes: aesKey, 43 | Opcode: new(uint32), 44 | DeviceName: nil, 45 | UserName: nil, 46 | ExtDevLoginType: new(uint32), 47 | HardwareExtra: nil, 48 | SoftType: nil, 49 | //Rsa: &mm_pb.RSAPem{ 50 | // Len: rsaLen, 51 | // Pem: kRsaPubKeyModules, 52 | //}, 53 | } 54 | resp := &mm_pb.GetLoginQRCodeResponse{} 55 | pkg, err := this.shortLinkExecute(shortUrl, 56 | req, 57 | mm_pb.CGI_TYPE_GETLOGINQRCODE, mm_pb.CGI_URL_GETLOGINQRCODE, 58 | 7, aesKey.Key, nil, 0, resp) 59 | if err != nil { 60 | return nil, err 61 | } 62 | //fmt.Println(resp) 63 | return &GetLoginQrCodeResponse{ 64 | QRCodeId: *resp.Uuid, 65 | Uin: pkg.uin, 66 | AesKey: resp.AESKey.Key, 67 | Cookies: pkg.cookie, 68 | QRCodeContent: resp.QRCode.Src, 69 | }, nil 70 | } 71 | 72 | func (this *client) CheckLoginQrCode(qrCodeId string, aesKey []byte) (*CheckLoginQrCodeResponse, error) { 73 | panic("implement me") 74 | } 75 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= 2 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 3 | github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= 4 | github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= 5 | github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= 6 | github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= 7 | github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= 8 | github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= 9 | github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= 10 | github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 11 | github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 12 | github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= 13 | github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 14 | github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= 15 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 16 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 17 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 18 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 19 | github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= 20 | github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 21 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= 22 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 23 | google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= 24 | google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= 25 | google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= 26 | google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= 27 | google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= 28 | google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= 29 | google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 30 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= 31 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 32 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= 33 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 34 | -------------------------------------------------------------------------------- /mm_pb/cgi_type.go: -------------------------------------------------------------------------------- 1 | package mm_pb 2 | 3 | //noinspection ALL 4 | const ( 5 | CGI_TYPE_DEFAULT = 0 6 | CGI_TYPE_SEARCHCONTACT = 106 7 | CGI_TYPE_GETMSGIMG = 109 8 | CGI_TYPE_CREATECHATROOM = 119 9 | CGI_TYPE_ADDCHATROOMMEMBER = 120 10 | CGI_TYPE_BATCHGETHEADIMG = 123 11 | CGI_TYPE_UPLOADVOICE = 127 12 | CGI_TYPE_DOWNLOADVOICE = 128 13 | CGI_TYPE_UPLOADMCONTACT = 133 14 | CGI_TYPE_NEWGETINVITEFRIEND = 135 15 | CGI_TYPE_VERIFYUSER = 137 16 | CGI_TYPE_NEWSYNC = 138 17 | CGI_TYPE_LBSFIND = 148 18 | CGI_TYPE_UPLOADVIDEO = 149 19 | CGI_TYPE_GETQRCODE = 168 20 | CGI_TYPE_SENDEMOJI = 175 21 | CGI_TYPE_DELCHATROOMMEMBER = 179 22 | CGI_TYPE_GETCONTACT = 182 23 | CGI_TYPE_MASSSEND = 193 24 | 25 | CGI_TYPE_MMSNSUPLOAD = 207 26 | CGI_TYPE_MMSNSPORT = 209 27 | CGI_TYPE_MMSNSUSERPAGE = 212 28 | CGI_TYPE_MMSNSOBJECTDETAIL = 210 29 | CGI_TYPE_MMSNSTIMELINE = 211 30 | CGI_TYPE_MMSNSCOMMENT = 213 31 | CGI_TYPE_MMSNSSYNC = 214 32 | CGI_TYPE_SNSOBJECTOP = 218 33 | CGI_TYPE_SENDAPPMSG = 222 34 | CGI_TYPE_GETCHATROOMINFODETAIL = 223 35 | CGI_TYPE_GETA8KEY = 233 36 | CGI_TYPE_STATUSNOTIFY = 251 37 | CGI_TYPE_MMSNSTAGLIST = 292 38 | 39 | CGI_TYPE_GETPROFILE = 302 40 | CGI_TYPE_GETCDNDNS = 379 41 | CGI_TYPE_TENPAY = 385 42 | 43 | CGI_TYPE_FAVSYNC = 400 44 | CGI_TYPE_ADDFAVITEM = 401 45 | CGI_TYPE_BATCHGETFAVITEM = 402 46 | CGI_TYPE_GETFAVINFO = 438 47 | CGI_TYPE_GETOPENIMRESOURCE = 453 48 | CGI_TYPE_TIMESEED = 477 49 | CGI_TYPE_GETPAYFUNCTIONLIST = 495 50 | 51 | CGI_TYPE_GETLOGINQRCODE = 502 52 | CGI_TYPE_CHECKLOGINQRCODE = 503 53 | CGI_TYPE_HEARTBEAT = 518 54 | CGI_TYPE_GETEMOTIONDESC = 521 55 | CGI_TYPE_NEWSENDMSG = 522 56 | CGI_TYPE_GETONLINEINFO = 526 57 | CGI_TYPE_GETCHATROOMMEMBERDETAIL = 551 58 | 59 | CGI_TYPE_UPLOADIMAGE = 625 60 | CGI_TYPE_GETCONTACTLABELLIST = 639 61 | CGI_TYPE_PUSHLOGINURL = 654 62 | CGI_TYPE_OPLOG = 681 63 | 64 | CGI_TYPE_MANUALAUTH = 701 65 | 66 | CGI_TYPE_INITCONTACT = 851 67 | 68 | CGI_TYPE_EXTDEVICELOGINCONFIRMGET = 971 69 | CGI_TYPE_SETCHATROOMANNOUNCEMENT = 993 70 | 71 | CGI_TYPE_ADEXPOSURE = 1231 72 | CGI_TYPE_ADCLICK = 1232 73 | 74 | CGI_TYPE_BINDQUERYNEW = 1501 75 | CGI_TYPE_QRYLISTWXHB = 1514 76 | CGI_TYPE_RECEIVEWXHB = 1581 77 | CGI_TYPE_QRYDETAILWXHB = 1585 78 | CGI_TYPE_F2FQRCODE = 1588 79 | 80 | CGI_TYPE_TRANSFERSETF2FFEE = 1623 81 | CGI_TYPE_TRANSFERQUERY = 1628 82 | CGI_TYPE_GETBANNERINFO = 1679 83 | CGI_TYPE_OPENWXHB = 1685 84 | CGI_TYPE_WISHWXHB = 1682 85 | CGI_TYPE_TRANSFEROPERATION = 1691 86 | 87 | CGI_TYPE_GETTRANSFERWORDINH = 1992 88 | ) 89 | 90 | //noinspection ALL 91 | type CGI_URL string 92 | 93 | const cgiBinBasePath CGI_URL = "/cgi-bin/micromsg-bin" 94 | 95 | //noinspection ALL 96 | const ( 97 | CGI_URL_GETLOGINQRCODE CGI_URL = cgiBinBasePath + "/getloginqrcode" 98 | CGI_URL_CHECKLOGINQRCODE CGI_URL = cgiBinBasePath + "/checkloginqrcode" 99 | ) 100 | -------------------------------------------------------------------------------- /http.go: -------------------------------------------------------------------------------- 1 | package wxxx 2 | 3 | import ( 4 | "bytes" 5 | "context" 6 | "crypto/tls" 7 | "fmt" 8 | "github.com/pkg/errors" 9 | "io" 10 | "io/ioutil" 11 | "net/http" 12 | "time" 13 | ) 14 | 15 | type HttpMethod string 16 | 17 | const ( 18 | POST HttpMethod = "POST" 19 | GET HttpMethod = "GET" 20 | ) 21 | 22 | type HttpCli interface { 23 | DO(ctx *RequestCtx) (*ResponseCtx, error) 24 | } 25 | 26 | type RequestCtx struct { 27 | HttpMethod HttpMethod 28 | Url string 29 | ContentType string 30 | UserAgent string 31 | //KeepAlive string 32 | //Accept string 33 | CustomHeaders map[string]string 34 | BodyData []byte 35 | } 36 | type ResponseCtx struct { 37 | StatusCode int 38 | Status string 39 | Headers http.Header 40 | BodyData []byte 41 | } 42 | 43 | type defaultHttpCli struct { 44 | cli http.Client 45 | ctx context.Context 46 | } 47 | 48 | //默认 http 访问的超时时间 49 | const kDefaultHttpTimeout = 60 * time.Second 50 | 51 | func NewDefaultHttpCli(ctx context.Context) HttpCli { 52 | if ctx == nil { 53 | ctx = context.Background() 54 | } 55 | return &defaultHttpCli{ 56 | cli: http.Client{ 57 | Transport: &http.Transport{ 58 | TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, 59 | }, 60 | Timeout: kDefaultHttpTimeout, 61 | }, 62 | ctx: ctx, 63 | } 64 | } 65 | 66 | func (this *defaultHttpCli) DO(ctx *RequestCtx) (*ResponseCtx, error) { 67 | AssertNotNil(ctx, "request ctx must not be nil") 68 | AssertNotEmpty(ctx.UserAgent, "request UserAgent must not empty") 69 | rspBytes := make([]byte, 0) 70 | reqBytes := ctx.BodyData 71 | start := time.Now() 72 | statusCode := 0 73 | method := ctx.HttpMethod 74 | fullUrl := ctx.Url 75 | defer func() { 76 | stop := time.Now() 77 | latency := stop.Sub(start) 78 | buf := bytes.Buffer{} 79 | buf.WriteString(fmt.Sprintf("[%s](%s) status:%d latency : %d ms\n", method, fullUrl, statusCode, latency.Milliseconds())) 80 | buf.WriteString(fmt.Sprintf("request : len= %d >>> %s \n", len(reqBytes), ArrToHexStrWithSp(reqBytes, " "))) 81 | buf.WriteString(fmt.Sprintf("response : len= %d >>> %s \n", len(rspBytes), ArrToHexStrWithSp(rspBytes, " "))) 82 | Log.PrintLn(buf.String()) 83 | }() 84 | withTimeout, cancelFunc := context.WithTimeout(this.ctx, kDefaultHttpTimeout) 85 | defer cancelFunc() 86 | var reqBodyReader io.Reader = nil 87 | if len(ctx.BodyData) > 0 { 88 | reqBodyReader = bytes.NewReader(ctx.BodyData) 89 | } 90 | req, err := http.NewRequestWithContext(withTimeout, string(ctx.HttpMethod), ctx.Url, reqBodyReader) 91 | if err != nil { 92 | return nil, errors.WithMessage(err, "build http request failed") 93 | } 94 | req.Header.Set("User-Agent", ctx.UserAgent) 95 | if len(ctx.CustomHeaders) > 0 { 96 | for k, v := range ctx.CustomHeaders { 97 | if IsNotEmptyStr(k) && IsNotEmptyStr(v) { 98 | req.Header.Set(k, v) 99 | } 100 | } 101 | } 102 | if ctx.HttpMethod == POST { 103 | AssertNotEmpty(ctx.ContentType, "request ContentType must not empty") 104 | req.Header.Set("Content-Type", ctx.ContentType) 105 | if len(ctx.BodyData) > 0 { 106 | req.Header.Set("Content-Length", fmt.Sprintf("%d", len(ctx.BodyData))) 107 | } 108 | } 109 | response, err := this.cli.Do(req) 110 | if err != nil { 111 | return nil, errors.WithMessagef(err, " http '%s' '%s' failed !", ctx.HttpMethod, ctx.Url) 112 | } 113 | rspBytes, err = ioutil.ReadAll(response.Body) 114 | if err != nil { 115 | return nil, errors.WithMessage(err, " http read body failed !") 116 | } 117 | statusCode = response.StatusCode 118 | resCtx := &ResponseCtx{ 119 | StatusCode: response.StatusCode, 120 | Status: response.Status, 121 | Headers: response.Header, 122 | BodyData: rspBytes, 123 | } 124 | return resCtx, nil 125 | } 126 | -------------------------------------------------------------------------------- /utils_calc.go: -------------------------------------------------------------------------------- 1 | package wxxx 2 | 3 | import ( 4 | "crypto/md5" 5 | "encoding/hex" 6 | "fmt" 7 | "strings" 8 | ) 9 | 10 | //noinspection ALL 11 | func MaxInt(a, b int) int { 12 | if a > b { 13 | return a 14 | } else { 15 | return b 16 | } 17 | } 18 | 19 | //noinspection ALL 20 | func MinInt(a, b int) int { 21 | if a < b { 22 | return a 23 | } else { 24 | return b 25 | } 26 | } 27 | 28 | //noinspection ALL 29 | func AbsInt(a int) int { 30 | if a < 0 { 31 | return -a 32 | } else { 33 | return a 34 | } 35 | } 36 | 37 | //noinspection ALL 38 | func MaxInt64(a, b int64) int64 { 39 | if a > b { 40 | return a 41 | } else { 42 | return b 43 | } 44 | } 45 | 46 | //noinspection ALL 47 | func MinInt64(a, b int64) int64 { 48 | if a < b { 49 | return a 50 | } else { 51 | return b 52 | } 53 | } 54 | 55 | //noinspection ALL 56 | func AbsInt64(a int64) int64 { 57 | if a < 0 { 58 | return -a 59 | } else { 60 | return a 61 | } 62 | } 63 | 64 | //convert uint8 array to string 65 | //noinspection ALL 66 | func ArrToHexStr(arr []uint8) string { 67 | return ArrToHexStrWithSp(arr, " ") 68 | } 69 | 70 | //noinspection ALL 71 | func ArrToHexStrWithSp(arr []uint8, sp string) string { 72 | if arr == nil || len(arr) == 0 { 73 | return "" 74 | } 75 | builder := strings.Builder{} 76 | for i := 0; i < len(arr); i++ { 77 | if i == len(arr)-1 { 78 | builder.WriteString(fmt.Sprintf("%02X", arr[i])) 79 | } else { 80 | builder.WriteString(fmt.Sprintf("%02X%s", arr[i], sp)) 81 | } 82 | } 83 | return builder.String() 84 | } 85 | 86 | //big ending 87 | //noinspection ALL 88 | func Uint16ToArrBE(v uint16) []uint8 { 89 | return []uint8{uint8(v>>8) & 0xFF, uint8(v) & 0xFF} 90 | } 91 | 92 | //big ending 93 | //noinspection ALL 94 | func ArrToUint16BE(arr []uint8) uint16 { 95 | if len(arr) != 2 { 96 | return 0 97 | } 98 | return (uint16(arr[0]) << 8) | uint16(arr[1]) 99 | } 100 | 101 | //big ending 102 | //noinspection ALL 103 | func Int16ToArrBE(v uint16) []uint8 { 104 | return []uint8{uint8(v>>8) & 0xFF, uint8(v) & 0xFF} 105 | } 106 | 107 | //big ending 108 | //noinspection ALL 109 | func ArrToInt16BE(arr []uint8) int16 { 110 | if len(arr) != 2 { 111 | return 0 112 | } 113 | return (int16(arr[0]) << 8) | int16(arr[1]) 114 | } 115 | 116 | //big ending 117 | //noinspection ALL 118 | func Uint32ToArrBE(v uint32) []uint8 { 119 | return []uint8{uint8(v>>24) & 0xFF, uint8(v>>16) & 0xFF, uint8(v>>8) & 0xFF, uint8(v) & 0xFF} 120 | } 121 | 122 | //big ending 123 | //noinspection ALL 124 | func ArrToUint32BE(arr []uint8) uint32 { 125 | if len(arr) != 4 { 126 | return 0 127 | } 128 | return (uint32(arr[0]) << 24) | (uint32(arr[1]) << 16) | (uint32(arr[2]) << 8) | uint32(arr[3]) 129 | } 130 | 131 | //big ending 132 | //noinspection ALL 133 | func Int32ToArrBE(v int32) []uint8 { 134 | return []uint8{uint8(v>>24) & 0xFF, uint8(v>>16) & 0xFF, uint8(v>>8) & 0xFF, uint8(v) & 0xFF} 135 | } 136 | 137 | //big ending 138 | //noinspection ALL 139 | func UInt32ToArrBE(v uint32) []uint8 { 140 | return []uint8{uint8(v>>24) & 0xFF, uint8(v>>16) & 0xFF, uint8(v>>8) & 0xFF, uint8(v) & 0xFF} 141 | } 142 | 143 | //big ending 144 | //noinspection ALL 145 | func ArrayToInt32BE(arr []uint8) int32 { 146 | if len(arr) != 4 { 147 | return 0 148 | } 149 | return (int32(arr[0]) << 24) | (int32(arr[1]) << 16) | (int32(arr[2]) << 8) | int32(arr[3]) 150 | } 151 | 152 | //big ending 153 | //noinspection ALL 154 | func Uint64ToArrBE(v uint64) []uint8 { 155 | return []uint8{ 156 | uint8(v>>(8*7)) & 0xFF, 157 | uint8(v>>(8*6)) & 0xFF, 158 | uint8(v>>(8*5)) & 0xFF, 159 | uint8(v>>(8*4)) & 0xFF, 160 | uint8(v>>(8*3)) & 0xFF, 161 | uint8(v>>(8*2)) & 0xFF, 162 | uint8(v>>(8*1)) & 0xFF, 163 | uint8(v>>(8*0)) & 0xFF, 164 | } 165 | } 166 | 167 | //big ending 168 | //noinspection ALL 169 | func ArrToUint64BE(arr []uint8) uint64 { 170 | if len(arr) != 8 { 171 | return 0 172 | } 173 | return (uint64(arr[0]) << (8 * 7)) | 174 | (uint64(arr[1]) << (8 * 6)) | 175 | (uint64(arr[2]) << (8 * 5)) | 176 | (uint64(arr[3]) << (8 * 4)) | 177 | (uint64(arr[4]) << (8 * 3)) | 178 | (uint64(arr[5]) << (8 * 2)) | 179 | (uint64(arr[6]) << (8 * 1)) | 180 | (uint64(arr[7]) << (8 * 0)) 181 | } 182 | 183 | //noinspection ALL 184 | func GetMd5Hex(data []byte) string { 185 | md5Bytes := md5.Sum(data) 186 | return hex.EncodeToString(md5Bytes[:]) 187 | } 188 | 189 | //noinspection ALL 190 | func Md5Hex(str string) string { 191 | return GetMd5Hex([]byte(str)) 192 | } 193 | 194 | func Md5Bytes(str string) []byte { 195 | md5Bytes := md5.Sum([]byte(str)) 196 | return md5Bytes[:] 197 | } 198 | -------------------------------------------------------------------------------- /mm_pb/base_common.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto2"; 2 | 3 | package mm_pb; 4 | 5 | option go_package = ".;mm_pb"; 6 | 7 | message AesKey { 8 | required int32 len = 1; 9 | required bytes key = 2; 10 | } 11 | 12 | message RSAPem { 13 | required uint32 len = 1; 14 | required string pem = 2; 15 | } 16 | 17 | message BaseRequest { 18 | required bytes sessionKey = 1; 19 | required int32 uin = 2; 20 | required bytes deviceId = 3; 21 | required int32 clientVersion = 4; 22 | required string osType = 5; 23 | required int32 scene = 6; 24 | } 25 | 26 | enum RetConst { 27 | MM_OK = 0; 28 | ERR_SERVER_FILE_EXPIRED = -5103059; 29 | MM_BOTTLE_COUNT_ERR = 16; 30 | MM_BOTTLE_ERR_UNKNOWNTYPE = 15; 31 | MM_BOTTLE_NOTEXIT = 17; 32 | MM_BOTTLE_PICKCOUNTINVALID = 19; 33 | MM_BOTTLE_UINNOTMATCH = 18; 34 | MM_ERR_ACCESS_DENIED = -5; 35 | MM_ERR_ACCOUNT_BAN = -200; 36 | MM_ERR_ALPHA_FORBIDDEN = -75; 37 | MM_ERR_ANSWER_COUNT = -150; 38 | MM_ERR_ARG = -2; 39 | MM_ERR_AUTH_ANOTHERPLACE = -100; 40 | MM_ERR_BADEMAIL = -28; 41 | MM_ERR_BATCHGETCONTACTPROFILE_MODE = -45; 42 | MM_ERR_BIGBIZ_AUTH = -69; 43 | MM_ERR_BIND_EMAIL_SAME_AS_QMAIL = -86; 44 | MM_ERR_BINDED_BY_OTHER = -85; 45 | MM_ERR_BINDUIN_BINDED = -50; 46 | MM_ERR_BIZ_FANS_LIMITED = -87; 47 | MM_ERR_BLACKLIST = -22; 48 | MM_ERR_BLOCK_BY_SPAM = -106; 49 | MM_ERR_BOTTLEBANBYEXPOSE = -2002; 50 | MM_ERR_CERT_EXPIRED = -102; 51 | MM_ERR_CHATROOM_NEED_INVITE = -2012; 52 | MM_ERR_CHATROOM_PARTIAL_INVITE = -2013; 53 | MM_ERR_CLIDB_ENCRYPT_KEYINFO_INVALID = -2010; 54 | MM_ERR_CLIENT = -800000; 55 | MM_ERR_CONNECT_INFO_URL_INVALID = -2011; 56 | MM_ERR_COOKIE_KICK = -2008; 57 | MM_ERR_CRITICALUPDATE = -16; 58 | MM_ERR_DOMAINDISABLE = -27; 59 | MM_ERR_DOMAINMAXLIMITED = -26; 60 | MM_ERR_DOMAINVERIFIED = -25; 61 | MM_ERR_EMAIL_FORMAT = -111; 62 | MM_ERR_EMAILEXIST = -8; 63 | MM_ERR_EMAILNOTVERIFY = -9; 64 | MM_ERR_FACING_CREATECHATROOM_RETRY = -432; 65 | MM_ERR_FAV_ALREADY = -400; 66 | MM_ERR_FILE_EXPIRED = -352; 67 | MM_ERR_FORCE_QUIT = -999999; 68 | MM_ERR_FORCE_REDIRECT = -2005; 69 | MM_ERR_FREQ_LIMITED = -34; 70 | MM_ERR_GETMFRIEND_NOT_READY = -70; 71 | MM_ERR_GMAIL_IMAP = -63; 72 | MM_ERR_GMAIL_ONLINELIMITE = -61; 73 | MM_ERR_GMAIL_PWD = -60; 74 | MM_ERR_GMAIL_WEBLOGIN = -62; 75 | MM_ERR_HAS_BINDED = -84; 76 | MM_ERR_HAS_NO_HEADIMG = -53; 77 | MM_ERR_HAS_UNBINDED = -83; 78 | MM_ERR_HAVE_BIND_FACEBOOK = -67; 79 | MM_ERR_IDC_REDIRECT = -301; 80 | MM_ERR_IMG_READ = -1005; 81 | MM_ERR_INVALID_BIND_OPMODE = -37; 82 | MM_ERR_INVALID_GROUPCARD_CONTACT = -52; 83 | MM_ERR_INVALID_HDHEADIMG_REQ_TOTAL_LEN = -54; 84 | MM_ERR_INVALID_UPLOADMCONTACT_OPMODE = -38; 85 | MM_ERR_IS_NOT_OWNER = -66; 86 | MM_ERR_KEYBUF_INVALID = -2006; 87 | MM_ERR_LBSBANBYEXPOSE = -2001; 88 | MM_ERR_LBSDATANOTFOUND = -2000; 89 | MM_ERR_LOGIN_QRCODE_UUID_EXPIRED = -2007; 90 | MM_ERR_LOGIN_URL_DEVICE_UNSAFE = -2009; 91 | MM_ERR_MEMBER_TOOMUCH = -23; 92 | MM_ERR_MOBILE_BINDED = -35; 93 | MM_ERR_MOBILE_FORMAT = -41; 94 | MM_ERR_MOBILE_NEEDADJUST = -74; 95 | MM_ERR_MOBILE_NULL = -39; 96 | MM_ERR_MOBILE_UNBINDED = -36; 97 | MM_ERR_NEED_QQPWD = -49; 98 | MM_ERR_NEED_VERIFY = -6; 99 | MM_ERR_NEED_VERIFY_USER = -44; 100 | MM_ERR_NEEDREG = -30; 101 | MM_ERR_NEEDSECONDPWD = -31; 102 | MM_ERR_NEW_USER = -79; 103 | MM_ERR_NICEQQ_EXPIRED = -72; 104 | MM_ERR_NICKNAMEINVALID = -15; 105 | MM_ERR_NICKRESERVED = -11; 106 | MM_ERR_NO_BOTTLECOUNT = -56; 107 | MM_ERR_NO_HDHEADIMG = -55; 108 | MM_ERR_NO_QUESTION = -152; 109 | MM_ERR_NO_RETRY = -101; 110 | MM_ERR_NODATA = -203; 111 | MM_ERR_NOTBINDQQ = -81; 112 | MM_ERR_NOTCHATROOMCONTACT = -21; 113 | MM_ERR_NOTMICROBLOGCONTACT = -20; 114 | MM_ERR_NOTOPENPRIVATEMSG = -19; 115 | MM_ERR_NOTQQCONTACT = -46; 116 | MM_ERR_NOUPDATEINFO = -18; 117 | MM_ERR_NOUSER = -4; 118 | MM_ERR_OIDBTIMEOUT = -29; 119 | MM_ERR_ONE_BINDTYPE_LEFT = -82; 120 | MM_ERR_OTHER_MAIN_ACCT = -204; 121 | MM_ERR_PARSE_MAIL = -64; 122 | MM_ERR_PASSWORD = -3; 123 | MM_ERR_PICKBOTTLE_NOBOTTLE = -58; 124 | MM_ERR_QA_RELATION = -153; 125 | MM_ERR_QQ_BAN = -201; 126 | MM_ERR_QQ_OK_NEED_MOBILE = -205; 127 | MM_ERR_QRCODEVERIFY_BANBYEXPOSE = -2004; 128 | MM_ERR_QUESTION_COUNT = -151; 129 | MM_ERR_RADAR_PASSWORD_SIMPLE = -431; 130 | MM_ERR_RECOMMENDEDUPDATE = -17; 131 | MM_ERR_REG_BUT_LOGIN = -212; 132 | MM_ERR_REVOKEMSG_TIMEOUT = -430; 133 | MM_ERR_SEND_VERIFYCODE = -57; 134 | MM_ERR_SESSIONTIMEOUT = -13; 135 | MM_ERR_SHAKE_TRAN_IMG_CANCEL = -90; 136 | MM_ERR_SHAKE_TRAN_IMG_CONTINUE = -92; 137 | MM_ERR_SHAKE_TRAN_IMG_NOTFOUND = -91; 138 | MM_ERR_SHAKE_TRAN_IMG_OTHER = -93; 139 | MM_ERR_SHAKEBANBYEXPOSE = -2003; 140 | MM_ERR_SHORTVIDEO_CANCEL = 1000000; 141 | MM_ERR_SPAM = -24; 142 | MM_ERR_SVR_MOBILE_FORMAT = -78; 143 | MM_ERR_SYS = -1; 144 | MM_ERR_TICKET_NOTFOUND = -48; 145 | MM_ERR_TICKET_UNMATCH = -47; 146 | MM_ERR_TOLIST_LIMITED = -71; 147 | MM_ERR_TRYQQPWD = -73; 148 | MM_ERR_UINEXIST = -12; 149 | MM_ERR_UNBIND_MAIN_ACCT = -206; 150 | MM_ERR_UNBIND_MOBILE_NEED_QQPWD = -202; 151 | MM_ERR_UNBIND_REGBYMOBILE = -65; 152 | MM_ERR_UNMATCH_MOBILE = -40; 153 | MM_ERR_UNSUPPORT_COUNTRY = -59; 154 | MM_ERR_USER_BIND_MOBILE = -43; 155 | MM_ERR_USER_MOBILE_UNMATCH = -42; 156 | MM_ERR_USER_NOT_SUPPORT = -94; 157 | MM_ERR_USER_NOT_VERIFYUSER = -302; 158 | MM_ERR_USEREXIST = -7; 159 | MM_ERR_USERNAMEINVALID = -14; 160 | MM_ERR_USERRESERVED = -10; 161 | MM_ERR_UUID_BINDED = -76; 162 | MM_ERR_VERIFYCODE_NOTEXIST = -51; 163 | MM_ERR_VERIFYCODE_TIMEOUT = -33; 164 | MM_ERR_VERIFYCODE_UNMATCH = -32; 165 | MM_ERR_WEIBO_PUSH_TRANS = -80; 166 | MM_ERR_WRONG_SESSION_KEY = -77; 167 | MM_FACEBOOK_ACCESSTOKEN_UNVALID = -68; 168 | MMSNS_RET_BAN = 202; 169 | MMSNS_RET_CLIENTID_EXIST = 206; 170 | MMSNS_RET_COMMENT_HAVE_LIKE = 204; 171 | MMSNS_RET_COMMENT_NOT_ALLOW = 205; 172 | MMSNS_RET_COMMENT_PRIVACY = 208; 173 | MMSNS_RET_ISALL = 207; 174 | MMSNS_RET_PRIVACY = 203; 175 | MMSNS_RET_SPAM = 201; 176 | } 177 | 178 | message SKBuiltinString { 179 | optional string string = 1; 180 | } 181 | 182 | message SKBuiltinStringBuffer { 183 | optional uint32 len = 1; 184 | optional bytes buffer = 2; 185 | } 186 | 187 | message BaseResponse { 188 | required RetConst ret = 1; 189 | optional SKBuiltinString errMsg = 2; 190 | } -------------------------------------------------------------------------------- /mm_pb/get_login_qr_code_request.pb.go: -------------------------------------------------------------------------------- 1 | // Code generated by protoc-gen-go. DO NOT EDIT. 2 | // versions: 3 | // protoc-gen-go v1.23.0 4 | // protoc v3.6.1 5 | // source: get_login_qr_code_request.proto 6 | 7 | package mm_pb 8 | 9 | import ( 10 | proto "github.com/golang/protobuf/proto" 11 | protoreflect "google.golang.org/protobuf/reflect/protoreflect" 12 | protoimpl "google.golang.org/protobuf/runtime/protoimpl" 13 | reflect "reflect" 14 | sync "sync" 15 | ) 16 | 17 | const ( 18 | // Verify that this generated code is sufficiently up-to-date. 19 | _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) 20 | // Verify that runtime/protoimpl is sufficiently up-to-date. 21 | _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) 22 | ) 23 | 24 | // This is a compile-time assertion that a sufficiently up-to-date version 25 | // of the legacy proto package is being used. 26 | const _ = proto.ProtoPackageIsVersion4 27 | 28 | type GetLoginQRCodeRequest struct { 29 | state protoimpl.MessageState 30 | sizeCache protoimpl.SizeCache 31 | unknownFields protoimpl.UnknownFields 32 | 33 | BaseRequest *BaseRequest `protobuf:"bytes,1,req,name=baseRequest" json:"baseRequest,omitempty"` 34 | Aes *AesKey `protobuf:"bytes,2,req,name=aes" json:"aes,omitempty"` 35 | Opcode *uint32 `protobuf:"varint,3,req,name=opcode" json:"opcode,omitempty"` 36 | DeviceName *string `protobuf:"bytes,4,opt,name=deviceName" json:"deviceName,omitempty"` 37 | UserName *string `protobuf:"bytes,5,opt,name=userName" json:"userName,omitempty"` 38 | ExtDevLoginType *uint32 `protobuf:"varint,6,req,name=extDevLoginType" json:"extDevLoginType,omitempty"` 39 | HardwareExtra *string `protobuf:"bytes,7,opt,name=hardwareExtra" json:"hardwareExtra,omitempty"` 40 | SoftType *string `protobuf:"bytes,8,opt,name=softType" json:"softType,omitempty"` 41 | Rsa *RSAPem `protobuf:"bytes,9,opt,name=rsa" json:"rsa,omitempty"` 42 | } 43 | 44 | func (x *GetLoginQRCodeRequest) Reset() { 45 | *x = GetLoginQRCodeRequest{} 46 | if protoimpl.UnsafeEnabled { 47 | mi := &file_get_login_qr_code_request_proto_msgTypes[0] 48 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 49 | ms.StoreMessageInfo(mi) 50 | } 51 | } 52 | 53 | func (x *GetLoginQRCodeRequest) String() string { 54 | return protoimpl.X.MessageStringOf(x) 55 | } 56 | 57 | func (*GetLoginQRCodeRequest) ProtoMessage() {} 58 | 59 | func (x *GetLoginQRCodeRequest) ProtoReflect() protoreflect.Message { 60 | mi := &file_get_login_qr_code_request_proto_msgTypes[0] 61 | if protoimpl.UnsafeEnabled && x != nil { 62 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 63 | if ms.LoadMessageInfo() == nil { 64 | ms.StoreMessageInfo(mi) 65 | } 66 | return ms 67 | } 68 | return mi.MessageOf(x) 69 | } 70 | 71 | // Deprecated: Use GetLoginQRCodeRequest.ProtoReflect.Descriptor instead. 72 | func (*GetLoginQRCodeRequest) Descriptor() ([]byte, []int) { 73 | return file_get_login_qr_code_request_proto_rawDescGZIP(), []int{0} 74 | } 75 | 76 | func (x *GetLoginQRCodeRequest) GetBaseRequest() *BaseRequest { 77 | if x != nil { 78 | return x.BaseRequest 79 | } 80 | return nil 81 | } 82 | 83 | func (x *GetLoginQRCodeRequest) GetAes() *AesKey { 84 | if x != nil { 85 | return x.Aes 86 | } 87 | return nil 88 | } 89 | 90 | func (x *GetLoginQRCodeRequest) GetOpcode() uint32 { 91 | if x != nil && x.Opcode != nil { 92 | return *x.Opcode 93 | } 94 | return 0 95 | } 96 | 97 | func (x *GetLoginQRCodeRequest) GetDeviceName() string { 98 | if x != nil && x.DeviceName != nil { 99 | return *x.DeviceName 100 | } 101 | return "" 102 | } 103 | 104 | func (x *GetLoginQRCodeRequest) GetUserName() string { 105 | if x != nil && x.UserName != nil { 106 | return *x.UserName 107 | } 108 | return "" 109 | } 110 | 111 | func (x *GetLoginQRCodeRequest) GetExtDevLoginType() uint32 { 112 | if x != nil && x.ExtDevLoginType != nil { 113 | return *x.ExtDevLoginType 114 | } 115 | return 0 116 | } 117 | 118 | func (x *GetLoginQRCodeRequest) GetHardwareExtra() string { 119 | if x != nil && x.HardwareExtra != nil { 120 | return *x.HardwareExtra 121 | } 122 | return "" 123 | } 124 | 125 | func (x *GetLoginQRCodeRequest) GetSoftType() string { 126 | if x != nil && x.SoftType != nil { 127 | return *x.SoftType 128 | } 129 | return "" 130 | } 131 | 132 | func (x *GetLoginQRCodeRequest) GetRsa() *RSAPem { 133 | if x != nil { 134 | return x.Rsa 135 | } 136 | return nil 137 | } 138 | 139 | var File_get_login_qr_code_request_proto protoreflect.FileDescriptor 140 | 141 | var file_get_login_qr_code_request_proto_rawDesc = []byte{ 142 | 0x0a, 0x1f, 0x67, 0x65, 0x74, 0x5f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x5f, 0x71, 0x72, 0x5f, 0x63, 143 | 0x6f, 0x64, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 144 | 0x6f, 0x12, 0x05, 0x6d, 0x6d, 0x5f, 0x70, 0x62, 0x1a, 0x11, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x63, 145 | 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xcf, 0x02, 0x0a, 0x15, 146 | 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x51, 0x52, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 147 | 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x0b, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 148 | 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x6d, 0x5f, 149 | 0x70, 0x62, 0x2e, 0x42, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0b, 150 | 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x03, 0x61, 151 | 0x65, 0x73, 0x18, 0x02, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x6d, 0x6d, 0x5f, 0x70, 0x62, 152 | 0x2e, 0x41, 0x65, 0x73, 0x4b, 0x65, 0x79, 0x52, 0x03, 0x61, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 153 | 0x6f, 0x70, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x02, 0x28, 0x0d, 0x52, 0x06, 0x6f, 0x70, 154 | 0x63, 0x6f, 0x64, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 155 | 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 156 | 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 157 | 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 158 | 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x78, 0x74, 0x44, 0x65, 0x76, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x54, 159 | 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x02, 0x28, 0x0d, 0x52, 0x0f, 0x65, 0x78, 0x74, 0x44, 0x65, 160 | 0x76, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x68, 0x61, 161 | 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x45, 0x78, 0x74, 0x72, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 162 | 0x09, 0x52, 0x0d, 0x68, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x45, 0x78, 0x74, 0x72, 0x61, 163 | 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x6f, 0x66, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x08, 0x20, 0x01, 164 | 0x28, 0x09, 0x52, 0x08, 0x73, 0x6f, 0x66, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x03, 165 | 0x72, 0x73, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x6d, 0x6d, 0x5f, 0x70, 166 | 0x62, 0x2e, 0x52, 0x53, 0x41, 0x50, 0x65, 0x6d, 0x52, 0x03, 0x72, 0x73, 0x61, 0x42, 0x09, 0x5a, 167 | 0x07, 0x2e, 0x3b, 0x6d, 0x6d, 0x5f, 0x70, 0x62, 168 | } 169 | 170 | var ( 171 | file_get_login_qr_code_request_proto_rawDescOnce sync.Once 172 | file_get_login_qr_code_request_proto_rawDescData = file_get_login_qr_code_request_proto_rawDesc 173 | ) 174 | 175 | func file_get_login_qr_code_request_proto_rawDescGZIP() []byte { 176 | file_get_login_qr_code_request_proto_rawDescOnce.Do(func() { 177 | file_get_login_qr_code_request_proto_rawDescData = protoimpl.X.CompressGZIP(file_get_login_qr_code_request_proto_rawDescData) 178 | }) 179 | return file_get_login_qr_code_request_proto_rawDescData 180 | } 181 | 182 | var file_get_login_qr_code_request_proto_msgTypes = make([]protoimpl.MessageInfo, 1) 183 | var file_get_login_qr_code_request_proto_goTypes = []interface{}{ 184 | (*GetLoginQRCodeRequest)(nil), // 0: mm_pb.GetLoginQRCodeRequest 185 | (*BaseRequest)(nil), // 1: mm_pb.BaseRequest 186 | (*AesKey)(nil), // 2: mm_pb.AesKey 187 | (*RSAPem)(nil), // 3: mm_pb.RSAPem 188 | } 189 | var file_get_login_qr_code_request_proto_depIdxs = []int32{ 190 | 1, // 0: mm_pb.GetLoginQRCodeRequest.baseRequest:type_name -> mm_pb.BaseRequest 191 | 2, // 1: mm_pb.GetLoginQRCodeRequest.aes:type_name -> mm_pb.AesKey 192 | 3, // 2: mm_pb.GetLoginQRCodeRequest.rsa:type_name -> mm_pb.RSAPem 193 | 3, // [3:3] is the sub-list for method output_type 194 | 3, // [3:3] is the sub-list for method input_type 195 | 3, // [3:3] is the sub-list for extension type_name 196 | 3, // [3:3] is the sub-list for extension extendee 197 | 0, // [0:3] is the sub-list for field type_name 198 | } 199 | 200 | func init() { file_get_login_qr_code_request_proto_init() } 201 | func file_get_login_qr_code_request_proto_init() { 202 | if File_get_login_qr_code_request_proto != nil { 203 | return 204 | } 205 | file_base_common_proto_init() 206 | if !protoimpl.UnsafeEnabled { 207 | file_get_login_qr_code_request_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { 208 | switch v := v.(*GetLoginQRCodeRequest); i { 209 | case 0: 210 | return &v.state 211 | case 1: 212 | return &v.sizeCache 213 | case 2: 214 | return &v.unknownFields 215 | default: 216 | return nil 217 | } 218 | } 219 | } 220 | type x struct{} 221 | out := protoimpl.TypeBuilder{ 222 | File: protoimpl.DescBuilder{ 223 | GoPackagePath: reflect.TypeOf(x{}).PkgPath(), 224 | RawDescriptor: file_get_login_qr_code_request_proto_rawDesc, 225 | NumEnums: 0, 226 | NumMessages: 1, 227 | NumExtensions: 0, 228 | NumServices: 0, 229 | }, 230 | GoTypes: file_get_login_qr_code_request_proto_goTypes, 231 | DependencyIndexes: file_get_login_qr_code_request_proto_depIdxs, 232 | MessageInfos: file_get_login_qr_code_request_proto_msgTypes, 233 | }.Build() 234 | File_get_login_qr_code_request_proto = out.File 235 | file_get_login_qr_code_request_proto_rawDesc = nil 236 | file_get_login_qr_code_request_proto_goTypes = nil 237 | file_get_login_qr_code_request_proto_depIdxs = nil 238 | } 239 | -------------------------------------------------------------------------------- /mm_pb/get_login_qr_code_response.pb.go: -------------------------------------------------------------------------------- 1 | // Code generated by protoc-gen-go. DO NOT EDIT. 2 | // versions: 3 | // protoc-gen-go v1.23.0 4 | // protoc v3.6.1 5 | // source: get_login_qr_code_response.proto 6 | 7 | package mm_pb 8 | 9 | import ( 10 | proto "github.com/golang/protobuf/proto" 11 | protoreflect "google.golang.org/protobuf/reflect/protoreflect" 12 | protoimpl "google.golang.org/protobuf/runtime/protoimpl" 13 | reflect "reflect" 14 | sync "sync" 15 | ) 16 | 17 | const ( 18 | // Verify that this generated code is sufficiently up-to-date. 19 | _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) 20 | // Verify that runtime/protoimpl is sufficiently up-to-date. 21 | _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) 22 | ) 23 | 24 | // This is a compile-time assertion that a sufficiently up-to-date version 25 | // of the legacy proto package is being used. 26 | const _ = proto.ProtoPackageIsVersion4 27 | 28 | type GetLoginQRCodeResponse struct { 29 | state protoimpl.MessageState 30 | sizeCache protoimpl.SizeCache 31 | unknownFields protoimpl.UnknownFields 32 | 33 | BaseResponse *BaseResponse `protobuf:"bytes,1,req,name=baseResponse" json:"baseResponse,omitempty"` 34 | QRCode *QRCode `protobuf:"bytes,2,req,name=qRCode" json:"qRCode,omitempty"` 35 | Uuid *string `protobuf:"bytes,3,req,name=uuid" json:"uuid,omitempty"` 36 | CheckTime *uint32 `protobuf:"varint,4,req,name=checkTime" json:"checkTime,omitempty"` 37 | AESKey *AesKey `protobuf:"bytes,5,req,name=AESKey" json:"AESKey,omitempty"` 38 | ExpiredTime *uint32 `protobuf:"varint,6,req,name=expiredTime" json:"expiredTime,omitempty"` 39 | BlueToothBroadCastUuid *string `protobuf:"bytes,7,opt,name=blueToothBroadCastUuid" json:"blueToothBroadCastUuid,omitempty"` 40 | BlueToothBroadCastContent *SKBuiltinStringBuffer `protobuf:"bytes,8,opt,name=blueToothBroadCastContent" json:"blueToothBroadCastContent,omitempty"` 41 | } 42 | 43 | func (x *GetLoginQRCodeResponse) Reset() { 44 | *x = GetLoginQRCodeResponse{} 45 | if protoimpl.UnsafeEnabled { 46 | mi := &file_get_login_qr_code_response_proto_msgTypes[0] 47 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 48 | ms.StoreMessageInfo(mi) 49 | } 50 | } 51 | 52 | func (x *GetLoginQRCodeResponse) String() string { 53 | return protoimpl.X.MessageStringOf(x) 54 | } 55 | 56 | func (*GetLoginQRCodeResponse) ProtoMessage() {} 57 | 58 | func (x *GetLoginQRCodeResponse) ProtoReflect() protoreflect.Message { 59 | mi := &file_get_login_qr_code_response_proto_msgTypes[0] 60 | if protoimpl.UnsafeEnabled && x != nil { 61 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 62 | if ms.LoadMessageInfo() == nil { 63 | ms.StoreMessageInfo(mi) 64 | } 65 | return ms 66 | } 67 | return mi.MessageOf(x) 68 | } 69 | 70 | // Deprecated: Use GetLoginQRCodeResponse.ProtoReflect.Descriptor instead. 71 | func (*GetLoginQRCodeResponse) Descriptor() ([]byte, []int) { 72 | return file_get_login_qr_code_response_proto_rawDescGZIP(), []int{0} 73 | } 74 | 75 | func (x *GetLoginQRCodeResponse) GetBaseResponse() *BaseResponse { 76 | if x != nil { 77 | return x.BaseResponse 78 | } 79 | return nil 80 | } 81 | 82 | func (x *GetLoginQRCodeResponse) GetQRCode() *QRCode { 83 | if x != nil { 84 | return x.QRCode 85 | } 86 | return nil 87 | } 88 | 89 | func (x *GetLoginQRCodeResponse) GetUuid() string { 90 | if x != nil && x.Uuid != nil { 91 | return *x.Uuid 92 | } 93 | return "" 94 | } 95 | 96 | func (x *GetLoginQRCodeResponse) GetCheckTime() uint32 { 97 | if x != nil && x.CheckTime != nil { 98 | return *x.CheckTime 99 | } 100 | return 0 101 | } 102 | 103 | func (x *GetLoginQRCodeResponse) GetAESKey() *AesKey { 104 | if x != nil { 105 | return x.AESKey 106 | } 107 | return nil 108 | } 109 | 110 | func (x *GetLoginQRCodeResponse) GetExpiredTime() uint32 { 111 | if x != nil && x.ExpiredTime != nil { 112 | return *x.ExpiredTime 113 | } 114 | return 0 115 | } 116 | 117 | func (x *GetLoginQRCodeResponse) GetBlueToothBroadCastUuid() string { 118 | if x != nil && x.BlueToothBroadCastUuid != nil { 119 | return *x.BlueToothBroadCastUuid 120 | } 121 | return "" 122 | } 123 | 124 | func (x *GetLoginQRCodeResponse) GetBlueToothBroadCastContent() *SKBuiltinStringBuffer { 125 | if x != nil { 126 | return x.BlueToothBroadCastContent 127 | } 128 | return nil 129 | } 130 | 131 | type QRCode struct { 132 | state protoimpl.MessageState 133 | sizeCache protoimpl.SizeCache 134 | unknownFields protoimpl.UnknownFields 135 | 136 | Len *uint32 `protobuf:"varint,1,req,name=len" json:"len,omitempty"` 137 | Src []byte `protobuf:"bytes,2,req,name=src" json:"src,omitempty"` 138 | } 139 | 140 | func (x *QRCode) Reset() { 141 | *x = QRCode{} 142 | if protoimpl.UnsafeEnabled { 143 | mi := &file_get_login_qr_code_response_proto_msgTypes[1] 144 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 145 | ms.StoreMessageInfo(mi) 146 | } 147 | } 148 | 149 | func (x *QRCode) String() string { 150 | return protoimpl.X.MessageStringOf(x) 151 | } 152 | 153 | func (*QRCode) ProtoMessage() {} 154 | 155 | func (x *QRCode) ProtoReflect() protoreflect.Message { 156 | mi := &file_get_login_qr_code_response_proto_msgTypes[1] 157 | if protoimpl.UnsafeEnabled && x != nil { 158 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 159 | if ms.LoadMessageInfo() == nil { 160 | ms.StoreMessageInfo(mi) 161 | } 162 | return ms 163 | } 164 | return mi.MessageOf(x) 165 | } 166 | 167 | // Deprecated: Use QRCode.ProtoReflect.Descriptor instead. 168 | func (*QRCode) Descriptor() ([]byte, []int) { 169 | return file_get_login_qr_code_response_proto_rawDescGZIP(), []int{1} 170 | } 171 | 172 | func (x *QRCode) GetLen() uint32 { 173 | if x != nil && x.Len != nil { 174 | return *x.Len 175 | } 176 | return 0 177 | } 178 | 179 | func (x *QRCode) GetSrc() []byte { 180 | if x != nil { 181 | return x.Src 182 | } 183 | return nil 184 | } 185 | 186 | var File_get_login_qr_code_response_proto protoreflect.FileDescriptor 187 | 188 | var file_get_login_qr_code_response_proto_rawDesc = []byte{ 189 | 0x0a, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x5f, 0x71, 0x72, 0x5f, 0x63, 190 | 0x6f, 0x64, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x70, 0x72, 0x6f, 191 | 0x74, 0x6f, 0x12, 0x05, 0x6d, 0x6d, 0x5f, 0x70, 0x62, 0x1a, 0x11, 0x62, 0x61, 0x73, 0x65, 0x5f, 192 | 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x87, 0x03, 0x0a, 193 | 0x16, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x51, 0x52, 0x43, 0x6f, 0x64, 0x65, 0x52, 194 | 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0c, 0x62, 0x61, 0x73, 0x65, 0x52, 195 | 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x13, 0x2e, 196 | 0x6d, 0x6d, 0x5f, 0x70, 0x62, 0x2e, 0x42, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 197 | 0x73, 0x65, 0x52, 0x0c, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 198 | 0x12, 0x25, 0x0a, 0x06, 0x71, 0x52, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x02, 0x28, 0x0b, 199 | 0x32, 0x0d, 0x2e, 0x6d, 0x6d, 0x5f, 0x70, 0x62, 0x2e, 0x51, 0x52, 0x43, 0x6f, 0x64, 0x65, 0x52, 200 | 0x06, 0x71, 0x52, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 201 | 0x03, 0x20, 0x02, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x63, 202 | 0x68, 0x65, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x02, 0x28, 0x0d, 0x52, 0x09, 203 | 0x63, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x06, 0x41, 0x45, 0x53, 204 | 0x4b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x6d, 0x6d, 0x5f, 0x70, 205 | 0x62, 0x2e, 0x41, 0x65, 0x73, 0x4b, 0x65, 0x79, 0x52, 0x06, 0x41, 0x45, 0x53, 0x4b, 0x65, 0x79, 206 | 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x18, 207 | 0x06, 0x20, 0x02, 0x28, 0x0d, 0x52, 0x0b, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x54, 0x69, 208 | 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x16, 0x62, 0x6c, 0x75, 0x65, 0x54, 0x6f, 0x6f, 0x74, 0x68, 0x42, 209 | 0x72, 0x6f, 0x61, 0x64, 0x43, 0x61, 0x73, 0x74, 0x55, 0x75, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 210 | 0x28, 0x09, 0x52, 0x16, 0x62, 0x6c, 0x75, 0x65, 0x54, 0x6f, 0x6f, 0x74, 0x68, 0x42, 0x72, 0x6f, 211 | 0x61, 0x64, 0x43, 0x61, 0x73, 0x74, 0x55, 0x75, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x19, 0x62, 0x6c, 212 | 0x75, 0x65, 0x54, 0x6f, 0x6f, 0x74, 0x68, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x43, 0x61, 0x73, 0x74, 213 | 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 214 | 0x6d, 0x6d, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x4b, 0x42, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x53, 215 | 0x74, 0x72, 0x69, 0x6e, 0x67, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x52, 0x19, 0x62, 0x6c, 0x75, 216 | 0x65, 0x54, 0x6f, 0x6f, 0x74, 0x68, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x43, 0x61, 0x73, 0x74, 0x43, 217 | 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x2c, 0x0a, 0x06, 0x51, 0x52, 0x43, 0x6f, 0x64, 0x65, 218 | 0x12, 0x10, 0x0a, 0x03, 0x6c, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0d, 0x52, 0x03, 0x6c, 219 | 0x65, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x72, 0x63, 0x18, 0x02, 0x20, 0x02, 0x28, 0x0c, 0x52, 220 | 0x03, 0x73, 0x72, 0x63, 0x42, 0x09, 0x5a, 0x07, 0x2e, 0x3b, 0x6d, 0x6d, 0x5f, 0x70, 0x62, 221 | } 222 | 223 | var ( 224 | file_get_login_qr_code_response_proto_rawDescOnce sync.Once 225 | file_get_login_qr_code_response_proto_rawDescData = file_get_login_qr_code_response_proto_rawDesc 226 | ) 227 | 228 | func file_get_login_qr_code_response_proto_rawDescGZIP() []byte { 229 | file_get_login_qr_code_response_proto_rawDescOnce.Do(func() { 230 | file_get_login_qr_code_response_proto_rawDescData = protoimpl.X.CompressGZIP(file_get_login_qr_code_response_proto_rawDescData) 231 | }) 232 | return file_get_login_qr_code_response_proto_rawDescData 233 | } 234 | 235 | var file_get_login_qr_code_response_proto_msgTypes = make([]protoimpl.MessageInfo, 2) 236 | var file_get_login_qr_code_response_proto_goTypes = []interface{}{ 237 | (*GetLoginQRCodeResponse)(nil), // 0: mm_pb.GetLoginQRCodeResponse 238 | (*QRCode)(nil), // 1: mm_pb.QRCode 239 | (*BaseResponse)(nil), // 2: mm_pb.BaseResponse 240 | (*AesKey)(nil), // 3: mm_pb.AesKey 241 | (*SKBuiltinStringBuffer)(nil), // 4: mm_pb.SKBuiltinStringBuffer 242 | } 243 | var file_get_login_qr_code_response_proto_depIdxs = []int32{ 244 | 2, // 0: mm_pb.GetLoginQRCodeResponse.baseResponse:type_name -> mm_pb.BaseResponse 245 | 1, // 1: mm_pb.GetLoginQRCodeResponse.qRCode:type_name -> mm_pb.QRCode 246 | 3, // 2: mm_pb.GetLoginQRCodeResponse.AESKey:type_name -> mm_pb.AesKey 247 | 4, // 3: mm_pb.GetLoginQRCodeResponse.blueToothBroadCastContent:type_name -> mm_pb.SKBuiltinStringBuffer 248 | 4, // [4:4] is the sub-list for method output_type 249 | 4, // [4:4] is the sub-list for method input_type 250 | 4, // [4:4] is the sub-list for extension type_name 251 | 4, // [4:4] is the sub-list for extension extendee 252 | 0, // [0:4] is the sub-list for field type_name 253 | } 254 | 255 | func init() { file_get_login_qr_code_response_proto_init() } 256 | func file_get_login_qr_code_response_proto_init() { 257 | if File_get_login_qr_code_response_proto != nil { 258 | return 259 | } 260 | file_base_common_proto_init() 261 | if !protoimpl.UnsafeEnabled { 262 | file_get_login_qr_code_response_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { 263 | switch v := v.(*GetLoginQRCodeResponse); i { 264 | case 0: 265 | return &v.state 266 | case 1: 267 | return &v.sizeCache 268 | case 2: 269 | return &v.unknownFields 270 | default: 271 | return nil 272 | } 273 | } 274 | file_get_login_qr_code_response_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { 275 | switch v := v.(*QRCode); i { 276 | case 0: 277 | return &v.state 278 | case 1: 279 | return &v.sizeCache 280 | case 2: 281 | return &v.unknownFields 282 | default: 283 | return nil 284 | } 285 | } 286 | } 287 | type x struct{} 288 | out := protoimpl.TypeBuilder{ 289 | File: protoimpl.DescBuilder{ 290 | GoPackagePath: reflect.TypeOf(x{}).PkgPath(), 291 | RawDescriptor: file_get_login_qr_code_response_proto_rawDesc, 292 | NumEnums: 0, 293 | NumMessages: 2, 294 | NumExtensions: 0, 295 | NumServices: 0, 296 | }, 297 | GoTypes: file_get_login_qr_code_response_proto_goTypes, 298 | DependencyIndexes: file_get_login_qr_code_response_proto_depIdxs, 299 | MessageInfos: file_get_login_qr_code_response_proto_msgTypes, 300 | }.Build() 301 | File_get_login_qr_code_response_proto = out.File 302 | file_get_login_qr_code_response_proto_rawDesc = nil 303 | file_get_login_qr_code_response_proto_goTypes = nil 304 | file_get_login_qr_code_response_proto_depIdxs = nil 305 | } 306 | -------------------------------------------------------------------------------- /client_test.go: -------------------------------------------------------------------------------- 1 | package wxxx 2 | 3 | import ( 4 | "context" 5 | "encoding/base64" 6 | "encoding/hex" 7 | "github.com/stretchr/testify/assert" 8 | "testing" 9 | ) 10 | 11 | func TestClient_GetLoginQrCode(t *testing.T) { 12 | ctx := context.Background() 13 | cli := NewClient(NewDefaultHttpCli(ctx)) 14 | resp, err := cli.GetLoginQrCode("") 15 | if !assert.NoError(t, err) { 16 | t.FailNow() 17 | } 18 | Log.Printf("aeskey = %s , qrCodeId = %s >> %s", ArrToHexStrWithSp(resp.AesKey, ""), resp.QRCodeId, base64.StdEncoding.EncodeToString(resp.QRCodeContent)) 19 | } 20 | 21 | func TestUnpack(t *testing.T) { 22 | key, _ := hex.DecodeString("CD519D776CB40706117171E880788350") 23 | data, _ := hex.DecodeString("6D04614277ECFFC8DD2DB9BED5ECB93D9CC3FA29A9D07C6C8672E43DC5B0B5A338D080E37F26DCD6D51085303842CC856C55E6CB182B241E9A8462F389679DFC39E26A98E52FFC1947283E5FDB10ECD829EF3B0505026075732780E71D05D763979ACD1C2688EC05DCB1A97EA1176C786D84680639C4DA3549B80A9913078BA048E5DE49B1AA33E314034010D5F00D0CC20489E8973D35EB711F21FB3A2D8E530BB941373E340D93FC0CD0482BF0D5152AAA2AE1AB12F3F2950D3F1FFC4587F9CF5D4C0ABD821C410999D9E9E2539F71E407D2FB86A1DCFCC23EA76F24BE2EC4913BD2D93FAEA911631E2FAC1F9A6A96744462E0501EA1582AA6ECEE53FC2B36F674CA75666480559C085B51BE121E2C66E2C8EF035D067EEF5250323A89732160117D5AA827707098427DD26383455BDF07E4F3408F59970BBEBE53FE150995E93808B2E071F1EC05D77C7A95F28AE0653B08E33BF79C6E7C4BE5C9246D143797BC4EE175A207E54AD7557F2F12FF6A013C2EA2F6DD5942987D558B0CC17C9CF3FBC3210917E2D7D233F170A701F34C732FA1E119848690F2DF90996AF8121B1B96B486EB7BBB9B14D4D1F2F0CE74B3A56BC336125BC132F73D765CA02A2C0A32323C690E9E3142F19C960BE8AD067175567EE7707369BF3DB94D8001BA0E68FC4510A1481CCF689DE17B90EDA5DC67388E03BE7D40293D3C83DB6D11AA1D14C1D5AC32A1F4C7594411EA8750E4B88C65E6C11996811ADDC413CE8DADC81C1FEFF88D87A03646EFFE550745A8747FE8634CB25F49470B8E1CED94D4F8E30E9987514BAB94ADA99C9363AAD87AA3410F9F87944B6ABB30139EE057D286598D08F2D17F7FC8D59A53206DF25BF8ACF7A90DCF333DF1C3626B23EE2ABBB55EE67D0D5595C19A687C0395340698824F23D284FD23BC9039D4ECE526D9B4DF91DF9D26D95D3E2F36C9BFE888CB9E643424A3413FFED2EE3F0F36B77CB3CA535A3B55F897828EB91451F1A3084918431FC19FF0987423B92F3E96B1A0C9D46F87F2F5BED903712343279E1B995B7C7E9F97F3A9FCCCE228E531B6BF61588E388E4A489EBB52B4EFD2B64ABDEFD226619F68A47E52C0111C2C861CA358725A0D58E29A6F89EAB4BA3F1903E6341526DB1DDA6CC89F31426ADF35017F02B763679EC0669AD84D1FB0F03B34E46E349238AB58AAF9A6F31B8532E6105ACD8D810137F49DAAE64618EA3C23143FA0A21F3514F0FA4C3D3599723247FF77A2D9344EF614CB16E395E6E0133B693A5128802440F12EEA7B98FABDDB00B7E53B6631C54915D41CF30C2D78CC8666ADA1EAA6D04D370FA82F75770CDCCCFCA8B376D9061E653C0B7F60BD0E7645AEEECBDC7BCBC172D98FF5FC53523DE48DF06F7BF470275CC7D5EDC0DD77239E908D311397ADAD1685C0F16689BC030882BB73B3B686FEDB4A1932BE7DA07E7C9102E8BA6C0E1F55B18C08E963F6B6F0ADCE3AF0C8FA99E1F3DE149FF38E6782A1466590B9453C8D8842B1E4674548E08D7853C40327CD8D29D99CC4624E0CF42087ABE3BA85FDF17287145321EF8831BC82903F01471C02FE796963BDE9FDE3AEAB8A574FD4B338761497C48086D43E45163152AD07CF721C35F830067C7AC59A00D2B8BDD67EF9565BA2BD206D18BEB7AAE41A27DE48B0A7B8AD2EF664039F6AAAC577736B1995312C709F28C9C0CA62EE2727BD36D777FDC7F418A4B9E5377774265D1602138A0D791151E40E4D08B895A9A55B2A6AC6A5856024520AD5E4D9EB8FEFED2D9E19700076B6D1335D54550EBA4F7B53CA68E39BF932B3DBBECD600B03CB2E576217D01BF803860D0C039929E9E3072EA65363BFD8AE0EC3194E78EAC971061A4F0CB968FF4C7FB2F6F4CF2B9C0ADE2F186308A055EF10C377B95578C77EC00E3DF9233BDF95CAA81B4F57237E00AE9B5D42F5C2A45A0D4E35E841C7AE2E2BE24D88AF365F4ED568A09DE74E0A189ED5A4470AD762E35E31A87BDE45A9F2449DD486310D3FF0C7EE4676F2E6109CC297625ED24618D398CC42FC2A73224142290396A0FCAF99D02CB152CBA5222F989D211B77CFF26CC8D32858380A821562A871F15269C87925D9007A9185077E81A4491156040C44B1F9E7AB4C2A8C02C5C58E7E8EA114CF294DA169FF7D675BD0FB31ED365564F1F05CA90C95840066F0B7EFC55C4DFC1F87D82EA524A3B353F715D3B81D64DB1CE05D9AA0207FAB5A4E5402F464F488CEDE824F9225201AAD3C11A3C20AB9A61656EC91F62FAAD373C6C9B30820FDA90DB0C7386ABA14B76289F22441BE8EC9ECEA7E43FDF9C4151F1F0E645E591A01681DCD90467A9CBA236DF12E0E6B9B3AF793EBBB98A3434F359C38E4C6D4462B7F6274E1AB97D733D9C6B65A067885AF50F78D80B748DA155091BD828BA9080EE6D077C2FD6A865967BA524D9BCFD1C24E4576C1DCB083EE812C625AA2AEF1A8C3D744E963BFD9A4968C4AAE5B4022D7C47ECD82D214C5A56F578E3C75D6B887BE5FC37DFF8FC9DB2327A9E5BF1E862EC5AE2880D422CA5C556EE4665A08FD99DECC1B043BD7C0ED3CD53B1EE184B2B7D98DE92FB30F07A9733FE91F7462F0E2319F0525C9A7F848EBBC8424038479E911E502FE682903A4D0C5AFB2FDB97B633C338B91D5F651C2A6AC1A6F141327BB5410C81BE94D90BA6348B2A33D4C645B5423DAFF82145BAD1BDBBC160F56A37661E2B012AE810348ECFF30B806D9D2A5E7A16DB4F56DC15E9460FF0A943FA1575620B6A721C039D95179DACC9C656FA1A5E49CF99268CC79C7A4243D9F5579C9B2C6ADA57C7AAEEAEC6DF36A08FF4B08245F0019C822EC6510D326D1CB3E8AEEB578371590DB09F14EA30F7B8C3F8F882E7C345B210148924010B4DE6F97A877E4A81DFCBFD3AF4F5D3174C38028D3CC06C7420C43E871C29FCB60D673EE37ADEE266690C5DE83576F8B6C9B7C451A4C272009F9F86CFB56EB04CD2B16A4C01B7AB3EA78E9FD9494193941572566986BB23976B13A30029C53212CB78146F2CB303A9483078CC70B2795356FE6A474D3092D1EF575ACB6307704D3E75013F7C29678664ADCA73EEB262A5DF915537FC029F8EE08C14076D7B4BF65E8FBBEF175BD041A2581CB3C53E1AEE886474CC18F79D625F87FB7B97E5AC980469048B8648567D719FA1A998E6854B6F2BC4F7DCB26C0EC7C2331F29D2D01BF9883689D4CF16A106B0A6B29EC92E1A25358DC8C8B891944D15EEFDF60DD3BD36C0B8E1FC215F37057DFC7CFABBA9859235580730ADE6A564D383D92C05644AEFC04AC05332AA9CFA2E28566B4A1BBEF57196BE9D4A9757C86CB6D093DA50602A48607BBA45D3BAC961F9B4ADEDE84E0860F1CDC0345AFCE28676DC26F3BBAFF6A594CB5241189B22F04BFB9F21AFE612533A6F7815554640978714200B96D317BB65D5907F5816CD80E94D17A35C16DF76BD8FD2CCA7BB0D3DC57D6DFA7E8598499D160ADC67C94A22B20BD508EDF6D471656C23D5FBA06DA120232D67596C4AE01122087FD77EC419A3D531BE0D7EAE0D40150A34A90B5CB5004EFCADE0EA3E009DC6EB1E902A1DEE34383B01EBEE3EE2FF2B3B91498334773A930E1D266176EE5DF28A167B9EB041D9E05BBFAA1D30579B53026A5DA30FD2835784E50AD8EA63F1ADFAE4497B259F98006E7BF72897D5D015A9AD624F57BC706D9D1A31564FFEE87B984221AD465E884368578FF4BB86A51084F9FF77FE061FE1F430B71AEC33ED2FF35A67C553B02590CF2FE7FBF0C0F06716511F9C63C8856D79723EB98F5B4FBF646F364BE7D334F1F73AFDE9E1103C06CC0DA0D9170C9064A100F4713BE85626480D0682EB6FA9B39B95E2CA9938C3E0D30801CCD7B775617AE07731C82425BCB4A085B3D6CAD2552530D1DBE676671ACAA8BEB10412AC5B7854CCC855B5268A10C8CDFE282C8142B7D4894B24DBDC13D5C812EE7108F81396E115892C7BE4B491A126A77512DC4A4C3CBD34EE9C3CF611655F96AFB7102F28B2CF0D393B3323772A3321309CB574A8075094DBDCBB9E435CA32F244DB4549F1D3365D8E484572C625D5635F88ECCBDE2CF3D33B4442FB2E23FF5A6A81131219B0FE96761D8E20B2AF345301B5CB94C7BBCAD7232BAF75D4199125D3293A221AA71B35A358E62980922EC4BC591CE847395D9E838E2D6B176F3A8E8B02C9DF449A7B9BBD7018DFD331CA122F256C408ECCEBD90383B74BBD2038D853C65E31866F92D26F1CDAF38EF72DE2BA8D73F345CEE616E98B31F02D7FA1C6B9C0F084C4856157242391FF4960F339992A6072A038B53710A4626B200102F6DD60A2F696DFF60808F8429472EB828B0631BE02FC02B1710C070EE16F5F12FB4E3643C065D16AD0ECB041FF11AAE60A00A37B77F550EEC486435DA08D16625A86676E416B167A4B77F0B014C69FFD50E37DBD03D44CAFC0B3FBB7E9A3DB1505156E8D31251D17C3AAA673DDB0D4C0DAFDE555A56A72C7756431F9AA0A6FF3FF0BA7CBE57109CB6FDCB61A10E4ACB95BE8E89500A3BEE8F1C54460D828489191A118F86A65653C79B16BBCF753BD0F0911231C7EDD9442B93DA02818FB5F3FD5CF44359FAF21092FE163578C648AEF918A04AD44E185753386B789147A3D62B33476777FE9B7E0B3EBF8BC4AF63FF6C7BC7A396491A441F81FF384844F2F81C73D53BAE47B1910CCA178FB9A9CA3C225946F84483223147A10C57D727FAEFDBE5BD9D29751396D31F6FD30B14F41ADC4D7C6B22368143DC00CE794FF87D3A9801792EE05424139B59D92896677E302AC8E70CF0A777B2821595802CF887FAAE4813E48C77ACE7BFD6F4D38D1B79F35FC4C99217C42064C3828BD29D0C282F65F6D703793D7E83EE1297F41EDF3425334E7335F90F2942F195BBE6D7EE232518A09274E1EF8D4491A593CD79F983128DC512B5C5081C0FBF48D565F67DEA9CD7885D9CC4DB4BC6E7F0B69BF75C3984B5C5DD00494776C072B33AD2F7E6A2AB2B2033B256FFEEFF517AE37A0B0AAD116EF57B5B2C7542A5539BEBE82A03A556B4B8191F4333DD2C0ACCFB7C6CB116D7F39216B15AF5A684FB7A14301FB3E3FA34556E5FE91E8991EA88D15BE7CE98234291389F486DA6AB2530818148C525B541357C93F3BA6AD5AF929326A1D163C9D5ABE011FD5B49876E6B20651C576153F1275E53207F588BC1D647E597CEAAAAC5454F61659CB6845D422F71A3CF21E3F1BE6F237C03911F3F901EE1D4651DDCA31E18866AA60D750949A29715BECFD8A4BE026EC82539B5C984135A516FBFF9FF8CEE5196E272A244CDFC0FEE23C2E908BDCC2D79DDC99C88FC9DC1BC59E7347337050BFA7173A0D2C01099DEA07FDBAA8A06E0F27C10356253660899F3D745A80B644B546508F931E39F275890A4269EA88A08693971515CC890674E0220E8886067059238A32EF432C8CD0DD294DC395F1B69299CE552F6329FCD62B9BAE68DC6B39C9ABAFAD36C21CB733FD5651D3BD38D45B52BD68AB694F75B690E152010EFF453F2FA12983C272612D9512CE252A294BD8A74E4F0AEAEED5979EDAB500B11F86A20AE584217B608F93A3CB6C08C634991AB1A5B9BF45EDF52A01BC67510D551FFA97BCF8F4F2E40ADAF1C9FADAABF6A3078162C80860581997DDC5CE80F85CD1F6E681CDD27843DFEB1987731C37EC75467670F98AFFD21D361F18943468997A0A167E2A20320765FD5D81A94B3A8D986E463874B6FE50C78F95A4FAB7FFD2FFBE1B52A869893E91AE6AECEAC6C9A8A30C8D2709F45B06F7F2B3D94F569D4E96E964D183088AD03262ED1E2B3A931B3C7D5982275A31910B05043DC5BD8B2108DF245C611B425CC2CDB456B4A413EC08DE1155A45B0C066E4EBDA920683F9F6E38BD2B1A4819796022DB328A83D2F233CBD7C91E5D2D653E1D7E2E0EDF2B8DA5C037E479D0885999F4539C0B52337929CC07EF8B5282967921966037E00E099B5C79E3750A85BF2DBCE122C172474809D396E5D4CA2A4437D8B7338CFFE510B6A8F4DEB8DA737E0609F1C0080298F3BBB972E572E99F7016FE38B50C1849FC1D37482642423067130F1BCEE46DFFB2CC4C92113CD5ACEC53048FEDE57D53C8A954B22E65183ACD8D1EB7E3670CFABA238B9106B0ADD45EB99D1690E0CE38D1475BC8F782506A7AA61E337688FE76E82DE4354551D690B7834806CFB984D0955DD03F499DA023E880200ABB8E7DD614F7691E73123F6C5D47C734005DB63C94E5D467C7D5B2BCCF7547DFEE04BFE9DBB09FA30CBED04FF33DC000F6E6F24D19429D33BFE1C1BAEB1BFB96CC76C348CD0FAA0F754126D960098B886AE54B192BBF59F1C2FE753BDDFD1E933539F0E368FDB9A2CC525E62AD14BF69DF1F78ACC733FE95D95834D2326C748FD1145B76986C0CEBACBDEEDEFFE12DFDAB3560944063D79CBDD5B2C2DEB95AC7F026E9D047FE363443E3F77CE449F5958CF3C8DFA057AA158D4BB5C56A9F966D6881AC2BF40E65314AEF46740930BB2BF2DE3B8742459EFF57D548392A2575C5D68D0BF8A2E4364C6295C2AEDD398687C0F29838ADB1BC15FF05C09785D12F9EF777B11D9C604DB638E923032D1BB791831D1D4924014031B85DE98307804AEA936C9D600988C0B45CD07559524975155B26B8A21C9C1C4ABBF8F732934F4BC0532AC5A9AB3B414F3ADAAA13C809F3EE8FA19592AA8B07182EFEB9AA3564156DA08CACEDC075F25D8AB9434422BF826257386B875BBD5F6F7DA7909AD6C88DB864D54DC8322030070EF71AC3577C99109A261901271A3F3D5FEE446FFEB9A07CFE5A8E5F556E10373B25728F3CF6C1F144F522C6F9CDAFFD8FD5066EA48799F1BF55C2C1F162F8BA946B8E90B75E8D1A7A4AA2E65DF5A08921861D71E15C11B790452E774306FE32396DD9E4F1A902C12C548193C0D28FDDF471C68EDCDE15048245095C9088C08A742C04C6EC5CD9FBA44DCABCDF99A07B9072608CA6B7531FFF26109693EA7B2ED2752AC6BEAFB8C9F653824B462D169603F5F9E440C55843EE9C07ACEF00CB1CB17819BBCF7FDECDE2384A90DFC19E42E9C406163CD104AE1AD8735011F3C7FA272A27D4082EB552CE0DD070D6C5EA38022FAF8C6087D22DD512A9BEB1D220FE9116D9EDF3A59EBB523A5547D909C43835DB9C226ED9FD1D8C13C8ED2B2D2071151E964D11DD10F99CFC5DEBA5687FC6517B43D7F7D62B57BBC5D773EA65567A40622CC7A50B77C77540EF85EAE0BDD15A9A707C8CE1C8C06C38FBF24B029F100C3E74BEE0A0EA80DC59D66A32DA6A6E9994B2554338B66C567F548F7FF6669577AFB9602198457F8B89F2D3F6F3EB682BCB435BF202928B65B214F89DD71F6751CFED8AAF0C0CEFEA319372221DE4BC67D1A274BEBB608853AC9805E944DF1FDFE9E6D08D378B610CAC5F85D674078E4DBADD2F546B8D6A52634370EB8EA8746BBBCE0D8DB988891A737983D63C9934A5BB1C110BCD29CB4D17BC734E6A10AF536A60FEAAF3949BA46B646DF5AB7A972368A9E57261E6ABDBDF27BD9378763FE5A005A086F1DB106CAD4C01ABC5C109BCA27B2095DD5703672B93310CEFE839FF3AB6CB8B6ED870EDC4D7BE4182D511FBA28B912E1E741EDE479147BFCED38DB207C6ED7CAFCC97F7456C609B973207C5DBF9F7DE3EDA245BE4EC49BA1E55E0DF47BC60CDE48A7E89C6267E772377F0F750FF96089ABBFB0EE5038DEF7CA77917B10B790B0A167CB0B2C6E573822BA388AC9E9786024301DE3D1C02AF3FCCD9355698CD2CE2B830C21328701986EA7C4D0787E965083F6BC467D479ABB4D351EF48E6C8D85EB8FF0749866370276587D4701A55330DCBD26D7683BBD95463624D72108D6556A0841BFB8D17150276F8988907B2C53C343283BCD2104483BBC529AE3D7195FC119A4D6EEA1736B29AC641DCBF308289B0FEACD6165E891F6970A1B35C99ACCA363435EC782A7370E79F4295A758C2592A02C2C368925A1CC748AE8B75ECD80E8A0DA32947551A2A72601C716F872447A9C8D7C7E041D7E8AC464072E6386BC55EE1169CA0D3CD77E06317483D5A4E49FCB4C11718A1E0525559F124C172947461FB4222C1A2682D026DB6E82E469858998649178C6C7F7C56D5D982AF0B16FECE2E997941A9F2A3D237B0ABAC1429446AA1C1C697103EE5C1208E92D7F94AF8122C2C89A10E1FA7F128EBA3EC86DE866C7A36C1E8CF33B9D86A6019AF16904DA60FB2B54E7C0A530551600F93EC71259414D3E0979831FEA807934204E0CB220419F4CC79123D1860432CD74326E69C1E257DB5589512B3C6F6E359C31CC3A7A79FE62095EDAD2F0E622B57AAD44670015207A1EE919AA699165BDBC7B668583E5F6A29556EA0365A22351D39121B1121C437821B3C1F6915767566E3FEEF0F5AF05C623C7A8BF30FF90A31AFAEA34EFA8A8741DB7338876D02B92B4587690B9D4BC18A8A8B4BDEB6F26D4A25A0C47184A67F3FBEB39FC018228EEE2E5C0CD5B2BC59F0CD10637EA34835C10223287E8CDD2F503F31187871A8BE4B2D38F0BAAE64F0F10D197D463FFC567EE33D5AF7BD2A76010966F28972CCBF606FD0C71ECC328323D2B006B92130EDB8D0B77C32C702045F4DE032845A45E2181E1E378B58FE9D2C3AF7189359E829D27CC9CDA94B80B6B94B86E5339E8722A6CCDCC8051E1D552A1A95E69BFEE7AAB777B13C5D250D0F06F22815774F4ABA1E04FCB5F3BC9F234CE1D1CACE88BF5B08EED8441F8D42C18241C80EBFAB7FED630EDC307E8466179BD0AD4A74A15D42DDB4FF04B88E0F460486FC715F2FFB4803FA6F3561C7F4B519BC28FD141D8228CC381B85D06BAFA8B007B5BA3FE4F1FABC4A00DE633D21206F7414CFFB532DCC337F314E18039A82CFAAC06A6CBA34BB3AED9DD66C84772831F5173C8FA6545ABC4564A34F9494850C17BC12CD477314D310909BD1121C4EACB424FEAD114E9AC5783C652F62044E330629B0BB4F98A0DB9659DA8DBBF3AF261D467EF716AE5810E93E6B6D27BA76596C3457C3BC9066B0D56856E8A477E122640D7FEF13F257AE0760433FBC45CC862D094C5D629CFE9B8559A706E1EABF5FB49949C4F0072DA339D198FCC2EBDA3B7365C017CAF028F660794CF54BFDEECF96529FD81F318B6B9DD90CEFF72E046757F51EDA3E4186DD825AA4DE36F6A013E1E61F47F8F0FCAA1C669201BE8D16968FE160AB121784EDD2004F0B1549EF454895B22295BBF723A72A09A6DF962F3C30C911426A007A75607961845C627C94BBAB15832091A2B3C73AC29BFD19B9DC3275EA678464E8DC455BB5CDDD85CBE4B0746D79F3D8093F34F42EA330DF9F6C94CBEB7911B2DB94B15126AD5E07EFA9F809124FF1E244F33494B3B89EC6B212048CB1D6464B16362FD77C71A8E247013301BDF147FEF99BBF6ABEDE94FBE391E66053FB71404D67E60C6557B707979A7B7B633BE0166A22AE877CF0DA4A8228350701D40780031D6B5561F1A503E6F0596DBD29253D0CA1E0E3CD73EE53A3FE1B49C9D69AF6ABEA2118E7828B90409B71162B1885AAEACCBE8E64787E995E30A3EEA71F050159C70EA946EAD08714CDF3032BA4A46BD6A42431117F340D6AE50BE40D23802CFD9F8DCF91805F4B5C449608176D864C788C5E599DF065D393C655380AE4EA84980020C1719D1A7E69916EBA8D1E585347422BF8203145CEA863413AFA025E7B51DB925B2F7379F20AF22BC6596CD465480CEDAE39BF61AAF7E98F03D4DAC3A2206B528F665F0AD5808C06EAD8E0274C0E86289678F7ED6580D645EAB45FC42DC072DC183A9E1109348D3DCCC5A56ADD42F98AF1A9C5E7383552D99A323176509E7759A4368AB465B07523CC477F97359D1CCF2A5B4343A9CE0BEBAE476583B278416234E069E49E8D1DDF1D94E8410248DC28D18221CC9969DC23EC476A523154EA8456152E33855E205723F0EA91BD43D53A205C52654B9959DA33D895D5250026308481DE15118D3E1B5C0FDF97CA0CADDDD7F4981BCB885CEFFF4716626608634A1B771CEDA58F004950BB99888F4B39012DA17D33E0802B5122381E8CEA120924E4FA7B0806792758BFEC5656770665D187E3793E33B70308D850DBBF4AF74ADD41E3FED18C64AA496ADE0B5899600CA68842EB541F22DFC7FFC0363C9C606DF185B20FA1F5294A32BEBF5D38F19269818C9C98428D1797F497D9205438C2BB9EDECB9F3A5755FA263D3F42E408E9CF5C97993A738C52F3819A40267E53CF2402400630CFC677BCBE0E15DADD9B18BF98AE01E6C0A7F695FFA3F90AD2D77674687CBC3F55808F4DC339F23AB215BF3AC8A3E0CCC52B633943C3852DAB3406E410500BD7FBEAA188FD0EA67A43748E5535537C319D7B522886B2D3E413385A4389D45DCEA52A8179308B4F0F9D0F626E73FF8CCFF66D8D4EFD4F016F76689817828A2E9DFEC15E1E2A8930F32DE8B220A393D7150A674E2C8F0245771EE4A80F489D5F2CC09FF7D612A7DE56369A7A12C7E649FCCA2AB4DBE838BE079E10FCED9F6B212F839DB5F4CC634359A7BA4E75EE873B061CC6F1FC5AA6E816AB4385965E8AE4B5D962DD4CF83CE9DE270FD4A156B91D00EDCDFB1F140C786CCB67ACC127C78ADAAD4CE0942FECC64900DDF534ECF6810AF4C11AFBBF4E5337A2BC7605F35D90E05A5EF2E647B0077AFB3803BBDF9F6335281B405E6C24F4177F6AC92C018F0DB827021B09822E5E9C369C8D5888571351690E50925D9762194693F2629F400C168A14CABD430472E32CFA8B55827F049353ED9724095C4925536CDC893C6C54329F969323B6FC1A7599B9CE48717AC36A74F7F4EAFB2CE3F28B928E73367508C2261F93E22E858D92777F56D14FEF235E143DE177D719C8359CA9F2971C6FD71D8244B113831A7023127849A9190DE89758C7D91C5BB683E348CC6E7D036692FBA1F773B916F15C4EBD6F047958CA34E18107203C85ECCE2DFBFACEA4DA12A7DF23D29E73E4DC1B45CA7DDF66B631A73601FACD155412CC8D8315EF889F03FD0739CD3CDC561A30D50D8524D47718E1E3CE6F8B809ECD73854AD0790638FE6383D148338E22BFD0D8B56E9DF20175C699A19ED7D251CE83D5B3FAF93BF96751CFCE87A640379BB6C256E1F7ACCBBE2BA0C1FB5E6C95F5B5A05DC602752625C5566849D8E7AC5E7344145B810D73D9AE976C1D303D2CC6E0139803D321A2EE62006E2C0F3D43856A2923014CECBC97CA91CDEE6549B1A549BAB59366B0EC1C97B5E5F5947E58AF4967E4749F7E80C914251FCA0E7BF006CF402D65525075255440AC0A8B003756DBB44B87F5CEF1BEB14111D4EFD2AE53ED971848EFEFE5DCAFCB98CCB8FB977EF7E89453B4946755CE7B869A9F3FC37466826CEA668B3879240518100210AF80B1B3671DF66B050E4B7ED96618D1F9D2189C1C0B988CC0C3FFA188BB05AA764A903EA2F5408CCF04F5E62A2D647839BB490D9864509A29EE6351D347D8B306299F0053E7AA98AFD09C63AE4927DB59BC4B8A6B1AEF2438953FCD9F3DB68A1CF779FE631B1111D9E3E32A5130B8D59C7684692B5CD997832695974F30A24192A4B4847B3FA0DD2D271A549CEDB5EFC0716BEA35137957E4E53A5E1D40FAF780C0763D12FC2238C9512ACCF249657D4C41B50AE45BC734E49AD616641BC5FA994A05C55B917C964760D9F5558512B1771325E6D827DA19936DB9B5E50B58C78EA31FCEBC405367E76409A960E43EEAA0E6BE071903D2A66C2018F20CFA5D34D9623C864BB96120FA0BA1C538EBA90DCBAF12C9E924D1056550C72CC4AF714EF93011F057670A3E90C5C753EFF1E47EAF601A830BC08BF05E3D2712F3A56E45CEF83DCF6E156FCCF4037C84A6FB8CED062EDB90D87BC36AECA55075E4F1D12DC4AA1C6CD2F3F1B0D01D91302E9A52686DC0F664FC1612989B4C77EE78D16A053D0F291CDAF1F95B96D2A9886E78B9C6EB710854E42F103D75F80AC7E6893618A384FD45EDA0B9354CA1982E72231D241DBEE456F31FE5D4CD41605EEC0836E9C62C764DD5E1110403AC04D56234EB82C9E02C1814CAB8F9D94B20C60EA2BCB8A4442A5918D6AADCDE1B3AD1108C68A0E5724B336169D5E89EF1E6848934914EF9D5CD25D82E290C19110D864DF39B58A173249160839034E9135CC89E49586D7EC4E38F156BACF0A4883C7B051D18854649B0590E32991E84A007518FFEEA3A7D31E1A99B8AD2579AF05D2A37493A6FE5719DC65408E573523BB112ADAA3FFC76436FA19BB127D1D68E2ABEAC077FC6F2C64359F8A287F15C99D6F461CE16BDD9AABCFF324D6B95AC48106FB8B062F860FC54EA42CE418A27AF372F98E265FC630BCA6E05359EB296F0337FD00D1D594913CCD27D91501DAFD5E8FCE051BE3AC5477C284CD8825873367A9D54D11397F01B761DEB75EE38DD3491252F0EACCDEEA289FCC51E3899F7D84188E28C706C560CDC3A4710A254C0495DCB496170A02261DAA4C9ADE0F73252FE812315B7BA9D66602E2B2F85D0A6ECC59C93D46A346F9AE941DBE5F78DE16147536AAC226B8A66334946AE74C20AC35DF5983DD60BDEF83F395F0E684EF1C7DDED6D3BA4A64CE81A369040961F042ED3715AB4A10445AFDD12B3A1AB8B2127B1A4D2393945BC8F543637A0B06C88E208B4193F833AFD3B9801E8B864017F347CDC61C2936BEC580280F0A39A33AFA8B62CDF64787640843EA29014BE71056EB395D531525747CB2622B317AD29DC4B7337F67381DDD35FAF6906C1C910DBC16A6DB093974335F11799A1B41FBED4E74E8977A8E677FAA116C2829DD33D82EB984BC4790051494295C2F07EB641BC991751476B401097720FEF58824DBF6F52D3FF836A940078F912797DBB3C97429092741D9CC2314D4151E3FCA18F922EE0168D2B512C3C123691CF9E6A4B819D74C7F5D4B9EF202004B967F528636AD0834FB08331A598EEED091E54CEC37EB5F400C28AB002419FF6D5557358DD81D44C9601B743EE07C4A698DB3AC9AA5FE753767DAA91DAA3DDD7172B61F99DD62E87EA97A36AB9774CFD7EE00949ECB50BA930987509CDB4AAAE9493E69BFECD0C18FB98E94F601180AA1829EF21A1F3F999D0C380F2EFF819503FA89D08D4B1C4151CEF5492709EACB75A5BB706C76101AFA30752955DF86FF69AB81D4D37BA59F802C3960CF8747941523C9ABCFF82CEEE7D1C13A567B420AA76FDF162217DB6BD93D9F20E8527C9901F24C9E7A5761D4C97ACC05519E22797868FD219AD2C5EA9CC839AD85CF70279CA8FDE7C4819A56B5840A07347E43C3E8FACC8E9530A29CEC525C160720E161634A3C553BEAB2D79AEFFD2C79D952EEA7581E0C164B5E9AE56D8424B55518E764D68D3C877A3453B6C9C47B9CEF8982AC7549ACCBF6E9610414ECD1AC27A93898BCA4500D4CA0F6C1E6F3270786A9D6D33003F74750CED2B4F44F8CBC292953866020D257500FA3CC2C1DF0271B83E78C548A650597A8CC5902249D387C9577BEDE2E9E5981D269CB61712CDD83657AC8671A6F218555783EDE3ACBBBF5238F7BF5658565C5D4A42FD11CC27B5AD96012D9528D6B6CC4514B8CA1B74CCAEC43F7F29A39BEB40FEFF030233FA5D6AEBC69BDD55DFD7A569E33B52B946E5181F1F0CAD1D8B112D30C72175F458933A801F1EAF8C6104A0375EE9F625E08D34E9F1BD4CAED497E15864C9584E50485C2A2B02C686ED85C5209EAA48EF5C60798DC4A5C2400B281B5BD285E22CE761FDBB93BC7206C491AB9843D7769400804F2DAD9727D3A03CDACF3C8F97C792D2194E5D038E2D954409F3DA90CA9FC2DBAAF9AF8A590723A61CEB4C8988451F616FA9BDE709DE8EC1E48CA70E1995F452C2E5EB9940E5A0B785ACD8D1B02A030A2543DE700DE09D16D990DA620876A5B7066F2A8392B0C7D0C77A955010590514FEC227ADA7BF240A7FB165951BD09E497DD1917E72BEE995B374C5DC9CB2D70A6AED876D06CF534E0C99E78ADEE564917CA66B3F79AD26E1854FCE81E06E655464E4DFAABCAB8830F35AC551B14BB003D040A895BED438920DF8A6FC3FDC287EE3F5226165E247F25160098D51C5F30BD5B3DEB706AF259F5A792CA11D2B02AFB417DCECFE79041312CAAB4E7CDEC9A9A3D7CCACDDCA6A11CA92C6B820325E47FD7ABFC45AF5C791536335CFE0CF0072E5A2B9E231D8451E813330B7C770C509027C1E9C8ADEDDBD139DCD9532B38AC8885AB123FC7470B859B1CAF0CA636D07B33B2CE87AAD9E42720E3D0A897A6043EC1ACE3BA45DD70A6F4FC8FE039F3A58ED17ECD718420E139CE2E369B10D4C0AB82830F985D526587DDE355829B380FDDC8AFAC9C0F4379C50983CD1D5A897C953626A24F57E4BBD21832410DC838365F86CE11DC53FD49A8EB77EE64337A1FB5E08EC8B2AEF8CECD3BF7BFAF742C8274C19AFD913AB2FC2809E66789B7ABB47EBFE035D5B92063165AB2B104ADA29D922B621B7C61AAF3037079864B9340E3EA57EF4D6967C46E808BD9820574DC2EA8A6DB7E09640956C9A3979C88111362B0343BA9EDE1A7BBD9D57E3251393401A8473F08CE1D905C861C4F9BB951A61C9F030EE4A155121CC1D0E40B2B659807A04935565909BB74CC2384115A770244DF33D714AA97C929903B0331DE973F4C73C4719938A6671BBE32DBBB7668F6165A4CA433DC15D9EE0A6B7058A037CA6D6E7D34BE9C57C234936F7A3067E7441CCC4A678D48403E4A3035E800D6E26CAA592C8800E132873B0A5675A9075952CFA086BA501F675D2E25DB7D8939B99A7425C24DD37D898388BAD85A39CC1D6F151F0BE082BDF8EC6E1AA088285D039AD73442B660A4E95CE20B104D4EE329E28AE0CBFF16FF892785C145A64BFFBB33854A5D9C982D04C3438A8FBFDCFA93ED34DB2C9C3EB696508D816DF6D55EB8C5FFD53A8153A70CCFA648DFD870470286687392F44C387B6820287A2CCF33DB5AB5856AC71DB80598C952F7E3D48ABEFA609AAA961A8F1BFA4E9CFBAF3E54BB94604C75E68A27DA1ED3F50D2784FB2262C092E309C97CA996825BAB68C98B424684DA1F849F3A1CD2FC1C1EA74A3715F6D1D331F85A22480E9345721556744DDD5608A5FACD1811E523E5675E7D0CDECBCE8516E697237B12FCF7EC928FFE5E5DC31763D84AA4C4BE3B35363B9D53B1E7F1F79E8C5F58E1F3BC648423CCE70252DAD34F9F9AFAC2C186ED4B545DFBE7C1F3442C08D367B15513E2827CE5C5CAB171A84FA47D6AB60C309CB77B89D14724BD5C47CF6B9B8B49ABDFFF9757ECBE2CA79D1973B21AC1BAF82DC9C175EED130B3228D8913D0884703A7F0815ACDCB96A6BD935DB21D33AD05E39BFCAE0E95D1CB83E6D9AE6F8841CAE21B1F025363FFC34E68C6C2AB5BDA2F812B70D3E7D109424FB0A4C72F0EA438A6D149549FDECF3B562D4B4733B8C754071805B57270B5E987C89371CB50674D3F5390372B0A9A929FAE94ADEBAAD29926423B969564A6E9E14FCE5A53E7CE9114FEE63B9A41395C0C569962E9FCE2642FCB2F881E38DAFCAEEC8ED067AA1ED3D2C8CA47565CD5FD13B9A93AB635162CDD7AD04351D2CCCCDD4B789B3F1FB7319381C958B83A45B3FCC1F22F78634DA8F19EA3EDD84E9372988FF8BE74AA6A2FB553203A2F3EE2037A612DE7E29661FDB392104A68B31D461C77AD43D73A0680EFB6C75C773E19163B4E7B3FE8E490CF1FF1EBE08FD425A157958133F30C319E3E60A61C0B7F9F9E039AC066054D7F90FF717B996C88A3E9619B8C83994D43DAB5985FB236163302CE3ED8DA9721105238171B8935A8D32ADBD36F253BC90EEEB4257BAC6CB702FC52D861507C11A657169EC4303B98B246C630B6D5917482EF98B05417CDDC7EC691DE149E27220017BA4A530EA90C6D9C1FCCB16EC32BCBDAD4197DF67DB0E7DD886E7E0AB7AA06633C5C301B83B6AE8C7CD4647C49F1F81AEA2E51EE2C137C4E788A8648C1241EBE23B2178B94413937B2E43CCD1CD96CF76E7C4B7662F9D1892C3761EDAF5DEF39E79500838DF9A6014B5AFD437F71DFE0288F83A197E39676538723FA306ACA99D78A3DD3BF185D99A7FCECF45704C49215EA71FA3DA97794C4A26537D1B2ABD8542612494E18FAA606AD3FCBDE881AF2E4EEFFE6F7041AFDBD7A7C36316DD4758B4201464E795A40D8D3190421770813C36F8B089C6FCFB27ACCD9DE5223BBE50E43A7FA5CE575BDDBEC53A212992E0018358A5E8720C7FDC20A56A40AD61495449EB48B7346D5089D4548654835DC32F3AB4B1FF45DD5CD21A5C90FF156F2041BD70360642CBC5338DEEBA9AD8385B3ECDDA82D212FD23978DF06742D7461176D0908B26C606AB46BF7E8C16F899E92DE47803720C74201EF88C221E64C4E210CCE6FCB5C328CA985930277F16983B8117014FBE57A8FF5328E7AB62E6AA6AB04A31DE1A1F8AE430A9F9CA2D16CB6E05C37C784DBED2B65CA4C37085DB1A9F95BAF0295C30983DB37A8B23743DB86C98337173BDF28A68EC3051D53F268DC6A3B2EF57632826531E39DC595A822FE1C6778E99FC9F3CB8955960D17726760834CAF2E0C1B65EB35652001D0FCABBA3ED3B405424E70F17F0476ACBD5A960415BCCADB4F4454924852D331BBF40577B5EAA887A279E0FEC97C7EF7BA02E91BE181ECA8D229B82BEFBCFDE77B22E11B58CBCCDFAD6D0993EB6FA5D24247D9AED4E20F8C9755A075AE0C387E7783D755A9FAF2F243F833008428FD82D493A3709A244F184EBC3F8412B3B8DE67EE677AF9CAAB18FC3A93561588888AA0268C5D897CAB7D1954EFB398A25A7B3522E5B49C51DC7D1A44BD1040821806347E454683DE8ACD60FB89C3CE268F0DA6690C178F37C5A610A05094AF0F9997EFC85388FE95AC4842DA975BE7E303E79E8E23BE57972E0B72D422C231BF9CFDAF147EF1201948FFF16B4093117C179F729844AAD3398CA9D827A6F521917F183BE81B9075D03AF6782ED3E53D928F2F34975FDF4A3F8025DF3DB69DBB6E86213C4C9F997041CBAF8313DBE6B0441B98BC1EA7E45E09BEF44EA3A988B912B529D889E38D73A69D6295D2EE21375060A433A5ACFF4BB788FEAB5B804610C70338D71C98EFD981568D0091063248D150D3BD4BC0BFF51C6E853E36653CE13D4BEC9BF245C5A6DCE2087F23D184D5F658C1594C6E8AED68A1B1337AE3B2568816D45BFFF727D1FFE2A3AEE7B65B0F365179C4A31FF4F0E9E87DFAA0BF46C383A34ACDB4A168946F191E8F72EB6618E9CDAD414B736D9FBCDC67CACA6D18BCCEBDE65E5D81D42BF11BB5A914DCBFD905567CF470687C092A8CD4E03174BF84455D76DDCBF0E1D3D0F78038E6110E2C3746624D0C450F40B67051A5931920B272C468EF5CFDED9C3CA3BE078CDF50AF2CAFA3EB9000979F5B7223101BD4C7EBB180485CEFDBBF10E6A401433DF3DF4CF9B9B0C17B5B38F5072B9F9C147924E06B9D8056B12163D949F4982E1517BB0DD0DBA6993B72C54C2BBF38F14154995DAC9D1673FC1C2E555884833C7C721FA98551066C48F96BE0AB02FB1949A3BA7B408FBF5ACFAD9AE9309B1F1CF3D67C77AB23EA8AB825EA3867E6CB67606C4617C54DAA33C2DF922708F84D513CB0FA8C71C09A1DE503F5C50C271A4AE8BD02BC2CA5EA921D37708181F9F0F0FFAFCDB428B03AA8015E56E0A3AF4FBA16E8AA2B2AC36EBDD386FA71DDD463A44F51B3C80117949616E5E6A81118DD33295F885DDF4E74A51ACD996DE1431DB42802263664236482F03AC67CDE7274BCEA47ACE4F9AD5A764D35981D251BCB0B9D4007B0A0039E298AD513750C99EA0E4F774FFB281880C06BC13955FA71015E83FE0FE50CC31F0418190F994289BAB401DB2B81E0E5F4970ADF59C6B351B8D554F375FE0C2936DD2D2C4DA31395004D5FDF142D4DAFF2EA9DDC484C5FDA9B9DB8824F1AB233BFE7A5226C868A72F26106EC718334538DBC25A8B1C73614D6FF23752439FF2A83DA34331E25674E257FE069027D3940E5330B3F0579BA61F722BF6A8334DF0DBCAA42A0F02D774696D5A3991B29DE64535FCA13911C10E5DCE398D2F3AEDA6F0AC06505817E4B08B09C677A09F813A194F33E36C2C2702A5209554E42DE243B45F40F1D1B82712E930FFF6ECDF88A91D70C5F3DA6968AA7EC9150A811B5F7222A265371C50E3D3DA802B1D395C7EAA162042F7D7579532586EAD02138F43E3A565723D639B62A2939382E1F8861C2DC9549918B47A851D6515F88F1E949617DB6D6B7818FC9CEAFCCF69965E155FB5880C4B0DC600657B0A664E8E84AD19B5326B941ED76711BF45EA1B265BC1B504523E5AF8CE67785F185E3DD6163591A869F4235A2AF0BA8CE74475DD8110E8067FD8E03A2EA565CECCFB0D4B164607B1EDC36A64C41E9BEF3B3897588D40C6B3020C4CA9FD2AD00DC72782D6A16467FC74FC469D8D35829F6ACAE50FEA7E083BF4CA20000AB930956F622EB9F723A811F3D1EC35540C3BE38D07C7F20AFF7A4465F5A74372CE3B2E912956BAB54169729198A4E0A0C17B4AFC9BAC98B38A7053122F6F745D24D0AE6EDF3937C6D8EED1293BA9977D954BA515A5E3F009E31A54976802B06455BAE091D8ABBA186317C85B039DCA2589862C77F613747EE0A22688AF27AB7F3809350DFC7809D7454F74BF96F04B1BA939978F7807ACB6F7541C306BA0714035B7655EF64B58E5B5D809D5C207FDD7265803130A059C2EE17F5750C65FF61D4D4E1396B5CBA7AD59E1244F91E7C1C83CCABFB77EE300E12EAE57D4DBDDC8794464E87437F514576FCAB43E632F4BCBBAF82531033411314B3BA532026FB379E9D56AF2CF61986F5490196FC57600FF28DE9BD10B187D56BE43D07ABECAFC5F90E8144D48716F7AB1788AA577CFEF95726B67379E846EB7B749B82980D101AED181AA431B3CDEB0B77B8CDDA1B1177004ABE55533B1EE590087C65AAA5392968C632A1F6C7DD3FE7CFE3E9CB96A838912D27FF378EE811C68FAB217AD6A75305B93E77E8796671F2EB4B6092275593D1BEA1D62155050BAB189B1A84F7274F03BEEA0505FA5AB6ECA61310922748E5C18B3C9C05136189C1532D9C28CE2C6E34BC2D38F737DAC25E51111DD75277346D491BE23866D7BE1D5981F45A8560A5983CF41AFA9932D8B47BE616BAB680606A401C733B278AA3AEA3762F42056A536A9B289E74F78FFD4A47C1C13BDA8B4387B58C179536B5A375C491E3D63FF40B579C65CC64D5EC644C575CE38C2ADAAF0CA5BC0A638FE115D4C819458909BA42BF9579440FE43D42552B29387B3B4895E703D7043B663CE684160F869C1CE3AB779841F6DCCA777987EF7E42F5BD8B6F831319023A83B69E159A155BC7622A00C88EA5B8833D63E6971B3B7A46195851F894D52E3A12DADE1C869C788F1101F426DA4C4DAA7C939DD60794F6E68EC940EEA9D728B32206108986039CDC04D913DD992197E372E6C43AFF5BCF366D980FD076FC171A048906D6B0D3923D32013BF2AEBFEAA6FA526BBF28AC52E8453F03D6C23C58DF22664A81CFE0AFC88E33C3F4B45ED45625F829FC0B374CA1E8BA88C6BD9FE6DA5D59C6F71AD21E8B1EB06AC1C632B3DE847E0E85D1BF45071D8BB378D15B58F2B9C3AF9B401BFD22EAAD791B2C2527E043B85FF30451CADAA6F172E3DF909EE1AA1D8E200EBEBC45B93D59E5FBAFDB8181C27D9A507D498E34803DA4B2CCD3431CDE28F6E13D15FECDE5C64ED972D12C77220279531E0529C8AB1632F4F27E2E2EE07C1FF868EF0A41918C6B409B26DEB070FE409C2D899A7B37B5B5ABA6C1EC589331D21C608296106AE3C1822C8BCCA269F6AF23FF5542C2C77D8208A96004AEFB897DA94E3FD33A2A817EBB8AF97187EB68D0C8F1366F152708B5401644CB5547217F405A79921B2636E4B2E07DCBE473A24B488063100C6BF9F670267C968F2480804516DE2615E8F4984AB08EDCAC86408CF1853134A3B626DF73A24CE4FFBB22FE65E8FE4916F977B6DD4500AA3603D1F53B3DE63275730F833B3F32245DD6515BDFACA95BD73516FCDD06CF606AEDB1D473B711B8163FADDD55A26BBAE2761477D1A1C0DAD59FEEA3ADE81A7D737D3AC19C61EBFE948EFBB8372BE730238B8C945CB7320342D64D4ED7435AEE4B147523821ABACA34B10C949E742A2FF0596AAE6F7D4ADEF396C42C7DE177F51BEEB2AD11914A4FC1491BDB593698EB41F6857646E48E72AA3E8A85DEF664091DE87BFF96B202F540AC1866F26F674AC46E054A05E7307D6B70AF61DCCD225ABCD1CE14913FC4C6187DD9406ED156A5792D9A2018D0053389FA08B5F8A802BFD1AE499199EF25B9A1ACFFC225ACB116840CC9621E5F753402EA60FBD3DDC7CFE3462215EA1B95038E88B0035B88121A0AA5EEA49ED11389F2BAF3FAE5FF282A98560A3BB9CD7A5F1986FA9CCFAFF8477DA6F4217586BDE018893DA8CD97567E2EF9D7CE7984E855F65B13B43CC63CE1C1C9AA6CD622AFF9409F60413977DEEDFA06333EDBB4CCC01A52D9BF0366049BDD0202E87FE74044AF87B9CEDE7B99A03800AB1B4D64CBDDD9855D3FD88A4299D42795E185C210A099478C4D150599B359CD6C5C73E5E55800A40A62BB72852ADA68E0A9D2A8F94D0C82085A0485FF9E56CEE725C06695156619B145C8BB92395EEDE9F01BD344AE5A28DFD28E340B4A35716049356906283D27C1642255F06A2927CD1044F4131A7C17E2968B2598974E3179C2122665710F624CED0CC77F6D23B6D1A887BA20207E316DCACAFB37359459AEBEE85D3270B9F8F5D79B5D76BE840ED659830F701B6BD5BBB307045C0A38CFB077D6541D08E7DE716BEF3604B7F334F7EE2B2BBF92D6C4C8AB599BE2D6D4FE703FBE0A62264D65A67E52F3A428DA4E02AF04690A7004D1BB8AA9A26A3026FD1C8F3D67740851E96079A085C61347CACBF7E4489FBD5F44166E7F989A7280CF02FEE1682305BB4563C91B87A2CC41AF45880E2FA9416B39765EF26ABFA39B6D114A859BA367B8DDC47E5BD92223E0E4A8F09F3245E9890FCD091C0F447863BB7EA3722C6BE96C35220008EFA211BE100FB4DFBA478A8B866AD6E9E5FF493259067602FF8BD77F029149391B35AA7F40E0AB15BFC5EBA9BAB9BD2CCB935E4F34B6EB2A396CC45ED139B9F3ED95EAA31C2CB18AA0CE0EC2FED7745756449B14135FAF8CECEE33D738B61420C3099C6A901513C82743658F5A36B563FA94F144889D14076CD28B4813F1824BCB4B31F7AF129158291AAC3832FDB92530007EE30BBEBBFD7D925CD3613F1D600A512F5015F25F39BD9D017F32060B4F6B3E0EAED10D063AA134467BF60B7080EBC98988B6A6CEDE466C1153CEE732F470F57379CACCE0CC370A7D7602A608380C0963B77AA2F8DBF504E5BB9288C58DA97DE03E1AAFFDCF48EFB206F98CC214BB02ED1011D35A066A72BC3590135C331AC08E181E708BADAB45E58478427BEE43F2F8A981C05B56DB0F3BB1CCF8D32283774CDC0D60380B354F49CCBDCCCFF3747D5A2037BA8F9079E173FAEBF8633B58559F185141F28489D853DC19D33D0D98D83DE6A2316535DE73209B06F033F8204E5C1AA38A320AEACF01C93F0A3E3606CF6E86CE4728787668B6AE96278BF5227B30A08CB341B68F03A20C7E4B3456B6A486F1A09FBB072B8DC12C8F5D24EA86A779DFD48786B7F171D3493AE4E759BC15A5BFD036F3A3F8F1584BFAD7720A09FB338F8158046B7AFAD8BF558489578D0A5C8886062528C4E4B25BE44A0BAC8952651E8F6C4D875F7D8370A31BA7FEAAC95A49678A54415DB1871B3D307A58B58DA732BF72E1BA949D046526B68A1244B89C565F99C9869CF5C080A5E824E4DCFE59E202A93C4D1695FBAC2853FCA615328178E253A5061AF94936F30ED57D11AF58563841F2F307986B5D4DD48110367E0F233E3A159ED60C0E2D04E03EE5714B084D2D314B70E5E22B1288841F80413682AABDAF10448287492269D9664657B9E03E4F616FB9CAE987A64D70FF4179583BF6AD7A613DF86C5493508C1DBA96DB264134B0476AD94350730C32613EC22036A1B7B88FE7D726F28E98681AF21073FBEE7FE940A4BF90BD1142CCD2E5AEB29D37F8D3068424EA3D7BF7D544C9E9EA857C5E811EDE17473AEF887D9C52B89E2006DD8B203AAA408482D54B42B14E61660C5652089E4068994D675989581566839B64701DB2E3FD0E0A1F81969B995EA0923524D97D13DC9CE0CCCE20E0053C42772E130C110034E8E2D96C23E8886477373EC9DE2ABA557D584EB7ABA484CF79B8026C5998DD583DB5076342331F0DCC6DF8A4F5B94913BFEF131F0218F94B7E193E19B59EC62881176B63355932E523ED6BE075CC1E26E336C5EFCD0982707FE3065EC7B1BF549169422EC8F55504165A2EDAC8BB8B228A0E54A6563D8DF1BEFCC4A2A8E9CA48E9168BF4E9C536C48EE02027B48A404957B0A058D5BC98AF7DBF6A6E07A178D93F022FB135CFA11882A6DF1E70F0E6E8C5518B42004D2E84C24793B3902E23D6471E30B3EBC1D92D94A2B60FB864DCF2EC8F83C4C357653BDFF3161E3E84810887E34D1B7C2ADFDEA20D883866AE7C999E11E6661A0D4C6304AF01F6CE308C060D0C14C8C0E3F7836205B202197E12A26F8A30AE342AA8E324EE9A9B4F925BE12D3CF5BAE1B2EAD69ADC3063FE36F0AE07831C44E8E83DEE783FEEBED58D01BA25008A7683DD1B9332137BCBFF40947E2E9A4A1321A6CBAE2953D71CEA0676CCECE687C9DE7A6641C30B207B2D55BD11FF2F179C6570D313ABF565C97504BC147B0B82C6C1E3C43763901AC37D3EEB7FB12E08CAE7EEBBFE24E8B32060156D39236698C5B5BE533216A9C634D2FABA2C610A66E2CE7873B3D1F509291938F7B5C838BEB008AAB2C0807045EA689FCCF34F2C4ECCCBA777FD8904C8DE1B65023F6C00358D58B4DE0CF187E4D7011648F6F0C63855AA08D7F11FCF79156D1D7E9F5AF07E19A4F7245643F17507263445EC58AE3097E042BACC2279186590537FDDAC48082841E350B440FCF02768352477215E0C0307A24900C20CF3DC5C5F62870390375AF658038AFAEE78917F1E1BC7073AA35FB49A405B8C364FB47147C2BD4920F752C5C26F3F90010B92E95D8BDD8B68DF8D725D3D7643EB9B35D\nafter AESDecrypt = 789CED5D095813D7DA1E17DC15CBA222D6B475A1824A152D5AB94C7BABA5D6DAD40563DD52AB365A2A295A05DA9071A97AB128D705A96B7AB5960AD5A888A860464041A142AD229B10202215130950424292C97FCE996C8444C3D2F6FEFFF3F7729FC7943A993973CEB7BCDFFBBD5F9FEEBD3027CCE9EED66EBD72B6767302FFD715EACAB181EFBD33F31DAC4B170CEB02FE87E94AB0B7B16E5DBBC21FF04F77F0E3D0CBC1A17B77873E3D7BF6E8D5AF4FBF7E7DFBF4EDDB7F80D3C0FE035E18D0B7EFC041035F7076717575EDE73878C82097214E2EAE2EBA6B58DF5E5D17755DD4A5CB0B98EE3AC6001777E882FEC1F4FF74E90A2EDCA367AFDE7DFA82FF206920D6B54BB76E5DBB77835F057E1B017E8F757FC1C1E9E5096FF5709EB3BCE72B212E1337EFF94FAF11FF3C97E63AF78E7CA4CF27EBB6F4EE3368F010B7A1A3467BBC3AC673D2E4D77DA74C7DE3EDE933DE097877E67BF3E6072E602DFC68D18A95AB3EE5AC5EF3D9FA2F376C0C0D0BFF6AEB37DBB6EFF857E4CEBDFBF6C71C88FDEEE0A1E3277E38F963DC4FA7E2CF275E48BA987CE9F295F48CEB3732B36EDECAFEEDEEBDFCFB058545C515959287558FAA7F7F5C5357DFF047A3A249A96AD61563BDE0F3E09876DEF19DAFFEFFCF337E84371D4B0A148D4A997CB1E25C5DDE569EBB4420E5F67F4C2E578F8A55CCF886621F5CCEF5D2D45FCB5D573FB56AB7CFE66B5D53BB51C3A3D51FE8B03BB37558768F581D76F31E91714787AD11378F21556FFEA6C35443A3955FE1B2693A6C86AF0E7B75285B878D98A3C31C03B471C4EF3FEAB0AA6EB374D8C3CFF08ADF75D8855AAD8B58F3FD1A42B32B40F30F86E2A80E3B7E5887EDEFEFADC3F6FCA4C3769CA0EE927FCC23EA379FD461F59319F23F88E2506A2797FA701249BD73A25DF7C212EB30F97BCCE2E84A42364687F50DA006E19164C508EA0695A3EED9EC705AB8AF3A42785B87CD710ACE8B6194E5BE5E177544ABC3D8FF66240B654FEA4ACA93652B24821E4ADF2CBCB0CCFD2E3F4331CB5BFA6D6F0D3931BD8CA5AADA7CA4EAE1FA9C619C6E9B1CC27ADAF1505FEB30A9ABFA2BCD46E55DF542A57B9A68625D9E226F7BA37772C4991CF52BE98E3E39672FC5F8877DCF1A12F6AB3C634A5AF91EB6F08F39FF276F27A1A9594468AFF2C78409CA93A5472502B730DF795466DDE8C30AC6F965DA6363C065A8320FD5A8056FEFDF93E5197264F79B9355DDDAB3B9121AD58A3ECA9395C42EFC7CE8E6D45592714C35E7FAA1D81251C1D78AB0EF1BFC52D4FFDAF73032B087D3A461AFE64E0C1F59F0ABCB9C19E0C7B5418781E79C755D8739902B6B872973D2AE0814BE9193C467B57B9BA475CC2A55ACA20EBFE5797ED80FBBA7CE8B7AB8AE8BF026A33D27822D149F65DDF076D6ACD1EE4BED2FF176FB8C28F11F794F54AA481127DEE879B04AFC60BA60E47B3FBDB6E7FB8A7742F6DD1A2DDA74FC2F5ABD3FE968769299E083B33B837E5B7C4C87A581CB3E54FB8FD6610F7C74D8EC8D31F5A7E95FBAB06AE23403B3A8208E360D575064A097BC27D5275A877914D5F9521582E6A00BC298D5C278B23C96511F21E8473EF5D0613FA65CD152C7776ABAE8B02D2774D82D050F3CE2250E7548E655B5C8AB46A81C95A5117032BCD5913AECF199A724F1D3711223CAC15D824B38134FDDE025DE532D20E377AA58E8DB467BD0DFF6E505E1B5A1AF0AC5B5F012DF09F497F8EDA9285E6FAE63E8CB7C42D097899BF59EA6CBF19D5A0ADCC912E256A46622B811017574FC939A78AF2AB6D2130757B92E566F271EFFF61B89AD36D87D2ADEE0026CDD18FAA52850FF84911AFA098F8EF392F72003F1F2ED78C362FC696F1D96DCD87C8ABD0997CF2754FE799164533F1D7677E9495EC28C08F077BB5FD261FBA4CA553A2C04D74E2E2DA86DE4837F9BB69E7C041EEB0157877DEE557F067E95763EF8A2213AECF6E7E06B3C287141CD491756BD901D48A48DC7C18B73231E30C17B0BDDA0D6B26308F9925AD571A2C95D8795F4D124585F2DAF7A21D5176C92494C4A42A897B363BEA437830E4397BC4ED197FC20764363A06BBD50E3CAA0DE675672B519F81F8FD7B0374D6E3E056E7F820E3B54A4C3BE606A4961FE7BCF5F2FF082AE31E0A20B38F4A29FF94D1428AC397E99B993ED923A41BEF8DA214154EA2A70E91561DCD9F5D0CE8473EA35B7E68E54BDB2607DEC9E9E7D428E1CEB32B91C9EA4A26FD1499ACCD49FA409047D904E190FD2A7DEE820E5E3F43992DE309CA338E339FA8EA4CFD17C788E9AE3ED7D9FD0904B5DEB4A244C68C88109B9262EF177BF2702865C2CFBBA975FDEF87468438E2E592E09C98E928CD8D21F18F23724E85082971DA3058772EF6A702897F0C1A17C9FAC27E1A19C4DFB1507DE46E538E85732974D94FB2A7CB7FF21067EA549BD2C9DF0FEE5ECA548FF77E33853C3077E11E776ABDC992D6C54B18099CD056F029CBC10527B56987DA549876D23CFB2B2B8BBFCBBDFF55B552EEE467CAEE4CE6DE0DFFA5A2B5C0ECC6236B0BE636B248EEEBBE773DC860D0C4A68752F6087BA5A79C72A1D56192B7B22F7284FDEDD88F750E6401736F22E4F985444AC64E755A9F68C3CD570A3DBCBD9EFEED83E25D7F1A59D5504B44E89839175FA4C004C36D89F4FA2811D8C8CA5587F90D44C61A036165F9507B6E6B9D02C6E3FCD2A654E8540F9B6C83D2C48C62EBE222E917145B715DF7EB476B9F6F6CFE77F51FF089660FA94D27DDBBA47933ACCF2EA9ED4031D56773E5AF94FA2E2085159A9C3D2072B6A65B5AA6DDA689980A3F6D510E1C33FD561E7971009A5C99CDBBB72043144450103D84F676F8DF031A1D9C726A81C411223C3B130A59CB99DDF9FB7AACE57F3B2D889375921942D75960E66893F55CFB897FC21D57C7FCCF2885F1F4C07FBE948705A46D79EF13AECB93B8F15284F0611A5735D5CD6571C1450CA044E9F2DE3168D25CF7B9737F85D3A0663800F978F589FD34FD26DAF4344173638930B74185AA30B711ACF5A256B38385ADF44AB07ABE7C9C091565C14318F2A985E5ADEA914FFF982D02925B9137DE4F66C3946CB7771827A3104F9246027B329E0936E4D2232CEE0C0258D66ABD8D0258D8E566EC8822E697A8E0EF36A062E6964410CEF4B6DACBF07759B2814C8CF698007E955AD2810281CFF502F164EBB55AF11373A891E849FD34A39A16E695931AC274D287EEA0DF6B947983E7E82E1011D3F51609F93287E5A3975E64079965BDAC317D86F5A1E6951BC55632FCC672A5F8ED6DCCF536F21645A7E3C2B4F87B9905CF666DC2135F494D23773D954E4EEAB8C5F15398A79EC55B70173A7FB4DC8FC22BC3BCBABB565C02D7619F2B09F183CEC3CA387FD858D3C6C3C513FF92BE135B238BA62876C8C365987F5915C17CBF7E8B04F540C60D5DFBC9254CFABF5C90601338C9F3D4A735F6F888A6A3E6DC31313817A5F3CC79A2361E7CFE081E3EB10005C89B312DCD01779DA3716B1CAFB83BF41B4C174B77208C097E83D94B3DE43BDB1B4203F50937067063F9E48EB473CBA483C70D661DC278D73DBE2BEADF8321B0FEEDAC8D2384928666245AC16C4927F1484B2C97BB49BB2E226BD9A7FB26F47943BC2256126D24B52B086ED79C7AAADB31EBF3C3F34B01AB3C098C24AC411D4388FEAB542874D4EA4CA056A821D1F23EF2903AFD261B10EDB1EA49455727730E40928F5527B6BDE07F6EE65B5F7D1EA4537F066E17970A652F875B90FEA8E387A82FD574DE483D7912304F79AD0387727F8B61281022CF4767070BEF1A0BCB8CAB7C98AA1EA504D3ABF5421B81021A00EDF48E416691B522E4E05F73C0CDC4660A20E1BC7A46427287701F522B8D2100938CC4CCD58B6F29F3AECD12AEA3E48003925F85D1D2629B929C8295290DEDA15C14529BB4ADE02C70678A178E0856281550801AF730058CF78B09E0780D9DB78E7399F0BF2D967B3A4E0DFF45BAAC37A276B1688E5DF01E33D4BC1507DA3DD211573D4015ADF587EED85AF577079758D81BC2E6AF0156963F08A93FED3C20E57E29A710C65007E5104EC92539E324094FF50F5FAB9B7A864D9CC14FF05B55726A40C93786493159978E362BCFE9E0E7B5AAC9D2FF4D4FE443900A3FD1EAF779D6F46B48C345CC2193F1F9170AB3EF8B840BBE08F528117B76C48E9B190ADC0A84EC9A21238D42281B62440F39FF554C260CD58A17AB30EE3101C1D56CE3CFC2882D4EE12B1EA82554C253F543B07D75CD161EA9D220C7CD51B04F8A68D75BED70929D374B3495AF04D6B3FD9AA0DBE0EBE29B47448E9EE907D5581704B5A2E593FF07940810E8BDA0DDE690935C85BF332D1308E5809BC83365126F89D51D7509D572555B30F52A7933F2FC9945DB3D81835C2C2158A6AFDA628A15E15D09BC25173438436C509EABB19864DD10CC236B442E0B6276B7AEB6FFB5DE0A8F9FAFB8ECD6D38731CDC775649B46F68E9D492DD3E7BC00AE1D3A89F04D452427B8376C7C9B8E6F568CDCB781D7094E92F820D5550423E1AA7A8BDA03D2105C73A7DDC617E5EEDD1D27379D917E6D83467F6D91C70C3CF3FEE058D86DCC755D94DFF5D52FD774D2E66652769E7B3B249686927E07A4B7B12D8A83B201B6A9CC3F6D4DBAAEB94DE567D702046D98D1D2F90BFCD509D16347507617733D85A5623DDE746C856E272FB97C46602F42AF8EA8E242B76A58141CD3F19F2275BA6D37ACED501CB0DAC46DBB36A910EF89B2D73F9F708B06E6B98CA4538885AC07FDF9BA1F056B00BF15FC7ADE509A6C9F8DCE67FEDDBC8FB8952842447ADACAE6D46C1AFD455EE216182E0D72D2C0786FD23EFA50A93CA74589038ED5178C8C899F533DEF83EFD9DADDBDC3299230F55C1D012040E30B4AC1180D01204BF7FD9ED6A3669AF125CF66EB10319C418A6F44D1381D0475E06918E8F88950B9955AA0383EAC9BCB1FDAABD471C5B2899320CF3BA66072A24D6611F0B4B0A24C99982E2AC6B65FDEB6277131779BEA72252641BD9458306861F5BBAED3A4802BA5ECAC8DCB1DD2DD3B1FB4E2D21CC2695E343357770F52E1D26DBC60FBC632338A921BBEAB0CF70E0D813D90AB1C62BDA99489FAA4D7A088C6AD7FB4F72EB797920CA65260FFF5C10EA569AFBC5841AB25300CF3175B320CA5B170732D0ADBC553026EF5FB38C552C25CF8F7DA9C1EFF2DCF9AACACD209D7B3BA39FA4E79619610E6D89AEAC9F066009EC397BE0F41BA018AB96CC863D82D162679B52F0C89E7FCCB1C7D21D17C5D3888B8247232E879E3E696A26C1AD965F16370037F0142CFD4557156B86AB4D5B4B1B68EBBF2EB00795B20A9BB437C6A67FD77EDB6F7D45684CC4F26C14D436C1B8F77DA63EEE7D1CCA0E64D50BAD06A9768350335C61E4DEC6A4A05D788EB8D61EB4A51D39559B611F08F51230F71B4A40181A59C0A2BAD127690BC806063B54012D609FADBDDD8F2DE40C19F66FAF7AFB3C223BD0322FBECA522C4159F00DF18BA93E75B112EFED44C500E5DA0A6112F1D913829B2452FB168F5B95B4A3E9F5F3393E4F0F558E540D946CFCC0C5C91F9AF78E278F3C1D866C98B37C71D657B40D93729DD688900DF3AEAED7DCDC0B6DD8BFAB46BE9D318CD3F3DF33D6912D9753189FB05F79B26E5606C321B5F729654EE62201029FBC64A124E7004894635E61EE1D65829E967569FD52552C185BEEDA4FA403CBD20FE40E83075303C964824BFCE22D253E57E345A4447DB3C157BB57A25D264BF1FF3C78890698A8019720A27D90A82220A07D48ADC3C05AFE440DE1DF1077E5F9C88324DE912458CB7D682D7F177C7C05AEE5F893577634DD3F37ABEFD3ED951EAA61928D03860CFC07CB724FE44378CCE2FA55FE63F869EC17457DC39CE7D5C546A5F6D7EEAAB8EA9BAD5E5AABB80A2B7A9ED30523E7251E49FDD79479510FE5BD85D89F022AD80F37E29AB9DAABFCEE9A41756571E562B7B06AB5FBF543DC18458AB7F45B95869C38B22556B244D8EA282580A8D212D9999CCD9BABDD229AC61B241F1D27F1760B7357BB677C052F2B967D0D8B51F35B428DCBBA2C4B907B2B962805EAF788B52092BF24CFD38C240A450125E050C8600CF24B3D59907D38B16A66D3FA5DA99211FEAD5F2D0AA1D2C5CE8667592330C08711C7C7E81FE5A0D91EB5118A17180A94153BA405A602E530AA982E50E6171C7DA845054A6759D66146596668C8916111F0A0FD1D66C80A06F8B0272C9065308612303443F531584044F5B17A6097360E82F5B18428BFE0A9738EACFCE22DB0076B0CC1B50D67479B6B3B438A8E04061DC6753A1838D909A4B425B5B3279E08B291A5185F8B29FD5176539C8021BB31DB8731FB6E626D442C354A208F8ED0A7FBDC6210AF9F167FB962E3D44C660C911145D45C24AAC032945EF8DB3F2435B2A413D4FD888CC1443A38ECAEC99AD1B87CAF7607B51C5FAEF62DA2C00E9F5D254E910D2F2C11FB4504B231909E8013A95CC3DC5D365A198DCEE40B7932E1791D763D917AA13629DC7FF6CF1F12A7D57381D34A791A159C35E556BD501912AD5D90A749C2D517C1A2B7FFADC2BD63893EF50746DAF1551D161582E02FD702CD684103B07E41C46711D152E231F097B2876F3DE2AA3D62A9731B6B4B734B7F00271D6CE07CB08173C0C94F590D4CC078221F58836D31E0BB7069AD5487697A37F0F280573E979C4D8D138FB1F85ED635461223CBB80CDA481A0B2F222A3F5290863528042632587DC2FD5CEE445E3C38B1152A71238889EB9F80B8D8B35E581C4DF5015FD07F8CDCE3BA78005EC142199082AD3C088CEEDB0AA1C7AD2B3B8946F6AAD945F517B515BB8AAA87E0989DF9F97F35DE65E7D12C77040BD47B265CA0BA92EBE2177458057851FA253A40A4FF03AE50D24EC746F233B042C91177761556BBF9075AC28D3527C359B200B93735745E393352340CB934FD3A6BF7C99631F76D70D16135C93F4A558BF9F24C69431463136E8E1EFE977DD0CEB746606AFF99BAC0CA67CB674503CFB19DDDE40C3D47295F87B1AAD89AC1D3A8D5026D2608D2D249CFDF8FDB0DB9B95AA954B6019832A4C1963FFAEA981E33A0AB63C0DB7CB35E1D84AA63BF0F4A5E16BA0F55C7CC7003B915664D3BF82E30124C164206CA20EDBED4F512EF1E35048C6820A7479C78038F7DC42E0129DCC8F89BEBF64EA9FAC067CFCD1EE44B84258B854040367A820B7110C75E08F34B54DFF396327E1F84CA7BA4AF76FACC14FFF9C4D7534A3227AE6FD2BACC591277C37B9B6888F26EF96C669A68E25D1CE230E1ECA0F3EAE967C38F2D39E5C9AB9B684261E48ECA0D59300EA14B7771B07417AFE90B929621FCDB4409213FE3A72FDDED5180AC539D209C76ABC14FD8582F7A107E3EE2012774EAB5ACF8022BD5136B34846581757741ACB81CC48A9F10E959FA509128C4EF3E3D0D22C59C06E2DE7BC00C063425EE4A5DE1818EE7251899C14811066687207AC51FA45C61244BBD6F04AF228E7F64E04A7DBA3E764FDED890230330D772B01BE8C4A9929016181327E076C351DE9474A5215580F22618137A946686AE3FD2EF2B61EB6D50ABC38AD6A37B5FADE92DCFCB64478960B535AB9219C9CFD7269CD68A6AB26438E7CA81FB8C07C5392E632EBA87ED7BF8D6D1CB533F99D9C86EBDC4E0C4B4991B248C2797472B8B0234A3C5F23BE2BA10A2A2AFDA51E1A849A7B214791722E2283F5EB40F51344E87DD0F2E49ACCA7C94070EEB93681095C24A6E23535FC90551290AF74F190AB9202885092B084A474330C6621F2E4B508FA751C6B58CDD656ECAC975B16001BFD3BC5EE75D4C267DC93CBBA8501B27559C2F7D5BFD64E1F183AFDFE63A6B76FB24F7F47C17073BB8E5E54581DACB3A4CB208C4E9DF80DF4DD16137805BF8E6AE4C5C226E7051730AA93C0557493568AE0A822E01BB92BC51871D9EC66278D215F43693A020E148D90D384EF51C0D537B083C1B709B97EA7C35230425EC628171039C0F673FA98CB8D4B0527D29F7E9FACDD19B3A81C92524B45B4808B4C268BE5B184A078BE4652715B59015B1F02D10CE0F768ACB73E923711C3A7C0867889F9357232582A0EE690A2DF7A7A432500C8EDF6CFAF829E24046F5EBB8E0D45A0FE93156B35210EC57E4FFD427E548F98A72C776D1E4F46553175BC553924004AE4F089AC01537EB4AB3DD41BE4DD4CC06C5C91A8E098129362986FE6602AEF737274B4158997DB555E9012439315F352750BD43607823CFA12A89E6A014A1B80622095BAA89DBE02F5F125385ACAAA5B05E63DDEDB409A034AE9D0DCA95ED32128D6176760D7EBEF502B8DEE35BE1D725582D2A3DE3895A91C8CC297122427992666F48AE324DE40D2F08FF0F6E50F157CE047EE74DE0F05EAED8EDB3F5E62B97D9ADF3DFF2FE88EC84D026121E1A23DC04B94ED2FABC2AD581C12F78DC7232836140A2DFFA42D08141A4E837017260FAB20872607D13D81EB9D081D58D96AAE6463C9070A7DCCCB3E6C020DEDAD6AC5F18A81C0C4CCD6BDA93F845606C96841DA69C70297B040C38062F00FEFA1134342000FD417D39B32C648F205028A0C6F0CBC8AEFCBE61B5F3E4DCA8D4F5DA5D95B321EC14AB98A1A1D8079DDE13F87D3871D80FFF0A5B11555EDFEB4C6B2CAB31900742EBAF34E3EAF04C41D1B42CFFFEF2E083DAC4CAD9B3A4F84AE0F43F0C3FB6549B2A6CC8CE3603347BB6467E9A401AE3B40F41399341D40BECEDB6E80A010CD0C9F3541A2508DA501D8E074117AD0E7994D574EEE8034E4F0651D039A897DD4C93FAD638D673DF4A0C114C40BFF9322ECFC569BF19AA68A2FD66A2F63085A742BF391ECF7F5A92F828B32A0F241C2DC968E025F1C0F2A6715FACE1F7AF3B70D0F88E8A5F11E434BC32735E75E441B3076C8D03B7E647DD698582E12D0967019D41D49A0CC296B32CC84A8411533917952711BDBCD488E8A5578E54BD72F448D5C3B7D28F703C36CDE69305D718F240B2683D4DF4EF9342B9666D2710D1FF9E9A688E4044FF7D3066F23461CD1095E904586F4CDDACCAD8EDFE7A103609876D152256712D3F6FAC1E837D2F775DFD4B151FF8ECBB369A6EAA682BCA466AC6294F5644EB5990A5209CCFF82AF6308CCC73F424483388EDCC19E057C0C928F442B7C5BFEFDFC3785F64B07A696D5115D80163C7B744C1D94210E1FCCD7BF05915C2B6509BDA54917C4621CD2E0AB2B06AD94E2FBB41BB761236ACD299ED2D623E1771B51FF1E4C7DB0BC1650FC66BCE11E9E0C85D6228421504D55D25E28070B0B0A48A1854BBDF82CD03B110499C66525C16D79917405DA7D35E29593756CD2E4E158CBEFF2A7E5F6A8E82C0E7D6D4361F27541B745893EB5742E9653DD96CBF525621A0C966C3A862354B4F3663ED7B589C03C966663808F9FB7188EE805869BF40FE9BE0C5D4D9750C6A50340AB581098BE46846883FABE71D5EF8BD0E5BACF8C10CE361CB258CE6D302D56744D35A7E3C2B06641B2FE21587A8EECAC395B8C203E68824BA423195531D5E30E72D2A790548D6529E1E9165B9DD04F13D0398C9F9E0458E27A94A74D04A04947B003550A03C4E540C008F1F2413370C528716F3EF2888E6E5836E939CA6DCA785D5558BACF6005081BF5BD9F39D816566939FE1BB05F2DB44571E581DB5338A0ED00564C4AA86D4273FC1B539A790DC2E6DFA60A324EA21AF4B6B04F3999F618FD6F96A04356EF67733418DC5A4016ABC77B605D418B100A57CE6586323BB68BD1E6BAC2BC9C04D58A3D08435261DB0C01A893B33FE2BB877D6FF8CC8DB5DC173C24DC5A9C85288D1A6FA0C6C2A41913FDC5473F3A884AFC1A64AAE1D26CB73BBD6B808E60D96B8EF333F0721121D64568E47243A2FAEF27DA262941AE4E7FC0C0537517B823A9C438616FFE35CB228AC39BE53CECA73BB75ECB568D61A3F6C246A565397496D48D4EC6FDF01DEC03641A2D58F8DCE22C44C427898BE2D8F06C4103169F5014357DE41138D874FFE89B0854887A1C686ED8C8BD1D70486BE86F7F92395B1745FC3D39FF977155F9F427D0DE7FE79787972A4FF74B7927D07460A0251F807C25C18FE813077364CF7DA058BD40B770B9218C02F14CF0336C8D0C5D90082FCCD41410F5565ECC3D4F191A5024FFCEA91B512B7A9F5F1363263B06DBA291AB557F9D37883B43FF3D6978B7B28AB51BDB8907F6B9576CF723CF6D1C2C5C06BF99DF53992BA3B1C64305F6042ECB9C809ECFD40B8E7C568D8FB31549953090E13DF3D0CAD9147E1B8CFE11A7D14FC1F6DE3CF73DE3FFC69722415E056B235662403F67EB4E4D619BA24B6330C30B09B190CFCB889658081856630B083D5108197D00A8FC45B7E1B8AD93F31C4ECC02AEC0DCAE73B00DBD30FFF9404A6CCF8E537611C0DEBD1AA63AC6615DB04E5E40775CE924254DE7689BC683DA491E84BE4FAD01E96C823F28D3DBC9E2D7A785B3D382C66024B4D135B66CB83CA0B1019636D05F487AB560B3EA6992D9F5C39DC5430671664B6B0540F241B7BB8607E09ADC878F9F5A7AD1B1BE8FF1C16A3EFB94DC0200466D4D0E9CA98C03F7DBFA834BC8C590473797F13187DCD723715D4C2E03D929A44DD2AA38377D85AC346C17BE5D65FEA6B9FC2E07DFE90777FFDE2C4945B0FF7B1DF9CC3C6A932D22595295FACF8A02E2F2AD51D359FED9BAD762CF2E6E7B9804C84E03A6BF626BC9CFDAE24664A6EC04B43359B5BBD02C42CE8FE03BAFBDF04F20B44C50A258D0748C9B3C4F78B8A55FEA1C51A71E30BA3A5AA395AA9843BE4569EB851D545FD15F8F2174530D7982AE76EE5AD47441498CB5337CFC264635C15716CA15BEEB200BF73995F4CC1589BECE13292541A3B5998C5DD8527456F4E7597780FD361B0FD0B44457A3A634ADFC879D53B1D4276EC72ECE71335BCB76B33B880A9A4622D8D6877AB218CF31153AC833DA2AD302C9BD858DB88929D4A67B4E61A3B46C2B406749AB9C236F7A018787B1DE11CB689DD6D155AB6FBFBDBDFE16ABDAAB8D3AB498D1674B407BDA05FA608E313542C6BBBD32A67F979AD589D81CFD9D37307B138D120A5C0D087F9BE118A93BDC0A4DB30AFFFB263CC2BC38748A6F86DF18AF9FB5899F98D81EB042EA231612BCA93374F86B4F979A8925765007AF7FE30B37EFACFD5DEAF0C70914CF5EB1A74CDF226FEEB9A3A5122D566082F2250DD8FC84C027FF575903AECD661DF821CBC775C21719678344691774E7B4286D749AA555FFB1770A9C46010B38CDF78D13FDE72BDF96FF2A1C79A5017071549688F85CC3BF2586387736297438F157F29235312E39619D07DA8BC0F389BD5E0AC14547069E708BDCD9779C839422193E257A073940167B30038C707F51953AE3DDCCCFE376E814B792A1FABC7F35075ED1C0E5C1C0739685CCA78AC8025F62A1559332AE252C30A7561EE539FADD19EC81FD39454C507725F232715A2697ACC9B0869592B106DEA38E9970EE157318C113CD8F4DF78A308BEAF9A51E28F22F87A3F10FAAC84217C4A70DE61F758DC13A502E6A78E6493309DF03076A9DEC5CFA5CEFC518BD2899D862655335833A20B48833AA9AE914D26E39ACF4F406483C3505E22E5DBB429EAAFA9E5C40A35A78802F7CE280B38484A6319354D6B8B1A56ACABAE62B7361208229005C83314E395CE1582AD6C3768B07B855E17F48F4850B3A6AB1DF29B8A4477368CBB878B92762E647FE9FB027EB3DAFDEC17D736D790CF3BD648E403D581EE82F5A94E13F5872A289193218911D60340BE4526C750E11F9B6F291BD9E326CBADF65FD7138E6BE62A1757125BCAA6DDD3B84BC6F91829B8176680387DFADEB83C67B3D2CD73150F6CB96EFAAF74A8590BC2B356683AA435AF8BEAAE9601100813ACC262561BC33A2619D1DE165B489293C4697CD8D70406DC335A3D98C63D8B78B56FD440DC1398A2D088BB472F49A6323022A381AC01DBA90A1CB607F39FFDA91F91918D4B4690D04C6F43265A93C32EC28B052BD48CE69E1A9E4A1E7E98BAF58848589AA268480E69C1C202C108D8BAFE34ACB5519E6784B5F28DB0D6DA552D612D588C7B3EAE65FBCFA66ECB65810896034970C549FFEECAC31559300D36826ACA77F9F90F55BE73985482F4548AFF0271EA84143F49CFF23E6D62EE56B111C1F15372B3BF9EE0080BAE34C1F1BCAA6CC33D487054873C7AAA8E9B1692B9CE1F6B095983B7B91FD8EBFC17C1DA0681A83D4FC690396A7AD4A782442939E536F52239A1AD8DC33493AFEE2EE526844CBE113AEC13223D40FB2DA4034608A5A2D0A31B5C184F3682C43145F438F741C81148FA30874161D702F419152071039B7DA70735B056F98EA854874DE02647C4C9181CB0F35EF8BC4441F09ECA76F30351113C5EBB1D0F26949FD42A67939591901F4439B1CFEAB05F164BF14FD57831FEF89B94A6881325EE5F5747C7932DBE0F7FC627586A6F4E500C41F7F32DDA83E07E9C19CA99FC0C783F67B587A53A0C04173F3AD5962AA23F5F5B7B0C85081DAE0A98C046461BFF0CB25F1016F4450DEBCEB0865042A076156D02359A5809DBD597CEC29B4FD7260F0F16A7AE4FF6E374CB5FFD171251A395CBA395E1019A95A1904D7586AC98A4C30E06A93DD4F3A4C40A1DF6A60E8B16F83BFA10457E798D41C9FCB28D4F3DCCF1E4F8FDED125F60D99FCFC06B5B814FDBC2416FDDA96715B96D419B34540DADF163AC164B5AF03F1C78C0EF4BAE3269911AE8F6619F5071933CFCD892994EBC3D1F9834B72EDB478A83DD47B4A81ACD66D46BAA7919BA4A119DF1CD33AFD5FDA7627BC8D6B45752BB5A4FE6AAAC7C1D2C349DAFA683FF48D144CD50799E3EF8674B4F73654D74F0BF2091FFA8E62318FCBF27786358F0CD0C2CA015C44422245F0FA942207F2C780FD0DA6863158E7FF45DCCF6C8555B80AA6A0AD1702D6FEACEF320467DBBCD72C8D130F4DB8C10942C43FD364FCFA4D67AA07E1B606B6F35851C7D50DD6D784207BB3D5EC2B96CD8D99BC62DCE82C92B7737712ED5F747ED0EE901F00E9C55FC55DB40F69AD36D6ACECDEA0353727B627DE476F1D1609D4971422950AFD6009F98268C12417A6B56453222541E8FD8721F122A930ED430C48B6EB8DCBA181426781872F4D2D4B96FA975D8F3888CD1AD5F37ECAE9127D321386CFBBBC24121380C4C654E79FABE672F7354F5F8551027F5512EAE8836A06620C4836C811251C12A45E4C77ACC2C322673F824BFD7725F0B1BC902E6BA1506BCDA12B867B464652239C90A2E4D2FA09330A39A64F12803E2B78033357C587D96DBB5F22ECBBAC078B96DCCCED60BF2DCAD6605CDAE17FEA5D2917465BF1D2285B01647BD3E0769864C0AD52C612BFF496568B7EAB0D7C873DA4419630DB0EF8C11BF8815B388C6C317A5AA90CB898DACD68F2BA60669C6C9B3D2B85DD71C43A80D44626F1B5ECBA8707675CC41130ECB325952C82698E16A1D8BB4A79FA1CD82091DE2EFDB2C205AD7DA794633B4CD8664ABC48EFD6D06976D503DEC6C4B7862C533FC64331BB38115BE7A9C4EE3FE2C2143FBE36EFBCABBC7DB41A8B1B51D109BEC86773F549BA295358D64B2C41C589A5AD292A145B25B25DEC8819D403D00C87FD5F91AFB457F1D7F5ADF2F7ADDBC5FF4AF6FB536D69D2085D4507782951BBAEEB47491CA3FB4C882437ACDFA716F1761B1ED3452A448DC076A55E8F1BF722E14AB80401EEC5F36E07FB92052BA54F54EC89EB41EA9DD5AB30551C79C05F80BB36AF4BE5643B19F34E1D665A30D7D0F39DA18E0A6E9BE879D355CF1D219B0EF015845E0A6DD3EE9A26CFD0D7680D8CF2546C24DDF62B9CE245470A1FAA084B9FB8F3C24A08B0458C48676FE103F109E74FD3EFD9DEA036E993D47F669EEAA2F5CC33EE735B0CA2AF1EEA174479EBDD0A88658B818B6E8249A77DB5AD143B46EA450110F36934FA28047AF8BDDCAEBAF4DACB80A01FFAB54C1D9ADBFD44BC755127B3FCACF1CEE3BECA7DC89535E2AD864B9322491D0FED647DA99B58D3DAA8F62CF5783E72E12D2516C3FBAFD0D85B148B60F85B1AC92E8D7F1AB514F2553A6A829141F167AD1CA2F59FE13E5DCCD242258EC90C692C50AA4FC92CAAC9FF58619F4ECD81A95842A4F868E2754AB37363CC15A3D6C781A8C4AF5B0E109766C115FBB95667E11027192D67DEDE0E5228A2788DA76F38C1C4FF86E15E1286A03A1644CA0D9E2B39E23FE74614EC7E4ED6CD15BACF94490F6D9A4DE109E8DD6E5EF5C350905D65D7B87044AF46C472F15CB1E055C54CF5D1E5D22A086A450CE5CC8BE0361C037B152BC6190DAB14894A7886E5E3E5E2B5EADC82C534980A7ECC4843C064250D748447C1BAD0C819D5EFA1E5B8E8289886F606BC49701BFB2569DE19E98FB1AF4712D095C4669BCF106693C44E00A3510B80466042ED5029AC9539E40203A9F8F5C42B9869A58659A913824F49DE2E8B04005382FBEDCB2A925C77C20826EC6B4E40716C4EB996990334733D320094CCF4C838CB9F37954C257202A4EAEED179C37250DE63EE6A27C68C541B04BAFF869D2B8E2BD0D2BCE35AD78FCABB62855747D8486AEFE4918A1AB64428F5C8150CE0CBA8A215AC053489A43F998EE4ECEC05F4095209A2F3ACBBF00F5261F706C4C7136F5B5C717D8A8E21AA4E126841AA4E1C0B3F6F646D2708CC4080192865BAA16DD91EDBADA9095DD623519CFF86002A668766BF71F6829C50AC1BF406A72015160E0EDE215C39194624ECF6671921938483E41BBA3DAB83B5E151876C70D917E777C37CBB83B582D38A9279EF109CAE7DA17057602BF12EF04A267012C42C9F26849C65E4CCD1C5C2FC958ABFA36024932E2DAD78C928C20FA3141D10136FF6C3AC97AB87A8C91000C9FD2A42E081ED3C00106B1D8F0E0DA2BEB9387714694F741F0E8761CA2B5101D2DA1D1DA0C90F109105A0BC1D13A235A1B6F79F6213A5ACED6F8B0213A3A852A31D60E7CD41EB076701FA4ADF9DC884B0D1BB592A397255386073E87606FBD75CD6A11C6169D830A7CD27ECA4BA00D87607F11C87E49285B46A50DD25E766A6D18382E9D20BAB789EE8D4917F74331607FD4A08204BB4B61016F160C0197BC27F07BDF042EA26CA633E8855F830323A63135842CE821351569E0784168E1400F531B737E6BA627D809A87A0FA96D7DF9B7CA6098B90147957418F4175582CB78CB409419B872EACC61EBE2DC6E3EEC06ABF79DDC52DC19E0150CE0E1CB2C4F06013C124E478D42E2F3CBE0CB84FAE17E20809C6662DB81089E96386B89AB6D60F7253E16A24EB41FC372D2443D10FDE591766F937A19EA44833177D180B901C34E65AE9B8A15FCEA5AC57E1191712FC4293CF4E16E80F6DB6AED56AD7F4DC1AD8654186D9E32B5D757593EFC2610ADA2D6F2A55075A287A83F48D506D66E2F1BAAF6562C8854F45D5C9B1871FCBED7293262834BA2FFE333A388A3B9BE1F2F7FB31BB0CB16DDB8201AEBE8A2D83A6F9D224710C8CF60C072F96CB2E204A92F9733A40CBA5CBE5ACDD484A950B97CB10EFBB9349993B3EBB6209E7C1EA0D80A1A8D08B411ADEA61038111F7A6BBB811EE4D774523DCC01CF76EDF7893799648EA6418594A2FD37C894A6E14D923D5C7C09788557B2D5647D07C09D79FC597AF1C807C09A7B8DC1DEEE75FBBF682353D896CD11B06D14E29D3A4E99067C041C32D243BB37F8206BACA7F0C6F9C3C2B53D0F533BAFB0BA693A8FB6B14C826AB66B644A13711FF2B08ECD01F1A0A4FB6929E4E16F536A9FCDA2084765C90A4CD2AC1FABA9BDD70A59E4262BB39C2EE56781B9D70D673CCBF8EEAF1A780A8F6E7C156057256B7D0F2B2B9FAA9099238C4AD0A8215F66DD1955C18A2A7824883F87EE9D2F03266EC231DF653A442723BBA76C5B44BB903683A7C0B0E15884BFAF2C784AD9030374FCA43A388A06EC423830ADCBA5466FD7BF166633AC0BDD085AA9315D15BC4B05085546A60D34089615A4A4E5FA852F351EEB2E9C3C664AE0BEB5EF0C41A7002731C54360171BD4F345D3629D55ED5974D40EE050C7C742DAA9B44377E7D51AA3A77793D78D1965053102D960241C3C1BCDEA6DADEB44AE676115DDBAB514BC5ABAFD0B5BDB1DE57DCFF2578B87E57E1948FDF6CB4A20B000E46ABAF406D3D10768265C96B6513EB623793A82C99022BCE0A5496BC0E42C06953736E6EDD362597891DD21288AC0881550359F1B081AC48A34B90ACF88A3959B13368965EF1CAC5F264B01B86F2405882EA8EB032EE2B3DC05EBDD3D12727D28261F9A6251208F794F4721D6ED85374533EDA5371C5A5863D1563B6A7E2114BB1A4A09C99C62D9AA6976336D214911EC32AEDF59633599A9FDF4CDD2EE5549350356C8231EA54234913A8533D1ED6AC914EB520D8AF9052F8A444954B6AADB11FA18A1A5A873B700482DE0FF78ECEE03A69693F7C3ABA989F1744FBE131FB3EBF5F1F97BB75DABA893F38A3B8ED4F6894BF63AB52026DA2C5E2A526A08E9921FC62BC2BCFD0313341B9AF92ADEF98B9724ECD2C7A7A1C75CCCCE8B3767B194BF58013DC63E1267E6BE0D9D05B420F58A17B4B68E22DEC2DA17745B1C58415716303F0FBDEF4AE404DE4FA4DA1620781B483D47791EFECF1F6FE3D8EFD428E0C7FCB35BB15C9D9D68015030322C3D1001DD312DD340122C1801C7B9821C73AAC732634815C10754C7547F3DEF41D5350A28BEE9822E0C0B712D431E5D96F6470F8F2231FAF7B5378B345E3034238ED62FB7746470470D056027517FBA5D56CCC2EB3D593DE96261B5B6AFC9613D0EC5F304437D6B87211116F3B7F18917E868E7865EC3A705CBED981B8786375588D08B25664EAAC69EB33BFF8474B040DC46010AD2A6723FE5A3F0D8DD080341B5E44ED81F86B1F4184C61CA9029BF76F95AEB4FA9E51CB017D61D4A16DBC701261BC2EECD136BF2EF08966D7F5B40B15FA724E4BFE1E64431A614F90C698C19EDE46D873E90C0BD8731348B33B01E77E16326BF601F642F01F801B2BC6E587891BCE30CBD28C602FD761DF259788EE2AA22F10777B5D5CABC645A11BB3F040E410344EFBA8A1F324C988E209456B0CAC46F0A7AFA16063900BE309FF9E99B866424BFC3CFB8A55F8AD2D9C0044FB5C1EAD5CCB80B4CF8B30D2A15E1042DAA7874CBC461D508C3F4E5DFCBA56209E96B20226C566882CECA3540ED661FD0A20803000D57BF5637DA85B0AF6B4DCA49D44E36271B05F2919561D1C96DB33063202EDE8784740FAD92C3D90BE9830E2E8CE461CBDCC84A32735E930232CBE1F1236F5FB438FE2C3FDC1DAF7B07416DC1FA3A5AAC5A2DF33A5EBA3504AD7024785E3460C2522BB05B9E6D82040DA9913B5A553CB2603B2F5D8141B16EECFA0E520EA85BD0A6C9D3A84381FCD136A4903AB110DA2D2D84892EA7DBA760DA5666E2326016CCF71468571B331ADDFB7166F6AD6AA1DF8F02286AEDBD4FEA8E54D260EBA4A159086B6DB31F966BA998CE750DA3A1788E99451AC302FA5C3737057FB8DE139AC57F0507C5E0AA922747CEECBC98EAEE5B887657E004C90E5A3A19C0F095B829CCFA86BF9C8C04DDC0BFB037F318D644910C658E0D94B59E9E2422F14DA3D3E868AF028B42321E100857661828707369AE6D7FEE1606DBFC1B4015E05362AEA93AA8BBC99502C414FE35DAABDDE12576FEED6EA592080F237933D9FCB6DEC24F89F6E223A4DE89B884A89F435A887686744A294A07B88A86579490F88849214E2F6D10458396DBBB2A4759A49E749DC56EB30386A9509874FEA47AD7EAEDC37B7DE20717B692F487C02DFFA6657CF3E3E51C7664ECE6E3560E9CC3C380014CE3EDD3C991E000A9732556890BA5CF743CBD93FF2B6B59774CEE868161C494977E3A391947A59408181A25D6FD18C1F03A5C2682906F9E883262586C3C6C9DC2CD8C9662A6D2CB5C25F37AA95D8AC68D909CB59F75C26214A7BFBEE3B0C1A5A77D756C4213B3A78008DA531526A6D315CEC854DED5C662B0B49BF3E6B57B5B3ED02B181DB327A09F14BDBBD2DDAD353D719F29D9D07D36D82F90622A215CF83E98657B4BE32A73D8544A8514385470C259A5F2AF064A61C595BEDE666856D381945B508F0FB56D45DC9292FC8643B13E92FD67964B03FA3F2EFF8A76D8850702F2C9DB5C1B1F6F427070697F6BFCEAC9F9A291DF6DA4B5FB59DB5D9BA19B65E087912EEAF22C2885B16351E0E660CA6CA403EC32EA48A14442291D5B4E711573D2AABF96AC9465EE183CB2AD6FFD5A740E0136A9CA67718DD37AD42BAE4F3F41BCCC76C44F4EAE33B1BD99B0DBB40CD358A50D6FB8B2901D229E2B4DC018D569A9DE1506104BE42C701559817718C43859126426C93538B2E5D10CC5659D9DBA8844A934CA54791F238CD3285D3BD813350FAE58DA7CA5A8E68E6BFF9570EA4F93F37CCA7554704AAF7B7D8BAB0DE8FE0681A58D7A3D18F8C9DE610595FE8DAC3C9D7EF6CEE6B535F62FDEA0AA21F57AEFE01210EB52D441FAD1349865D255ED9F21171CC128FA7111148533D170A4BA0B43ED5DBA291CA205A9F6ABC10F6A19F42FA5473D3D5FFB91449054C29DDBABDBB63AB47B0647E0B8003604388D62015C2857314674236ED016089E57AAD10733AB36673E74C37FDCBA4425B0F0E45D147A734B9DBEB60DB98DCB77D2C63676053CFE20D5AB008F5BC5BF7003DEF16A95E22DE2D52BD8C3653BDAC89FFEB2611FDC9C2A5768EA06D9CD712F2F334482FEA853861C1C22832AA1921364A712AE2CC46183B18E1C91B623D3CD91BFC3D12C19385FCDB0AE20271B777E85375C0C5D79BF218816D5117B06BF81274C47A04DBD98460A71810EC3C73041BECC50E03CDB45EE96642FE9B0056AC24C0071B10F03CA900EA53FE047C63E0555F4E7649D3765FCE918F91087447E6773F4329D76CC1022110044B0A86293DA8A4406F155452300EEA11659B13BE5BD94974485169021E525369C2701D589A0872B1284DF825582B4D20E109589A300A4FC8D806E189FB0B5B0A4FC0CA849D7B23104E7EAFBB6B32239F18E63E1D88101A4CC8463344D6133EA4E92546DBF8B301B2A6950A2E9A29157818940A524D4A0509CF6663DAEEEEEBC064A04E22CB74A423EE02DDCB19F81CAF49E3C790190005F620036337CFBD5C3C0C6A0672A166E058F2FC580FC8C1B06075965BF691C70475825AE95556391BE19141B04886221C4817884E06F96929A4A01CAC2284902DB0EFA964DAE5DC1EFF58D0392DDEACDA465AE86C2E542987D1CB4479701CC28E61DF93DA6F1E641D40F2CACF3BC68CD83D5F3275D8A6A0FA9EAD216958A9D3271C25D4D06974C2B19C4A33241CD11774585634CA38C8E6DB20E3B8F4A0A8B915A4DA1E90902E256F117537322595EE48D3876E0B238C544973F4FBE65098A7A0E6FF2221CA53E8181FE6299BE1D0047F98A7C0CA373325EA69F5942188E262B17648B96D4C98C0C0679E874259A48656F716CD669E1EBFB5F7D0012E1C37BFBD41312050BACCDCC9EECB9B60984EFD23018928F586CE74349C7A9549CCB1FC79E87AAB51407053C09D380EEC4428E4041336FD9E580D27BF9E853A4E1F1DA97AB83E6718A7DB26873087CE43EAA0DB8042572098595D4B0B5DED50F7A485AE8AFDEFEAB0E1FE50E8EA800E7BE2BBB6A85EB29E53236CDDF10FCD3BB09EB8623C248C6C65F748454257195C542F98AE76380DEB0541AEF7C4A22B3B3F127C59E044E656BB9F7DEDFB2E5516F8A6505C83F6061C04B6457C3E54DF5566D81A8AB03870BCD5B0ABEC2313BDF8A1633BA60691904D8EF4594FC05E1A37FE442587726644FA8F52B314679215EA04C605EDB19AC50B89F541633FFCB1706D25734F8F8D0FAB223DF28936B36D2D850860DFE9781EA247D18DA734A7648491CA0E1B4FABCC0625055A35AFFA81339DA441DA79387727CFF0CA3742AF1D9B73D40619D2675313DB52B3EE20346B4DC9C6E652D08BD46ED1CED65ADF6D5045ED6CE1569BC3A76CB172DAFEC2ACA9B19B65969D3170E7EF1970DC2E69D104A8A00DC9836B9848415BCF97870ADA0E50AE3A1C0E430389EA29FFA721C9475672F40ADA1DEEEDB6EC8E86E3DC3E16EE161B141C97F5A0470FD6A296A342A65EC3D1456AD22C6DA4FEDC46F3D6C7A733B43591AC7CDBBBF461039E0EDB1504D2BBB53AACFF8B3A6CD013CA9909528A8F4156314F2658A10E2826245979F58A883362EDA7A525D412D9E7D04A5AEE892610B5D224DB6B8738268E6D83A17DFBF2320FD5A840E023B23C7DA276F79A9C0FA77775C2B0A456E2049D09F401CB0145C5FBF298757150547C2BCF1D466CFB207578ACE88ECB704E2C01E91AE7CD81BD760C7C6A2BCC0ED23858BC45A21E344A4C6B7AF0844965DA631FE941E21813EB35AC67271C51EBF964C76FA4DC51E92946FCFBFD60132DD54FFB84BA7320808820B55D615797E8164880227D39D9FB9E56BB8767BEC3C7ECE86CA7A31A1B0A366D1B9867AF44F8B3E729B56DEA510767993F7BEA9125C076E24FFFD45E08CF4AA515890EBE41644C86F2266824B5A9DB38491B9BDB70E6F8566D7096D9557ADAD5D26C47AB73827A3C41773A4F0BE398753AE79B3A9DEF9F4F6BD9E95CDBDCBA308CB41609BA33BCBB9263EA0CCF377586FBCE4D6BD9190ED2853FA3331CA6EEFD4FA00E920562F90E227DB2A256F58D364586AF56E35ADF6F3F1527AAAB433F876D231D9FCFD35242B4231FB703DFB5633F911980D8C17DA0E7521D20CF1349FE590AFC0F47A5AAA1BCC157BBEF171DB6202554561D5CD902996D3E05DBD6355F9A916B0B05B4DC2584D4830CDCDAD268B39675C71683D1F5CAA1348534D28C42BAD84021FDC64421B581C7754C3F137578D28CD1D1622363B490D03346650C33C2687E609B8C8F0105861B834681D1C66018364680D9C66864D9436F7D9E00A74B5B844F9E995575B06B0EF25660F79FB57CA9C3C22C1D6E897BEE00BDCE681D6EC7F0E4D6DCCB7C280E62EFEB8475088B2F582770A1A731F37AEB9326D85447274DE98E3E3931306972356BA105CE97E4A7B1CFB2AE090CA3DFBDBBD1115B68712D91545BAE9FFDBE73838919F7474FBB3413F311F79026CCC16E2323630E910FA5DFF6F2CB1B9F5E395F55B9D91CE82D80FC3538975DCF5FF331F1D7D4097AFE9AD38F66FC35CB2E6034720CE1285040DD9937543919C5B3EE614152B2689147E13824A0BEF0CC8FDAC67B73A1807A0C153AA574F336CCD1F32F272536AA614763256158FC714CD4D453622025A2B58F0C34E30FBBD2AD886D82BC9E0B8376EEA2FD8993AE3A4B1836D00E3D4F3BA68B5B69ADEF38CDB4532783759CBBCB168AA11CA2336A3CA3E510112708C921DE807D670FA01CA249F458B4E99961F433E36F7BFBCF6DFB9BB60D2AEF7C4D4D5B43E4ACCF51B5776AB9ED894FCF92B2B4D509D231791A1BAFCFB67076C73AF5ED24FD3EAB5FAFAD7D80663DF06DFE8BF66936409966B5036F23AA8056672EEB0F95C4B737C201224DEA65D0559F05A77A26873524ECC1BA13536E966F5DD67AF4B496B2F52AF8DA2D3478AAE703EAD153452DA4AAB3F3F48440977EA62949BF3BDA0364C2A61938C77D92B2F67D7A6A1B6C77B98D7A7134C339B1CE961DA8DFFF3FE9F6BF99AEFA373F450DD915461D4899480C5E052D27FFD00061A5E681000A24F3F305A1534A7227FAD42475426F77EB0156CB406A0ADBB8E86984FA362EA8814DB7719D358C3E1F5364262CA10D6765E939AF7010485FC675312497852320F8CD2B571A5205DE169CD770562789783E4B3CE82FA7B5FEB92EC8D6205DEB6ED3B67C8A4D4BDE6E36671B3A5D9EA18AD3F161EC1D4644DA3A76871D1F63AF625E36698EFE406D08B034A74D37AA0C14EB1999A309F9BFB5FA3B6515CDDBC83B4D86ADD8189EE9780D26EEA87DD362104E3F382CA7408745ED460C9A41D000368C2356EAB055DA4499E077465D43755E9554CD3E489D4EFEBC245376CD828789265943A9CB3BE802AF0A946F931543D58E9A1B20B4155C8838417D3723915BA46D48B938B539DEFAC60A7CD63C9BB67CDA8E575431EAF640CA653A12ADA25609A50219F39C365ADB8DF2E729D1CCB6063CFF4CA93ABCE492AD9935EDEC7FF732AEC578C35AE8A77AEB653F4F98C97E365B3003A13ADC6EE3806FB5B34940404618C77B9FF3E5649736BDE3BBE2C84A55A06B0D79BE1AA9D8EE2E7333A9D816930615DB9F132D546C759632B620E3DD3F9EC807C6745B0CD870B8B456AAC334BD1B7879E062E792B3A971E2319653E3215126CBA87560181A4F8F6F32081D980D8DE7C523C9C8182298285C0139C70305507916718E65E286DE34E79868E61A39C755E6C4529852A3433959B3517F280D903B3C95B1B90DA73F01A7B2C9A42650158894C9CDEF19188CFEC0CF3B023F1F15827CBD6B8166B4A00178F020E2B3886829F1186477B2876F014FEF114B9DDB585B9A5BFAC37FFFCC7643C75B1B88EC7A698E0E4C8598D3368012DE5F9BD4DADA940F9A781ED62C7EBCA57062A7A08BF60C31B1027A54F98FE1C359CD9394CEF3E4DCA8D4F546593EC50CA8B9EFF99EC0EF43AF28BFD56120E697BF2B6CC540364C0AE9847679E8525A31AEE2D17C53F03E4B0224C98601A7A3F1FEA9B3E801A7832EE26BD4FFF8190D387DF5C7D989908A30224A9696BDD711F62EB5FC0278DE95F749CDCBB83C17AF0B262B26A943154D9A1BFE450A3C517B98C253759837A7F8299E2F2B251FE5E64379E63F8BDCF6BF5EBED5CA909CCE7C597FC63CA0B64B0CC04C809E354F670219382A8AA9502AC0BC9254CFABF5B61836AFB2328607A5028B69713B48AD2EF5417D6C50DF4911C9D113ABCD27F16C62592287F61C7993521952E7344A9541901D49958D83A982CC429FB3B6D97AF80C419F8ECAD3D2ED6A7AD553BA5F8D161424930CE4627C654BD95306D63E5306A1A067E13A06936CC380754C83BA63AA2ED6A714D996E6EEB85697A9EBFEFF7F3AFD87AD2B1AEAF2D6E477C3A72F58F3D1C2C92B362CFA602E2BE8AD711B5F72F074E935D06920F1F6A18B0F040E6FBEEBF4BEF4C99EDAA4D78E77FD67D75ED8FF00CC6CA04D") 24 | decrypted := AESCbcDecrypt(data, key) 25 | Log.Printf("decrypted = %s\n", ArrToHexStrWithSp(decrypted, "")) 26 | unziped, _ := deflateUnZip(decrypted) 27 | Log.Printf("unziped = %s\n", ArrToHexStrWithSp(unziped, "")) 28 | } 29 | -------------------------------------------------------------------------------- /mm_pb/base_common.pb.go: -------------------------------------------------------------------------------- 1 | // Code generated by protoc-gen-go. DO NOT EDIT. 2 | // versions: 3 | // protoc-gen-go v1.23.0 4 | // protoc v3.6.1 5 | // source: base_common.proto 6 | 7 | package mm_pb 8 | 9 | import ( 10 | proto "github.com/golang/protobuf/proto" 11 | protoreflect "google.golang.org/protobuf/reflect/protoreflect" 12 | protoimpl "google.golang.org/protobuf/runtime/protoimpl" 13 | reflect "reflect" 14 | sync "sync" 15 | ) 16 | 17 | const ( 18 | // Verify that this generated code is sufficiently up-to-date. 19 | _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) 20 | // Verify that runtime/protoimpl is sufficiently up-to-date. 21 | _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) 22 | ) 23 | 24 | // This is a compile-time assertion that a sufficiently up-to-date version 25 | // of the legacy proto package is being used. 26 | const _ = proto.ProtoPackageIsVersion4 27 | 28 | type RetConst int32 29 | 30 | const ( 31 | RetConst_MM_OK RetConst = 0 32 | RetConst_ERR_SERVER_FILE_EXPIRED RetConst = -5103059 33 | RetConst_MM_BOTTLE_COUNT_ERR RetConst = 16 34 | RetConst_MM_BOTTLE_ERR_UNKNOWNTYPE RetConst = 15 35 | RetConst_MM_BOTTLE_NOTEXIT RetConst = 17 36 | RetConst_MM_BOTTLE_PICKCOUNTINVALID RetConst = 19 37 | RetConst_MM_BOTTLE_UINNOTMATCH RetConst = 18 38 | RetConst_MM_ERR_ACCESS_DENIED RetConst = -5 39 | RetConst_MM_ERR_ACCOUNT_BAN RetConst = -200 40 | RetConst_MM_ERR_ALPHA_FORBIDDEN RetConst = -75 41 | RetConst_MM_ERR_ANSWER_COUNT RetConst = -150 42 | RetConst_MM_ERR_ARG RetConst = -2 43 | RetConst_MM_ERR_AUTH_ANOTHERPLACE RetConst = -100 44 | RetConst_MM_ERR_BADEMAIL RetConst = -28 45 | RetConst_MM_ERR_BATCHGETCONTACTPROFILE_MODE RetConst = -45 46 | RetConst_MM_ERR_BIGBIZ_AUTH RetConst = -69 47 | RetConst_MM_ERR_BIND_EMAIL_SAME_AS_QMAIL RetConst = -86 48 | RetConst_MM_ERR_BINDED_BY_OTHER RetConst = -85 49 | RetConst_MM_ERR_BINDUIN_BINDED RetConst = -50 50 | RetConst_MM_ERR_BIZ_FANS_LIMITED RetConst = -87 51 | RetConst_MM_ERR_BLACKLIST RetConst = -22 52 | RetConst_MM_ERR_BLOCK_BY_SPAM RetConst = -106 53 | RetConst_MM_ERR_BOTTLEBANBYEXPOSE RetConst = -2002 54 | RetConst_MM_ERR_CERT_EXPIRED RetConst = -102 55 | RetConst_MM_ERR_CHATROOM_NEED_INVITE RetConst = -2012 56 | RetConst_MM_ERR_CHATROOM_PARTIAL_INVITE RetConst = -2013 57 | RetConst_MM_ERR_CLIDB_ENCRYPT_KEYINFO_INVALID RetConst = -2010 58 | RetConst_MM_ERR_CLIENT RetConst = -800000 59 | RetConst_MM_ERR_CONNECT_INFO_URL_INVALID RetConst = -2011 60 | RetConst_MM_ERR_COOKIE_KICK RetConst = -2008 61 | RetConst_MM_ERR_CRITICALUPDATE RetConst = -16 62 | RetConst_MM_ERR_DOMAINDISABLE RetConst = -27 63 | RetConst_MM_ERR_DOMAINMAXLIMITED RetConst = -26 64 | RetConst_MM_ERR_DOMAINVERIFIED RetConst = -25 65 | RetConst_MM_ERR_EMAIL_FORMAT RetConst = -111 66 | RetConst_MM_ERR_EMAILEXIST RetConst = -8 67 | RetConst_MM_ERR_EMAILNOTVERIFY RetConst = -9 68 | RetConst_MM_ERR_FACING_CREATECHATROOM_RETRY RetConst = -432 69 | RetConst_MM_ERR_FAV_ALREADY RetConst = -400 70 | RetConst_MM_ERR_FILE_EXPIRED RetConst = -352 71 | RetConst_MM_ERR_FORCE_QUIT RetConst = -999999 72 | RetConst_MM_ERR_FORCE_REDIRECT RetConst = -2005 73 | RetConst_MM_ERR_FREQ_LIMITED RetConst = -34 74 | RetConst_MM_ERR_GETMFRIEND_NOT_READY RetConst = -70 75 | RetConst_MM_ERR_GMAIL_IMAP RetConst = -63 76 | RetConst_MM_ERR_GMAIL_ONLINELIMITE RetConst = -61 77 | RetConst_MM_ERR_GMAIL_PWD RetConst = -60 78 | RetConst_MM_ERR_GMAIL_WEBLOGIN RetConst = -62 79 | RetConst_MM_ERR_HAS_BINDED RetConst = -84 80 | RetConst_MM_ERR_HAS_NO_HEADIMG RetConst = -53 81 | RetConst_MM_ERR_HAS_UNBINDED RetConst = -83 82 | RetConst_MM_ERR_HAVE_BIND_FACEBOOK RetConst = -67 83 | RetConst_MM_ERR_IDC_REDIRECT RetConst = -301 84 | RetConst_MM_ERR_IMG_READ RetConst = -1005 85 | RetConst_MM_ERR_INVALID_BIND_OPMODE RetConst = -37 86 | RetConst_MM_ERR_INVALID_GROUPCARD_CONTACT RetConst = -52 87 | RetConst_MM_ERR_INVALID_HDHEADIMG_REQ_TOTAL_LEN RetConst = -54 88 | RetConst_MM_ERR_INVALID_UPLOADMCONTACT_OPMODE RetConst = -38 89 | RetConst_MM_ERR_IS_NOT_OWNER RetConst = -66 90 | RetConst_MM_ERR_KEYBUF_INVALID RetConst = -2006 91 | RetConst_MM_ERR_LBSBANBYEXPOSE RetConst = -2001 92 | RetConst_MM_ERR_LBSDATANOTFOUND RetConst = -2000 93 | RetConst_MM_ERR_LOGIN_QRCODE_UUID_EXPIRED RetConst = -2007 94 | RetConst_MM_ERR_LOGIN_URL_DEVICE_UNSAFE RetConst = -2009 95 | RetConst_MM_ERR_MEMBER_TOOMUCH RetConst = -23 96 | RetConst_MM_ERR_MOBILE_BINDED RetConst = -35 97 | RetConst_MM_ERR_MOBILE_FORMAT RetConst = -41 98 | RetConst_MM_ERR_MOBILE_NEEDADJUST RetConst = -74 99 | RetConst_MM_ERR_MOBILE_NULL RetConst = -39 100 | RetConst_MM_ERR_MOBILE_UNBINDED RetConst = -36 101 | RetConst_MM_ERR_NEED_QQPWD RetConst = -49 102 | RetConst_MM_ERR_NEED_VERIFY RetConst = -6 103 | RetConst_MM_ERR_NEED_VERIFY_USER RetConst = -44 104 | RetConst_MM_ERR_NEEDREG RetConst = -30 105 | RetConst_MM_ERR_NEEDSECONDPWD RetConst = -31 106 | RetConst_MM_ERR_NEW_USER RetConst = -79 107 | RetConst_MM_ERR_NICEQQ_EXPIRED RetConst = -72 108 | RetConst_MM_ERR_NICKNAMEINVALID RetConst = -15 109 | RetConst_MM_ERR_NICKRESERVED RetConst = -11 110 | RetConst_MM_ERR_NO_BOTTLECOUNT RetConst = -56 111 | RetConst_MM_ERR_NO_HDHEADIMG RetConst = -55 112 | RetConst_MM_ERR_NO_QUESTION RetConst = -152 113 | RetConst_MM_ERR_NO_RETRY RetConst = -101 114 | RetConst_MM_ERR_NODATA RetConst = -203 115 | RetConst_MM_ERR_NOTBINDQQ RetConst = -81 116 | RetConst_MM_ERR_NOTCHATROOMCONTACT RetConst = -21 117 | RetConst_MM_ERR_NOTMICROBLOGCONTACT RetConst = -20 118 | RetConst_MM_ERR_NOTOPENPRIVATEMSG RetConst = -19 119 | RetConst_MM_ERR_NOTQQCONTACT RetConst = -46 120 | RetConst_MM_ERR_NOUPDATEINFO RetConst = -18 121 | RetConst_MM_ERR_NOUSER RetConst = -4 122 | RetConst_MM_ERR_OIDBTIMEOUT RetConst = -29 123 | RetConst_MM_ERR_ONE_BINDTYPE_LEFT RetConst = -82 124 | RetConst_MM_ERR_OTHER_MAIN_ACCT RetConst = -204 125 | RetConst_MM_ERR_PARSE_MAIL RetConst = -64 126 | RetConst_MM_ERR_PASSWORD RetConst = -3 127 | RetConst_MM_ERR_PICKBOTTLE_NOBOTTLE RetConst = -58 128 | RetConst_MM_ERR_QA_RELATION RetConst = -153 129 | RetConst_MM_ERR_QQ_BAN RetConst = -201 130 | RetConst_MM_ERR_QQ_OK_NEED_MOBILE RetConst = -205 131 | RetConst_MM_ERR_QRCODEVERIFY_BANBYEXPOSE RetConst = -2004 132 | RetConst_MM_ERR_QUESTION_COUNT RetConst = -151 133 | RetConst_MM_ERR_RADAR_PASSWORD_SIMPLE RetConst = -431 134 | RetConst_MM_ERR_RECOMMENDEDUPDATE RetConst = -17 135 | RetConst_MM_ERR_REG_BUT_LOGIN RetConst = -212 136 | RetConst_MM_ERR_REVOKEMSG_TIMEOUT RetConst = -430 137 | RetConst_MM_ERR_SEND_VERIFYCODE RetConst = -57 138 | RetConst_MM_ERR_SESSIONTIMEOUT RetConst = -13 139 | RetConst_MM_ERR_SHAKE_TRAN_IMG_CANCEL RetConst = -90 140 | RetConst_MM_ERR_SHAKE_TRAN_IMG_CONTINUE RetConst = -92 141 | RetConst_MM_ERR_SHAKE_TRAN_IMG_NOTFOUND RetConst = -91 142 | RetConst_MM_ERR_SHAKE_TRAN_IMG_OTHER RetConst = -93 143 | RetConst_MM_ERR_SHAKEBANBYEXPOSE RetConst = -2003 144 | RetConst_MM_ERR_SHORTVIDEO_CANCEL RetConst = 1000000 145 | RetConst_MM_ERR_SPAM RetConst = -24 146 | RetConst_MM_ERR_SVR_MOBILE_FORMAT RetConst = -78 147 | RetConst_MM_ERR_SYS RetConst = -1 148 | RetConst_MM_ERR_TICKET_NOTFOUND RetConst = -48 149 | RetConst_MM_ERR_TICKET_UNMATCH RetConst = -47 150 | RetConst_MM_ERR_TOLIST_LIMITED RetConst = -71 151 | RetConst_MM_ERR_TRYQQPWD RetConst = -73 152 | RetConst_MM_ERR_UINEXIST RetConst = -12 153 | RetConst_MM_ERR_UNBIND_MAIN_ACCT RetConst = -206 154 | RetConst_MM_ERR_UNBIND_MOBILE_NEED_QQPWD RetConst = -202 155 | RetConst_MM_ERR_UNBIND_REGBYMOBILE RetConst = -65 156 | RetConst_MM_ERR_UNMATCH_MOBILE RetConst = -40 157 | RetConst_MM_ERR_UNSUPPORT_COUNTRY RetConst = -59 158 | RetConst_MM_ERR_USER_BIND_MOBILE RetConst = -43 159 | RetConst_MM_ERR_USER_MOBILE_UNMATCH RetConst = -42 160 | RetConst_MM_ERR_USER_NOT_SUPPORT RetConst = -94 161 | RetConst_MM_ERR_USER_NOT_VERIFYUSER RetConst = -302 162 | RetConst_MM_ERR_USEREXIST RetConst = -7 163 | RetConst_MM_ERR_USERNAMEINVALID RetConst = -14 164 | RetConst_MM_ERR_USERRESERVED RetConst = -10 165 | RetConst_MM_ERR_UUID_BINDED RetConst = -76 166 | RetConst_MM_ERR_VERIFYCODE_NOTEXIST RetConst = -51 167 | RetConst_MM_ERR_VERIFYCODE_TIMEOUT RetConst = -33 168 | RetConst_MM_ERR_VERIFYCODE_UNMATCH RetConst = -32 169 | RetConst_MM_ERR_WEIBO_PUSH_TRANS RetConst = -80 170 | RetConst_MM_ERR_WRONG_SESSION_KEY RetConst = -77 171 | RetConst_MM_FACEBOOK_ACCESSTOKEN_UNVALID RetConst = -68 172 | RetConst_MMSNS_RET_BAN RetConst = 202 173 | RetConst_MMSNS_RET_CLIENTID_EXIST RetConst = 206 174 | RetConst_MMSNS_RET_COMMENT_HAVE_LIKE RetConst = 204 175 | RetConst_MMSNS_RET_COMMENT_NOT_ALLOW RetConst = 205 176 | RetConst_MMSNS_RET_COMMENT_PRIVACY RetConst = 208 177 | RetConst_MMSNS_RET_ISALL RetConst = 207 178 | RetConst_MMSNS_RET_PRIVACY RetConst = 203 179 | RetConst_MMSNS_RET_SPAM RetConst = 201 180 | ) 181 | 182 | // Enum value maps for RetConst. 183 | var ( 184 | RetConst_name = map[int32]string{ 185 | 0: "MM_OK", 186 | -5103059: "ERR_SERVER_FILE_EXPIRED", 187 | 16: "MM_BOTTLE_COUNT_ERR", 188 | 15: "MM_BOTTLE_ERR_UNKNOWNTYPE", 189 | 17: "MM_BOTTLE_NOTEXIT", 190 | 19: "MM_BOTTLE_PICKCOUNTINVALID", 191 | 18: "MM_BOTTLE_UINNOTMATCH", 192 | -5: "MM_ERR_ACCESS_DENIED", 193 | -200: "MM_ERR_ACCOUNT_BAN", 194 | -75: "MM_ERR_ALPHA_FORBIDDEN", 195 | -150: "MM_ERR_ANSWER_COUNT", 196 | -2: "MM_ERR_ARG", 197 | -100: "MM_ERR_AUTH_ANOTHERPLACE", 198 | -28: "MM_ERR_BADEMAIL", 199 | -45: "MM_ERR_BATCHGETCONTACTPROFILE_MODE", 200 | -69: "MM_ERR_BIGBIZ_AUTH", 201 | -86: "MM_ERR_BIND_EMAIL_SAME_AS_QMAIL", 202 | -85: "MM_ERR_BINDED_BY_OTHER", 203 | -50: "MM_ERR_BINDUIN_BINDED", 204 | -87: "MM_ERR_BIZ_FANS_LIMITED", 205 | -22: "MM_ERR_BLACKLIST", 206 | -106: "MM_ERR_BLOCK_BY_SPAM", 207 | -2002: "MM_ERR_BOTTLEBANBYEXPOSE", 208 | -102: "MM_ERR_CERT_EXPIRED", 209 | -2012: "MM_ERR_CHATROOM_NEED_INVITE", 210 | -2013: "MM_ERR_CHATROOM_PARTIAL_INVITE", 211 | -2010: "MM_ERR_CLIDB_ENCRYPT_KEYINFO_INVALID", 212 | -800000: "MM_ERR_CLIENT", 213 | -2011: "MM_ERR_CONNECT_INFO_URL_INVALID", 214 | -2008: "MM_ERR_COOKIE_KICK", 215 | -16: "MM_ERR_CRITICALUPDATE", 216 | -27: "MM_ERR_DOMAINDISABLE", 217 | -26: "MM_ERR_DOMAINMAXLIMITED", 218 | -25: "MM_ERR_DOMAINVERIFIED", 219 | -111: "MM_ERR_EMAIL_FORMAT", 220 | -8: "MM_ERR_EMAILEXIST", 221 | -9: "MM_ERR_EMAILNOTVERIFY", 222 | -432: "MM_ERR_FACING_CREATECHATROOM_RETRY", 223 | -400: "MM_ERR_FAV_ALREADY", 224 | -352: "MM_ERR_FILE_EXPIRED", 225 | -999999: "MM_ERR_FORCE_QUIT", 226 | -2005: "MM_ERR_FORCE_REDIRECT", 227 | -34: "MM_ERR_FREQ_LIMITED", 228 | -70: "MM_ERR_GETMFRIEND_NOT_READY", 229 | -63: "MM_ERR_GMAIL_IMAP", 230 | -61: "MM_ERR_GMAIL_ONLINELIMITE", 231 | -60: "MM_ERR_GMAIL_PWD", 232 | -62: "MM_ERR_GMAIL_WEBLOGIN", 233 | -84: "MM_ERR_HAS_BINDED", 234 | -53: "MM_ERR_HAS_NO_HEADIMG", 235 | -83: "MM_ERR_HAS_UNBINDED", 236 | -67: "MM_ERR_HAVE_BIND_FACEBOOK", 237 | -301: "MM_ERR_IDC_REDIRECT", 238 | -1005: "MM_ERR_IMG_READ", 239 | -37: "MM_ERR_INVALID_BIND_OPMODE", 240 | -52: "MM_ERR_INVALID_GROUPCARD_CONTACT", 241 | -54: "MM_ERR_INVALID_HDHEADIMG_REQ_TOTAL_LEN", 242 | -38: "MM_ERR_INVALID_UPLOADMCONTACT_OPMODE", 243 | -66: "MM_ERR_IS_NOT_OWNER", 244 | -2006: "MM_ERR_KEYBUF_INVALID", 245 | -2001: "MM_ERR_LBSBANBYEXPOSE", 246 | -2000: "MM_ERR_LBSDATANOTFOUND", 247 | -2007: "MM_ERR_LOGIN_QRCODE_UUID_EXPIRED", 248 | -2009: "MM_ERR_LOGIN_URL_DEVICE_UNSAFE", 249 | -23: "MM_ERR_MEMBER_TOOMUCH", 250 | -35: "MM_ERR_MOBILE_BINDED", 251 | -41: "MM_ERR_MOBILE_FORMAT", 252 | -74: "MM_ERR_MOBILE_NEEDADJUST", 253 | -39: "MM_ERR_MOBILE_NULL", 254 | -36: "MM_ERR_MOBILE_UNBINDED", 255 | -49: "MM_ERR_NEED_QQPWD", 256 | -6: "MM_ERR_NEED_VERIFY", 257 | -44: "MM_ERR_NEED_VERIFY_USER", 258 | -30: "MM_ERR_NEEDREG", 259 | -31: "MM_ERR_NEEDSECONDPWD", 260 | -79: "MM_ERR_NEW_USER", 261 | -72: "MM_ERR_NICEQQ_EXPIRED", 262 | -15: "MM_ERR_NICKNAMEINVALID", 263 | -11: "MM_ERR_NICKRESERVED", 264 | -56: "MM_ERR_NO_BOTTLECOUNT", 265 | -55: "MM_ERR_NO_HDHEADIMG", 266 | -152: "MM_ERR_NO_QUESTION", 267 | -101: "MM_ERR_NO_RETRY", 268 | -203: "MM_ERR_NODATA", 269 | -81: "MM_ERR_NOTBINDQQ", 270 | -21: "MM_ERR_NOTCHATROOMCONTACT", 271 | -20: "MM_ERR_NOTMICROBLOGCONTACT", 272 | -19: "MM_ERR_NOTOPENPRIVATEMSG", 273 | -46: "MM_ERR_NOTQQCONTACT", 274 | -18: "MM_ERR_NOUPDATEINFO", 275 | -4: "MM_ERR_NOUSER", 276 | -29: "MM_ERR_OIDBTIMEOUT", 277 | -82: "MM_ERR_ONE_BINDTYPE_LEFT", 278 | -204: "MM_ERR_OTHER_MAIN_ACCT", 279 | -64: "MM_ERR_PARSE_MAIL", 280 | -3: "MM_ERR_PASSWORD", 281 | -58: "MM_ERR_PICKBOTTLE_NOBOTTLE", 282 | -153: "MM_ERR_QA_RELATION", 283 | -201: "MM_ERR_QQ_BAN", 284 | -205: "MM_ERR_QQ_OK_NEED_MOBILE", 285 | -2004: "MM_ERR_QRCODEVERIFY_BANBYEXPOSE", 286 | -151: "MM_ERR_QUESTION_COUNT", 287 | -431: "MM_ERR_RADAR_PASSWORD_SIMPLE", 288 | -17: "MM_ERR_RECOMMENDEDUPDATE", 289 | -212: "MM_ERR_REG_BUT_LOGIN", 290 | -430: "MM_ERR_REVOKEMSG_TIMEOUT", 291 | -57: "MM_ERR_SEND_VERIFYCODE", 292 | -13: "MM_ERR_SESSIONTIMEOUT", 293 | -90: "MM_ERR_SHAKE_TRAN_IMG_CANCEL", 294 | -92: "MM_ERR_SHAKE_TRAN_IMG_CONTINUE", 295 | -91: "MM_ERR_SHAKE_TRAN_IMG_NOTFOUND", 296 | -93: "MM_ERR_SHAKE_TRAN_IMG_OTHER", 297 | -2003: "MM_ERR_SHAKEBANBYEXPOSE", 298 | 1000000: "MM_ERR_SHORTVIDEO_CANCEL", 299 | -24: "MM_ERR_SPAM", 300 | -78: "MM_ERR_SVR_MOBILE_FORMAT", 301 | -1: "MM_ERR_SYS", 302 | -48: "MM_ERR_TICKET_NOTFOUND", 303 | -47: "MM_ERR_TICKET_UNMATCH", 304 | -71: "MM_ERR_TOLIST_LIMITED", 305 | -73: "MM_ERR_TRYQQPWD", 306 | -12: "MM_ERR_UINEXIST", 307 | -206: "MM_ERR_UNBIND_MAIN_ACCT", 308 | -202: "MM_ERR_UNBIND_MOBILE_NEED_QQPWD", 309 | -65: "MM_ERR_UNBIND_REGBYMOBILE", 310 | -40: "MM_ERR_UNMATCH_MOBILE", 311 | -59: "MM_ERR_UNSUPPORT_COUNTRY", 312 | -43: "MM_ERR_USER_BIND_MOBILE", 313 | -42: "MM_ERR_USER_MOBILE_UNMATCH", 314 | -94: "MM_ERR_USER_NOT_SUPPORT", 315 | -302: "MM_ERR_USER_NOT_VERIFYUSER", 316 | -7: "MM_ERR_USEREXIST", 317 | -14: "MM_ERR_USERNAMEINVALID", 318 | -10: "MM_ERR_USERRESERVED", 319 | -76: "MM_ERR_UUID_BINDED", 320 | -51: "MM_ERR_VERIFYCODE_NOTEXIST", 321 | -33: "MM_ERR_VERIFYCODE_TIMEOUT", 322 | -32: "MM_ERR_VERIFYCODE_UNMATCH", 323 | -80: "MM_ERR_WEIBO_PUSH_TRANS", 324 | -77: "MM_ERR_WRONG_SESSION_KEY", 325 | -68: "MM_FACEBOOK_ACCESSTOKEN_UNVALID", 326 | 202: "MMSNS_RET_BAN", 327 | 206: "MMSNS_RET_CLIENTID_EXIST", 328 | 204: "MMSNS_RET_COMMENT_HAVE_LIKE", 329 | 205: "MMSNS_RET_COMMENT_NOT_ALLOW", 330 | 208: "MMSNS_RET_COMMENT_PRIVACY", 331 | 207: "MMSNS_RET_ISALL", 332 | 203: "MMSNS_RET_PRIVACY", 333 | 201: "MMSNS_RET_SPAM", 334 | } 335 | RetConst_value = map[string]int32{ 336 | "MM_OK": 0, 337 | "ERR_SERVER_FILE_EXPIRED": -5103059, 338 | "MM_BOTTLE_COUNT_ERR": 16, 339 | "MM_BOTTLE_ERR_UNKNOWNTYPE": 15, 340 | "MM_BOTTLE_NOTEXIT": 17, 341 | "MM_BOTTLE_PICKCOUNTINVALID": 19, 342 | "MM_BOTTLE_UINNOTMATCH": 18, 343 | "MM_ERR_ACCESS_DENIED": -5, 344 | "MM_ERR_ACCOUNT_BAN": -200, 345 | "MM_ERR_ALPHA_FORBIDDEN": -75, 346 | "MM_ERR_ANSWER_COUNT": -150, 347 | "MM_ERR_ARG": -2, 348 | "MM_ERR_AUTH_ANOTHERPLACE": -100, 349 | "MM_ERR_BADEMAIL": -28, 350 | "MM_ERR_BATCHGETCONTACTPROFILE_MODE": -45, 351 | "MM_ERR_BIGBIZ_AUTH": -69, 352 | "MM_ERR_BIND_EMAIL_SAME_AS_QMAIL": -86, 353 | "MM_ERR_BINDED_BY_OTHER": -85, 354 | "MM_ERR_BINDUIN_BINDED": -50, 355 | "MM_ERR_BIZ_FANS_LIMITED": -87, 356 | "MM_ERR_BLACKLIST": -22, 357 | "MM_ERR_BLOCK_BY_SPAM": -106, 358 | "MM_ERR_BOTTLEBANBYEXPOSE": -2002, 359 | "MM_ERR_CERT_EXPIRED": -102, 360 | "MM_ERR_CHATROOM_NEED_INVITE": -2012, 361 | "MM_ERR_CHATROOM_PARTIAL_INVITE": -2013, 362 | "MM_ERR_CLIDB_ENCRYPT_KEYINFO_INVALID": -2010, 363 | "MM_ERR_CLIENT": -800000, 364 | "MM_ERR_CONNECT_INFO_URL_INVALID": -2011, 365 | "MM_ERR_COOKIE_KICK": -2008, 366 | "MM_ERR_CRITICALUPDATE": -16, 367 | "MM_ERR_DOMAINDISABLE": -27, 368 | "MM_ERR_DOMAINMAXLIMITED": -26, 369 | "MM_ERR_DOMAINVERIFIED": -25, 370 | "MM_ERR_EMAIL_FORMAT": -111, 371 | "MM_ERR_EMAILEXIST": -8, 372 | "MM_ERR_EMAILNOTVERIFY": -9, 373 | "MM_ERR_FACING_CREATECHATROOM_RETRY": -432, 374 | "MM_ERR_FAV_ALREADY": -400, 375 | "MM_ERR_FILE_EXPIRED": -352, 376 | "MM_ERR_FORCE_QUIT": -999999, 377 | "MM_ERR_FORCE_REDIRECT": -2005, 378 | "MM_ERR_FREQ_LIMITED": -34, 379 | "MM_ERR_GETMFRIEND_NOT_READY": -70, 380 | "MM_ERR_GMAIL_IMAP": -63, 381 | "MM_ERR_GMAIL_ONLINELIMITE": -61, 382 | "MM_ERR_GMAIL_PWD": -60, 383 | "MM_ERR_GMAIL_WEBLOGIN": -62, 384 | "MM_ERR_HAS_BINDED": -84, 385 | "MM_ERR_HAS_NO_HEADIMG": -53, 386 | "MM_ERR_HAS_UNBINDED": -83, 387 | "MM_ERR_HAVE_BIND_FACEBOOK": -67, 388 | "MM_ERR_IDC_REDIRECT": -301, 389 | "MM_ERR_IMG_READ": -1005, 390 | "MM_ERR_INVALID_BIND_OPMODE": -37, 391 | "MM_ERR_INVALID_GROUPCARD_CONTACT": -52, 392 | "MM_ERR_INVALID_HDHEADIMG_REQ_TOTAL_LEN": -54, 393 | "MM_ERR_INVALID_UPLOADMCONTACT_OPMODE": -38, 394 | "MM_ERR_IS_NOT_OWNER": -66, 395 | "MM_ERR_KEYBUF_INVALID": -2006, 396 | "MM_ERR_LBSBANBYEXPOSE": -2001, 397 | "MM_ERR_LBSDATANOTFOUND": -2000, 398 | "MM_ERR_LOGIN_QRCODE_UUID_EXPIRED": -2007, 399 | "MM_ERR_LOGIN_URL_DEVICE_UNSAFE": -2009, 400 | "MM_ERR_MEMBER_TOOMUCH": -23, 401 | "MM_ERR_MOBILE_BINDED": -35, 402 | "MM_ERR_MOBILE_FORMAT": -41, 403 | "MM_ERR_MOBILE_NEEDADJUST": -74, 404 | "MM_ERR_MOBILE_NULL": -39, 405 | "MM_ERR_MOBILE_UNBINDED": -36, 406 | "MM_ERR_NEED_QQPWD": -49, 407 | "MM_ERR_NEED_VERIFY": -6, 408 | "MM_ERR_NEED_VERIFY_USER": -44, 409 | "MM_ERR_NEEDREG": -30, 410 | "MM_ERR_NEEDSECONDPWD": -31, 411 | "MM_ERR_NEW_USER": -79, 412 | "MM_ERR_NICEQQ_EXPIRED": -72, 413 | "MM_ERR_NICKNAMEINVALID": -15, 414 | "MM_ERR_NICKRESERVED": -11, 415 | "MM_ERR_NO_BOTTLECOUNT": -56, 416 | "MM_ERR_NO_HDHEADIMG": -55, 417 | "MM_ERR_NO_QUESTION": -152, 418 | "MM_ERR_NO_RETRY": -101, 419 | "MM_ERR_NODATA": -203, 420 | "MM_ERR_NOTBINDQQ": -81, 421 | "MM_ERR_NOTCHATROOMCONTACT": -21, 422 | "MM_ERR_NOTMICROBLOGCONTACT": -20, 423 | "MM_ERR_NOTOPENPRIVATEMSG": -19, 424 | "MM_ERR_NOTQQCONTACT": -46, 425 | "MM_ERR_NOUPDATEINFO": -18, 426 | "MM_ERR_NOUSER": -4, 427 | "MM_ERR_OIDBTIMEOUT": -29, 428 | "MM_ERR_ONE_BINDTYPE_LEFT": -82, 429 | "MM_ERR_OTHER_MAIN_ACCT": -204, 430 | "MM_ERR_PARSE_MAIL": -64, 431 | "MM_ERR_PASSWORD": -3, 432 | "MM_ERR_PICKBOTTLE_NOBOTTLE": -58, 433 | "MM_ERR_QA_RELATION": -153, 434 | "MM_ERR_QQ_BAN": -201, 435 | "MM_ERR_QQ_OK_NEED_MOBILE": -205, 436 | "MM_ERR_QRCODEVERIFY_BANBYEXPOSE": -2004, 437 | "MM_ERR_QUESTION_COUNT": -151, 438 | "MM_ERR_RADAR_PASSWORD_SIMPLE": -431, 439 | "MM_ERR_RECOMMENDEDUPDATE": -17, 440 | "MM_ERR_REG_BUT_LOGIN": -212, 441 | "MM_ERR_REVOKEMSG_TIMEOUT": -430, 442 | "MM_ERR_SEND_VERIFYCODE": -57, 443 | "MM_ERR_SESSIONTIMEOUT": -13, 444 | "MM_ERR_SHAKE_TRAN_IMG_CANCEL": -90, 445 | "MM_ERR_SHAKE_TRAN_IMG_CONTINUE": -92, 446 | "MM_ERR_SHAKE_TRAN_IMG_NOTFOUND": -91, 447 | "MM_ERR_SHAKE_TRAN_IMG_OTHER": -93, 448 | "MM_ERR_SHAKEBANBYEXPOSE": -2003, 449 | "MM_ERR_SHORTVIDEO_CANCEL": 1000000, 450 | "MM_ERR_SPAM": -24, 451 | "MM_ERR_SVR_MOBILE_FORMAT": -78, 452 | "MM_ERR_SYS": -1, 453 | "MM_ERR_TICKET_NOTFOUND": -48, 454 | "MM_ERR_TICKET_UNMATCH": -47, 455 | "MM_ERR_TOLIST_LIMITED": -71, 456 | "MM_ERR_TRYQQPWD": -73, 457 | "MM_ERR_UINEXIST": -12, 458 | "MM_ERR_UNBIND_MAIN_ACCT": -206, 459 | "MM_ERR_UNBIND_MOBILE_NEED_QQPWD": -202, 460 | "MM_ERR_UNBIND_REGBYMOBILE": -65, 461 | "MM_ERR_UNMATCH_MOBILE": -40, 462 | "MM_ERR_UNSUPPORT_COUNTRY": -59, 463 | "MM_ERR_USER_BIND_MOBILE": -43, 464 | "MM_ERR_USER_MOBILE_UNMATCH": -42, 465 | "MM_ERR_USER_NOT_SUPPORT": -94, 466 | "MM_ERR_USER_NOT_VERIFYUSER": -302, 467 | "MM_ERR_USEREXIST": -7, 468 | "MM_ERR_USERNAMEINVALID": -14, 469 | "MM_ERR_USERRESERVED": -10, 470 | "MM_ERR_UUID_BINDED": -76, 471 | "MM_ERR_VERIFYCODE_NOTEXIST": -51, 472 | "MM_ERR_VERIFYCODE_TIMEOUT": -33, 473 | "MM_ERR_VERIFYCODE_UNMATCH": -32, 474 | "MM_ERR_WEIBO_PUSH_TRANS": -80, 475 | "MM_ERR_WRONG_SESSION_KEY": -77, 476 | "MM_FACEBOOK_ACCESSTOKEN_UNVALID": -68, 477 | "MMSNS_RET_BAN": 202, 478 | "MMSNS_RET_CLIENTID_EXIST": 206, 479 | "MMSNS_RET_COMMENT_HAVE_LIKE": 204, 480 | "MMSNS_RET_COMMENT_NOT_ALLOW": 205, 481 | "MMSNS_RET_COMMENT_PRIVACY": 208, 482 | "MMSNS_RET_ISALL": 207, 483 | "MMSNS_RET_PRIVACY": 203, 484 | "MMSNS_RET_SPAM": 201, 485 | } 486 | ) 487 | 488 | func (x RetConst) Enum() *RetConst { 489 | p := new(RetConst) 490 | *p = x 491 | return p 492 | } 493 | 494 | func (x RetConst) String() string { 495 | return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) 496 | } 497 | 498 | func (RetConst) Descriptor() protoreflect.EnumDescriptor { 499 | return file_base_common_proto_enumTypes[0].Descriptor() 500 | } 501 | 502 | func (RetConst) Type() protoreflect.EnumType { 503 | return &file_base_common_proto_enumTypes[0] 504 | } 505 | 506 | func (x RetConst) Number() protoreflect.EnumNumber { 507 | return protoreflect.EnumNumber(x) 508 | } 509 | 510 | // Deprecated: Do not use. 511 | func (x *RetConst) UnmarshalJSON(b []byte) error { 512 | num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) 513 | if err != nil { 514 | return err 515 | } 516 | *x = RetConst(num) 517 | return nil 518 | } 519 | 520 | // Deprecated: Use RetConst.Descriptor instead. 521 | func (RetConst) EnumDescriptor() ([]byte, []int) { 522 | return file_base_common_proto_rawDescGZIP(), []int{0} 523 | } 524 | 525 | type AesKey struct { 526 | state protoimpl.MessageState 527 | sizeCache protoimpl.SizeCache 528 | unknownFields protoimpl.UnknownFields 529 | 530 | Len *int32 `protobuf:"varint,1,req,name=len" json:"len,omitempty"` 531 | Key []byte `protobuf:"bytes,2,req,name=key" json:"key,omitempty"` 532 | } 533 | 534 | func (x *AesKey) Reset() { 535 | *x = AesKey{} 536 | if protoimpl.UnsafeEnabled { 537 | mi := &file_base_common_proto_msgTypes[0] 538 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 539 | ms.StoreMessageInfo(mi) 540 | } 541 | } 542 | 543 | func (x *AesKey) String() string { 544 | return protoimpl.X.MessageStringOf(x) 545 | } 546 | 547 | func (*AesKey) ProtoMessage() {} 548 | 549 | func (x *AesKey) ProtoReflect() protoreflect.Message { 550 | mi := &file_base_common_proto_msgTypes[0] 551 | if protoimpl.UnsafeEnabled && x != nil { 552 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 553 | if ms.LoadMessageInfo() == nil { 554 | ms.StoreMessageInfo(mi) 555 | } 556 | return ms 557 | } 558 | return mi.MessageOf(x) 559 | } 560 | 561 | // Deprecated: Use AesKey.ProtoReflect.Descriptor instead. 562 | func (*AesKey) Descriptor() ([]byte, []int) { 563 | return file_base_common_proto_rawDescGZIP(), []int{0} 564 | } 565 | 566 | func (x *AesKey) GetLen() int32 { 567 | if x != nil && x.Len != nil { 568 | return *x.Len 569 | } 570 | return 0 571 | } 572 | 573 | func (x *AesKey) GetKey() []byte { 574 | if x != nil { 575 | return x.Key 576 | } 577 | return nil 578 | } 579 | 580 | type RSAPem struct { 581 | state protoimpl.MessageState 582 | sizeCache protoimpl.SizeCache 583 | unknownFields protoimpl.UnknownFields 584 | 585 | Len *uint32 `protobuf:"varint,1,req,name=len" json:"len,omitempty"` 586 | Pem *string `protobuf:"bytes,2,req,name=pem" json:"pem,omitempty"` 587 | } 588 | 589 | func (x *RSAPem) Reset() { 590 | *x = RSAPem{} 591 | if protoimpl.UnsafeEnabled { 592 | mi := &file_base_common_proto_msgTypes[1] 593 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 594 | ms.StoreMessageInfo(mi) 595 | } 596 | } 597 | 598 | func (x *RSAPem) String() string { 599 | return protoimpl.X.MessageStringOf(x) 600 | } 601 | 602 | func (*RSAPem) ProtoMessage() {} 603 | 604 | func (x *RSAPem) ProtoReflect() protoreflect.Message { 605 | mi := &file_base_common_proto_msgTypes[1] 606 | if protoimpl.UnsafeEnabled && x != nil { 607 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 608 | if ms.LoadMessageInfo() == nil { 609 | ms.StoreMessageInfo(mi) 610 | } 611 | return ms 612 | } 613 | return mi.MessageOf(x) 614 | } 615 | 616 | // Deprecated: Use RSAPem.ProtoReflect.Descriptor instead. 617 | func (*RSAPem) Descriptor() ([]byte, []int) { 618 | return file_base_common_proto_rawDescGZIP(), []int{1} 619 | } 620 | 621 | func (x *RSAPem) GetLen() uint32 { 622 | if x != nil && x.Len != nil { 623 | return *x.Len 624 | } 625 | return 0 626 | } 627 | 628 | func (x *RSAPem) GetPem() string { 629 | if x != nil && x.Pem != nil { 630 | return *x.Pem 631 | } 632 | return "" 633 | } 634 | 635 | type BaseRequest struct { 636 | state protoimpl.MessageState 637 | sizeCache protoimpl.SizeCache 638 | unknownFields protoimpl.UnknownFields 639 | 640 | SessionKey []byte `protobuf:"bytes,1,req,name=sessionKey" json:"sessionKey,omitempty"` 641 | Uin *int32 `protobuf:"varint,2,req,name=uin" json:"uin,omitempty"` 642 | DeviceId []byte `protobuf:"bytes,3,req,name=deviceId" json:"deviceId,omitempty"` 643 | ClientVersion *int32 `protobuf:"varint,4,req,name=clientVersion" json:"clientVersion,omitempty"` 644 | OsType *string `protobuf:"bytes,5,req,name=osType" json:"osType,omitempty"` 645 | Scene *int32 `protobuf:"varint,6,req,name=scene" json:"scene,omitempty"` 646 | } 647 | 648 | func (x *BaseRequest) Reset() { 649 | *x = BaseRequest{} 650 | if protoimpl.UnsafeEnabled { 651 | mi := &file_base_common_proto_msgTypes[2] 652 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 653 | ms.StoreMessageInfo(mi) 654 | } 655 | } 656 | 657 | func (x *BaseRequest) String() string { 658 | return protoimpl.X.MessageStringOf(x) 659 | } 660 | 661 | func (*BaseRequest) ProtoMessage() {} 662 | 663 | func (x *BaseRequest) ProtoReflect() protoreflect.Message { 664 | mi := &file_base_common_proto_msgTypes[2] 665 | if protoimpl.UnsafeEnabled && x != nil { 666 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 667 | if ms.LoadMessageInfo() == nil { 668 | ms.StoreMessageInfo(mi) 669 | } 670 | return ms 671 | } 672 | return mi.MessageOf(x) 673 | } 674 | 675 | // Deprecated: Use BaseRequest.ProtoReflect.Descriptor instead. 676 | func (*BaseRequest) Descriptor() ([]byte, []int) { 677 | return file_base_common_proto_rawDescGZIP(), []int{2} 678 | } 679 | 680 | func (x *BaseRequest) GetSessionKey() []byte { 681 | if x != nil { 682 | return x.SessionKey 683 | } 684 | return nil 685 | } 686 | 687 | func (x *BaseRequest) GetUin() int32 { 688 | if x != nil && x.Uin != nil { 689 | return *x.Uin 690 | } 691 | return 0 692 | } 693 | 694 | func (x *BaseRequest) GetDeviceId() []byte { 695 | if x != nil { 696 | return x.DeviceId 697 | } 698 | return nil 699 | } 700 | 701 | func (x *BaseRequest) GetClientVersion() int32 { 702 | if x != nil && x.ClientVersion != nil { 703 | return *x.ClientVersion 704 | } 705 | return 0 706 | } 707 | 708 | func (x *BaseRequest) GetOsType() string { 709 | if x != nil && x.OsType != nil { 710 | return *x.OsType 711 | } 712 | return "" 713 | } 714 | 715 | func (x *BaseRequest) GetScene() int32 { 716 | if x != nil && x.Scene != nil { 717 | return *x.Scene 718 | } 719 | return 0 720 | } 721 | 722 | type SKBuiltinString struct { 723 | state protoimpl.MessageState 724 | sizeCache protoimpl.SizeCache 725 | unknownFields protoimpl.UnknownFields 726 | 727 | String_ *string `protobuf:"bytes,1,opt,name=string" json:"string,omitempty"` 728 | } 729 | 730 | func (x *SKBuiltinString) Reset() { 731 | *x = SKBuiltinString{} 732 | if protoimpl.UnsafeEnabled { 733 | mi := &file_base_common_proto_msgTypes[3] 734 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 735 | ms.StoreMessageInfo(mi) 736 | } 737 | } 738 | 739 | func (x *SKBuiltinString) String() string { 740 | return protoimpl.X.MessageStringOf(x) 741 | } 742 | 743 | func (*SKBuiltinString) ProtoMessage() {} 744 | 745 | func (x *SKBuiltinString) ProtoReflect() protoreflect.Message { 746 | mi := &file_base_common_proto_msgTypes[3] 747 | if protoimpl.UnsafeEnabled && x != nil { 748 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 749 | if ms.LoadMessageInfo() == nil { 750 | ms.StoreMessageInfo(mi) 751 | } 752 | return ms 753 | } 754 | return mi.MessageOf(x) 755 | } 756 | 757 | // Deprecated: Use SKBuiltinString.ProtoReflect.Descriptor instead. 758 | func (*SKBuiltinString) Descriptor() ([]byte, []int) { 759 | return file_base_common_proto_rawDescGZIP(), []int{3} 760 | } 761 | 762 | func (x *SKBuiltinString) GetString_() string { 763 | if x != nil && x.String_ != nil { 764 | return *x.String_ 765 | } 766 | return "" 767 | } 768 | 769 | type SKBuiltinStringBuffer struct { 770 | state protoimpl.MessageState 771 | sizeCache protoimpl.SizeCache 772 | unknownFields protoimpl.UnknownFields 773 | 774 | Len *uint32 `protobuf:"varint,1,opt,name=len" json:"len,omitempty"` 775 | Buffer []byte `protobuf:"bytes,2,opt,name=buffer" json:"buffer,omitempty"` 776 | } 777 | 778 | func (x *SKBuiltinStringBuffer) Reset() { 779 | *x = SKBuiltinStringBuffer{} 780 | if protoimpl.UnsafeEnabled { 781 | mi := &file_base_common_proto_msgTypes[4] 782 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 783 | ms.StoreMessageInfo(mi) 784 | } 785 | } 786 | 787 | func (x *SKBuiltinStringBuffer) String() string { 788 | return protoimpl.X.MessageStringOf(x) 789 | } 790 | 791 | func (*SKBuiltinStringBuffer) ProtoMessage() {} 792 | 793 | func (x *SKBuiltinStringBuffer) ProtoReflect() protoreflect.Message { 794 | mi := &file_base_common_proto_msgTypes[4] 795 | if protoimpl.UnsafeEnabled && x != nil { 796 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 797 | if ms.LoadMessageInfo() == nil { 798 | ms.StoreMessageInfo(mi) 799 | } 800 | return ms 801 | } 802 | return mi.MessageOf(x) 803 | } 804 | 805 | // Deprecated: Use SKBuiltinStringBuffer.ProtoReflect.Descriptor instead. 806 | func (*SKBuiltinStringBuffer) Descriptor() ([]byte, []int) { 807 | return file_base_common_proto_rawDescGZIP(), []int{4} 808 | } 809 | 810 | func (x *SKBuiltinStringBuffer) GetLen() uint32 { 811 | if x != nil && x.Len != nil { 812 | return *x.Len 813 | } 814 | return 0 815 | } 816 | 817 | func (x *SKBuiltinStringBuffer) GetBuffer() []byte { 818 | if x != nil { 819 | return x.Buffer 820 | } 821 | return nil 822 | } 823 | 824 | type BaseResponse struct { 825 | state protoimpl.MessageState 826 | sizeCache protoimpl.SizeCache 827 | unknownFields protoimpl.UnknownFields 828 | 829 | Ret *RetConst `protobuf:"varint,1,req,name=ret,enum=mm_pb.RetConst" json:"ret,omitempty"` 830 | ErrMsg *SKBuiltinString `protobuf:"bytes,2,opt,name=errMsg" json:"errMsg,omitempty"` 831 | } 832 | 833 | func (x *BaseResponse) Reset() { 834 | *x = BaseResponse{} 835 | if protoimpl.UnsafeEnabled { 836 | mi := &file_base_common_proto_msgTypes[5] 837 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 838 | ms.StoreMessageInfo(mi) 839 | } 840 | } 841 | 842 | func (x *BaseResponse) String() string { 843 | return protoimpl.X.MessageStringOf(x) 844 | } 845 | 846 | func (*BaseResponse) ProtoMessage() {} 847 | 848 | func (x *BaseResponse) ProtoReflect() protoreflect.Message { 849 | mi := &file_base_common_proto_msgTypes[5] 850 | if protoimpl.UnsafeEnabled && x != nil { 851 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 852 | if ms.LoadMessageInfo() == nil { 853 | ms.StoreMessageInfo(mi) 854 | } 855 | return ms 856 | } 857 | return mi.MessageOf(x) 858 | } 859 | 860 | // Deprecated: Use BaseResponse.ProtoReflect.Descriptor instead. 861 | func (*BaseResponse) Descriptor() ([]byte, []int) { 862 | return file_base_common_proto_rawDescGZIP(), []int{5} 863 | } 864 | 865 | func (x *BaseResponse) GetRet() RetConst { 866 | if x != nil && x.Ret != nil { 867 | return *x.Ret 868 | } 869 | return RetConst_MM_OK 870 | } 871 | 872 | func (x *BaseResponse) GetErrMsg() *SKBuiltinString { 873 | if x != nil { 874 | return x.ErrMsg 875 | } 876 | return nil 877 | } 878 | 879 | var File_base_common_proto protoreflect.FileDescriptor 880 | 881 | var file_base_common_proto_rawDesc = []byte{ 882 | 0x0a, 0x11, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 883 | 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x6d, 0x6d, 0x5f, 0x70, 0x62, 0x22, 0x2c, 0x0a, 0x06, 0x41, 0x65, 884 | 0x73, 0x4b, 0x65, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6c, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x02, 0x28, 885 | 0x05, 0x52, 0x03, 0x6c, 0x65, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 886 | 0x02, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x2c, 0x0a, 0x06, 0x52, 0x53, 0x41, 0x50, 887 | 0x65, 0x6d, 0x12, 0x10, 0x0a, 0x03, 0x6c, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0d, 0x52, 888 | 0x03, 0x6c, 0x65, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x65, 0x6d, 0x18, 0x02, 0x20, 0x02, 0x28, 889 | 0x09, 0x52, 0x03, 0x70, 0x65, 0x6d, 0x22, 0xaf, 0x01, 0x0a, 0x0b, 0x42, 0x61, 0x73, 0x65, 0x52, 890 | 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 891 | 0x6e, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0c, 0x52, 0x0a, 0x73, 0x65, 0x73, 0x73, 892 | 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x6e, 0x18, 0x02, 0x20, 893 | 0x02, 0x28, 0x05, 0x52, 0x03, 0x75, 0x69, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x76, 0x69, 894 | 0x63, 0x65, 0x49, 0x64, 0x18, 0x03, 0x20, 0x02, 0x28, 0x0c, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 895 | 0x63, 0x65, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x56, 0x65, 896 | 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x02, 0x28, 0x05, 0x52, 0x0d, 0x63, 0x6c, 0x69, 897 | 0x65, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x73, 898 | 0x54, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x02, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x73, 0x54, 0x79, 899 | 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x65, 0x6e, 0x65, 0x18, 0x06, 0x20, 0x02, 0x28, 900 | 0x05, 0x52, 0x05, 0x73, 0x63, 0x65, 0x6e, 0x65, 0x22, 0x29, 0x0a, 0x0f, 0x53, 0x4b, 0x42, 0x75, 901 | 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x73, 902 | 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x72, 903 | 0x69, 0x6e, 0x67, 0x22, 0x41, 0x0a, 0x15, 0x53, 0x4b, 0x42, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 904 | 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 905 | 0x6c, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6c, 0x65, 0x6e, 0x12, 0x16, 906 | 0x0a, 0x06, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 907 | 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x22, 0x61, 0x0a, 0x0c, 0x42, 0x61, 0x73, 0x65, 0x52, 0x65, 908 | 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x03, 0x72, 0x65, 0x74, 0x18, 0x01, 0x20, 909 | 0x02, 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x6d, 0x6d, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x74, 0x43, 910 | 0x6f, 0x6e, 0x73, 0x74, 0x52, 0x03, 0x72, 0x65, 0x74, 0x12, 0x2e, 0x0a, 0x06, 0x65, 0x72, 0x72, 911 | 0x4d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x6d, 0x5f, 0x70, 912 | 0x62, 0x2e, 0x53, 0x4b, 0x42, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x53, 0x74, 0x72, 0x69, 0x6e, 913 | 0x67, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x2a, 0xdc, 0x29, 0x0a, 0x08, 0x52, 0x65, 914 | 0x74, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x12, 0x09, 0x0a, 0x05, 0x4d, 0x4d, 0x5f, 0x4f, 0x4b, 0x10, 915 | 0x00, 0x12, 0x24, 0x0a, 0x17, 0x45, 0x52, 0x52, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x5f, 916 | 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x45, 0x58, 0x50, 0x49, 0x52, 0x45, 0x44, 0x10, 0xad, 0xc4, 0xc8, 917 | 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x4d, 0x4d, 0x5f, 0x42, 0x4f, 918 | 0x54, 0x54, 0x4c, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x45, 0x52, 0x52, 0x10, 0x10, 919 | 0x12, 0x1d, 0x0a, 0x19, 0x4d, 0x4d, 0x5f, 0x42, 0x4f, 0x54, 0x54, 0x4c, 0x45, 0x5f, 0x45, 0x52, 920 | 0x52, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x54, 0x59, 0x50, 0x45, 0x10, 0x0f, 0x12, 921 | 0x15, 0x0a, 0x11, 0x4d, 0x4d, 0x5f, 0x42, 0x4f, 0x54, 0x54, 0x4c, 0x45, 0x5f, 0x4e, 0x4f, 0x54, 922 | 0x45, 0x58, 0x49, 0x54, 0x10, 0x11, 0x12, 0x1e, 0x0a, 0x1a, 0x4d, 0x4d, 0x5f, 0x42, 0x4f, 0x54, 923 | 0x54, 0x4c, 0x45, 0x5f, 0x50, 0x49, 0x43, 0x4b, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x49, 0x4e, 0x56, 924 | 0x41, 0x4c, 0x49, 0x44, 0x10, 0x13, 0x12, 0x19, 0x0a, 0x15, 0x4d, 0x4d, 0x5f, 0x42, 0x4f, 0x54, 925 | 0x54, 0x4c, 0x45, 0x5f, 0x55, 0x49, 0x4e, 0x4e, 0x4f, 0x54, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x10, 926 | 0x12, 0x12, 0x21, 0x0a, 0x14, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x41, 0x43, 0x43, 0x45, 927 | 0x53, 0x53, 0x5f, 0x44, 0x45, 0x4e, 0x49, 0x45, 0x44, 0x10, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 928 | 0xff, 0xff, 0xff, 0x01, 0x12, 0x1f, 0x0a, 0x12, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x41, 929 | 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x42, 0x41, 0x4e, 0x10, 0xb8, 0xfe, 0xff, 0xff, 0xff, 930 | 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x23, 0x0a, 0x16, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 931 | 0x41, 0x4c, 0x50, 0x48, 0x41, 0x5f, 0x46, 0x4f, 0x52, 0x42, 0x49, 0x44, 0x44, 0x45, 0x4e, 0x10, 932 | 0xb5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x20, 0x0a, 0x13, 0x4d, 0x4d, 933 | 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x41, 0x4e, 0x53, 0x57, 0x45, 0x52, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 934 | 0x54, 0x10, 0xea, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x17, 0x0a, 0x0a, 935 | 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x41, 0x52, 0x47, 0x10, 0xfe, 0xff, 0xff, 0xff, 0xff, 936 | 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x25, 0x0a, 0x18, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 937 | 0x41, 0x55, 0x54, 0x48, 0x5f, 0x41, 0x4e, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x50, 0x4c, 0x41, 0x43, 938 | 0x45, 0x10, 0x9c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x1c, 0x0a, 0x0f, 939 | 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x42, 0x41, 0x44, 0x45, 0x4d, 0x41, 0x49, 0x4c, 0x10, 940 | 0xe4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x2f, 0x0a, 0x22, 0x4d, 0x4d, 941 | 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x42, 0x41, 0x54, 0x43, 0x48, 0x47, 0x45, 0x54, 0x43, 0x4f, 0x4e, 942 | 0x54, 0x41, 0x43, 0x54, 0x50, 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 943 | 0x10, 0xd3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x1f, 0x0a, 0x12, 0x4d, 944 | 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x42, 0x49, 0x47, 0x42, 0x49, 0x5a, 0x5f, 0x41, 0x55, 0x54, 945 | 0x48, 0x10, 0xbb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x2c, 0x0a, 0x1f, 946 | 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x42, 0x49, 0x4e, 0x44, 0x5f, 0x45, 0x4d, 0x41, 0x49, 947 | 0x4c, 0x5f, 0x53, 0x41, 0x4d, 0x45, 0x5f, 0x41, 0x53, 0x5f, 0x51, 0x4d, 0x41, 0x49, 0x4c, 0x10, 948 | 0xaa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x23, 0x0a, 0x16, 0x4d, 0x4d, 949 | 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x42, 0x49, 0x4e, 0x44, 0x45, 0x44, 0x5f, 0x42, 0x59, 0x5f, 0x4f, 950 | 0x54, 0x48, 0x45, 0x52, 0x10, 0xab, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 951 | 0x22, 0x0a, 0x15, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x42, 0x49, 0x4e, 0x44, 0x55, 0x49, 952 | 0x4e, 0x5f, 0x42, 0x49, 0x4e, 0x44, 0x45, 0x44, 0x10, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 953 | 0xff, 0xff, 0x01, 0x12, 0x24, 0x0a, 0x17, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x42, 0x49, 954 | 0x5a, 0x5f, 0x46, 0x41, 0x4e, 0x53, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x45, 0x44, 0x10, 0xa9, 955 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x1d, 0x0a, 0x10, 0x4d, 0x4d, 0x5f, 956 | 0x45, 0x52, 0x52, 0x5f, 0x42, 0x4c, 0x41, 0x43, 0x4b, 0x4c, 0x49, 0x53, 0x54, 0x10, 0xea, 0xff, 957 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x21, 0x0a, 0x14, 0x4d, 0x4d, 0x5f, 0x45, 958 | 0x52, 0x52, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x42, 0x59, 0x5f, 0x53, 0x50, 0x41, 0x4d, 959 | 0x10, 0x96, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x25, 0x0a, 0x18, 0x4d, 960 | 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x42, 0x4f, 0x54, 0x54, 0x4c, 0x45, 0x42, 0x41, 0x4e, 0x42, 961 | 0x59, 0x45, 0x58, 0x50, 0x4f, 0x53, 0x45, 0x10, 0xae, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 962 | 0xff, 0x01, 0x12, 0x20, 0x0a, 0x13, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x43, 0x45, 0x52, 963 | 0x54, 0x5f, 0x45, 0x58, 0x50, 0x49, 0x52, 0x45, 0x44, 0x10, 0x9a, 0xff, 0xff, 0xff, 0xff, 0xff, 964 | 0xff, 0xff, 0xff, 0x01, 0x12, 0x28, 0x0a, 0x1b, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x43, 965 | 0x48, 0x41, 0x54, 0x52, 0x4f, 0x4f, 0x4d, 0x5f, 0x4e, 0x45, 0x45, 0x44, 0x5f, 0x49, 0x4e, 0x56, 966 | 0x49, 0x54, 0x45, 0x10, 0xa4, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x2b, 967 | 0x0a, 0x1e, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x43, 0x48, 0x41, 0x54, 0x52, 0x4f, 0x4f, 968 | 0x4d, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x49, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x56, 0x49, 0x54, 0x45, 969 | 0x10, 0xa3, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x31, 0x0a, 0x24, 0x4d, 970 | 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x43, 0x4c, 0x49, 0x44, 0x42, 0x5f, 0x45, 0x4e, 0x43, 0x52, 971 | 0x59, 0x50, 0x54, 0x5f, 0x4b, 0x45, 0x59, 0x49, 0x4e, 0x46, 0x4f, 0x5f, 0x49, 0x4e, 0x56, 0x41, 972 | 0x4c, 0x49, 0x44, 0x10, 0xa6, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x1a, 973 | 0x0a, 0x0d, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x10, 974 | 0x80, 0x96, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x2c, 0x0a, 0x1f, 0x4d, 0x4d, 975 | 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x5f, 0x49, 0x4e, 0x46, 976 | 0x4f, 0x5f, 0x55, 0x52, 0x4c, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0xa5, 0xf0, 977 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x1f, 0x0a, 0x12, 0x4d, 0x4d, 0x5f, 0x45, 978 | 0x52, 0x52, 0x5f, 0x43, 0x4f, 0x4f, 0x4b, 0x49, 0x45, 0x5f, 0x4b, 0x49, 0x43, 0x4b, 0x10, 0xa8, 979 | 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x22, 0x0a, 0x15, 0x4d, 0x4d, 0x5f, 980 | 0x45, 0x52, 0x52, 0x5f, 0x43, 0x52, 0x49, 0x54, 0x49, 0x43, 0x41, 0x4c, 0x55, 0x50, 0x44, 0x41, 981 | 0x54, 0x45, 0x10, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x21, 0x0a, 982 | 0x14, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x44, 0x4f, 0x4d, 0x41, 0x49, 0x4e, 0x44, 0x49, 983 | 0x53, 0x41, 0x42, 0x4c, 0x45, 0x10, 0xe5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 984 | 0x12, 0x24, 0x0a, 0x17, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x44, 0x4f, 0x4d, 0x41, 0x49, 985 | 0x4e, 0x4d, 0x41, 0x58, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x45, 0x44, 0x10, 0xe6, 0xff, 0xff, 0xff, 986 | 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x22, 0x0a, 0x15, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 987 | 0x5f, 0x44, 0x4f, 0x4d, 0x41, 0x49, 0x4e, 0x56, 0x45, 0x52, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 988 | 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x20, 0x0a, 0x13, 0x4d, 0x4d, 989 | 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x45, 0x4d, 0x41, 0x49, 0x4c, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 990 | 0x54, 0x10, 0x91, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x1e, 0x0a, 0x11, 991 | 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x45, 0x4d, 0x41, 0x49, 0x4c, 0x45, 0x58, 0x49, 0x53, 992 | 0x54, 0x10, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x22, 0x0a, 0x15, 993 | 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x45, 0x4d, 0x41, 0x49, 0x4c, 0x4e, 0x4f, 0x54, 0x56, 994 | 0x45, 0x52, 0x49, 0x46, 0x59, 0x10, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 995 | 0x12, 0x2f, 0x0a, 0x22, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x46, 0x41, 0x43, 0x49, 0x4e, 996 | 0x47, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x43, 0x48, 0x41, 0x54, 0x52, 0x4f, 0x4f, 0x4d, 997 | 0x5f, 0x52, 0x45, 0x54, 0x52, 0x59, 0x10, 0xd0, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 998 | 0x01, 0x12, 0x1f, 0x0a, 0x12, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x46, 0x41, 0x56, 0x5f, 999 | 0x41, 0x4c, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0xf0, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1000 | 0xff, 0x01, 0x12, 0x20, 0x0a, 0x13, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x46, 0x49, 0x4c, 1001 | 0x45, 0x5f, 0x45, 0x58, 0x50, 0x49, 0x52, 0x45, 0x44, 0x10, 0xa0, 0xfd, 0xff, 0xff, 0xff, 0xff, 1002 | 0xff, 0xff, 0xff, 0x01, 0x12, 0x1e, 0x0a, 0x11, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x46, 1003 | 0x4f, 0x52, 0x43, 0x45, 0x5f, 0x51, 0x55, 0x49, 0x54, 0x10, 0xc1, 0xfb, 0xc2, 0xff, 0xff, 0xff, 1004 | 0xff, 0xff, 0xff, 0x01, 0x12, 0x22, 0x0a, 0x15, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x46, 1005 | 0x4f, 0x52, 0x43, 0x45, 0x5f, 0x52, 0x45, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x10, 0xab, 0xf0, 1006 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x20, 0x0a, 0x13, 0x4d, 0x4d, 0x5f, 0x45, 1007 | 0x52, 0x52, 0x5f, 0x46, 0x52, 0x45, 0x51, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x45, 0x44, 0x10, 1008 | 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x28, 0x0a, 0x1b, 0x4d, 0x4d, 1009 | 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x47, 0x45, 0x54, 0x4d, 0x46, 0x52, 0x49, 0x45, 0x4e, 0x44, 0x5f, 1010 | 0x4e, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0xba, 0xff, 0xff, 0xff, 0xff, 0xff, 1011 | 0xff, 0xff, 0xff, 0x01, 0x12, 0x1e, 0x0a, 0x11, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x47, 1012 | 0x4d, 0x41, 0x49, 0x4c, 0x5f, 0x49, 0x4d, 0x41, 0x50, 0x10, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, 1013 | 0xff, 0xff, 0xff, 0x01, 0x12, 0x26, 0x0a, 0x19, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x47, 1014 | 0x4d, 0x41, 0x49, 0x4c, 0x5f, 0x4f, 0x4e, 0x4c, 0x49, 0x4e, 0x45, 0x4c, 0x49, 0x4d, 0x49, 0x54, 1015 | 0x45, 0x10, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x1d, 0x0a, 0x10, 1016 | 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x47, 0x4d, 0x41, 0x49, 0x4c, 0x5f, 0x50, 0x57, 0x44, 1017 | 0x10, 0xc4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x22, 0x0a, 0x15, 0x4d, 1018 | 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x47, 0x4d, 0x41, 0x49, 0x4c, 0x5f, 0x57, 0x45, 0x42, 0x4c, 1019 | 0x4f, 0x47, 0x49, 0x4e, 0x10, 0xc2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 1020 | 0x1e, 0x0a, 0x11, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x48, 0x41, 0x53, 0x5f, 0x42, 0x49, 1021 | 0x4e, 0x44, 0x45, 0x44, 0x10, 0xac, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 1022 | 0x22, 0x0a, 0x15, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x48, 0x41, 0x53, 0x5f, 0x4e, 0x4f, 1023 | 0x5f, 0x48, 0x45, 0x41, 0x44, 0x49, 0x4d, 0x47, 0x10, 0xcb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1024 | 0xff, 0xff, 0x01, 0x12, 0x20, 0x0a, 0x13, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x48, 0x41, 1025 | 0x53, 0x5f, 0x55, 0x4e, 0x42, 0x49, 0x4e, 0x44, 0x45, 0x44, 0x10, 0xad, 0xff, 0xff, 0xff, 0xff, 1026 | 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x26, 0x0a, 0x19, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 1027 | 0x48, 0x41, 0x56, 0x45, 0x5f, 0x42, 0x49, 0x4e, 0x44, 0x5f, 0x46, 0x41, 0x43, 0x45, 0x42, 0x4f, 1028 | 0x4f, 0x4b, 0x10, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x20, 0x0a, 1029 | 0x13, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x49, 0x44, 0x43, 0x5f, 0x52, 0x45, 0x44, 0x49, 1030 | 0x52, 0x45, 0x43, 0x54, 0x10, 0xd3, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 1031 | 0x1c, 0x0a, 0x0f, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x49, 0x4d, 0x47, 0x5f, 0x52, 0x45, 1032 | 0x41, 0x44, 0x10, 0x93, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x27, 0x0a, 1033 | 0x1a, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 1034 | 0x42, 0x49, 0x4e, 0x44, 0x5f, 0x4f, 0x50, 0x4d, 0x4f, 0x44, 0x45, 0x10, 0xdb, 0xff, 0xff, 0xff, 1035 | 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x2d, 0x0a, 0x20, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 1036 | 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x43, 0x41, 1037 | 0x52, 0x44, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x43, 0x54, 0x10, 0xcc, 0xff, 0xff, 0xff, 0xff, 1038 | 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x33, 0x0a, 0x26, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 1039 | 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x48, 0x44, 0x48, 0x45, 0x41, 0x44, 0x49, 0x4d, 1040 | 0x47, 0x5f, 0x52, 0x45, 0x51, 0x5f, 0x54, 0x4f, 0x54, 0x41, 0x4c, 0x5f, 0x4c, 0x45, 0x4e, 0x10, 1041 | 0xca, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x31, 0x0a, 0x24, 0x4d, 0x4d, 1042 | 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x55, 0x50, 0x4c, 1043 | 0x4f, 0x41, 0x44, 0x4d, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x43, 0x54, 0x5f, 0x4f, 0x50, 0x4d, 0x4f, 1044 | 0x44, 0x45, 0x10, 0xda, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x20, 0x0a, 1045 | 0x13, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x49, 0x53, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x4f, 1046 | 0x57, 0x4e, 0x45, 0x52, 0x10, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 1047 | 0x22, 0x0a, 0x15, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x4b, 0x45, 0x59, 0x42, 0x55, 0x46, 1048 | 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0xaa, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 1049 | 0xff, 0xff, 0x01, 0x12, 0x22, 0x0a, 0x15, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x4c, 0x42, 1050 | 0x53, 0x42, 0x41, 0x4e, 0x42, 0x59, 0x45, 0x58, 0x50, 0x4f, 0x53, 0x45, 0x10, 0xaf, 0xf0, 0xff, 1051 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x23, 0x0a, 0x16, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 1052 | 0x52, 0x5f, 0x4c, 0x42, 0x53, 0x44, 0x41, 0x54, 0x41, 0x4e, 0x4f, 0x54, 0x46, 0x4f, 0x55, 0x4e, 1053 | 0x44, 0x10, 0xb0, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x2d, 0x0a, 0x20, 1054 | 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x4c, 0x4f, 0x47, 0x49, 0x4e, 0x5f, 0x51, 0x52, 0x43, 1055 | 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x55, 0x49, 0x44, 0x5f, 0x45, 0x58, 0x50, 0x49, 0x52, 0x45, 0x44, 1056 | 0x10, 0xa9, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x2b, 0x0a, 0x1e, 0x4d, 1057 | 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x4c, 0x4f, 0x47, 0x49, 0x4e, 0x5f, 0x55, 0x52, 0x4c, 0x5f, 1058 | 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x41, 0x46, 0x45, 0x10, 0xa7, 0xf0, 1059 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x22, 0x0a, 0x15, 0x4d, 0x4d, 0x5f, 0x45, 1060 | 0x52, 0x52, 0x5f, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, 0x5f, 0x54, 0x4f, 0x4f, 0x4d, 0x55, 0x43, 1061 | 0x48, 0x10, 0xe9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x21, 0x0a, 0x14, 1062 | 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x4d, 0x4f, 0x42, 0x49, 0x4c, 0x45, 0x5f, 0x42, 0x49, 1063 | 0x4e, 0x44, 0x45, 0x44, 0x10, 0xdd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 1064 | 0x21, 0x0a, 0x14, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x4d, 0x4f, 0x42, 0x49, 0x4c, 0x45, 1065 | 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x10, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1066 | 0xff, 0x01, 0x12, 0x25, 0x0a, 0x18, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x4d, 0x4f, 0x42, 1067 | 0x49, 0x4c, 0x45, 0x5f, 0x4e, 0x45, 0x45, 0x44, 0x41, 0x44, 0x4a, 0x55, 0x53, 0x54, 0x10, 0xb6, 1068 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x1f, 0x0a, 0x12, 0x4d, 0x4d, 0x5f, 1069 | 0x45, 0x52, 0x52, 0x5f, 0x4d, 0x4f, 0x42, 0x49, 0x4c, 0x45, 0x5f, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 1070 | 0xd9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x23, 0x0a, 0x16, 0x4d, 0x4d, 1071 | 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x4d, 0x4f, 0x42, 0x49, 0x4c, 0x45, 0x5f, 0x55, 0x4e, 0x42, 0x49, 1072 | 0x4e, 0x44, 0x45, 0x44, 0x10, 0xdc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 1073 | 0x1e, 0x0a, 0x11, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x4e, 0x45, 0x45, 0x44, 0x5f, 0x51, 1074 | 0x51, 0x50, 0x57, 0x44, 0x10, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 1075 | 0x1f, 0x0a, 0x12, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x4e, 0x45, 0x45, 0x44, 0x5f, 0x56, 1076 | 0x45, 0x52, 0x49, 0x46, 0x59, 0x10, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 1077 | 0x12, 0x24, 0x0a, 0x17, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x4e, 0x45, 0x45, 0x44, 0x5f, 1078 | 0x56, 0x45, 0x52, 0x49, 0x46, 0x59, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x10, 0xd4, 0xff, 0xff, 0xff, 1079 | 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x1b, 0x0a, 0x0e, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 1080 | 0x5f, 0x4e, 0x45, 0x45, 0x44, 0x52, 0x45, 0x47, 0x10, 0xe2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1081 | 0xff, 0xff, 0x01, 0x12, 0x21, 0x0a, 0x14, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x4e, 0x45, 1082 | 0x45, 0x44, 0x53, 0x45, 0x43, 0x4f, 0x4e, 0x44, 0x50, 0x57, 0x44, 0x10, 0xe1, 0xff, 0xff, 0xff, 1083 | 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x1c, 0x0a, 0x0f, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 1084 | 0x5f, 0x4e, 0x45, 0x57, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x10, 0xb1, 0xff, 0xff, 0xff, 0xff, 0xff, 1085 | 0xff, 0xff, 0xff, 0x01, 0x12, 0x22, 0x0a, 0x15, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x4e, 1086 | 0x49, 0x43, 0x45, 0x51, 0x51, 0x5f, 0x45, 0x58, 0x50, 0x49, 0x52, 0x45, 0x44, 0x10, 0xb8, 0xff, 1087 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x23, 0x0a, 0x16, 0x4d, 0x4d, 0x5f, 0x45, 1088 | 0x52, 0x52, 0x5f, 0x4e, 0x49, 0x43, 0x4b, 0x4e, 0x41, 0x4d, 0x45, 0x49, 0x4e, 0x56, 0x41, 0x4c, 1089 | 0x49, 0x44, 0x10, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x20, 0x0a, 1090 | 0x13, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x4e, 0x49, 0x43, 0x4b, 0x52, 0x45, 0x53, 0x45, 1091 | 0x52, 0x56, 0x45, 0x44, 0x10, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 1092 | 0x22, 0x0a, 0x15, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x4e, 0x4f, 0x5f, 0x42, 0x4f, 0x54, 1093 | 0x54, 0x4c, 0x45, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x10, 0xc8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1094 | 0xff, 0xff, 0x01, 0x12, 0x20, 0x0a, 0x13, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x4e, 0x4f, 1095 | 0x5f, 0x48, 0x44, 0x48, 0x45, 0x41, 0x44, 0x49, 0x4d, 0x47, 0x10, 0xc9, 0xff, 0xff, 0xff, 0xff, 1096 | 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x1f, 0x0a, 0x12, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 1097 | 0x4e, 0x4f, 0x5f, 0x51, 0x55, 0x45, 0x53, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0xe8, 0xfe, 0xff, 0xff, 1098 | 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x1c, 0x0a, 0x0f, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 1099 | 0x5f, 0x4e, 0x4f, 0x5f, 0x52, 0x45, 0x54, 0x52, 0x59, 0x10, 0x9b, 0xff, 0xff, 0xff, 0xff, 0xff, 1100 | 0xff, 0xff, 0xff, 0x01, 0x12, 0x1a, 0x0a, 0x0d, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x4e, 1101 | 0x4f, 0x44, 0x41, 0x54, 0x41, 0x10, 0xb5, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 1102 | 0x12, 0x1d, 0x0a, 0x10, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x4e, 0x4f, 0x54, 0x42, 0x49, 1103 | 0x4e, 0x44, 0x51, 0x51, 0x10, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 1104 | 0x26, 0x0a, 0x19, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x4e, 0x4f, 0x54, 0x43, 0x48, 0x41, 1105 | 0x54, 0x52, 0x4f, 0x4f, 0x4d, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x43, 0x54, 0x10, 0xeb, 0xff, 0xff, 1106 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x27, 0x0a, 0x1a, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 1107 | 0x52, 0x5f, 0x4e, 0x4f, 0x54, 0x4d, 0x49, 0x43, 0x52, 0x4f, 0x42, 0x4c, 0x4f, 0x47, 0x43, 0x4f, 1108 | 0x4e, 0x54, 0x41, 0x43, 0x54, 0x10, 0xec, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 1109 | 0x12, 0x25, 0x0a, 0x18, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x4e, 0x4f, 0x54, 0x4f, 0x50, 1110 | 0x45, 0x4e, 0x50, 0x52, 0x49, 0x56, 0x41, 0x54, 0x45, 0x4d, 0x53, 0x47, 0x10, 0xed, 0xff, 0xff, 1111 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x20, 0x0a, 0x13, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 1112 | 0x52, 0x5f, 0x4e, 0x4f, 0x54, 0x51, 0x51, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x43, 0x54, 0x10, 0xd2, 1113 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x20, 0x0a, 0x13, 0x4d, 0x4d, 0x5f, 1114 | 0x45, 0x52, 0x52, 0x5f, 0x4e, 0x4f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x49, 0x4e, 0x46, 0x4f, 1115 | 0x10, 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x1a, 0x0a, 0x0d, 0x4d, 1116 | 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x4e, 0x4f, 0x55, 0x53, 0x45, 0x52, 0x10, 0xfc, 0xff, 0xff, 1117 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x1f, 0x0a, 0x12, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 1118 | 0x52, 0x5f, 0x4f, 0x49, 0x44, 0x42, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0xe3, 0xff, 1119 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x25, 0x0a, 0x18, 0x4d, 0x4d, 0x5f, 0x45, 1120 | 0x52, 0x52, 0x5f, 0x4f, 0x4e, 0x45, 0x5f, 0x42, 0x49, 0x4e, 0x44, 0x54, 0x59, 0x50, 0x45, 0x5f, 1121 | 0x4c, 0x45, 0x46, 0x54, 0x10, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 1122 | 0x23, 0x0a, 0x16, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x5f, 1123 | 0x4d, 0x41, 0x49, 0x4e, 0x5f, 0x41, 0x43, 0x43, 0x54, 0x10, 0xb4, 0xfe, 0xff, 0xff, 0xff, 0xff, 1124 | 0xff, 0xff, 0xff, 0x01, 0x12, 0x1e, 0x0a, 0x11, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x50, 1125 | 0x41, 0x52, 0x53, 0x45, 0x5f, 0x4d, 0x41, 0x49, 0x4c, 0x10, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 1126 | 0xff, 0xff, 0xff, 0x01, 0x12, 0x1c, 0x0a, 0x0f, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x50, 1127 | 0x41, 0x53, 0x53, 0x57, 0x4f, 0x52, 0x44, 0x10, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1128 | 0xff, 0x01, 0x12, 0x27, 0x0a, 0x1a, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x50, 0x49, 0x43, 1129 | 0x4b, 0x42, 0x4f, 0x54, 0x54, 0x4c, 0x45, 0x5f, 0x4e, 0x4f, 0x42, 0x4f, 0x54, 0x54, 0x4c, 0x45, 1130 | 0x10, 0xc6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x1f, 0x0a, 0x12, 0x4d, 1131 | 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x51, 0x41, 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 1132 | 0x4e, 0x10, 0xe7, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x1a, 0x0a, 0x0d, 1133 | 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x51, 0x51, 0x5f, 0x42, 0x41, 0x4e, 0x10, 0xb7, 0xfe, 1134 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x25, 0x0a, 0x18, 0x4d, 0x4d, 0x5f, 0x45, 1135 | 0x52, 0x52, 0x5f, 0x51, 0x51, 0x5f, 0x4f, 0x4b, 0x5f, 0x4e, 0x45, 0x45, 0x44, 0x5f, 0x4d, 0x4f, 1136 | 0x42, 0x49, 0x4c, 0x45, 0x10, 0xb3, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 1137 | 0x2c, 0x0a, 0x1f, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x51, 0x52, 0x43, 0x4f, 0x44, 0x45, 1138 | 0x56, 0x45, 0x52, 0x49, 0x46, 0x59, 0x5f, 0x42, 0x41, 0x4e, 0x42, 0x59, 0x45, 0x58, 0x50, 0x4f, 1139 | 0x53, 0x45, 0x10, 0xac, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x22, 0x0a, 1140 | 0x15, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x51, 0x55, 0x45, 0x53, 0x54, 0x49, 0x4f, 0x4e, 1141 | 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x10, 0xe9, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1142 | 0x01, 0x12, 0x29, 0x0a, 0x1c, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x52, 0x41, 0x44, 0x41, 1143 | 0x52, 0x5f, 0x50, 0x41, 0x53, 0x53, 0x57, 0x4f, 0x52, 0x44, 0x5f, 0x53, 0x49, 0x4d, 0x50, 0x4c, 1144 | 0x45, 0x10, 0xd1, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x25, 0x0a, 0x18, 1145 | 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 1146 | 0x45, 0x44, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1147 | 0xff, 0xff, 0x01, 0x12, 0x21, 0x0a, 0x14, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x52, 0x45, 1148 | 0x47, 0x5f, 0x42, 0x55, 0x54, 0x5f, 0x4c, 0x4f, 0x47, 0x49, 0x4e, 0x10, 0xac, 0xfe, 0xff, 0xff, 1149 | 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x25, 0x0a, 0x18, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 1150 | 0x5f, 0x52, 0x45, 0x56, 0x4f, 0x4b, 0x45, 0x4d, 0x53, 0x47, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x4f, 1151 | 0x55, 0x54, 0x10, 0xd2, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x23, 0x0a, 1152 | 0x16, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x56, 0x45, 0x52, 1153 | 0x49, 0x46, 0x59, 0x43, 0x4f, 0x44, 0x45, 0x10, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1154 | 0xff, 0x01, 0x12, 0x22, 0x0a, 0x15, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x53, 0x45, 0x53, 1155 | 0x53, 0x49, 0x4f, 0x4e, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0xf3, 0xff, 0xff, 0xff, 1156 | 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x29, 0x0a, 0x1c, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 1157 | 0x5f, 0x53, 0x48, 0x41, 0x4b, 0x45, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x5f, 0x49, 0x4d, 0x47, 0x5f, 1158 | 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x10, 0xa6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1159 | 0x01, 0x12, 0x2b, 0x0a, 0x1e, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x4b, 1160 | 0x45, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x5f, 0x49, 0x4d, 0x47, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x49, 1161 | 0x4e, 0x55, 0x45, 0x10, 0xa4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x2b, 1162 | 0x0a, 0x1e, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x4b, 0x45, 0x5f, 0x54, 1163 | 0x52, 0x41, 0x4e, 0x5f, 0x49, 0x4d, 0x47, 0x5f, 0x4e, 0x4f, 0x54, 0x46, 0x4f, 0x55, 0x4e, 0x44, 1164 | 0x10, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x28, 0x0a, 0x1b, 0x4d, 1165 | 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x4b, 0x45, 0x5f, 0x54, 0x52, 0x41, 0x4e, 1166 | 0x5f, 0x49, 0x4d, 0x47, 0x5f, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x10, 0xa3, 0xff, 0xff, 0xff, 0xff, 1167 | 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x24, 0x0a, 0x17, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 1168 | 0x53, 0x48, 0x41, 0x4b, 0x45, 0x42, 0x41, 0x4e, 0x42, 0x59, 0x45, 0x58, 0x50, 0x4f, 0x53, 0x45, 1169 | 0x10, 0xad, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x1e, 0x0a, 0x18, 0x4d, 1170 | 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x53, 0x48, 0x4f, 0x52, 0x54, 0x56, 0x49, 0x44, 0x45, 0x4f, 1171 | 0x5f, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x10, 0xc0, 0x84, 0x3d, 0x12, 0x18, 0x0a, 0x0b, 0x4d, 1172 | 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x53, 0x50, 0x41, 0x4d, 0x10, 0xe8, 0xff, 0xff, 0xff, 0xff, 1173 | 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x25, 0x0a, 0x18, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 1174 | 0x53, 0x56, 0x52, 0x5f, 0x4d, 0x4f, 0x42, 0x49, 0x4c, 0x45, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 1175 | 0x54, 0x10, 0xb2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x17, 0x0a, 0x0a, 1176 | 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x53, 0x59, 0x53, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 1177 | 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x23, 0x0a, 0x16, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 1178 | 0x54, 0x49, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x4e, 0x4f, 0x54, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 1179 | 0xd0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x22, 0x0a, 0x15, 0x4d, 0x4d, 1180 | 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x54, 0x49, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x55, 0x4e, 0x4d, 0x41, 1181 | 0x54, 0x43, 0x48, 0x10, 0xd1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x22, 1182 | 0x0a, 0x15, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x54, 0x4f, 0x4c, 0x49, 0x53, 0x54, 0x5f, 1183 | 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x45, 0x44, 0x10, 0xb9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1184 | 0xff, 0x01, 0x12, 0x1c, 0x0a, 0x0f, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x54, 0x52, 0x59, 1185 | 0x51, 0x51, 0x50, 0x57, 0x44, 0x10, 0xb7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 1186 | 0x12, 0x1c, 0x0a, 0x0f, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x55, 0x49, 0x4e, 0x45, 0x58, 1187 | 0x49, 0x53, 0x54, 0x10, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x24, 1188 | 0x0a, 0x17, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x55, 0x4e, 0x42, 0x49, 0x4e, 0x44, 0x5f, 1189 | 0x4d, 0x41, 0x49, 0x4e, 0x5f, 0x41, 0x43, 0x43, 0x54, 0x10, 0xb2, 0xfe, 0xff, 0xff, 0xff, 0xff, 1190 | 0xff, 0xff, 0xff, 0x01, 0x12, 0x2c, 0x0a, 0x1f, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x55, 1191 | 0x4e, 0x42, 0x49, 0x4e, 0x44, 0x5f, 0x4d, 0x4f, 0x42, 0x49, 0x4c, 0x45, 0x5f, 0x4e, 0x45, 0x45, 1192 | 0x44, 0x5f, 0x51, 0x51, 0x50, 0x57, 0x44, 0x10, 0xb6, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1193 | 0xff, 0x01, 0x12, 0x26, 0x0a, 0x19, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x55, 0x4e, 0x42, 1194 | 0x49, 0x4e, 0x44, 0x5f, 0x52, 0x45, 0x47, 0x42, 0x59, 0x4d, 0x4f, 0x42, 0x49, 0x4c, 0x45, 0x10, 1195 | 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x22, 0x0a, 0x15, 0x4d, 0x4d, 1196 | 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x55, 0x4e, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4d, 0x4f, 0x42, 1197 | 0x49, 0x4c, 0x45, 0x10, 0xd8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x25, 1198 | 0x0a, 0x18, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x55, 0x50, 0x50, 0x4f, 1199 | 0x52, 0x54, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x52, 0x59, 0x10, 0xc5, 0xff, 0xff, 0xff, 0xff, 1200 | 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x24, 0x0a, 0x17, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 1201 | 0x55, 0x53, 0x45, 0x52, 0x5f, 0x42, 0x49, 0x4e, 0x44, 0x5f, 0x4d, 0x4f, 0x42, 0x49, 0x4c, 0x45, 1202 | 0x10, 0xd5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x27, 0x0a, 0x1a, 0x4d, 1203 | 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x4d, 0x4f, 0x42, 0x49, 0x4c, 1204 | 0x45, 0x5f, 0x55, 0x4e, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x10, 0xd6, 0xff, 0xff, 0xff, 0xff, 0xff, 1205 | 0xff, 0xff, 0xff, 0x01, 0x12, 0x24, 0x0a, 0x17, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x55, 1206 | 0x53, 0x45, 0x52, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x53, 0x55, 0x50, 0x50, 0x4f, 0x52, 0x54, 0x10, 1207 | 0xa2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x27, 0x0a, 0x1a, 0x4d, 0x4d, 1208 | 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x56, 0x45, 1209 | 0x52, 0x49, 0x46, 0x59, 0x55, 0x53, 0x45, 0x52, 0x10, 0xd2, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 1210 | 0xff, 0xff, 0x01, 0x12, 0x1d, 0x0a, 0x10, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x55, 0x53, 1211 | 0x45, 0x52, 0x45, 0x58, 0x49, 0x53, 0x54, 0x10, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1212 | 0xff, 0x01, 0x12, 0x23, 0x0a, 0x16, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x55, 0x53, 0x45, 1213 | 0x52, 0x4e, 0x41, 0x4d, 0x45, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0xf2, 0xff, 0xff, 1214 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x20, 0x0a, 0x13, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 1215 | 0x52, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x52, 0x45, 0x53, 0x45, 0x52, 0x56, 0x45, 0x44, 0x10, 0xf6, 1216 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x1f, 0x0a, 0x12, 0x4d, 0x4d, 0x5f, 1217 | 0x45, 0x52, 0x52, 0x5f, 0x55, 0x55, 0x49, 0x44, 0x5f, 0x42, 0x49, 0x4e, 0x44, 0x45, 0x44, 0x10, 1218 | 0xb4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x27, 0x0a, 0x1a, 0x4d, 0x4d, 1219 | 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x56, 0x45, 0x52, 0x49, 0x46, 0x59, 0x43, 0x4f, 0x44, 0x45, 0x5f, 1220 | 0x4e, 0x4f, 0x54, 0x45, 0x58, 0x49, 0x53, 0x54, 0x10, 0xcd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1221 | 0xff, 0xff, 0x01, 0x12, 0x26, 0x0a, 0x19, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x56, 0x45, 1222 | 0x52, 0x49, 0x46, 0x59, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 1223 | 0x10, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x26, 0x0a, 0x19, 0x4d, 1224 | 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x56, 0x45, 0x52, 0x49, 0x46, 0x59, 0x43, 0x4f, 0x44, 0x45, 1225 | 0x5f, 0x55, 0x4e, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x10, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1226 | 0xff, 0xff, 0x01, 0x12, 0x24, 0x0a, 0x17, 0x4d, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x5f, 0x57, 0x45, 1227 | 0x49, 0x42, 0x4f, 0x5f, 0x50, 0x55, 0x53, 0x48, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x10, 0xb0, 1228 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x25, 0x0a, 0x18, 0x4d, 0x4d, 0x5f, 1229 | 0x45, 0x52, 0x52, 0x5f, 0x57, 0x52, 0x4f, 0x4e, 0x47, 0x5f, 0x53, 0x45, 0x53, 0x53, 0x49, 0x4f, 1230 | 0x4e, 0x5f, 0x4b, 0x45, 0x59, 0x10, 0xb3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 1231 | 0x12, 0x2c, 0x0a, 0x1f, 0x4d, 0x4d, 0x5f, 0x46, 0x41, 0x43, 0x45, 0x42, 0x4f, 0x4f, 0x4b, 0x5f, 1232 | 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x5f, 0x55, 0x4e, 0x56, 0x41, 1233 | 0x4c, 0x49, 0x44, 0x10, 0xbc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x12, 1234 | 0x0a, 0x0d, 0x4d, 0x4d, 0x53, 0x4e, 0x53, 0x5f, 0x52, 0x45, 0x54, 0x5f, 0x42, 0x41, 0x4e, 0x10, 1235 | 0xca, 0x01, 0x12, 0x1d, 0x0a, 0x18, 0x4d, 0x4d, 0x53, 0x4e, 0x53, 0x5f, 0x52, 0x45, 0x54, 0x5f, 1236 | 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x49, 0x44, 0x5f, 0x45, 0x58, 0x49, 0x53, 0x54, 0x10, 0xce, 1237 | 0x01, 0x12, 0x20, 0x0a, 0x1b, 0x4d, 0x4d, 0x53, 0x4e, 0x53, 0x5f, 0x52, 0x45, 0x54, 0x5f, 0x43, 1238 | 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x48, 0x41, 0x56, 0x45, 0x5f, 0x4c, 0x49, 0x4b, 0x45, 1239 | 0x10, 0xcc, 0x01, 0x12, 0x20, 0x0a, 0x1b, 0x4d, 0x4d, 0x53, 0x4e, 0x53, 0x5f, 0x52, 0x45, 0x54, 1240 | 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x41, 0x4c, 0x4c, 1241 | 0x4f, 0x57, 0x10, 0xcd, 0x01, 0x12, 0x1e, 0x0a, 0x19, 0x4d, 0x4d, 0x53, 0x4e, 0x53, 0x5f, 0x52, 1242 | 0x45, 0x54, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x50, 0x52, 0x49, 0x56, 0x41, 1243 | 0x43, 0x59, 0x10, 0xd0, 0x01, 0x12, 0x14, 0x0a, 0x0f, 0x4d, 0x4d, 0x53, 0x4e, 0x53, 0x5f, 0x52, 1244 | 0x45, 0x54, 0x5f, 0x49, 0x53, 0x41, 0x4c, 0x4c, 0x10, 0xcf, 0x01, 0x12, 0x16, 0x0a, 0x11, 0x4d, 1245 | 0x4d, 0x53, 0x4e, 0x53, 0x5f, 0x52, 0x45, 0x54, 0x5f, 0x50, 0x52, 0x49, 0x56, 0x41, 0x43, 0x59, 1246 | 0x10, 0xcb, 0x01, 0x12, 0x13, 0x0a, 0x0e, 0x4d, 0x4d, 0x53, 0x4e, 0x53, 0x5f, 0x52, 0x45, 0x54, 1247 | 0x5f, 0x53, 0x50, 0x41, 0x4d, 0x10, 0xc9, 0x01, 0x42, 0x09, 0x5a, 0x07, 0x2e, 0x3b, 0x6d, 0x6d, 1248 | 0x5f, 0x70, 0x62, 1249 | } 1250 | 1251 | var ( 1252 | file_base_common_proto_rawDescOnce sync.Once 1253 | file_base_common_proto_rawDescData = file_base_common_proto_rawDesc 1254 | ) 1255 | 1256 | func file_base_common_proto_rawDescGZIP() []byte { 1257 | file_base_common_proto_rawDescOnce.Do(func() { 1258 | file_base_common_proto_rawDescData = protoimpl.X.CompressGZIP(file_base_common_proto_rawDescData) 1259 | }) 1260 | return file_base_common_proto_rawDescData 1261 | } 1262 | 1263 | var file_base_common_proto_enumTypes = make([]protoimpl.EnumInfo, 1) 1264 | var file_base_common_proto_msgTypes = make([]protoimpl.MessageInfo, 6) 1265 | var file_base_common_proto_goTypes = []interface{}{ 1266 | (RetConst)(0), // 0: mm_pb.RetConst 1267 | (*AesKey)(nil), // 1: mm_pb.AesKey 1268 | (*RSAPem)(nil), // 2: mm_pb.RSAPem 1269 | (*BaseRequest)(nil), // 3: mm_pb.BaseRequest 1270 | (*SKBuiltinString)(nil), // 4: mm_pb.SKBuiltinString 1271 | (*SKBuiltinStringBuffer)(nil), // 5: mm_pb.SKBuiltinStringBuffer 1272 | (*BaseResponse)(nil), // 6: mm_pb.BaseResponse 1273 | } 1274 | var file_base_common_proto_depIdxs = []int32{ 1275 | 0, // 0: mm_pb.BaseResponse.ret:type_name -> mm_pb.RetConst 1276 | 4, // 1: mm_pb.BaseResponse.errMsg:type_name -> mm_pb.SKBuiltinString 1277 | 2, // [2:2] is the sub-list for method output_type 1278 | 2, // [2:2] is the sub-list for method input_type 1279 | 2, // [2:2] is the sub-list for extension type_name 1280 | 2, // [2:2] is the sub-list for extension extendee 1281 | 0, // [0:2] is the sub-list for field type_name 1282 | } 1283 | 1284 | func init() { file_base_common_proto_init() } 1285 | func file_base_common_proto_init() { 1286 | if File_base_common_proto != nil { 1287 | return 1288 | } 1289 | if !protoimpl.UnsafeEnabled { 1290 | file_base_common_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { 1291 | switch v := v.(*AesKey); i { 1292 | case 0: 1293 | return &v.state 1294 | case 1: 1295 | return &v.sizeCache 1296 | case 2: 1297 | return &v.unknownFields 1298 | default: 1299 | return nil 1300 | } 1301 | } 1302 | file_base_common_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { 1303 | switch v := v.(*RSAPem); i { 1304 | case 0: 1305 | return &v.state 1306 | case 1: 1307 | return &v.sizeCache 1308 | case 2: 1309 | return &v.unknownFields 1310 | default: 1311 | return nil 1312 | } 1313 | } 1314 | file_base_common_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { 1315 | switch v := v.(*BaseRequest); i { 1316 | case 0: 1317 | return &v.state 1318 | case 1: 1319 | return &v.sizeCache 1320 | case 2: 1321 | return &v.unknownFields 1322 | default: 1323 | return nil 1324 | } 1325 | } 1326 | file_base_common_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { 1327 | switch v := v.(*SKBuiltinString); i { 1328 | case 0: 1329 | return &v.state 1330 | case 1: 1331 | return &v.sizeCache 1332 | case 2: 1333 | return &v.unknownFields 1334 | default: 1335 | return nil 1336 | } 1337 | } 1338 | file_base_common_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { 1339 | switch v := v.(*SKBuiltinStringBuffer); i { 1340 | case 0: 1341 | return &v.state 1342 | case 1: 1343 | return &v.sizeCache 1344 | case 2: 1345 | return &v.unknownFields 1346 | default: 1347 | return nil 1348 | } 1349 | } 1350 | file_base_common_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { 1351 | switch v := v.(*BaseResponse); i { 1352 | case 0: 1353 | return &v.state 1354 | case 1: 1355 | return &v.sizeCache 1356 | case 2: 1357 | return &v.unknownFields 1358 | default: 1359 | return nil 1360 | } 1361 | } 1362 | } 1363 | type x struct{} 1364 | out := protoimpl.TypeBuilder{ 1365 | File: protoimpl.DescBuilder{ 1366 | GoPackagePath: reflect.TypeOf(x{}).PkgPath(), 1367 | RawDescriptor: file_base_common_proto_rawDesc, 1368 | NumEnums: 1, 1369 | NumMessages: 6, 1370 | NumExtensions: 0, 1371 | NumServices: 0, 1372 | }, 1373 | GoTypes: file_base_common_proto_goTypes, 1374 | DependencyIndexes: file_base_common_proto_depIdxs, 1375 | EnumInfos: file_base_common_proto_enumTypes, 1376 | MessageInfos: file_base_common_proto_msgTypes, 1377 | }.Build() 1378 | File_base_common_proto = out.File 1379 | file_base_common_proto_rawDesc = nil 1380 | file_base_common_proto_goTypes = nil 1381 | file_base_common_proto_depIdxs = nil 1382 | } 1383 | --------------------------------------------------------------------------------