converting hard-coded prefixes to calls to validators and authenticators

This commit is contained in:
or-else
2020-07-09 20:54:33 -07:00
parent 21b6d713e1
commit 0897120da3
14 changed files with 456 additions and 354 deletions

View File

@ -50,7 +50,7 @@ func (x AuthLevel) String() string {
return proto.EnumName(AuthLevel_name, int32(x)) return proto.EnumName(AuthLevel_name, int32(x))
} }
func (AuthLevel) EnumDescriptor() ([]byte, []int) { func (AuthLevel) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_model_45d32aef7fcc5f78, []int{0} return fileDescriptor_model_92588c8639c67d56, []int{0}
} }
type InfoNote int32 type InfoNote int32
@ -76,7 +76,7 @@ func (x InfoNote) String() string {
return proto.EnumName(InfoNote_name, int32(x)) return proto.EnumName(InfoNote_name, int32(x))
} }
func (InfoNote) EnumDescriptor() ([]byte, []int) { func (InfoNote) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_model_45d32aef7fcc5f78, []int{1} return fileDescriptor_model_92588c8639c67d56, []int{1}
} }
// Plugin response codes // Plugin response codes
@ -111,7 +111,7 @@ func (x RespCode) String() string {
return proto.EnumName(RespCode_name, int32(x)) return proto.EnumName(RespCode_name, int32(x))
} }
func (RespCode) EnumDescriptor() ([]byte, []int) { func (RespCode) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_model_45d32aef7fcc5f78, []int{2} return fileDescriptor_model_92588c8639c67d56, []int{2}
} }
type Crud int32 type Crud int32
@ -137,7 +137,7 @@ func (x Crud) String() string {
return proto.EnumName(Crud_name, int32(x)) return proto.EnumName(Crud_name, int32(x))
} }
func (Crud) EnumDescriptor() ([]byte, []int) { func (Crud) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_model_45d32aef7fcc5f78, []int{3} return fileDescriptor_model_92588c8639c67d56, []int{3}
} }
// What to delete, either "msg" to delete messages (default) or "topic" to delete the topic or "sub" // What to delete, either "msg" to delete messages (default) or "topic" to delete the topic or "sub"
@ -171,7 +171,7 @@ func (x ClientDel_What) String() string {
return proto.EnumName(ClientDel_What_name, int32(x)) return proto.EnumName(ClientDel_What_name, int32(x))
} }
func (ClientDel_What) EnumDescriptor() ([]byte, []int) { func (ClientDel_What) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_model_45d32aef7fcc5f78, []int{18, 0} return fileDescriptor_model_92588c8639c67d56, []int{18, 0}
} }
type ServerPres_What int32 type ServerPres_What int32
@ -224,7 +224,7 @@ func (x ServerPres_What) String() string {
return proto.EnumName(ServerPres_What_name, int32(x)) return proto.EnumName(ServerPres_What_name, int32(x))
} }
func (ServerPres_What) EnumDescriptor() ([]byte, []int) { func (ServerPres_What) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_model_45d32aef7fcc5f78, []int{27, 0} return fileDescriptor_model_92588c8639c67d56, []int{27, 0}
} }
// Dummy placeholder message. // Dummy placeholder message.
@ -238,7 +238,7 @@ func (m *Unused) Reset() { *m = Unused{} }
func (m *Unused) String() string { return proto.CompactTextString(m) } func (m *Unused) String() string { return proto.CompactTextString(m) }
func (*Unused) ProtoMessage() {} func (*Unused) ProtoMessage() {}
func (*Unused) Descriptor() ([]byte, []int) { func (*Unused) Descriptor() ([]byte, []int) {
return fileDescriptor_model_45d32aef7fcc5f78, []int{0} return fileDescriptor_model_92588c8639c67d56, []int{0}
} }
func (m *Unused) XXX_Unmarshal(b []byte) error { func (m *Unused) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Unused.Unmarshal(m, b) return xxx_messageInfo_Unused.Unmarshal(m, b)
@ -271,7 +271,7 @@ func (m *DefaultAcsMode) Reset() { *m = DefaultAcsMode{} }
func (m *DefaultAcsMode) String() string { return proto.CompactTextString(m) } func (m *DefaultAcsMode) String() string { return proto.CompactTextString(m) }
func (*DefaultAcsMode) ProtoMessage() {} func (*DefaultAcsMode) ProtoMessage() {}
func (*DefaultAcsMode) Descriptor() ([]byte, []int) { func (*DefaultAcsMode) Descriptor() ([]byte, []int) {
return fileDescriptor_model_45d32aef7fcc5f78, []int{1} return fileDescriptor_model_92588c8639c67d56, []int{1}
} }
func (m *DefaultAcsMode) XXX_Unmarshal(b []byte) error { func (m *DefaultAcsMode) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DefaultAcsMode.Unmarshal(m, b) return xxx_messageInfo_DefaultAcsMode.Unmarshal(m, b)
@ -320,7 +320,7 @@ func (m *AccessMode) Reset() { *m = AccessMode{} }
func (m *AccessMode) String() string { return proto.CompactTextString(m) } func (m *AccessMode) String() string { return proto.CompactTextString(m) }
func (*AccessMode) ProtoMessage() {} func (*AccessMode) ProtoMessage() {}
func (*AccessMode) Descriptor() ([]byte, []int) { func (*AccessMode) Descriptor() ([]byte, []int) {
return fileDescriptor_model_45d32aef7fcc5f78, []int{2} return fileDescriptor_model_92588c8639c67d56, []int{2}
} }
func (m *AccessMode) XXX_Unmarshal(b []byte) error { func (m *AccessMode) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_AccessMode.Unmarshal(m, b) return xxx_messageInfo_AccessMode.Unmarshal(m, b)
@ -369,7 +369,7 @@ func (m *SetSub) Reset() { *m = SetSub{} }
func (m *SetSub) String() string { return proto.CompactTextString(m) } func (m *SetSub) String() string { return proto.CompactTextString(m) }
func (*SetSub) ProtoMessage() {} func (*SetSub) ProtoMessage() {}
func (*SetSub) Descriptor() ([]byte, []int) { func (*SetSub) Descriptor() ([]byte, []int) {
return fileDescriptor_model_45d32aef7fcc5f78, []int{3} return fileDescriptor_model_92588c8639c67d56, []int{3}
} }
func (m *SetSub) XXX_Unmarshal(b []byte) error { func (m *SetSub) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SetSub.Unmarshal(m, b) return xxx_messageInfo_SetSub.Unmarshal(m, b)
@ -411,18 +411,18 @@ type ClientCred struct {
Value string `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` Value string `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"`
// Verification response // Verification response
Response string `protobuf:"bytes,3,opt,name=response" json:"response,omitempty"` Response string `protobuf:"bytes,3,opt,name=response" json:"response,omitempty"`
// Request parameters, such as preferences. // Request parameters, such as preferences or country code.
Params []byte `protobuf:"bytes,4,opt,name=params,proto3" json:"params,omitempty"` Params map[string][]byte `protobuf:"bytes,4,rep,name=params" json:"params,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value,proto3"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
} }
func (m *ClientCred) Reset() { *m = ClientCred{} } func (m *ClientCred) Reset() { *m = ClientCred{} }
func (m *ClientCred) String() string { return proto.CompactTextString(m) } func (m *ClientCred) String() string { return proto.CompactTextString(m) }
func (*ClientCred) ProtoMessage() {} func (*ClientCred) ProtoMessage() {}
func (*ClientCred) Descriptor() ([]byte, []int) { func (*ClientCred) Descriptor() ([]byte, []int) {
return fileDescriptor_model_45d32aef7fcc5f78, []int{4} return fileDescriptor_model_92588c8639c67d56, []int{4}
} }
func (m *ClientCred) XXX_Unmarshal(b []byte) error { func (m *ClientCred) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ClientCred.Unmarshal(m, b) return xxx_messageInfo_ClientCred.Unmarshal(m, b)
@ -463,7 +463,7 @@ func (m *ClientCred) GetResponse() string {
return "" return ""
} }
func (m *ClientCred) GetParams() []byte { func (m *ClientCred) GetParams() map[string][]byte {
if m != nil { if m != nil {
return m.Params return m.Params
} }
@ -484,7 +484,7 @@ func (m *SetDesc) Reset() { *m = SetDesc{} }
func (m *SetDesc) String() string { return proto.CompactTextString(m) } func (m *SetDesc) String() string { return proto.CompactTextString(m) }
func (*SetDesc) ProtoMessage() {} func (*SetDesc) ProtoMessage() {}
func (*SetDesc) Descriptor() ([]byte, []int) { func (*SetDesc) Descriptor() ([]byte, []int) {
return fileDescriptor_model_45d32aef7fcc5f78, []int{5} return fileDescriptor_model_92588c8639c67d56, []int{5}
} }
func (m *SetDesc) XXX_Unmarshal(b []byte) error { func (m *SetDesc) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SetDesc.Unmarshal(m, b) return xxx_messageInfo_SetDesc.Unmarshal(m, b)
@ -547,7 +547,7 @@ func (m *GetOpts) Reset() { *m = GetOpts{} }
func (m *GetOpts) String() string { return proto.CompactTextString(m) } func (m *GetOpts) String() string { return proto.CompactTextString(m) }
func (*GetOpts) ProtoMessage() {} func (*GetOpts) ProtoMessage() {}
func (*GetOpts) Descriptor() ([]byte, []int) { func (*GetOpts) Descriptor() ([]byte, []int) {
return fileDescriptor_model_45d32aef7fcc5f78, []int{6} return fileDescriptor_model_92588c8639c67d56, []int{6}
} }
func (m *GetOpts) XXX_Unmarshal(b []byte) error { func (m *GetOpts) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetOpts.Unmarshal(m, b) return xxx_messageInfo_GetOpts.Unmarshal(m, b)
@ -626,7 +626,7 @@ func (m *GetQuery) Reset() { *m = GetQuery{} }
func (m *GetQuery) String() string { return proto.CompactTextString(m) } func (m *GetQuery) String() string { return proto.CompactTextString(m) }
func (*GetQuery) ProtoMessage() {} func (*GetQuery) ProtoMessage() {}
func (*GetQuery) Descriptor() ([]byte, []int) { func (*GetQuery) Descriptor() ([]byte, []int) {
return fileDescriptor_model_45d32aef7fcc5f78, []int{7} return fileDescriptor_model_92588c8639c67d56, []int{7}
} }
func (m *GetQuery) XXX_Unmarshal(b []byte) error { func (m *GetQuery) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetQuery.Unmarshal(m, b) return xxx_messageInfo_GetQuery.Unmarshal(m, b)
@ -692,7 +692,7 @@ func (m *SetQuery) Reset() { *m = SetQuery{} }
func (m *SetQuery) String() string { return proto.CompactTextString(m) } func (m *SetQuery) String() string { return proto.CompactTextString(m) }
func (*SetQuery) ProtoMessage() {} func (*SetQuery) ProtoMessage() {}
func (*SetQuery) Descriptor() ([]byte, []int) { func (*SetQuery) Descriptor() ([]byte, []int) {
return fileDescriptor_model_45d32aef7fcc5f78, []int{8} return fileDescriptor_model_92588c8639c67d56, []int{8}
} }
func (m *SetQuery) XXX_Unmarshal(b []byte) error { func (m *SetQuery) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SetQuery.Unmarshal(m, b) return xxx_messageInfo_SetQuery.Unmarshal(m, b)
@ -752,7 +752,7 @@ func (m *SeqRange) Reset() { *m = SeqRange{} }
func (m *SeqRange) String() string { return proto.CompactTextString(m) } func (m *SeqRange) String() string { return proto.CompactTextString(m) }
func (*SeqRange) ProtoMessage() {} func (*SeqRange) ProtoMessage() {}
func (*SeqRange) Descriptor() ([]byte, []int) { func (*SeqRange) Descriptor() ([]byte, []int) {
return fileDescriptor_model_45d32aef7fcc5f78, []int{9} return fileDescriptor_model_92588c8639c67d56, []int{9}
} }
func (m *SeqRange) XXX_Unmarshal(b []byte) error { func (m *SeqRange) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SeqRange.Unmarshal(m, b) return xxx_messageInfo_SeqRange.Unmarshal(m, b)
@ -804,7 +804,7 @@ func (m *ClientHi) Reset() { *m = ClientHi{} }
func (m *ClientHi) String() string { return proto.CompactTextString(m) } func (m *ClientHi) String() string { return proto.CompactTextString(m) }
func (*ClientHi) ProtoMessage() {} func (*ClientHi) ProtoMessage() {}
func (*ClientHi) Descriptor() ([]byte, []int) { func (*ClientHi) Descriptor() ([]byte, []int) {
return fileDescriptor_model_45d32aef7fcc5f78, []int{10} return fileDescriptor_model_92588c8639c67d56, []int{10}
} }
func (m *ClientHi) XXX_Unmarshal(b []byte) error { func (m *ClientHi) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ClientHi.Unmarshal(m, b) return xxx_messageInfo_ClientHi.Unmarshal(m, b)
@ -903,7 +903,7 @@ func (m *ClientAcc) Reset() { *m = ClientAcc{} }
func (m *ClientAcc) String() string { return proto.CompactTextString(m) } func (m *ClientAcc) String() string { return proto.CompactTextString(m) }
func (*ClientAcc) ProtoMessage() {} func (*ClientAcc) ProtoMessage() {}
func (*ClientAcc) Descriptor() ([]byte, []int) { func (*ClientAcc) Descriptor() ([]byte, []int) {
return fileDescriptor_model_45d32aef7fcc5f78, []int{11} return fileDescriptor_model_92588c8639c67d56, []int{11}
} }
func (m *ClientAcc) XXX_Unmarshal(b []byte) error { func (m *ClientAcc) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ClientAcc.Unmarshal(m, b) return xxx_messageInfo_ClientAcc.Unmarshal(m, b)
@ -1011,7 +1011,7 @@ func (m *ClientLogin) Reset() { *m = ClientLogin{} }
func (m *ClientLogin) String() string { return proto.CompactTextString(m) } func (m *ClientLogin) String() string { return proto.CompactTextString(m) }
func (*ClientLogin) ProtoMessage() {} func (*ClientLogin) ProtoMessage() {}
func (*ClientLogin) Descriptor() ([]byte, []int) { func (*ClientLogin) Descriptor() ([]byte, []int) {
return fileDescriptor_model_45d32aef7fcc5f78, []int{12} return fileDescriptor_model_92588c8639c67d56, []int{12}
} }
func (m *ClientLogin) XXX_Unmarshal(b []byte) error { func (m *ClientLogin) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ClientLogin.Unmarshal(m, b) return xxx_messageInfo_ClientLogin.Unmarshal(m, b)
@ -1076,7 +1076,7 @@ func (m *ClientSub) Reset() { *m = ClientSub{} }
func (m *ClientSub) String() string { return proto.CompactTextString(m) } func (m *ClientSub) String() string { return proto.CompactTextString(m) }
func (*ClientSub) ProtoMessage() {} func (*ClientSub) ProtoMessage() {}
func (*ClientSub) Descriptor() ([]byte, []int) { func (*ClientSub) Descriptor() ([]byte, []int) {
return fileDescriptor_model_45d32aef7fcc5f78, []int{13} return fileDescriptor_model_92588c8639c67d56, []int{13}
} }
func (m *ClientSub) XXX_Unmarshal(b []byte) error { func (m *ClientSub) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ClientSub.Unmarshal(m, b) return xxx_messageInfo_ClientSub.Unmarshal(m, b)
@ -1138,7 +1138,7 @@ func (m *ClientLeave) Reset() { *m = ClientLeave{} }
func (m *ClientLeave) String() string { return proto.CompactTextString(m) } func (m *ClientLeave) String() string { return proto.CompactTextString(m) }
func (*ClientLeave) ProtoMessage() {} func (*ClientLeave) ProtoMessage() {}
func (*ClientLeave) Descriptor() ([]byte, []int) { func (*ClientLeave) Descriptor() ([]byte, []int) {
return fileDescriptor_model_45d32aef7fcc5f78, []int{14} return fileDescriptor_model_92588c8639c67d56, []int{14}
} }
func (m *ClientLeave) XXX_Unmarshal(b []byte) error { func (m *ClientLeave) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ClientLeave.Unmarshal(m, b) return xxx_messageInfo_ClientLeave.Unmarshal(m, b)
@ -1195,7 +1195,7 @@ func (m *ClientPub) Reset() { *m = ClientPub{} }
func (m *ClientPub) String() string { return proto.CompactTextString(m) } func (m *ClientPub) String() string { return proto.CompactTextString(m) }
func (*ClientPub) ProtoMessage() {} func (*ClientPub) ProtoMessage() {}
func (*ClientPub) Descriptor() ([]byte, []int) { func (*ClientPub) Descriptor() ([]byte, []int) {
return fileDescriptor_model_45d32aef7fcc5f78, []int{15} return fileDescriptor_model_92588c8639c67d56, []int{15}
} }
func (m *ClientPub) XXX_Unmarshal(b []byte) error { func (m *ClientPub) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ClientPub.Unmarshal(m, b) return xxx_messageInfo_ClientPub.Unmarshal(m, b)
@ -1264,7 +1264,7 @@ func (m *ClientGet) Reset() { *m = ClientGet{} }
func (m *ClientGet) String() string { return proto.CompactTextString(m) } func (m *ClientGet) String() string { return proto.CompactTextString(m) }
func (*ClientGet) ProtoMessage() {} func (*ClientGet) ProtoMessage() {}
func (*ClientGet) Descriptor() ([]byte, []int) { func (*ClientGet) Descriptor() ([]byte, []int) {
return fileDescriptor_model_45d32aef7fcc5f78, []int{16} return fileDescriptor_model_92588c8639c67d56, []int{16}
} }
func (m *ClientGet) XXX_Unmarshal(b []byte) error { func (m *ClientGet) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ClientGet.Unmarshal(m, b) return xxx_messageInfo_ClientGet.Unmarshal(m, b)
@ -1319,7 +1319,7 @@ func (m *ClientSet) Reset() { *m = ClientSet{} }
func (m *ClientSet) String() string { return proto.CompactTextString(m) } func (m *ClientSet) String() string { return proto.CompactTextString(m) }
func (*ClientSet) ProtoMessage() {} func (*ClientSet) ProtoMessage() {}
func (*ClientSet) Descriptor() ([]byte, []int) { func (*ClientSet) Descriptor() ([]byte, []int) {
return fileDescriptor_model_45d32aef7fcc5f78, []int{17} return fileDescriptor_model_92588c8639c67d56, []int{17}
} }
func (m *ClientSet) XXX_Unmarshal(b []byte) error { func (m *ClientSet) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ClientSet.Unmarshal(m, b) return xxx_messageInfo_ClientSet.Unmarshal(m, b)
@ -1382,7 +1382,7 @@ func (m *ClientDel) Reset() { *m = ClientDel{} }
func (m *ClientDel) String() string { return proto.CompactTextString(m) } func (m *ClientDel) String() string { return proto.CompactTextString(m) }
func (*ClientDel) ProtoMessage() {} func (*ClientDel) ProtoMessage() {}
func (*ClientDel) Descriptor() ([]byte, []int) { func (*ClientDel) Descriptor() ([]byte, []int) {
return fileDescriptor_model_45d32aef7fcc5f78, []int{18} return fileDescriptor_model_92588c8639c67d56, []int{18}
} }
func (m *ClientDel) XXX_Unmarshal(b []byte) error { func (m *ClientDel) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ClientDel.Unmarshal(m, b) return xxx_messageInfo_ClientDel.Unmarshal(m, b)
@ -1467,7 +1467,7 @@ func (m *ClientNote) Reset() { *m = ClientNote{} }
func (m *ClientNote) String() string { return proto.CompactTextString(m) } func (m *ClientNote) String() string { return proto.CompactTextString(m) }
func (*ClientNote) ProtoMessage() {} func (*ClientNote) ProtoMessage() {}
func (*ClientNote) Descriptor() ([]byte, []int) { func (*ClientNote) Descriptor() ([]byte, []int) {
return fileDescriptor_model_45d32aef7fcc5f78, []int{19} return fileDescriptor_model_92588c8639c67d56, []int{19}
} }
func (m *ClientNote) XXX_Unmarshal(b []byte) error { func (m *ClientNote) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ClientNote.Unmarshal(m, b) return xxx_messageInfo_ClientNote.Unmarshal(m, b)
@ -1533,7 +1533,7 @@ func (m *ClientMsg) Reset() { *m = ClientMsg{} }
func (m *ClientMsg) String() string { return proto.CompactTextString(m) } func (m *ClientMsg) String() string { return proto.CompactTextString(m) }
func (*ClientMsg) ProtoMessage() {} func (*ClientMsg) ProtoMessage() {}
func (*ClientMsg) Descriptor() ([]byte, []int) { func (*ClientMsg) Descriptor() ([]byte, []int) {
return fileDescriptor_model_45d32aef7fcc5f78, []int{20} return fileDescriptor_model_92588c8639c67d56, []int{20}
} }
func (m *ClientMsg) XXX_Unmarshal(b []byte) error { func (m *ClientMsg) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ClientMsg.Unmarshal(m, b) return xxx_messageInfo_ClientMsg.Unmarshal(m, b)
@ -1933,7 +1933,7 @@ func (m *ServerCred) Reset() { *m = ServerCred{} }
func (m *ServerCred) String() string { return proto.CompactTextString(m) } func (m *ServerCred) String() string { return proto.CompactTextString(m) }
func (*ServerCred) ProtoMessage() {} func (*ServerCred) ProtoMessage() {}
func (*ServerCred) Descriptor() ([]byte, []int) { func (*ServerCred) Descriptor() ([]byte, []int) {
return fileDescriptor_model_45d32aef7fcc5f78, []int{21} return fileDescriptor_model_92588c8639c67d56, []int{21}
} }
func (m *ServerCred) XXX_Unmarshal(b []byte) error { func (m *ServerCred) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ServerCred.Unmarshal(m, b) return xxx_messageInfo_ServerCred.Unmarshal(m, b)
@ -1998,7 +1998,7 @@ func (m *TopicDesc) Reset() { *m = TopicDesc{} }
func (m *TopicDesc) String() string { return proto.CompactTextString(m) } func (m *TopicDesc) String() string { return proto.CompactTextString(m) }
func (*TopicDesc) ProtoMessage() {} func (*TopicDesc) ProtoMessage() {}
func (*TopicDesc) Descriptor() ([]byte, []int) { func (*TopicDesc) Descriptor() ([]byte, []int) {
return fileDescriptor_model_45d32aef7fcc5f78, []int{22} return fileDescriptor_model_92588c8639c67d56, []int{22}
} }
func (m *TopicDesc) XXX_Unmarshal(b []byte) error { func (m *TopicDesc) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TopicDesc.Unmarshal(m, b) return xxx_messageInfo_TopicDesc.Unmarshal(m, b)
@ -2140,7 +2140,7 @@ func (m *TopicSub) Reset() { *m = TopicSub{} }
func (m *TopicSub) String() string { return proto.CompactTextString(m) } func (m *TopicSub) String() string { return proto.CompactTextString(m) }
func (*TopicSub) ProtoMessage() {} func (*TopicSub) ProtoMessage() {}
func (*TopicSub) Descriptor() ([]byte, []int) { func (*TopicSub) Descriptor() ([]byte, []int) {
return fileDescriptor_model_45d32aef7fcc5f78, []int{23} return fileDescriptor_model_92588c8639c67d56, []int{23}
} }
func (m *TopicSub) XXX_Unmarshal(b []byte) error { func (m *TopicSub) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TopicSub.Unmarshal(m, b) return xxx_messageInfo_TopicSub.Unmarshal(m, b)
@ -2277,7 +2277,7 @@ func (m *DelValues) Reset() { *m = DelValues{} }
func (m *DelValues) String() string { return proto.CompactTextString(m) } func (m *DelValues) String() string { return proto.CompactTextString(m) }
func (*DelValues) ProtoMessage() {} func (*DelValues) ProtoMessage() {}
func (*DelValues) Descriptor() ([]byte, []int) { func (*DelValues) Descriptor() ([]byte, []int) {
return fileDescriptor_model_45d32aef7fcc5f78, []int{24} return fileDescriptor_model_92588c8639c67d56, []int{24}
} }
func (m *DelValues) XXX_Unmarshal(b []byte) error { func (m *DelValues) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DelValues.Unmarshal(m, b) return xxx_messageInfo_DelValues.Unmarshal(m, b)
@ -2327,7 +2327,7 @@ func (m *ServerCtrl) Reset() { *m = ServerCtrl{} }
func (m *ServerCtrl) String() string { return proto.CompactTextString(m) } func (m *ServerCtrl) String() string { return proto.CompactTextString(m) }
func (*ServerCtrl) ProtoMessage() {} func (*ServerCtrl) ProtoMessage() {}
func (*ServerCtrl) Descriptor() ([]byte, []int) { func (*ServerCtrl) Descriptor() ([]byte, []int) {
return fileDescriptor_model_45d32aef7fcc5f78, []int{25} return fileDescriptor_model_92588c8639c67d56, []int{25}
} }
func (m *ServerCtrl) XXX_Unmarshal(b []byte) error { func (m *ServerCtrl) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ServerCtrl.Unmarshal(m, b) return xxx_messageInfo_ServerCtrl.Unmarshal(m, b)
@ -2403,7 +2403,7 @@ func (m *ServerData) Reset() { *m = ServerData{} }
func (m *ServerData) String() string { return proto.CompactTextString(m) } func (m *ServerData) String() string { return proto.CompactTextString(m) }
func (*ServerData) ProtoMessage() {} func (*ServerData) ProtoMessage() {}
func (*ServerData) Descriptor() ([]byte, []int) { func (*ServerData) Descriptor() ([]byte, []int) {
return fileDescriptor_model_45d32aef7fcc5f78, []int{26} return fileDescriptor_model_92588c8639c67d56, []int{26}
} }
func (m *ServerData) XXX_Unmarshal(b []byte) error { func (m *ServerData) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ServerData.Unmarshal(m, b) return xxx_messageInfo_ServerData.Unmarshal(m, b)
@ -2493,7 +2493,7 @@ func (m *ServerPres) Reset() { *m = ServerPres{} }
func (m *ServerPres) String() string { return proto.CompactTextString(m) } func (m *ServerPres) String() string { return proto.CompactTextString(m) }
func (*ServerPres) ProtoMessage() {} func (*ServerPres) ProtoMessage() {}
func (*ServerPres) Descriptor() ([]byte, []int) { func (*ServerPres) Descriptor() ([]byte, []int) {
return fileDescriptor_model_45d32aef7fcc5f78, []int{27} return fileDescriptor_model_92588c8639c67d56, []int{27}
} }
func (m *ServerPres) XXX_Unmarshal(b []byte) error { func (m *ServerPres) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ServerPres.Unmarshal(m, b) return xxx_messageInfo_ServerPres.Unmarshal(m, b)
@ -2601,7 +2601,7 @@ func (m *ServerMeta) Reset() { *m = ServerMeta{} }
func (m *ServerMeta) String() string { return proto.CompactTextString(m) } func (m *ServerMeta) String() string { return proto.CompactTextString(m) }
func (*ServerMeta) ProtoMessage() {} func (*ServerMeta) ProtoMessage() {}
func (*ServerMeta) Descriptor() ([]byte, []int) { func (*ServerMeta) Descriptor() ([]byte, []int) {
return fileDescriptor_model_45d32aef7fcc5f78, []int{28} return fileDescriptor_model_92588c8639c67d56, []int{28}
} }
func (m *ServerMeta) XXX_Unmarshal(b []byte) error { func (m *ServerMeta) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ServerMeta.Unmarshal(m, b) return xxx_messageInfo_ServerMeta.Unmarshal(m, b)
@ -2685,7 +2685,7 @@ func (m *ServerInfo) Reset() { *m = ServerInfo{} }
func (m *ServerInfo) String() string { return proto.CompactTextString(m) } func (m *ServerInfo) String() string { return proto.CompactTextString(m) }
func (*ServerInfo) ProtoMessage() {} func (*ServerInfo) ProtoMessage() {}
func (*ServerInfo) Descriptor() ([]byte, []int) { func (*ServerInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_model_45d32aef7fcc5f78, []int{29} return fileDescriptor_model_92588c8639c67d56, []int{29}
} }
func (m *ServerInfo) XXX_Unmarshal(b []byte) error { func (m *ServerInfo) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ServerInfo.Unmarshal(m, b) return xxx_messageInfo_ServerInfo.Unmarshal(m, b)
@ -2753,7 +2753,7 @@ func (m *ServerMsg) Reset() { *m = ServerMsg{} }
func (m *ServerMsg) String() string { return proto.CompactTextString(m) } func (m *ServerMsg) String() string { return proto.CompactTextString(m) }
func (*ServerMsg) ProtoMessage() {} func (*ServerMsg) ProtoMessage() {}
func (*ServerMsg) Descriptor() ([]byte, []int) { func (*ServerMsg) Descriptor() ([]byte, []int) {
return fileDescriptor_model_45d32aef7fcc5f78, []int{30} return fileDescriptor_model_92588c8639c67d56, []int{30}
} }
func (m *ServerMsg) XXX_Unmarshal(b []byte) error { func (m *ServerMsg) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ServerMsg.Unmarshal(m, b) return xxx_messageInfo_ServerMsg.Unmarshal(m, b)
@ -2992,7 +2992,7 @@ func (m *ServerResp) Reset() { *m = ServerResp{} }
func (m *ServerResp) String() string { return proto.CompactTextString(m) } func (m *ServerResp) String() string { return proto.CompactTextString(m) }
func (*ServerResp) ProtoMessage() {} func (*ServerResp) ProtoMessage() {}
func (*ServerResp) Descriptor() ([]byte, []int) { func (*ServerResp) Descriptor() ([]byte, []int) {
return fileDescriptor_model_45d32aef7fcc5f78, []int{31} return fileDescriptor_model_92588c8639c67d56, []int{31}
} }
func (m *ServerResp) XXX_Unmarshal(b []byte) error { func (m *ServerResp) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ServerResp.Unmarshal(m, b) return xxx_messageInfo_ServerResp.Unmarshal(m, b)
@ -3051,7 +3051,7 @@ func (m *Session) Reset() { *m = Session{} }
func (m *Session) String() string { return proto.CompactTextString(m) } func (m *Session) String() string { return proto.CompactTextString(m) }
func (*Session) ProtoMessage() {} func (*Session) ProtoMessage() {}
func (*Session) Descriptor() ([]byte, []int) { func (*Session) Descriptor() ([]byte, []int) {
return fileDescriptor_model_45d32aef7fcc5f78, []int{32} return fileDescriptor_model_92588c8639c67d56, []int{32}
} }
func (m *Session) XXX_Unmarshal(b []byte) error { func (m *Session) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Session.Unmarshal(m, b) return xxx_messageInfo_Session.Unmarshal(m, b)
@ -3132,7 +3132,7 @@ func (m *ClientReq) Reset() { *m = ClientReq{} }
func (m *ClientReq) String() string { return proto.CompactTextString(m) } func (m *ClientReq) String() string { return proto.CompactTextString(m) }
func (*ClientReq) ProtoMessage() {} func (*ClientReq) ProtoMessage() {}
func (*ClientReq) Descriptor() ([]byte, []int) { func (*ClientReq) Descriptor() ([]byte, []int) {
return fileDescriptor_model_45d32aef7fcc5f78, []int{33} return fileDescriptor_model_92588c8639c67d56, []int{33}
} }
func (m *ClientReq) XXX_Unmarshal(b []byte) error { func (m *ClientReq) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ClientReq.Unmarshal(m, b) return xxx_messageInfo_ClientReq.Unmarshal(m, b)
@ -3178,7 +3178,7 @@ func (m *SearchQuery) Reset() { *m = SearchQuery{} }
func (m *SearchQuery) String() string { return proto.CompactTextString(m) } func (m *SearchQuery) String() string { return proto.CompactTextString(m) }
func (*SearchQuery) ProtoMessage() {} func (*SearchQuery) ProtoMessage() {}
func (*SearchQuery) Descriptor() ([]byte, []int) { func (*SearchQuery) Descriptor() ([]byte, []int) {
return fileDescriptor_model_45d32aef7fcc5f78, []int{34} return fileDescriptor_model_92588c8639c67d56, []int{34}
} }
func (m *SearchQuery) XXX_Unmarshal(b []byte) error { func (m *SearchQuery) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SearchQuery.Unmarshal(m, b) return xxx_messageInfo_SearchQuery.Unmarshal(m, b)
@ -3227,7 +3227,7 @@ func (m *SearchFound) Reset() { *m = SearchFound{} }
func (m *SearchFound) String() string { return proto.CompactTextString(m) } func (m *SearchFound) String() string { return proto.CompactTextString(m) }
func (*SearchFound) ProtoMessage() {} func (*SearchFound) ProtoMessage() {}
func (*SearchFound) Descriptor() ([]byte, []int) { func (*SearchFound) Descriptor() ([]byte, []int) {
return fileDescriptor_model_45d32aef7fcc5f78, []int{35} return fileDescriptor_model_92588c8639c67d56, []int{35}
} }
func (m *SearchFound) XXX_Unmarshal(b []byte) error { func (m *SearchFound) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SearchFound.Unmarshal(m, b) return xxx_messageInfo_SearchFound.Unmarshal(m, b)
@ -3281,7 +3281,7 @@ func (m *TopicEvent) Reset() { *m = TopicEvent{} }
func (m *TopicEvent) String() string { return proto.CompactTextString(m) } func (m *TopicEvent) String() string { return proto.CompactTextString(m) }
func (*TopicEvent) ProtoMessage() {} func (*TopicEvent) ProtoMessage() {}
func (*TopicEvent) Descriptor() ([]byte, []int) { func (*TopicEvent) Descriptor() ([]byte, []int) {
return fileDescriptor_model_45d32aef7fcc5f78, []int{36} return fileDescriptor_model_92588c8639c67d56, []int{36}
} }
func (m *TopicEvent) XXX_Unmarshal(b []byte) error { func (m *TopicEvent) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TopicEvent.Unmarshal(m, b) return xxx_messageInfo_TopicEvent.Unmarshal(m, b)
@ -3338,7 +3338,7 @@ func (m *AccountEvent) Reset() { *m = AccountEvent{} }
func (m *AccountEvent) String() string { return proto.CompactTextString(m) } func (m *AccountEvent) String() string { return proto.CompactTextString(m) }
func (*AccountEvent) ProtoMessage() {} func (*AccountEvent) ProtoMessage() {}
func (*AccountEvent) Descriptor() ([]byte, []int) { func (*AccountEvent) Descriptor() ([]byte, []int) {
return fileDescriptor_model_45d32aef7fcc5f78, []int{37} return fileDescriptor_model_92588c8639c67d56, []int{37}
} }
func (m *AccountEvent) XXX_Unmarshal(b []byte) error { func (m *AccountEvent) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_AccountEvent.Unmarshal(m, b) return xxx_messageInfo_AccountEvent.Unmarshal(m, b)
@ -3411,7 +3411,7 @@ func (m *SubscriptionEvent) Reset() { *m = SubscriptionEvent{} }
func (m *SubscriptionEvent) String() string { return proto.CompactTextString(m) } func (m *SubscriptionEvent) String() string { return proto.CompactTextString(m) }
func (*SubscriptionEvent) ProtoMessage() {} func (*SubscriptionEvent) ProtoMessage() {}
func (*SubscriptionEvent) Descriptor() ([]byte, []int) { func (*SubscriptionEvent) Descriptor() ([]byte, []int) {
return fileDescriptor_model_45d32aef7fcc5f78, []int{38} return fileDescriptor_model_92588c8639c67d56, []int{38}
} }
func (m *SubscriptionEvent) XXX_Unmarshal(b []byte) error { func (m *SubscriptionEvent) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SubscriptionEvent.Unmarshal(m, b) return xxx_messageInfo_SubscriptionEvent.Unmarshal(m, b)
@ -3499,7 +3499,7 @@ func (m *MessageEvent) Reset() { *m = MessageEvent{} }
func (m *MessageEvent) String() string { return proto.CompactTextString(m) } func (m *MessageEvent) String() string { return proto.CompactTextString(m) }
func (*MessageEvent) ProtoMessage() {} func (*MessageEvent) ProtoMessage() {}
func (*MessageEvent) Descriptor() ([]byte, []int) { func (*MessageEvent) Descriptor() ([]byte, []int) {
return fileDescriptor_model_45d32aef7fcc5f78, []int{39} return fileDescriptor_model_92588c8639c67d56, []int{39}
} }
func (m *MessageEvent) XXX_Unmarshal(b []byte) error { func (m *MessageEvent) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_MessageEvent.Unmarshal(m, b) return xxx_messageInfo_MessageEvent.Unmarshal(m, b)
@ -3539,6 +3539,7 @@ func init() {
proto.RegisterType((*AccessMode)(nil), "pbx.AccessMode") proto.RegisterType((*AccessMode)(nil), "pbx.AccessMode")
proto.RegisterType((*SetSub)(nil), "pbx.SetSub") proto.RegisterType((*SetSub)(nil), "pbx.SetSub")
proto.RegisterType((*ClientCred)(nil), "pbx.ClientCred") proto.RegisterType((*ClientCred)(nil), "pbx.ClientCred")
proto.RegisterMapType((map[string][]byte)(nil), "pbx.ClientCred.ParamsEntry")
proto.RegisterType((*SetDesc)(nil), "pbx.SetDesc") proto.RegisterType((*SetDesc)(nil), "pbx.SetDesc")
proto.RegisterType((*GetOpts)(nil), "pbx.GetOpts") proto.RegisterType((*GetOpts)(nil), "pbx.GetOpts")
proto.RegisterType((*GetQuery)(nil), "pbx.GetQuery") proto.RegisterType((*GetQuery)(nil), "pbx.GetQuery")
@ -3942,172 +3943,172 @@ var _Plugin_serviceDesc = grpc.ServiceDesc{
Metadata: "model.proto", Metadata: "model.proto",
} }
func init() { proto.RegisterFile("model.proto", fileDescriptor_model_45d32aef7fcc5f78) } func init() { proto.RegisterFile("model.proto", fileDescriptor_model_92588c8639c67d56) }
var fileDescriptor_model_45d32aef7fcc5f78 = []byte{ var fileDescriptor_model_92588c8639c67d56 = []byte{
// 2614 bytes of a gzipped FileDescriptorProto // 2623 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x59, 0x4f, 0x93, 0xe3, 0x56, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x59, 0x4f, 0x93, 0xe3, 0x46,
0x11, 0x1f, 0x59, 0xb2, 0x2c, 0xb5, 0xbd, 0xb3, 0xda, 0xc7, 0x92, 0x38, 0x13, 0x92, 0xcc, 0x2a, 0x15, 0x1f, 0x59, 0xb2, 0x2c, 0x3d, 0x7b, 0x67, 0xb5, 0xcd, 0x92, 0x38, 0x13, 0x92, 0xcc, 0x2a,
0xff, 0xb6, 0x26, 0xc9, 0x42, 0xed, 0x12, 0x12, 0x20, 0x17, 0x67, 0xec, 0x9d, 0x19, 0xd8, 0x19, 0xff, 0xa6, 0x26, 0xc9, 0x42, 0xed, 0x12, 0x12, 0x20, 0x17, 0x67, 0xec, 0x9d, 0x19, 0xd8, 0x19,
0x0f, 0xf2, 0x4c, 0xb8, 0x50, 0xe5, 0x92, 0xa5, 0x67, 0x5b, 0x15, 0x59, 0xf2, 0x48, 0x4f, 0x4e, 0x0f, 0xf2, 0x4c, 0xb8, 0x50, 0xe5, 0x92, 0xa5, 0x1e, 0x5b, 0x15, 0x59, 0xf2, 0x48, 0x2d, 0x27,
0x72, 0xa1, 0x2a, 0x14, 0x17, 0x0e, 0x7c, 0x01, 0x2e, 0x7c, 0x01, 0x38, 0x43, 0xf1, 0x11, 0xe0, 0xb9, 0x50, 0x15, 0x8a, 0x0b, 0x07, 0xbe, 0x00, 0x17, 0xbe, 0x00, 0x9c, 0xa1, 0xf8, 0x00, 0x1c,
0xc6, 0x95, 0x4f, 0xc0, 0x81, 0xe2, 0x03, 0x70, 0xa1, 0xfa, 0xfd, 0x91, 0x25, 0xcf, 0x78, 0x33, 0xe0, 0xc6, 0x95, 0x4f, 0xc0, 0x81, 0xe2, 0x03, 0x70, 0xa1, 0x5e, 0xff, 0x91, 0x25, 0xcf, 0x78,
0x09, 0xdc, 0xde, 0xeb, 0xee, 0xd7, 0xaf, 0x5f, 0xf7, 0xeb, 0xee, 0x9f, 0x9e, 0xa0, 0xbd, 0x48, 0x33, 0x1b, 0x72, 0xeb, 0x7e, 0xef, 0xa9, 0xfb, 0xfd, 0xe9, 0xf7, 0xde, 0xaf, 0x5b, 0xd0, 0x9e,
0x43, 0x1a, 0x3f, 0x5a, 0x66, 0x29, 0x4b, 0x89, 0xbe, 0x9c, 0x7c, 0xee, 0x5a, 0x60, 0x5e, 0x26, 0xa7, 0x21, 0x8d, 0x1f, 0x2e, 0xb2, 0x94, 0xa5, 0x44, 0x5f, 0x4c, 0x3e, 0x77, 0x2d, 0x30, 0x2f,
0x45, 0x4e, 0x43, 0xf7, 0x43, 0xd8, 0xed, 0xd3, 0xa9, 0x5f, 0xc4, 0xac, 0x17, 0xe4, 0xa7, 0x69, 0x92, 0x22, 0xa7, 0xa1, 0xfb, 0x21, 0x6c, 0xf7, 0xe9, 0xa5, 0x5f, 0xc4, 0xac, 0x17, 0xe4, 0x27,
0x48, 0x09, 0x01, 0xc3, 0x2f, 0xd8, 0xbc, 0xab, 0xed, 0x6b, 0x0f, 0x6d, 0x8f, 0x8f, 0x39, 0x2d, 0x69, 0x48, 0x09, 0x01, 0xc3, 0x2f, 0xd8, 0xac, 0xab, 0xed, 0x6a, 0x7b, 0xb6, 0xc7, 0xc7, 0x9c,
0x49, 0x93, 0x6e, 0x43, 0xd2, 0x92, 0x34, 0x71, 0x7f, 0x00, 0xd0, 0x0b, 0x02, 0x9a, 0x97, 0xab, 0x96, 0xa4, 0x49, 0xb7, 0x21, 0x69, 0x49, 0x9a, 0xb8, 0x3f, 0x00, 0xe8, 0x05, 0x01, 0xcd, 0xcb,
0x3e, 0xf3, 0x13, 0xa6, 0x56, 0xe1, 0x98, 0xdc, 0x87, 0xe6, 0x2c, 0x5a, 0x51, 0xb5, 0x4c, 0x4c, 0xaf, 0x3e, 0xf3, 0x13, 0xa6, 0xbe, 0xc2, 0x31, 0xb9, 0x0f, 0xcd, 0x69, 0xb4, 0xa4, 0xea, 0x33,
0xdc, 0xf7, 0xc1, 0x1c, 0x51, 0x36, 0x2a, 0x26, 0xe4, 0x45, 0x68, 0x15, 0x39, 0xcd, 0xc6, 0x51, 0x31, 0x71, 0xdf, 0x07, 0x73, 0x44, 0xd9, 0xa8, 0x98, 0x90, 0x17, 0xa1, 0x55, 0xe4, 0x34, 0x1b,
0x28, 0x97, 0x99, 0x38, 0x3d, 0x09, 0x51, 0x19, 0x9a, 0xac, 0xb6, 0xc3, 0xb1, 0x9b, 0x00, 0x1c, 0x47, 0xa1, 0xfc, 0xcc, 0xc4, 0xe9, 0x71, 0x88, 0x8b, 0xa1, 0xca, 0x6a, 0x3b, 0x1c, 0xbb, 0x7f,
0xc6, 0x11, 0x4d, 0xd8, 0x61, 0x46, 0x43, 0xf2, 0x02, 0x98, 0x0b, 0xca, 0xe6, 0x69, 0xb9, 0x52, 0xd5, 0x00, 0x0e, 0xe2, 0x88, 0x26, 0xec, 0x20, 0xa3, 0x21, 0x79, 0x01, 0xcc, 0x39, 0x65, 0xb3,
0xcc, 0x70, 0xcb, 0x95, 0x1f, 0x17, 0x6a, 0xa9, 0x98, 0x90, 0x3d, 0xb0, 0x32, 0x9a, 0x2f, 0xd3, 0xb4, 0xfc, 0x54, 0xcc, 0x70, 0xcf, 0xa5, 0x1f, 0x17, 0xea, 0x5b, 0x31, 0x21, 0x3b, 0x60, 0x65,
0x24, 0xa7, 0x5d, 0x9d, 0x33, 0xca, 0x39, 0x6a, 0x5a, 0xfa, 0x99, 0xbf, 0xc8, 0xbb, 0xc6, 0xbe, 0x34, 0x5f, 0xa4, 0x49, 0x4e, 0xbb, 0x3a, 0x67, 0x94, 0x73, 0xf2, 0x18, 0xcc, 0x85, 0x9f, 0xf9,
0xf6, 0xb0, 0xe3, 0xc9, 0x99, 0x7b, 0x05, 0xad, 0x11, 0x65, 0x7d, 0x9a, 0x07, 0xe4, 0xfb, 0xd0, 0xf3, 0xbc, 0x6b, 0xec, 0xea, 0x7b, 0xed, 0x47, 0x2f, 0x3f, 0x5c, 0x4c, 0x3e, 0x7f, 0xb8, 0xda,
0x0e, 0x85, 0x8f, 0xc6, 0x7e, 0x90, 0xf3, 0x1d, 0xdb, 0x8f, 0xbf, 0xf5, 0x68, 0x39, 0xf9, 0xfc, 0xea, 0xe1, 0x19, 0xe7, 0x0e, 0x12, 0x96, 0x7d, 0xe1, 0x49, 0xd1, 0x9d, 0x1f, 0x42, 0xbb, 0x42,
0x51, 0xdd, 0x77, 0x1e, 0x84, 0xe5, 0x9c, 0x2b, 0x2e, 0x26, 0x71, 0x14, 0x70, 0x5b, 0x50, 0x31, 0x26, 0x0e, 0xe8, 0x9f, 0xd2, 0x2f, 0xa4, 0x2a, 0x38, 0xac, 0xeb, 0xd1, 0x91, 0x7a, 0xfc, 0xa8,
0x9f, 0x91, 0x2e, 0xb4, 0x96, 0x59, 0xb4, 0xf2, 0x99, 0xb0, 0xa5, 0xe3, 0xa9, 0xa9, 0xfb, 0x47, 0xf1, 0xa1, 0xe6, 0x5e, 0x41, 0x6b, 0x44, 0x59, 0x9f, 0xe6, 0x01, 0xf9, 0x3e, 0xb4, 0x43, 0xe1,
0x0d, 0x5a, 0x47, 0x94, 0x0d, 0x97, 0x2c, 0x27, 0x07, 0x70, 0x2f, 0x9a, 0x8e, 0x17, 0x69, 0x18, 0xfc, 0xb1, 0x1f, 0xe4, 0xfc, 0xf3, 0xf6, 0xa3, 0x6f, 0xf1, 0xfd, 0xeb, 0x41, 0xf1, 0x20, 0x2c,
0x4d, 0x23, 0x1a, 0x8e, 0xf3, 0x28, 0x09, 0x28, 0xdf, 0x59, 0xf7, 0xee, 0x46, 0xd3, 0x53, 0x49, 0xe7, 0x68, 0xfa, 0xa2, 0x98, 0xc4, 0x51, 0x20, 0xd7, 0x96, 0x33, 0xd2, 0x85, 0xd6, 0x22, 0x8b,
0x1f, 0x21, 0x19, 0xdd, 0x85, 0x8e, 0x53, 0xee, 0xc2, 0x31, 0x3a, 0x82, 0xa5, 0xcb, 0x28, 0x90, 0x96, 0x3e, 0x13, 0x36, 0x76, 0x3c, 0x35, 0x75, 0xff, 0xa8, 0x41, 0xeb, 0x90, 0xb2, 0xe1, 0x82,
0xe7, 0x15, 0x13, 0xf2, 0x12, 0x58, 0x5c, 0x13, 0xba, 0x1c, 0x8f, 0xdb, 0xf4, 0x5a, 0x7c, 0x7e, 0xe5, 0x64, 0x1f, 0xee, 0x45, 0x97, 0xe3, 0x79, 0x1a, 0x46, 0x97, 0x11, 0x0d, 0xc7, 0x79, 0x94,
0x12, 0x92, 0x97, 0xc1, 0x9e, 0xd0, 0x69, 0x9a, 0x71, 0x5e, 0x93, 0xf3, 0x2c, 0x41, 0x38, 0xe1, 0x04, 0x94, 0xef, 0xac, 0x7b, 0x77, 0xa3, 0xcb, 0x13, 0x49, 0x1f, 0x21, 0x19, 0xe3, 0x80, 0x11,
0x6e, 0x8d, 0xa3, 0x45, 0xc4, 0xba, 0x26, 0x67, 0x88, 0x89, 0xfb, 0x2b, 0x0d, 0xac, 0x23, 0xca, 0x51, 0x71, 0xc0, 0x31, 0x1a, 0xc6, 0xd2, 0x45, 0x14, 0x48, 0x3f, 0x8a, 0x09, 0x79, 0x09, 0x2c,
0x7e, 0x56, 0xd0, 0xec, 0x0b, 0x7e, 0x01, 0xe6, 0xfe, 0xfa, 0x02, 0xcc, 0x7d, 0x46, 0xf6, 0xc1, 0xbe, 0x12, 0xc6, 0xd2, 0xd8, 0xd5, 0xf6, 0x9a, 0x5e, 0x8b, 0xcf, 0x8f, 0x43, 0xf2, 0x32, 0xd8,
0x08, 0x69, 0x2e, 0x1c, 0xd0, 0x7e, 0xdc, 0xe1, 0x1e, 0x93, 0x07, 0xf4, 0x38, 0x87, 0xbc, 0x0a, 0x13, 0x7a, 0x99, 0x66, 0x9c, 0xd7, 0xe4, 0x3c, 0x4b, 0x10, 0x8e, 0x79, 0xb8, 0xe2, 0x68, 0x1e,
0x7a, 0x5e, 0x4c, 0xb8, 0x91, 0x9b, 0x02, 0xc8, 0xe0, 0x1a, 0x7c, 0xe6, 0x73, 0x63, 0xaf, 0x6b, 0xb1, 0xae, 0xc9, 0x19, 0x62, 0xe2, 0xfe, 0x4a, 0x03, 0xeb, 0x90, 0xb2, 0x9f, 0x15, 0x34, 0xfb,
0xf0, 0x99, 0xef, 0xfe, 0x5a, 0x03, 0x6b, 0xa4, 0x8c, 0x50, 0x1b, 0x6a, 0x15, 0x71, 0x19, 0x45, 0x82, 0x9f, 0xac, 0x99, 0xbf, 0x3a, 0x59, 0x33, 0x9f, 0x91, 0x5d, 0x30, 0x42, 0x9a, 0x0b, 0x07,
0xb9, 0xe1, 0x2b, 0x62, 0x43, 0x61, 0x51, 0x5b, 0x09, 0x8c, 0x8a, 0x89, 0xd8, 0x8f, 0x80, 0xc1, 0xb4, 0x1f, 0x75, 0xb8, 0xc7, 0xa4, 0x81, 0x1e, 0xe7, 0x90, 0x57, 0x41, 0xcf, 0x8b, 0x09, 0x57,
0xfc, 0x59, 0xde, 0xd5, 0xf7, 0x75, 0x3c, 0x05, 0x8e, 0xc9, 0xeb, 0x60, 0x04, 0x19, 0x0d, 0xa5, 0x72, 0x5d, 0x00, 0x19, 0x7c, 0x05, 0x9f, 0xf9, 0x5c, 0xd9, 0xeb, 0x2b, 0xf8, 0xcc, 0x77, 0x7f,
0x0d, 0x77, 0xf9, 0x9a, 0xf5, 0x55, 0xf4, 0x38, 0xd3, 0x7d, 0x17, 0xad, 0xb8, 0xf2, 0xfc, 0x64, 0xad, 0x81, 0x35, 0x52, 0x4a, 0xa8, 0x0d, 0xb5, 0x8a, 0xb8, 0x8c, 0xa2, 0xdc, 0xf0, 0x15, 0xb1,
0x46, 0x89, 0x03, 0x7a, 0x9c, 0x7e, 0xc6, 0x8d, 0x68, 0x7a, 0x38, 0x24, 0xbb, 0xd0, 0x98, 0x47, 0xa1, 0xd0, 0xa8, 0xad, 0x04, 0x46, 0xc5, 0x44, 0xec, 0x47, 0xc0, 0x60, 0xfe, 0x34, 0xef, 0xea,
0x7c, 0xd3, 0xa6, 0xd7, 0x98, 0x47, 0xee, 0x9f, 0x35, 0xb0, 0x84, 0x8a, 0xe3, 0x08, 0x99, 0x65, 0xbb, 0x3a, 0x5a, 0x81, 0x63, 0xf2, 0x3a, 0x18, 0x41, 0x46, 0x43, 0xa9, 0xc3, 0xdd, 0xb5, 0x73,
0x06, 0x34, 0xa2, 0x90, 0xbc, 0x02, 0xc0, 0xd3, 0xc2, 0x9f, 0xd1, 0x84, 0xc9, 0xa0, 0xda, 0x48, 0xe7, 0x71, 0xa6, 0xfb, 0x2e, 0x6a, 0x71, 0xe5, 0xf9, 0xc9, 0x94, 0xe2, 0x31, 0x8b, 0xd3, 0xcf,
0xe9, 0x21, 0x01, 0xb5, 0xaf, 0x68, 0x26, 0xe3, 0x8a, 0x43, 0x0c, 0x5d, 0x48, 0x57, 0xd1, 0x3a, 0xb8, 0x12, 0x4d, 0x0f, 0x87, 0x64, 0x1b, 0x1a, 0xb3, 0x88, 0x6f, 0xda, 0xf4, 0x1a, 0xb3, 0xc8,
0xac, 0xb6, 0x67, 0x09, 0x82, 0xc8, 0xa5, 0xd8, 0x4f, 0x66, 0x3c, 0xa4, 0xb6, 0xc7, 0xc7, 0x98, 0xfd, 0xb3, 0x06, 0x96, 0x58, 0xe2, 0x28, 0x42, 0x66, 0x99, 0x5a, 0x8d, 0x28, 0x24, 0xaf, 0x00,
0x0f, 0xcb, 0xd8, 0x67, 0xd3, 0x34, 0x5b, 0xf0, 0x88, 0xda, 0x5e, 0x39, 0x27, 0xaf, 0x02, 0x4c, 0xf0, 0x7c, 0xf3, 0xa7, 0x34, 0x61, 0x32, 0xa8, 0x36, 0x52, 0x7a, 0x48, 0xc0, 0xd5, 0x97, 0x34,
0xfc, 0xe0, 0xd3, 0x59, 0x96, 0x16, 0x49, 0xd8, 0x6d, 0xed, 0x6b, 0x0f, 0x2d, 0xaf, 0x42, 0x71, 0x93, 0x71, 0xc5, 0x21, 0x86, 0x2e, 0xa4, 0xcb, 0x68, 0x15, 0x56, 0xdb, 0xb3, 0x04, 0x41, 0x24,
0xbf, 0x6c, 0x80, 0x2d, 0x4c, 0xef, 0x05, 0xc1, 0x35, 0xdb, 0x2b, 0x29, 0xdd, 0xa8, 0xa5, 0xf4, 0x69, 0xec, 0x27, 0x53, 0x1e, 0x52, 0xdb, 0xe3, 0x63, 0xcc, 0xb3, 0x45, 0xec, 0xb3, 0xcb, 0x34,
0x0b, 0x60, 0xe6, 0xc1, 0x9c, 0x2e, 0x54, 0x02, 0xca, 0x19, 0xa7, 0xd3, 0x20, 0xa3, 0x4c, 0xa5, 0x9b, 0xf3, 0x88, 0xda, 0x5e, 0x39, 0x27, 0xaf, 0x02, 0x4c, 0xfc, 0xe0, 0xd3, 0x69, 0x96, 0x16,
0x9f, 0x98, 0xf1, 0x1b, 0x97, 0xce, 0xa2, 0x84, 0xdb, 0x6d, 0x79, 0x62, 0x52, 0x86, 0xc7, 0xac, 0x49, 0xd8, 0x6d, 0xed, 0x6a, 0x7b, 0x96, 0x57, 0xa1, 0xb8, 0x5f, 0x36, 0xc0, 0x16, 0xaa, 0xf7,
0x84, 0x47, 0xc5, 0xbc, 0xb5, 0x35, 0xe6, 0x2a, 0x80, 0xd6, 0xbe, 0xbe, 0x35, 0x80, 0x22, 0x61, 0x82, 0xe0, 0x9a, 0xee, 0x95, 0x5a, 0xd1, 0xa8, 0xd5, 0x8a, 0x17, 0xc0, 0xcc, 0x83, 0x19, 0x9d,
0x3e, 0xa5, 0x49, 0xd7, 0xe6, 0x76, 0x88, 0x09, 0x52, 0x73, 0x86, 0xa9, 0x0a, 0x22, 0x8d, 0xf8, 0xab, 0xc4, 0x96, 0x33, 0x4e, 0xa7, 0x41, 0x46, 0x19, 0x57, 0xbc, 0xe3, 0xc9, 0x19, 0x3f, 0x71,
0xc4, 0xcd, 0xa0, 0x2d, 0xd6, 0x3f, 0xe3, 0x56, 0x6d, 0x3a, 0x61, 0x7d, 0xd6, 0xc6, 0x96, 0xb3, 0xe9, 0x34, 0x4a, 0xb8, 0xde, 0x96, 0x27, 0x26, 0x65, 0x78, 0xcc, 0x4a, 0x78, 0x54, 0xcc, 0x5b,
0xea, 0xb5, 0xb3, 0xae, 0x2f, 0xd8, 0x76, 0xfb, 0xdc, 0xdf, 0x68, 0xca, 0xef, 0x58, 0x3a, 0x37, 0x1b, 0x63, 0xae, 0x02, 0x68, 0xf1, 0xc2, 0x71, 0x73, 0x00, 0x45, 0xc2, 0x7c, 0x4a, 0x93, 0xae,
0xb7, 0x2c, 0xd3, 0xbd, 0x51, 0x4d, 0xf7, 0x03, 0xb0, 0x73, 0xca, 0xc6, 0x57, 0x98, 0x1b, 0x32, 0x2d, 0x2a, 0x01, 0x9f, 0x20, 0x35, 0x67, 0x98, 0xaa, 0x20, 0xd2, 0x88, 0x4f, 0xdc, 0x0c, 0xda,
0xc7, 0xee, 0x28, 0xff, 0xf0, 0x84, 0xf1, 0xac, 0x5c, 0xa5, 0xce, 0x01, 0xd8, 0xb3, 0x52, 0xd6, 0xe2, 0xfb, 0xa7, 0x5c, 0xab, 0x75, 0x27, 0xac, 0x6c, 0x6d, 0x6c, 0xb0, 0x55, 0xaf, 0xd9, 0xba,
0xa8, 0xc8, 0x1e, 0x95, 0xb2, 0x33, 0x39, 0x72, 0x4f, 0xca, 0xf3, 0x53, 0x7f, 0x45, 0x6f, 0x69, 0x3a, 0x60, 0x9b, 0xf5, 0x73, 0x7f, 0xa3, 0x29, 0xbf, 0x63, 0x4d, 0x5e, 0xdf, 0xb2, 0x4c, 0xf7,
0xcc, 0x7d, 0x68, 0x16, 0x89, 0x4a, 0x76, 0xcb, 0x13, 0x13, 0xf7, 0x6f, 0xe5, 0xb1, 0xce, 0x6f, 0x46, 0x35, 0xdd, 0xf7, 0xc1, 0xce, 0x29, 0x1b, 0x5f, 0x61, 0x6e, 0xc8, 0x1c, 0xbb, 0xa3, 0xfc,
0x7d, 0xac, 0x17, 0xa1, 0x95, 0xa4, 0x63, 0x1a, 0xcc, 0x53, 0xa9, 0xcb, 0x4c, 0xd2, 0x41, 0x30, 0xc3, 0x13, 0xc6, 0xb3, 0x72, 0x95, 0x3a, 0xfb, 0x60, 0x4f, 0x4b, 0x59, 0xa3, 0x22, 0x7b, 0x58,
0x4f, 0xc9, 0xbb, 0x60, 0xcc, 0xa9, 0xaf, 0x1c, 0xd9, 0xad, 0x38, 0xf2, 0xbc, 0x98, 0x3c, 0x3a, 0xca, 0x4e, 0xe5, 0xc8, 0x3d, 0x2e, 0xed, 0xa7, 0xfe, 0x92, 0xde, 0x52, 0x99, 0xfb, 0xd0, 0x2c,
0xa6, 0x7e, 0x38, 0x48, 0x58, 0xf6, 0x85, 0xc7, 0xa5, 0xb0, 0x10, 0x07, 0x69, 0xc2, 0x30, 0xc9, 0x12, 0x95, 0xec, 0x96, 0x27, 0x26, 0xee, 0xdf, 0x4b, 0xb3, 0xce, 0x6e, 0x6d, 0xd6, 0x8b, 0xd0,
0x9a, 0xa2, 0x10, 0xcb, 0xe9, 0xde, 0x07, 0x60, 0x97, 0xc2, 0x98, 0x6f, 0x9f, 0xd2, 0x2f, 0xa4, 0x4a, 0xd2, 0x31, 0x0d, 0x66, 0xa9, 0x5c, 0xcb, 0x4c, 0xd2, 0x41, 0x30, 0x4b, 0xc9, 0xbb, 0x60,
0x51, 0x38, 0xac, 0x37, 0x99, 0x8e, 0x6c, 0x32, 0x3f, 0x6a, 0x7c, 0xa8, 0xb9, 0x9f, 0xa8, 0xc3, 0xcc, 0xa8, 0xaf, 0x1c, 0xd9, 0xad, 0x38, 0xf2, 0xac, 0x98, 0x3c, 0x3c, 0xa2, 0x7e, 0x28, 0xda,
0x1c, 0x51, 0x76, 0xcb, 0xc3, 0xbc, 0x0e, 0xcd, 0xeb, 0xf1, 0x29, 0x7d, 0x2e, 0x78, 0x6b, 0xbd, 0x03, 0x97, 0xc2, 0x42, 0x1c, 0xa4, 0x09, 0xc3, 0x24, 0x6b, 0x8a, 0x42, 0x2c, 0xa7, 0x3b, 0x1f,
0xa3, 0xff, 0x4d, 0xef, 0x68, 0x43, 0xef, 0x6f, 0xcb, 0x64, 0xee, 0xd3, 0xf8, 0x96, 0x8a, 0xdf, 0x80, 0x5d, 0x0a, 0x3f, 0x57, 0xd3, 0xf8, 0x44, 0x19, 0x73, 0x48, 0xd9, 0x2d, 0x8d, 0x79, 0x1d,
0x96, 0x85, 0x1e, 0xf5, 0xee, 0xca, 0x36, 0x58, 0xea, 0x78, 0xf4, 0xf3, 0xb9, 0xcf, 0x64, 0xf5, 0x9a, 0xd7, 0xe3, 0x53, 0xfa, 0x5c, 0xf0, 0x56, 0xeb, 0x8e, 0xfe, 0xbf, 0x75, 0x47, 0x6b, 0xeb,
0x7f, 0x0b, 0x5a, 0x21, 0x8d, 0xc7, 0x39, 0xbd, 0x92, 0x01, 0x51, 0x36, 0x88, 0x32, 0xe9, 0x99, 0xfe, 0xb6, 0x4c, 0xe6, 0x3e, 0x8d, 0x6f, 0xb9, 0xf0, 0xdb, 0xb2, 0xd0, 0xe3, 0xba, 0xdb, 0xb2,
0x21, 0x8d, 0x47, 0xf4, 0xaa, 0x5a, 0x33, 0x9a, 0xb5, 0x9a, 0xa1, 0xf2, 0xc2, 0x7c, 0x4e, 0xe1, 0x0d, 0x96, 0x6b, 0x3c, 0xfc, 0xf9, 0xcc, 0x67, 0xb2, 0xfa, 0xbf, 0x05, 0xad, 0x90, 0xc6, 0xe3,
0xc5, 0x92, 0x30, 0xf7, 0x33, 0x55, 0xa9, 0xf8, 0xd8, 0xfd, 0x00, 0x0c, 0xb4, 0x83, 0xb4, 0x40, 0x9c, 0x5e, 0xc9, 0x80, 0x28, 0x1d, 0x44, 0x99, 0xf4, 0xcc, 0x90, 0xc6, 0x23, 0x7a, 0x55, 0xad,
0x3f, 0x1d, 0x1d, 0x39, 0x3b, 0xc4, 0x86, 0xe6, 0xc5, 0xf0, 0xfc, 0xe4, 0xd0, 0xd1, 0x90, 0x36, 0x19, 0xcd, 0x5a, 0xcd, 0x50, 0x79, 0x61, 0x3e, 0xa3, 0xf0, 0x62, 0x49, 0x98, 0xf9, 0x99, 0xaa,
0xba, 0xfc, 0xd8, 0x69, 0x10, 0x0b, 0x8c, 0xcb, 0xd1, 0xc0, 0x73, 0x74, 0x1c, 0x1d, 0x7a, 0x83, 0x54, 0x7c, 0xec, 0x7e, 0x00, 0x06, 0xea, 0x41, 0x5a, 0xa0, 0x9f, 0x8c, 0x0e, 0x9d, 0x2d, 0x62,
0xbe, 0x63, 0xb8, 0xbf, 0x50, 0x20, 0xe3, 0x2c, 0x65, 0x74, 0x7d, 0x7e, 0xad, 0x7a, 0xfe, 0x07, 0x43, 0xf3, 0x7c, 0x78, 0x76, 0x7c, 0xe0, 0x68, 0x48, 0x1b, 0x5d, 0x7c, 0xec, 0x34, 0x88, 0x05,
0xf2, 0xfc, 0x0d, 0x7e, 0x7e, 0x71, 0xa6, 0x93, 0x64, 0x9a, 0xe2, 0x12, 0x79, 0xf2, 0x6f, 0x63, 0xc6, 0xc5, 0x68, 0xe0, 0x39, 0x3a, 0x8e, 0x0e, 0xbc, 0x41, 0xdf, 0x31, 0xdc, 0x5f, 0x28, 0xf0,
0xa2, 0x5f, 0xe1, 0x81, 0x74, 0xd1, 0x2f, 0x73, 0x7a, 0x75, 0x12, 0xba, 0xff, 0xd0, 0x95, 0xb7, 0x72, 0x9a, 0x32, 0xba, 0xb2, 0x5f, 0xab, 0xda, 0xff, 0x40, 0xda, 0xdf, 0xe0, 0xf6, 0x0b, 0x9b,
0x4f, 0xf3, 0x19, 0x79, 0x8d, 0xf7, 0x04, 0xad, 0x12, 0x1d, 0xd5, 0x11, 0x8e, 0x77, 0xb0, 0x49, 0x8e, 0x93, 0xcb, 0x14, 0x3f, 0x91, 0x96, 0x7f, 0x1b, 0x13, 0xfd, 0x0a, 0x0d, 0xd2, 0x45, 0xbf,
0x10, 0x17, 0x74, 0x3f, 0x50, 0xcd, 0x73, 0xb7, 0x22, 0xd1, 0x0b, 0x82, 0xe3, 0x1d, 0x0f, 0x99, 0xcc, 0xe9, 0xd5, 0x71, 0xe8, 0xfe, 0x53, 0x57, 0xde, 0x3e, 0xc9, 0xa7, 0xe4, 0x35, 0xde, 0x13,
0xe4, 0xa1, 0x2a, 0x93, 0x22, 0xca, 0x4e, 0x45, 0x8a, 0xd7, 0xa6, 0xe3, 0x1d, 0x55, 0x3a, 0x5d, 0xb4, 0x4a, 0x74, 0x54, 0x47, 0x38, 0xda, 0xc2, 0x26, 0x41, 0x5c, 0xd0, 0xfd, 0x40, 0x35, 0xcf,
0xd1, 0xf8, 0x8c, 0x6b, 0xda, 0x46, 0xc5, 0x04, 0xb5, 0x61, 0xf7, 0x43, 0x6d, 0x98, 0xd1, 0x3c, 0xed, 0x8a, 0x44, 0x2f, 0x08, 0x8e, 0xb6, 0x3c, 0x64, 0x92, 0x3d, 0x55, 0x26, 0x45, 0x94, 0x9d,
0x0e, 0x1b, 0xda, 0x90, 0xce, 0xb5, 0xf1, 0x94, 0x77, 0x41, 0x5f, 0x16, 0x13, 0x19, 0x99, 0xdd, 0x8a, 0x14, 0xaf, 0x4d, 0x47, 0x5b, 0xaa, 0x74, 0xba, 0xa2, 0xf1, 0x19, 0xd7, 0x56, 0x1b, 0x15,
0x7a, 0xa2, 0xa1, 0xb6, 0x65, 0x31, 0x41, 0x99, 0x19, 0x65, 0xb2, 0x2e, 0x57, 0x65, 0x8e, 0x28, 0x13, 0x5c, 0x0d, 0xbb, 0x1f, 0xae, 0x86, 0x19, 0xcd, 0xe3, 0xb0, 0xb6, 0x1a, 0xd2, 0xf9, 0x6a,
0x43, 0x99, 0x19, 0x65, 0xdc, 0x2a, 0xca, 0xba, 0xd6, 0x75, 0xab, 0x84, 0x4c, 0x2e, 0x64, 0x42, 0x3c, 0xe5, 0x5d, 0xd0, 0x17, 0xc5, 0x44, 0x46, 0x66, 0xbb, 0x9e, 0x68, 0xb8, 0xda, 0xa2, 0x98,
0x1a, 0xf3, 0xba, 0x5c, 0x97, 0xe9, 0xd3, 0x18, 0x65, 0x42, 0x1a, 0x93, 0x37, 0xc1, 0x48, 0x52, 0xa0, 0xcc, 0x94, 0x32, 0x59, 0x97, 0xab, 0x32, 0x87, 0x94, 0xa1, 0xcc, 0x94, 0x32, 0xae, 0x15,
0x59, 0xa6, 0xeb, 0x57, 0x05, 0xc3, 0x72, 0xbc, 0xe3, 0x71, 0x36, 0xd9, 0x87, 0x4e, 0x9a, 0x8c, 0x65, 0x5d, 0xeb, 0xba, 0x56, 0x42, 0x26, 0x17, 0x32, 0x21, 0x8d, 0x79, 0x5d, 0xae, 0xcb, 0xf4,
0x27, 0x74, 0xee, 0xc7, 0xd3, 0x71, 0x3a, 0xed, 0xb6, 0x79, 0x60, 0x21, 0x4d, 0x3e, 0xe6, 0xa4, 0x69, 0x8c, 0x32, 0x21, 0x8d, 0xc9, 0x9b, 0x60, 0x24, 0xa9, 0x2c, 0xd3, 0xf5, 0xa3, 0x82, 0x61,
0xe1, 0x94, 0xbc, 0x07, 0x80, 0x88, 0x77, 0x1c, 0xd3, 0x15, 0x8d, 0xbb, 0x1d, 0x1e, 0x63, 0xb1, 0x39, 0xda, 0xf2, 0x38, 0x9b, 0xec, 0x42, 0x27, 0x4d, 0xc6, 0x13, 0x3a, 0xf3, 0xe3, 0xcb, 0x71,
0x67, 0xaf, 0x60, 0xf3, 0x67, 0x48, 0xf5, 0x6c, 0x5f, 0x0d, 0x3f, 0xb6, 0xa1, 0x75, 0x4a, 0xf3, 0x7a, 0xd9, 0x6d, 0xf3, 0xc0, 0x42, 0x9a, 0x7c, 0xcc, 0x49, 0xc3, 0x4b, 0xf2, 0x1e, 0x00, 0x42,
0xdc, 0x9f, 0x51, 0xf7, 0x0c, 0x60, 0x44, 0xb3, 0x15, 0xcd, 0xbe, 0x01, 0x40, 0x25, 0x60, 0x84, 0xe9, 0x71, 0x4c, 0x97, 0x34, 0xee, 0x76, 0x78, 0x8c, 0xc5, 0x9e, 0xbd, 0x82, 0xcd, 0x9e, 0x22,
0x69, 0x42, 0x65, 0x39, 0xe3, 0x63, 0xf7, 0x3f, 0x0d, 0xb0, 0x2f, 0xf0, 0xc6, 0xf5, 0x05, 0x6e, 0xd5, 0xb3, 0x7d, 0x35, 0xfc, 0xd8, 0x86, 0xd6, 0x09, 0xcd, 0x73, 0x7f, 0x4a, 0xdd, 0x53, 0x80,
0x81, 0x20, 0xa3, 0x3e, 0xa3, 0xe1, 0x58, 0x82, 0x2c, 0xdd, 0xb3, 0x25, 0xa5, 0xc7, 0x38, 0x66, 0x11, 0xcd, 0x96, 0x34, 0xfb, 0x1a, 0xc0, 0x97, 0x80, 0x11, 0xa6, 0x09, 0x95, 0xe5, 0x8c, 0x8f,
0x58, 0x86, 0x8a, 0xdd, 0x10, 0x6c, 0x49, 0x11, 0x6c, 0x96, 0x16, 0xc1, 0x5c, 0xb0, 0x75, 0xc1, 0xdd, 0xff, 0x36, 0xc0, 0x3e, 0xc7, 0x13, 0xd7, 0x17, 0xb8, 0x05, 0x82, 0x8c, 0xfa, 0x8c, 0x86,
0x96, 0x94, 0x1e, 0x23, 0xef, 0x80, 0x89, 0xc0, 0x35, 0xc8, 0xe5, 0xf5, 0xb8, 0x11, 0xdb, 0x4a, 0x63, 0x09, 0xb2, 0x74, 0xcf, 0x96, 0x94, 0x1e, 0xe3, 0x98, 0x61, 0x11, 0x2a, 0x76, 0x43, 0xb0,
0x11, 0xf2, 0x00, 0xaf, 0x65, 0x2e, 0xaf, 0x88, 0xf0, 0xf4, 0xfa, 0x3b, 0x00, 0x6f, 0x65, 0x5e, 0x25, 0x45, 0xb0, 0x59, 0x5a, 0x04, 0x33, 0xc1, 0xd6, 0x05, 0x5b, 0x52, 0x7a, 0x8c, 0xbc, 0x03,
0xb9, 0xff, 0x66, 0xe5, 0xfe, 0x63, 0xa2, 0x67, 0xd4, 0x0f, 0x91, 0xde, 0xe2, 0x74, 0x13, 0xa7, 0x26, 0x02, 0xd7, 0x20, 0x97, 0xc7, 0xe3, 0x46, 0x6c, 0x2b, 0x45, 0xc8, 0x03, 0x3c, 0x96, 0xb9,
0x8a, 0x11, 0xac, 0x90, 0x61, 0x29, 0x46, 0xb0, 0x3a, 0x09, 0x51, 0x11, 0x96, 0x90, 0x28, 0xe4, 0x3c, 0x22, 0xc2, 0xd3, 0xab, 0x0b, 0x06, 0x9e, 0xca, 0xbc, 0x72, 0xfe, 0xcd, 0xca, 0xf9, 0xc7,
0xd1, 0x6f, 0x7a, 0xcd, 0x90, 0xc6, 0x02, 0x4c, 0x48, 0x68, 0x0d, 0xdb, 0xa0, 0x75, 0xbb, 0x06, 0x44, 0xcf, 0xa8, 0x1f, 0x22, 0xbd, 0xc5, 0xe9, 0x26, 0x4e, 0x15, 0x23, 0x58, 0x22, 0xc3, 0x52,
0xad, 0xd7, 0x7d, 0xbc, 0x53, 0xe9, 0xe3, 0x1c, 0x0e, 0xe3, 0x00, 0x9d, 0x72, 0x87, 0x3b, 0xa5, 0x8c, 0x60, 0x79, 0x1c, 0xe2, 0x42, 0x58, 0x42, 0xa2, 0x90, 0x47, 0xbf, 0xe9, 0x35, 0x43, 0x1a,
0xc5, 0xe7, 0x3d, 0xe6, 0xfe, 0x45, 0x07, 0x8b, 0x7b, 0x1f, 0xbb, 0x6d, 0xdd, 0xbb, 0xda, 0x0d, 0x0b, 0x30, 0x21, 0xa1, 0x35, 0x6c, 0x82, 0xd6, 0xed, 0x1a, 0xb4, 0x5e, 0xf5, 0xf1, 0x4e, 0xa5,
0xde, 0x0d, 0x69, 0x4c, 0xeb, 0xce, 0x97, 0x94, 0x1e, 0x43, 0x6b, 0xd3, 0x24, 0x8e, 0xca, 0xf0, 0x8f, 0x73, 0x38, 0x8c, 0x03, 0x74, 0xca, 0x1d, 0xee, 0x94, 0x16, 0x9f, 0xf7, 0x98, 0xfb, 0x17,
0xca, 0x99, 0x72, 0xa4, 0xf1, 0x1c, 0x47, 0x56, 0x3c, 0xd6, 0xdc, 0xe6, 0x31, 0xb3, 0xe6, 0xb1, 0x1d, 0x2c, 0xee, 0x7d, 0xec, 0xb6, 0x75, 0xef, 0x6a, 0x37, 0x78, 0x37, 0xa4, 0x31, 0xad, 0x3b,
0xb5, 0x6b, 0x5a, 0xdb, 0x5c, 0x63, 0xd5, 0x5d, 0x53, 0x29, 0xbf, 0x76, 0xad, 0xfc, 0x96, 0xe5, 0x5f, 0x52, 0x7a, 0x0c, 0xb5, 0x4d, 0x93, 0x38, 0x2a, 0xc3, 0x2b, 0x67, 0xca, 0x91, 0xc6, 0x33,
0x0f, 0xaa, 0xe5, 0xaf, 0x7e, 0x95, 0xda, 0x9b, 0x57, 0x69, 0x1d, 0xfa, 0x4e, 0x35, 0xf4, 0xeb, 0x1c, 0x59, 0xf1, 0x58, 0x73, 0x93, 0xc7, 0xcc, 0x9a, 0xc7, 0x56, 0xae, 0x69, 0x6d, 0x72, 0x8d,
0x40, 0xde, 0xa9, 0x06, 0xf2, 0x0d, 0xd8, 0x8d, 0xfd, 0x9c, 0x8d, 0x73, 0x4a, 0x93, 0x31, 0x8b, 0x55, 0x77, 0x4d, 0xa5, 0xfc, 0xda, 0xb5, 0xf2, 0x5b, 0x96, 0x3f, 0xa8, 0x96, 0xbf, 0xfa, 0x51,
0x16, 0xb4, 0xbb, 0xcb, 0x15, 0x76, 0x90, 0x3a, 0xa2, 0x34, 0xb9, 0x88, 0x16, 0x94, 0x7c, 0x17, 0x6a, 0xaf, 0x1f, 0xa5, 0x55, 0xe8, 0x3b, 0xd5, 0xd0, 0xaf, 0x02, 0x79, 0xa7, 0x1a, 0xc8, 0x37,
0xee, 0xaf, 0xa5, 0x2a, 0xd0, 0xf8, 0x2e, 0xb7, 0xeb, 0x9e, 0x92, 0xbd, 0x54, 0x10, 0xd9, 0xfd, 0x60, 0x3b, 0xf6, 0x73, 0x36, 0xce, 0x29, 0x4d, 0xc6, 0x2c, 0x9a, 0xd3, 0xee, 0x36, 0x5f, 0xb0,
0x09, 0xd8, 0x7d, 0x1a, 0x7f, 0x82, 0xa9, 0x95, 0x57, 0xb6, 0xd6, 0xaa, 0x5b, 0x57, 0xba, 0x53, 0x83, 0xd4, 0x11, 0xa5, 0xc9, 0x79, 0x34, 0xa7, 0xe4, 0xbb, 0x70, 0x7f, 0x25, 0x55, 0x81, 0xc6,
0xe3, 0x39, 0xdd, 0xc9, 0xfd, 0xab, 0x56, 0xe6, 0x35, 0xcb, 0x6e, 0xdb, 0x23, 0x09, 0x18, 0x01, 0x77, 0xb9, 0x5e, 0xf7, 0x94, 0xec, 0x85, 0x82, 0xc8, 0xee, 0x4f, 0xc0, 0xee, 0xd3, 0xf8, 0x13,
0x7e, 0xc0, 0x8a, 0xf2, 0xcf, 0xc7, 0x1c, 0xbb, 0xd2, 0xcf, 0x99, 0x04, 0xe8, 0x7c, 0x4c, 0x9e, 0x4c, 0xad, 0xbc, 0xb2, 0xb5, 0x56, 0xdd, 0xba, 0xd2, 0x9d, 0x1a, 0xcf, 0xe8, 0x4e, 0xee, 0xdf,
0x94, 0x1f, 0x9f, 0x4d, 0x6e, 0xc3, 0xcb, 0xd2, 0x06, 0xb5, 0xdd, 0xa3, 0x73, 0xce, 0x15, 0xa8, 0xb4, 0x32, 0xaf, 0x59, 0x76, 0xdb, 0x1e, 0x49, 0xc0, 0x08, 0xf0, 0x66, 0x2c, 0xca, 0x3f, 0x1f,
0x45, 0x8a, 0xee, 0xfd, 0x10, 0xda, 0x15, 0xf2, 0xd7, 0xc2, 0x27, 0xbf, 0x6b, 0xa8, 0xc3, 0xf4, 0x73, 0xec, 0x4a, 0x3f, 0x67, 0x12, 0xa0, 0xf3, 0x71, 0xe5, 0x52, 0xdb, 0xac, 0x5c, 0x6a, 0x57,
0x7d, 0xe6, 0x6f, 0x69, 0x70, 0xfb, 0xd0, 0x99, 0x66, 0xe9, 0x62, 0x5c, 0x07, 0xf2, 0x80, 0xb4, 0xdb, 0x7d, 0xd3, 0x97, 0xda, 0xdf, 0x35, 0x94, 0x31, 0x7d, 0x9f, 0xf9, 0x1b, 0x1a, 0xdc, 0x2e,
0x4b, 0x71, 0x33, 0xbe, 0x03, 0x36, 0x06, 0x2b, 0x67, 0xfe, 0x62, 0xc9, 0xef, 0x19, 0x5e, 0x01, 0x74, 0x2e, 0xb3, 0x74, 0x3e, 0xae, 0x03, 0x79, 0x40, 0xda, 0x85, 0x38, 0x19, 0xdf, 0x01, 0x1b,
0x45, 0xd8, 0x48, 0x07, 0x7d, 0x33, 0x1d, 0xd6, 0x37, 0xc4, 0xa8, 0xde, 0x90, 0xf7, 0x24, 0x76, 0x83, 0x95, 0x33, 0x7f, 0xbe, 0xe0, 0xe7, 0x0c, 0x8f, 0x80, 0x22, 0xac, 0xa5, 0x83, 0xbe, 0x9e,
0x13, 0x8e, 0x78, 0xa9, 0xe2, 0x08, 0x34, 0xf5, 0x79, 0xe0, 0xcd, 0xfc, 0x3f, 0x81, 0xb7, 0x3f, 0x0e, 0xab, 0x13, 0x62, 0x54, 0x4f, 0xc8, 0x7b, 0x12, 0xbb, 0x09, 0x47, 0xbc, 0x54, 0x71, 0x04,
0xe9, 0xca, 0x39, 0xe7, 0x19, 0xcd, 0xb7, 0x38, 0xc7, 0x01, 0x3d, 0xcf, 0x54, 0xb4, 0x71, 0x48, 0xaa, 0xfa, 0x2c, 0xf0, 0x66, 0x7e, 0x43, 0xe0, 0xed, 0x4f, 0xba, 0x72, 0xce, 0x59, 0x46, 0xf3,
0x1e, 0xd6, 0xf0, 0xd0, 0xfd, 0x8a, 0xe1, 0xa8, 0xa6, 0x0a, 0x88, 0xea, 0x1f, 0x76, 0xc6, 0xe6, 0x0d, 0xce, 0x71, 0x40, 0xcf, 0x33, 0x15, 0x6d, 0x1c, 0x92, 0xbd, 0x1a, 0x1e, 0xba, 0x5f, 0x51,
0x87, 0xdd, 0xda, 0x31, 0xcd, 0x9b, 0x53, 0xc7, 0xdc, 0x72, 0x7f, 0x5b, 0xcf, 0x43, 0x57, 0x6f, 0x1c, 0x97, 0xa9, 0x02, 0xa2, 0xfa, 0xc5, 0xce, 0x58, 0xbf, 0xd8, 0xad, 0x1c, 0xd3, 0xbc, 0x39,
0xc0, 0x2e, 0xf3, 0x33, 0x84, 0xf6, 0x2a, 0x9e, 0x16, 0xdf, 0xb8, 0x23, 0xa8, 0x32, 0xa2, 0x2e, 0x75, 0xcc, 0x0d, 0xe7, 0xb7, 0xf5, 0x2c, 0x74, 0xf5, 0x06, 0x6c, 0x33, 0x3f, 0x43, 0x68, 0xaf,
0xdc, 0xf1, 0x03, 0x96, 0x66, 0xe3, 0x7a, 0x29, 0x68, 0x73, 0xa2, 0x94, 0x91, 0xf5, 0x0a, 0xb6, 0xe2, 0x69, 0xf1, 0x8d, 0x3b, 0x82, 0x2a, 0x23, 0xea, 0xc2, 0x1d, 0x3f, 0x60, 0x69, 0x36, 0xae,
0xd7, 0x2b, 0xb7, 0x90, 0xc0, 0xcb, 0x84, 0xc6, 0xf0, 0xcc, 0xd9, 0x41, 0xb0, 0x35, 0x7c, 0xfa, 0x97, 0x82, 0x36, 0x27, 0x4a, 0x19, 0x59, 0xaf, 0x60, 0x73, 0xbd, 0x72, 0x0b, 0x09, 0xbc, 0x4c,
0xd4, 0xd1, 0x90, 0x70, 0xd9, 0x73, 0x74, 0x24, 0x5c, 0x9e, 0xf7, 0x1d, 0x03, 0x31, 0xd7, 0xd1, 0x68, 0x0c, 0x4f, 0x9d, 0x2d, 0x04, 0x5b, 0xc3, 0x27, 0x4f, 0x1c, 0x0d, 0x09, 0x17, 0x3d, 0x47,
0xf0, 0x6c, 0xe0, 0x34, 0x91, 0xd4, 0x3b, 0x1c, 0x39, 0x26, 0x92, 0x2e, 0x06, 0xde, 0xa9, 0xd3, 0x47, 0xc2, 0xc5, 0x59, 0xdf, 0x31, 0x10, 0x73, 0x1d, 0x0e, 0x4f, 0x07, 0x4e, 0x13, 0x49, 0xbd,
0x52, 0xb8, 0xcd, 0x42, 0x92, 0x37, 0xe8, 0xf5, 0x1d, 0x5b, 0x8c, 0x0e, 0x3f, 0x71, 0x00, 0x99, 0x83, 0x91, 0x63, 0x22, 0xe9, 0x7c, 0xe0, 0x9d, 0x38, 0x2d, 0x85, 0xdb, 0x2c, 0x24, 0x79, 0x83,
0xfd, 0xc1, 0x33, 0xa7, 0xcd, 0xe5, 0x7b, 0x47, 0x23, 0xa7, 0xe3, 0xfe, 0xbd, 0xcc, 0xd1, 0x53, 0x5e, 0xdf, 0xb1, 0xc5, 0xe8, 0xe0, 0x13, 0x07, 0x90, 0xd9, 0x1f, 0x3c, 0x75, 0xda, 0x5c, 0xbe,
0xca, 0xfc, 0x5b, 0xe6, 0xa8, 0x2b, 0xbf, 0x1b, 0xf5, 0x0a, 0xae, 0x28, 0xfb, 0xad, 0xfc, 0x72, 0x77, 0x38, 0x72, 0x3a, 0xee, 0x3f, 0xca, 0x1c, 0x3d, 0xa1, 0xcc, 0xbf, 0x65, 0x8e, 0xba, 0xf2,
0x7c, 0x4d, 0x81, 0xa6, 0xb5, 0x83, 0x55, 0x53, 0x50, 0xef, 0x13, 0x1c, 0x9b, 0x34, 0x2b, 0x3a, 0xde, 0xa8, 0x57, 0x70, 0x45, 0xd9, 0x6f, 0xe5, 0xcd, 0xf1, 0x35, 0x05, 0x9a, 0x56, 0x0e, 0x56,
0xca, 0xca, 0x23, 0x90, 0xc9, 0x4d, 0x9f, 0xac, 0x0a, 0xd8, 0xb6, 0x2a, 0x1f, 0x7c, 0x6b, 0xec, 0x4d, 0x41, 0xbd, 0x4f, 0x70, 0x6c, 0xd2, 0xac, 0xac, 0x51, 0x56, 0x1e, 0x81, 0x4c, 0x6e, 0xba,
0x20, 0x3f, 0xf8, 0x7e, 0xa9, 0xce, 0x84, 0xe0, 0xf2, 0x1b, 0xa7, 0xea, 0x83, 0xda, 0xed, 0xfc, 0xb2, 0x2a, 0x60, 0xdb, 0xaa, 0x5c, 0xf8, 0x56, 0xd8, 0x41, 0x5e, 0xf8, 0x7e, 0xa9, 0x6c, 0x42,
0x0a, 0xb4, 0x5a, 0x4d, 0x48, 0xf7, 0xdf, 0x1a, 0xd8, 0xd2, 0xa9, 0xf9, 0x0c, 0x01, 0x56, 0xc0, 0x70, 0xf9, 0xb5, 0x53, 0xf5, 0x41, 0xed, 0x74, 0x7e, 0x05, 0x5a, 0xad, 0x26, 0xa4, 0xfb, 0x1f,
0xb2, 0x58, 0xe2, 0xd5, 0xbb, 0x1b, 0x75, 0x0a, 0x01, 0x16, 0xb2, 0x51, 0x8c, 0xbf, 0xd7, 0x34, 0x0d, 0x6c, 0xe9, 0xd4, 0x7c, 0x8a, 0x00, 0x2b, 0x60, 0x59, 0x2c, 0xf1, 0xea, 0xdd, 0xb5, 0x3a,
0xae, 0x89, 0x61, 0x16, 0xa3, 0x18, 0xb2, 0x51, 0x6c, 0x99, 0xd1, 0x5c, 0xfa, 0xfe, 0xee, 0x46, 0x85, 0x00, 0x0b, 0xd9, 0x28, 0xc6, 0xdf, 0x6b, 0x1a, 0xd7, 0xc4, 0x30, 0x8b, 0x51, 0x0c, 0xd9,
0xce, 0xa0, 0x18, 0xb2, 0x51, 0x6c, 0x41, 0xcb, 0xd7, 0x9f, 0xaa, 0x18, 0xc6, 0x19, 0xc5, 0x90, 0x28, 0xb6, 0xc8, 0x68, 0x2e, 0x7d, 0x7f, 0x77, 0x2d, 0x67, 0x50, 0x0c, 0xd9, 0x28, 0x36, 0xa7,
0x8d, 0x62, 0x51, 0x32, 0x4d, 0x6b, 0x90, 0x64, 0xed, 0x3a, 0x14, 0x8b, 0x6a, 0x2e, 0x34, 0x2b, 0xe5, 0xeb, 0x4f, 0x55, 0x0c, 0xe3, 0x8c, 0x62, 0xc8, 0x46, 0xb1, 0x28, 0xb9, 0x4c, 0x6b, 0x90,
0x2e, 0xac, 0x22, 0xb8, 0x2f, 0xcb, 0x6b, 0xe4, 0xd1, 0x7c, 0x49, 0xde, 0x04, 0x13, 0xd1, 0x40, 0x64, 0xe5, 0x3a, 0x14, 0x8b, 0x6a, 0x2e, 0x34, 0x2b, 0x2e, 0xac, 0x22, 0xb8, 0x2f, 0xcb, 0x63,
0x21, 0x5e, 0xfc, 0x94, 0xf3, 0x90, 0x75, 0xc8, 0xf1, 0x90, 0x60, 0x92, 0xb7, 0xc0, 0xcc, 0xb3, 0xe4, 0xd1, 0x7c, 0x41, 0xde, 0x04, 0x13, 0xd1, 0x40, 0x21, 0x5e, 0xfc, 0x94, 0xf3, 0x90, 0x75,
0xd5, 0x22, 0x9f, 0xd5, 0x90, 0x7a, 0xe9, 0x39, 0x4f, 0x72, 0xc9, 0x1b, 0xd0, 0x0c, 0x62, 0x14, 0xc0, 0xf1, 0x90, 0x60, 0x92, 0xb7, 0xc0, 0xcc, 0xb3, 0xe5, 0x3c, 0x9f, 0xd6, 0x90, 0x7a, 0xe9,
0xd3, 0xaf, 0x01, 0x59, 0x14, 0x13, 0x4c, 0xf7, 0x9f, 0x1a, 0xb4, 0x46, 0x34, 0xcf, 0xa3, 0x34, 0x39, 0x4f, 0x72, 0xc9, 0x1b, 0xd0, 0x0c, 0x62, 0x14, 0xd3, 0xaf, 0x01, 0x59, 0x14, 0x13, 0x4c,
0xc1, 0x7a, 0x91, 0x8b, 0xe1, 0xfa, 0x89, 0xd4, 0x96, 0x94, 0x93, 0xe7, 0xbc, 0xb5, 0xd4, 0x31, 0xf7, 0x5f, 0x1a, 0xb4, 0x46, 0x34, 0xcf, 0xa3, 0x34, 0xc1, 0x7a, 0x91, 0x8b, 0xe1, 0xea, 0xed,
0xac, 0xfe, 0x15, 0x18, 0x96, 0xbc, 0x06, 0xed, 0x8c, 0x2e, 0x52, 0x84, 0x41, 0x61, 0x98, 0xc9, 0xd5, 0x96, 0x94, 0xe3, 0x67, 0xbc, 0xb5, 0xd4, 0x31, 0xac, 0xfe, 0x15, 0x18, 0x96, 0xbc, 0x06,
0xba, 0x04, 0x82, 0xd4, 0x0b, 0xc3, 0x6c, 0xa3, 0x6e, 0x35, 0x37, 0xeb, 0x56, 0xed, 0xf9, 0xc9, 0xed, 0x8c, 0xce, 0x53, 0x84, 0x41, 0x61, 0x98, 0xc9, 0xba, 0x04, 0x82, 0xd4, 0x0b, 0xc3, 0x6c,
0xdc, 0x78, 0x7e, 0xda, 0x03, 0x2b, 0xf6, 0x93, 0x59, 0xe1, 0xcf, 0x28, 0xef, 0x14, 0xb6, 0x57, 0xad, 0x6e, 0x35, 0xd7, 0xeb, 0x56, 0xed, 0xf9, 0xc9, 0x5c, 0x7b, 0x7e, 0xda, 0x01, 0x2b, 0xf6,
0xce, 0xdd, 0xa1, 0xfa, 0x1c, 0xf2, 0xe8, 0x15, 0x66, 0x12, 0x3a, 0x47, 0xbb, 0xd1, 0x39, 0xc8, 0x93, 0x69, 0xe1, 0x4f, 0x29, 0xef, 0x14, 0xb6, 0x57, 0xce, 0xdd, 0xa1, 0xba, 0x0e, 0x79, 0xf4,
0x22, 0xfb, 0x60, 0xe0, 0xe1, 0x6b, 0xaf, 0x89, 0xd2, 0x55, 0x1e, 0xe7, 0xb8, 0x1f, 0x41, 0x7b, 0x0a, 0x33, 0x09, 0x9d, 0xa3, 0xdd, 0xe8, 0x1c, 0x64, 0x91, 0x5d, 0x30, 0xd0, 0xf8, 0xda, 0x6b,
0x44, 0xfd, 0x2c, 0x98, 0x8b, 0x27, 0x8d, 0xad, 0xef, 0xcb, 0xf7, 0xd5, 0xb7, 0xb1, 0x2c, 0x08, 0xa2, 0x74, 0x95, 0xc7, 0x39, 0xee, 0x47, 0xd0, 0x1e, 0x51, 0x3f, 0x0b, 0x66, 0xe2, 0x49, 0x63,
0xe2, 0x63, 0xf8, 0x4a, 0xad, 0x7e, 0x9a, 0x16, 0x49, 0x78, 0xdb, 0xf0, 0xdf, 0xa8, 0x0b, 0x17, 0xe3, 0xc3, 0xf5, 0x7d, 0x75, 0x37, 0x96, 0x05, 0x41, 0x5c, 0x86, 0xaf, 0xd4, 0xd7, 0x4f, 0xd2,
0x67, 0x34, 0x2f, 0x62, 0xc6, 0x5f, 0x12, 0xaf, 0xd5, 0x0e, 0xc9, 0x74, 0x67, 0x00, 0x9c, 0x36, 0x22, 0x09, 0x6f, 0x1b, 0xfe, 0x1b, 0xd7, 0xc2, 0x8f, 0x33, 0x9a, 0x17, 0x31, 0xe3, 0x2f, 0x89,
0x58, 0xa1, 0x23, 0x1f, 0x80, 0xe9, 0x07, 0x2c, 0x4a, 0x13, 0xb9, 0xa3, 0x2d, 0xbc, 0x90, 0x15, 0xd7, 0x6a, 0x87, 0x64, 0xba, 0x53, 0x00, 0x4e, 0x1b, 0x2c, 0xd1, 0x91, 0x0f, 0xc0, 0xf4, 0x03,
0xa1, 0x27, 0x19, 0x58, 0x4d, 0x12, 0xbf, 0x7c, 0x58, 0xe2, 0xe3, 0xdb, 0x14, 0x32, 0xf7, 0x0f, 0x16, 0xa5, 0x89, 0xdc, 0xd1, 0x16, 0x5e, 0xc8, 0x8a, 0xd0, 0x93, 0x0c, 0xac, 0x26, 0x89, 0x5f,
0x1a, 0x74, 0x7a, 0x41, 0x90, 0x16, 0x09, 0xbb, 0xf5, 0x5e, 0x5b, 0xef, 0xd7, 0xc6, 0x7b, 0xb8, 0x3e, 0x2c, 0xf1, 0xf1, 0x6d, 0x0a, 0x99, 0xfb, 0x07, 0x0d, 0x3a, 0xbd, 0x20, 0x48, 0x8b, 0x84,
0xfe, 0x75, 0xdf, 0xc3, 0x8d, 0x1a, 0x32, 0x55, 0x05, 0xd2, 0x5a, 0x17, 0x48, 0xf7, 0x5f, 0x1a, 0xdd, 0x7a, 0xaf, 0x8d, 0xe7, 0x6b, 0xed, 0x3d, 0x5c, 0x7f, 0xde, 0xf7, 0x70, 0xa3, 0x86, 0x4c,
0xdc, 0x1b, 0x15, 0x93, 0x3c, 0xc8, 0xa2, 0x25, 0xda, 0x72, 0x6b, 0x9b, 0xb7, 0x3e, 0x18, 0xa9, 0x55, 0x81, 0xb4, 0x56, 0x05, 0xd2, 0xfd, 0xb7, 0x06, 0xf7, 0x46, 0xc5, 0x24, 0x0f, 0xb2, 0x68,
0x93, 0xe8, 0xb5, 0x93, 0xac, 0x7b, 0xab, 0x51, 0xed, 0xad, 0x5f, 0x1f, 0x76, 0xbf, 0x2e, 0xff, 0x81, 0xba, 0xdc, 0x5a, 0xe7, 0x8d, 0x0f, 0x46, 0xca, 0x12, 0xbd, 0x66, 0xc9, 0xaa, 0xb7, 0x1a,
0x58, 0xb4, 0x6e, 0x6e, 0x8e, 0x9c, 0xb9, 0x1d, 0x83, 0xbb, 0x17, 0xd0, 0x91, 0x45, 0xe8, 0xd6, 0xd5, 0xde, 0xfa, 0xfc, 0xb0, 0xfb, 0x75, 0xf9, 0x2b, 0xa4, 0x75, 0x73, 0x73, 0xe4, 0xcc, 0xcd,
0x27, 0x7d, 0x20, 0xf2, 0xe5, 0xe6, 0x42, 0xcb, 0x13, 0xe6, 0xe0, 0x09, 0xd8, 0x65, 0xc2, 0x63, 0x18, 0xdc, 0x3d, 0x87, 0x8e, 0x2c, 0x42, 0xb7, 0xb6, 0xf4, 0x81, 0xc8, 0x97, 0x9b, 0x0b, 0x2d,
0xb7, 0x3c, 0xc3, 0x86, 0xbb, 0x83, 0xa3, 0xde, 0xd9, 0xf0, 0xcc, 0x01, 0x3e, 0xba, 0xbc, 0x38, 0x4f, 0x98, 0xfd, 0xc7, 0x60, 0x97, 0x09, 0x8f, 0xdd, 0xf2, 0x14, 0x1b, 0xee, 0x16, 0x8e, 0x7a,
0x76, 0xee, 0xf3, 0xf6, 0x3a, 0x1c, 0x5e, 0x38, 0xaf, 0x1e, 0xbc, 0x05, 0x96, 0xea, 0x0f, 0x65, 0xa7, 0xc3, 0x53, 0x07, 0xf8, 0xe8, 0xe2, 0xfc, 0xc8, 0xb9, 0xcf, 0xdb, 0xeb, 0x70, 0x78, 0xee,
0xfb, 0xdd, 0x29, 0xdb, 0x2f, 0xef, 0xe4, 0x3f, 0x3d, 0x77, 0x1a, 0x07, 0x1f, 0x81, 0xa5, 0x72, 0xbc, 0xba, 0xff, 0x16, 0x58, 0xaa, 0x3f, 0x94, 0xed, 0x77, 0xab, 0x6c, 0xbf, 0xbc, 0x93, 0xff,
0x81, 0x74, 0xc0, 0x3a, 0x1c, 0x9e, 0x5d, 0x9c, 0x9c, 0x5d, 0x4a, 0xfd, 0x7d, 0x6f, 0x78, 0xee, 0xf4, 0xcc, 0x69, 0xec, 0x7f, 0x04, 0x96, 0xca, 0x05, 0xd2, 0x01, 0xeb, 0x60, 0x78, 0x7a, 0x7e,
0x68, 0xa4, 0x0d, 0x2d, 0x6f, 0x30, 0x3a, 0x1f, 0x9e, 0xf5, 0x9d, 0x86, 0x98, 0x9c, 0x3f, 0xeb, 0x7c, 0x7a, 0x21, 0xd7, 0xef, 0x7b, 0xc3, 0x33, 0x47, 0x23, 0x6d, 0x68, 0x79, 0x83, 0xd1, 0xd9,
0x1d, 0x0e, 0x1c, 0xfd, 0xe0, 0x00, 0x0c, 0x3c, 0x0d, 0x01, 0x30, 0x0f, 0xbd, 0x41, 0xef, 0x02, 0xf0, 0xb4, 0xef, 0x34, 0xc4, 0xe4, 0xec, 0x69, 0xef, 0x60, 0xe0, 0xe8, 0xfb, 0xfb, 0x60, 0xa0,
0xd7, 0x01, 0x98, 0x97, 0xe7, 0x7d, 0x1c, 0x6b, 0x38, 0xee, 0x0f, 0x9e, 0x0d, 0x2e, 0x06, 0x4e, 0x35, 0x04, 0xc0, 0x3c, 0xf0, 0x06, 0xbd, 0x73, 0xfc, 0x0e, 0xc0, 0xbc, 0x38, 0xeb, 0xe3, 0x58,
0xe3, 0xf1, 0x8f, 0xc1, 0x38, 0xc3, 0x5d, 0x9e, 0x40, 0x5b, 0x3a, 0xe9, 0x59, 0x9a, 0x2e, 0xc9, 0xc3, 0x71, 0x7f, 0xf0, 0x74, 0x70, 0x3e, 0x70, 0x1a, 0x8f, 0x7e, 0x0c, 0xc6, 0x29, 0xee, 0xf2,
0x46, 0x8d, 0xd8, 0xdb, 0xa8, 0xbb, 0xee, 0xce, 0x43, 0xed, 0x7b, 0xda, 0xe3, 0xdf, 0x37, 0xc0, 0x18, 0xda, 0xd2, 0x49, 0x4f, 0xd3, 0x74, 0x41, 0xd6, 0x6a, 0xc4, 0xce, 0x5a, 0xdd, 0x75, 0xb7,
0x3c, 0x8f, 0x8b, 0x59, 0x94, 0x90, 0xf7, 0xc0, 0x7a, 0x1a, 0x65, 0xf4, 0x38, 0xcd, 0x69, 0x6d, 0xf6, 0xb4, 0xef, 0x69, 0x8f, 0x7e, 0xdf, 0x00, 0xf3, 0x2c, 0x2e, 0xa6, 0x51, 0x42, 0xde, 0x03,
0xb1, 0x47, 0xaf, 0xf6, 0xaa, 0x0e, 0xc4, 0x63, 0xb9, 0x3b, 0xe4, 0x5d, 0x30, 0x9e, 0x46, 0x49, 0xeb, 0x49, 0x94, 0xd1, 0xa3, 0x34, 0xa7, 0xb5, 0x8f, 0x3d, 0x7a, 0xb5, 0x53, 0x75, 0x20, 0x9a,
0x48, 0x1c, 0xc9, 0x2a, 0xeb, 0xca, 0x5e, 0x95, 0xc2, 0x6b, 0x85, 0xbb, 0x43, 0xde, 0x81, 0x96, 0xe5, 0x6e, 0x91, 0x77, 0xc1, 0x78, 0x12, 0x25, 0x21, 0x71, 0x24, 0xab, 0xac, 0x2b, 0x3b, 0x55,
0xcc, 0x2f, 0x72, 0x4f, 0x45, 0xbf, 0xcc, 0xb6, 0x3d, 0xf1, 0xa3, 0x41, 0xfe, 0x72, 0xdb, 0x21, 0x0a, 0xaf, 0x15, 0xee, 0x16, 0x79, 0x07, 0x5a, 0x32, 0xbf, 0xc8, 0x3d, 0x15, 0xfd, 0x32, 0xdb,
0x6f, 0x43, 0x93, 0x27, 0x28, 0xb9, 0xbb, 0x4e, 0xd6, 0x1b, 0x05, 0xdf, 0x87, 0x4e, 0x35, 0x0d, 0x76, 0xc4, 0x8f, 0x06, 0xf9, 0x2f, 0x6f, 0x8b, 0xbc, 0x0d, 0x4d, 0x9e, 0xa0, 0xe4, 0xee, 0x2a,
0xc8, 0x0b, 0x62, 0xe7, 0xcd, 0xcc, 0xd8, 0x5c, 0xf6, 0x4e, 0xd9, 0xd3, 0xa4, 0x31, 0xd5, 0xcb, 0x59, 0x6f, 0x14, 0x7c, 0x1f, 0x3a, 0xd5, 0x34, 0x20, 0x2f, 0x88, 0x9d, 0xd7, 0x33, 0x63, 0xfd,
0xb5, 0x21, 0x3c, 0x31, 0xf9, 0x7f, 0xc1, 0x27, 0xff, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x1d, 0x5d, 0xb3, 0x77, 0xca, 0x9e, 0x26, 0x95, 0xa9, 0x1e, 0xae, 0x35, 0xe1, 0x89, 0xc9, 0x7f, 0x38, 0x3e,
0xca, 0xd9, 0x26, 0x1c, 0x00, 0x00, 0xfe, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x65, 0x88, 0x3a, 0xba, 0x7f, 0x1c, 0x00, 0x00,
} }

View File

@ -82,8 +82,8 @@ message ClientCred {
string value = 2; string value = 2;
// Verification response // Verification response
string response = 3; string response = 3;
// Request parameters, such as preferences. // Request parameters, such as preferences or country code.
bytes params = 4; map<string, bytes> params = 4;
} }
// SetDesc: C2S in set.what == "desc" and sub.init message // SetDesc: C2S in set.what == "desc" and sub.init message

File diff suppressed because one or more lines are too long

View File

@ -106,8 +106,8 @@ def upd():
@app.route('/rtagns', methods=['POST']) @app.route('/rtagns', methods=['POST'])
def rtags(): def rtags():
# Return dummy namespace "rest" and "email" # Return dummy namespace "rest" and "email", let client check logins by regular expression.
return jsonify({'strarr': ['rest', 'email']}) return jsonify({'strarr': ['rest', 'email'], 'byteval': base64.b64encode('^[a-z0-9_]{3,8}$')})
@app.errorhandler(404) @app.errorhandler(404)
def not_found(error): def not_found(error):

View File

@ -39,6 +39,11 @@ func (authenticator) Authenticate(secret []byte) (*auth.Rec, []byte, error) {
return nil, nil, types.ErrUnsupported return nil, nil, types.ErrUnsupported
} }
// AsTag is not supported, will produce an empty string.
func (authenticator) AsTag(token string) string {
return ""
}
// IsUnique for a noop. Anonymous login does not use secret, any secret is fine. // IsUnique for a noop. Anonymous login does not use secret, any secret is fine.
func (authenticator) IsUnique(secret []byte) (bool, error) { func (authenticator) IsUnique(secret []byte) (bool, error) {
return true, nil return true, nil

View File

@ -223,6 +223,10 @@ type AuthHandler interface {
// Returns: user auth record, challenge, error. // Returns: user auth record, challenge, error.
Authenticate(secret []byte) (*Rec, []byte, error) Authenticate(secret []byte) (*Rec, []byte, error)
// AsTag converts search token into prefixed tag or an empty string if it
// cannot be represented as a prefixed tag.
AsTag(token string) string
// IsUnique verifies if the provided secret can be considered unique by the auth scheme // IsUnique verifies if the provided secret can be considered unique by the auth scheme
// E.g. if login is unique. // E.g. if login is unique.
IsUnique(secret []byte) (bool, error) IsUnique(secret []byte) (bool, error)

View File

@ -239,11 +239,17 @@ func (a *authenticator) Authenticate(secret []byte) (*auth.Rec, []byte, error) {
State: types.StateUndefined}, nil, nil State: types.StateUndefined}, nil, nil
} }
func (a *authenticator) PreCheck(secret []byte) (string, error) { // AsTag convert search token into a prefixed tag, if possible.
if err := a.checkLoginPolicy(uname); err != nil { func (a *authenticator) AsTag(token string) string {
return "", err if !a.addToTags {
return ""
} }
return a.name + ":" + uname
if err := a.checkLoginPolicy(token); err != nil {
return ""
}
return a.name + ":" + token
} }
// IsUnique checks login uniqueness. // IsUnique checks login uniqueness.
@ -280,11 +286,11 @@ func (a *authenticator) DelRecords(uid types.Uid) error {
// RestrictedTags returns tag namespaces (prefixes) restricted by this adapter. // RestrictedTags returns tag namespaces (prefixes) restricted by this adapter.
func (a *authenticator) RestrictedTags() ([]string, error) { func (a *authenticator) RestrictedTags() ([]string, error) {
var tags []string var prefix []string
if a.addToTags { if a.addToTags {
tags = []string{a.name} prefix = []string{a.name}
} }
return tags, nil return prefix, nil
} }
// GetResetParams returns authenticator parameters passed to password reset handler. // GetResetParams returns authenticator parameters passed to password reset handler.

View File

@ -321,7 +321,9 @@ If accounts are managed by the server, the server should respond with an error `
### `rtagns` Get a list of restricted tag namespaces. ### `rtagns` Get a list of restricted tag namespaces.
Server may enforce certain tag namespaces to be restricted, i.e. not editable by the user. Server may enforce certain tag namespaces (tag prefixes) to be restricted, i.e. not editable by the user.
These are also used when searching for users.
The server may optionally provide a regular expression to validate search tokens before rewriting them as prefixed tags. I.e. if server allows only logins of 3-8 ASCII letters and numbers then the regexp could be `^[a-z0-9_]{3,8}$` which is base64-encoded as `XlthLXowLTlfXXszLDh9JA==`.
#### Sample request #### Sample request
```json ```json
@ -333,6 +335,7 @@ Server may enforce certain tag namespaces to be restricted, i.e. not editable by
#### Sample response #### Sample response
```json ```json
{ {
"strarr": ["basic", "email", "tel"] "strarr": ["basic", "email", "tel"],
"byteval": "XlthLXowLTlfXXszLDh9JA=="
} }
``` ```

View File

@ -6,8 +6,10 @@ import (
"encoding/json" "encoding/json"
"errors" "errors"
"io/ioutil" "io/ioutil"
"log"
"net/http" "net/http"
"net/url" "net/url"
"regexp"
"strings" "strings"
"time" "time"
@ -26,6 +28,10 @@ type authenticator struct {
allowNewAccounts bool allowNewAccounts bool
// Use separate endpoints, i.e. add request name to serverUrl path when making requests. // Use separate endpoints, i.e. add request name to serverUrl path when making requests.
useSeparateEndpoints bool useSeparateEndpoints bool
// Cache of restricted tag prefixes (namespaces).
rTagNS []string
// Optional regex pattern for checking tokens.
reToken *regexp.Regexp
} }
// Request to the server. // Request to the server.
@ -202,6 +208,19 @@ func (a *authenticator) Authenticate(secret []byte) (*auth.Rec, []byte, error) {
return resp.Record, resp.ByteVal, nil return resp.Record, resp.ByteVal, nil
} }
// AsTag converts search token into prefixed tag or an empty string if it
// cannot be represented as a prefixed tag.
func (a *authenticator) AsTag(token string) string {
if len(a.rTagNS) > 0 {
if a.reToken != nil && !a.reToken.MatchString(token) {
return ""
}
// No validation or passed validation.
return a.rTagNS[0] + ":" + token
}
return ""
}
// IsUnique verifies if the provided secret can be considered unique by the auth scheme // IsUnique verifies if the provided secret can be considered unique by the auth scheme
// E.g. if login is unique. // E.g. if login is unique.
func (a *authenticator) IsUnique(secret []byte) (bool, error) { func (a *authenticator) IsUnique(secret []byte) (bool, error) {
@ -231,11 +250,24 @@ func (a *authenticator) DelRecords(uid types.Uid) error {
// RestrictedTags returns tag namespaces (prefixes, such as prefix:login) restricted by the server. // RestrictedTags returns tag namespaces (prefixes, such as prefix:login) restricted by the server.
func (a *authenticator) RestrictedTags() ([]string, error) { func (a *authenticator) RestrictedTags() ([]string, error) {
if a.rTagNS != nil {
ns := make([]string, len(a.rTagNS))
copy(ns, a.rTagNS)
return ns, nil
}
resp, err := a.callEndpoint("rtagns", nil, nil) resp, err := a.callEndpoint("rtagns", nil, nil)
if err != nil { if err != nil {
return nil, err return nil, err
} }
// Save valid result to cache.
a.rTagNS = resp.StrSliceVal
if len(resp.ByteVal) > 0 {
a.reToken, err = regexp.Compile(string(resp.ByteVal))
if err != nil {
log.Println("rest_auth: invalid token regexp", string(resp.ByteVal))
}
}
return resp.StrSliceVal, nil return resp.StrSliceVal, nil
} }

View File

@ -157,6 +157,11 @@ func (ta *authenticator) GenSecret(rec *auth.Rec) ([]byte, time.Time, error) {
return buf.Bytes(), expires, nil return buf.Bytes(), expires, nil
} }
// AsTag is not supported, will produce an empty string.
func (authenticator) AsTag(token string) string {
return ""
}
// IsUnique is not supported, will produce an error. // IsUnique is not supported, will produce an error.
func (authenticator) IsUnique(token []byte) (bool, error) { func (authenticator) IsUnique(token []byte) (bool, error) {
return false, types.ErrUnsupported return false, types.ErrUnsupported

View File

@ -73,7 +73,7 @@ type MsgCredClient struct {
// Verification response // Verification response
Response string `json:"resp,omitempty"` Response string `json:"resp,omitempty"`
// Request parameters, such as preferences. Passed to valiator without interpretation. // Request parameters, such as preferences. Passed to valiator without interpretation.
Params interface{} `json:"params,omitempty"` Params map[string]interface{} `json:"params,omitempty"`
} }
// MsgSetQuery is an update to topic metadata: Desc, subscriptions, or tags. // MsgSetQuery is an update to topic metadata: Desc, subscriptions, or tags.

View File

@ -921,7 +921,7 @@ func pbClientCredSerialize(in *MsgCredClient) *pbx.ClientCred {
Method: in.Method, Method: in.Method,
Value: in.Value, Value: in.Value,
Response: in.Response, Response: in.Response,
Params: interfaceToBytes(in.Params)} Params: interfaceMapToByteMap(in.Params)}
} }
@ -947,7 +947,7 @@ func pbClientCredDeserialize(in *pbx.ClientCred) *MsgCredClient {
Method: in.GetMethod(), Method: in.GetMethod(),
Value: in.GetValue(), Value: in.GetValue(),
Response: in.GetResponse(), Response: in.GetResponse(),
Params: bytesToInterface(in.GetParams())} Params: byteMapToInterfaceMap(in.GetParams())}
} }
func pbClientCredsDeserialize(in []*pbx.ClientCred) []MsgCredClient { func pbClientCredsDeserialize(in []*pbx.ClientCred) []MsgCredClient {

View File

@ -76,7 +76,7 @@ func replyCreateUser(s *Session, msg *ClientComMessage, rec *auth.Rec) {
for i := range creds { for i := range creds {
cr := &creds[i] cr := &creds[i]
vld := store.GetValidator(cr.Method) vld := store.GetValidator(cr.Method)
if err := vld.PreCheck(cr.Value, cr.Params); err != nil { if _, err := vld.PreCheck(cr.Value, cr.Params); err != nil {
log.Println("create user: failed credential pre-check", cr, err, s.sid) log.Println("create user: failed credential pre-check", cr, err, s.sid)
s.queueOut(decodeStoreError(err, msg.Id, "", msg.timestamp, s.queueOut(decodeStoreError(err, msg.Id, "", msg.timestamp,
map[string]interface{}{"what": cr.Method})) map[string]interface{}{"what": cr.Method}))

View File

@ -9,7 +9,6 @@ import (
"fmt" "fmt"
"log" "log"
"net" "net"
"net/mail"
"path/filepath" "path/filepath"
"reflect" "reflect"
"regexp" "regexp"
@ -21,6 +20,7 @@ import (
"unicode/utf8" "unicode/utf8"
"github.com/tinode/chat/server/auth" "github.com/tinode/chat/server/auth"
"github.com/tinode/chat/server/store"
"github.com/tinode/chat/server/store/types" "github.com/tinode/chat/server/store/types"
"golang.org/x/crypto/acme/autocert" "golang.org/x/crypto/acme/autocert"
@ -35,10 +35,6 @@ var prefixedTagRegexp = regexp.MustCompile(`^([a-z]\w{1,15}):[-_+.!?#@\pL\pN]{1,
// Generic tag: the same restrictions as tag body. // Generic tag: the same restrictions as tag body.
var tagRegexp = regexp.MustCompile(`^[-_+.!?#@\pL\pN]{1,96}$`) var tagRegexp = regexp.MustCompile(`^[-_+.!?#@\pL\pN]{1,96}$`)
// Token suitable as a login: 3-16 chars, starts with a Unicode letter (class L) and contains Unicode letters (L),
// numbers (N) and underscore.
var basicLoginName = regexp.MustCompile(`^\pL[_\pL\pN]{2,15}$`)
const nullValue = "\u2421" const nullValue = "\u2421"
// Convert a list of IDs into ranges // Convert a list of IDs into ranges
@ -425,24 +421,26 @@ func rewriteTag(orig, countryCode string, withLogin bool) string {
return orig return orig
} }
// Is it email? // Check if token can be rewritten by any of the validators
if addr, err := mail.ParseAddress(orig); err == nil { param := map[string]interface{}{"countryCode": countryCode}
if len([]rune(addr.Address)) < maxTagLength && addr.Address == orig { for name, conf := range globals.validators {
return "email:" + orig if conf.addToTags {
val := store.GetValidator(name)
if tag, _ := val.PreCheck(orig, param); tag != "" {
return tag
}
} }
log.Println("failed to rewrite email tag", orig)
return ""
} }
if num, err := phonenumbers.Parse(orig, countryCode); err == nil { // Try authenticators now.
// It's a phone number. Not checking the length because phone numbers cannot be that long. if withLogin {
return "tel:" + phonenumbers.Format(num, phonenumbers.E164) auths := store.GetAuthNames()
} for _, name := range auths {
auth := store.GetAuthHandler(name)
// Does it look like a username/login? if tag := auth.AsTag(orig); tag != "" {
// TODO: use configured authenticators to check if orig is a valid user name. return tag
if withLogin && basicLoginName.MatchString(orig) { }
return "basic:" + orig }
} }
if tagRegexp.MatchString(orig) { if tagRegexp.MatchString(orig) {