diff options
Diffstat (limited to 'vendor/github.com')
65 files changed, 2452 insertions, 890 deletions
diff --git a/vendor/github.com/Rhymen/go-whatsapp/README.md b/vendor/github.com/Rhymen/go-whatsapp/README.md index 1248b8f9..5f439d55 100644 --- a/vendor/github.com/Rhymen/go-whatsapp/README.md +++ b/vendor/github.com/Rhymen/go-whatsapp/README.md @@ -23,7 +23,7 @@ qrChan := make(chan string) go func() { fmt.Printf("qr code: %v\n", <-qrChan) //show qr code or save it somewhere to scan -} +}() sess, err := wac.Login(qrChan) ``` The authentication process requires you to scan the qr code, that is send through the channel, with the device you are using whatsapp on. The session struct that is returned can be saved and used to restore the login without scanning the qr code again. The qr code has a ttl of 20 seconds and the login function throws a timeout err if the time has passed or any other request fails. @@ -66,6 +66,10 @@ func (myHandler) HandleJsonMessage(message string) { fmt.Println(message) } +func (myHandler) HandleContactMessage(message whatsapp.ContactMessage) { + fmt.Println(message) +} + wac.AddHandler(myHandler{}) ``` The message handlers are all optional, you don't need to implement anything but the error handler to implement the interface. The ImageMessage, VideoMessage, AudioMessage and DocumentMessage provide a Download function to get the media data. @@ -81,6 +85,21 @@ text := whatsapp.TextMessage{ err := wac.Send(text) ``` + +### Sending Contact Messages +```go +contactMessage := whatsapp.ContactMessage{ + Info: whatsapp.MessageInfo{ + RemoteJid: "0123456789@s.whatsapp.net", + }, + DisplayName: "Luke Skylwallker", + Vcard: "BEGIN:VCARD\nVERSION:3.0\nN:Skyllwalker;Luke;;\nFN:Luke Skywallker\nitem1.TEL;waid=0123456789:+1 23 456789789\nitem1.X-ABLabel:Mobile\nEND:VCARD", + } + +id, error := client.WaConn.Send(contactMessage) +``` + + The message will be send over the websocket. The attributes seen above are the required ones. All other relevant attributes (id, timestamp, fromMe, status) are set if they are missing in the struct. For the time being we only support text messages, but other types are planned for the near future. ## Legal diff --git a/vendor/github.com/Rhymen/go-whatsapp/binary/node.go b/vendor/github.com/Rhymen/go-whatsapp/binary/node.go index 2139e385..66b28d88 100644 --- a/vendor/github.com/Rhymen/go-whatsapp/binary/node.go +++ b/vendor/github.com/Rhymen/go-whatsapp/binary/node.go @@ -66,9 +66,12 @@ func Unmarshal(data []byte) (*Node, error) { } if n != nil && n.Attributes != nil && n.Content != nil { - n.Content, err = unmarshalMessageArray(n.Content.([]Node)) - if err != nil { - return nil, err + nContent, ok := n.Content.([]Node) + if ok { + n.Content, err = unmarshalMessageArray(nContent) + if err != nil { + return nil, err + } } } diff --git a/vendor/github.com/Rhymen/go-whatsapp/binary/proto/def.pb.go b/vendor/github.com/Rhymen/go-whatsapp/binary/proto/def.pb.go index 8d811b34..9c4d99de 100644 --- a/vendor/github.com/Rhymen/go-whatsapp/binary/proto/def.pb.go +++ b/vendor/github.com/Rhymen/go-whatsapp/binary/proto/def.pb.go @@ -201,15 +201,18 @@ func (VideoMessage_VIDEO_MESSAGE_ATTRIBUTION) EnumDescriptor() ([]byte, []int) { type ProtocolMessage_PROTOCOL_MESSAGE_TYPE int32 const ( - ProtocolMessage_REVOKE ProtocolMessage_PROTOCOL_MESSAGE_TYPE = 0 + ProtocolMessage_REVOKE ProtocolMessage_PROTOCOL_MESSAGE_TYPE = 0 + ProtocolMessage_EPHEMERAL_SETTING ProtocolMessage_PROTOCOL_MESSAGE_TYPE = 3 ) var ProtocolMessage_PROTOCOL_MESSAGE_TYPE_name = map[int32]string{ 0: "REVOKE", + 3: "EPHEMERAL_SETTING", } var ProtocolMessage_PROTOCOL_MESSAGE_TYPE_value = map[string]int32{ - "REVOKE": 0, + "REVOKE": 0, + "EPHEMERAL_SETTING": 3, } func (x ProtocolMessage_PROTOCOL_MESSAGE_TYPE) Enum() *ProtocolMessage_PROTOCOL_MESSAGE_TYPE { @@ -333,21 +336,24 @@ func (HSMDateTimeComponent_HSM_DATE_TIME_COMPONENT_CALENDARTYPE) EnumDescriptor( type WebFeatures_WEB_FEATURES_FLAG int32 const ( - WebFeatures_NOT_IMPLEMENTED WebFeatures_WEB_FEATURES_FLAG = 0 - WebFeatures_IMPLEMENTED WebFeatures_WEB_FEATURES_FLAG = 1 - WebFeatures_OPTIONAL WebFeatures_WEB_FEATURES_FLAG = 2 + WebFeatures_NOT_STARTED WebFeatures_WEB_FEATURES_FLAG = 0 + WebFeatures_FORCE_UPGRADE WebFeatures_WEB_FEATURES_FLAG = 1 + WebFeatures_DEVELOPMENT WebFeatures_WEB_FEATURES_FLAG = 2 + WebFeatures_PRODUCTION WebFeatures_WEB_FEATURES_FLAG = 3 ) var WebFeatures_WEB_FEATURES_FLAG_name = map[int32]string{ - 0: "NOT_IMPLEMENTED", - 1: "IMPLEMENTED", - 2: "OPTIONAL", + 0: "NOT_STARTED", + 1: "FORCE_UPGRADE", + 2: "DEVELOPMENT", + 3: "PRODUCTION", } var WebFeatures_WEB_FEATURES_FLAG_value = map[string]int32{ - "NOT_IMPLEMENTED": 0, - "IMPLEMENTED": 1, - "OPTIONAL": 2, + "NOT_STARTED": 0, + "FORCE_UPGRADE": 1, + "DEVELOPMENT": 2, + "PRODUCTION": 3, } func (x WebFeatures_WEB_FEATURES_FLAG) Enum() *WebFeatures_WEB_FEATURES_FLAG { @@ -370,7 +376,7 @@ func (x *WebFeatures_WEB_FEATURES_FLAG) UnmarshalJSON(data []byte) error { } func (WebFeatures_WEB_FEATURES_FLAG) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_76fb0470a3b910d8, []int{46, 0} + return fileDescriptor_76fb0470a3b910d8, []int{48, 0} } type PaymentInfo_PAYMENT_INFO_STATUS int32 @@ -440,7 +446,7 @@ func (x *PaymentInfo_PAYMENT_INFO_STATUS) UnmarshalJSON(data []byte) error { } func (PaymentInfo_PAYMENT_INFO_STATUS) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_76fb0470a3b910d8, []int{50, 0} + return fileDescriptor_76fb0470a3b910d8, []int{52, 0} } type WebMessageInfo_WEB_MESSAGE_INFO_STATUS int32 @@ -492,7 +498,7 @@ func (x *WebMessageInfo_WEB_MESSAGE_INFO_STATUS) UnmarshalJSON(data []byte) erro } func (WebMessageInfo_WEB_MESSAGE_INFO_STATUS) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_76fb0470a3b910d8, []int{51, 0} + return fileDescriptor_76fb0470a3b910d8, []int{53, 0} } type WebMessageInfo_WEB_MESSAGE_INFO_STUBTYPE int32 @@ -568,6 +574,9 @@ const ( WebMessageInfo_BIZ_TWO_TIER_MIGRATION_BOTTOM WebMessageInfo_WEB_MESSAGE_INFO_STUBTYPE = 67 WebMessageInfo_OVERSIZED WebMessageInfo_WEB_MESSAGE_INFO_STUBTYPE = 68 WebMessageInfo_GROUP_CHANGE_NO_FREQUENTLY_FORWARDED WebMessageInfo_WEB_MESSAGE_INFO_STUBTYPE = 69 + WebMessageInfo_GROUP_V4_ADD_INVITE_SENT WebMessageInfo_WEB_MESSAGE_INFO_STUBTYPE = 70 + WebMessageInfo_GROUP_PARTICIPANT_ADD_REQUEST_JOIN WebMessageInfo_WEB_MESSAGE_INFO_STUBTYPE = 71 + WebMessageInfo_CHANGE_EPHEMERAL_SETTING WebMessageInfo_WEB_MESSAGE_INFO_STUBTYPE = 72 ) var WebMessageInfo_WEB_MESSAGE_INFO_STUBTYPE_name = map[int32]string{ @@ -641,6 +650,9 @@ var WebMessageInfo_WEB_MESSAGE_INFO_STUBTYPE_name = map[int32]string{ 67: "BIZ_TWO_TIER_MIGRATION_BOTTOM", 68: "OVERSIZED", 69: "GROUP_CHANGE_NO_FREQUENTLY_FORWARDED", + 70: "GROUP_V4_ADD_INVITE_SENT", + 71: "GROUP_PARTICIPANT_ADD_REQUEST_JOIN", + 72: "CHANGE_EPHEMERAL_SETTING", } var WebMessageInfo_WEB_MESSAGE_INFO_STUBTYPE_value = map[string]int32{ @@ -714,6 +726,9 @@ var WebMessageInfo_WEB_MESSAGE_INFO_STUBTYPE_value = map[string]int32{ "BIZ_TWO_TIER_MIGRATION_BOTTOM": 67, "OVERSIZED": 68, "GROUP_CHANGE_NO_FREQUENTLY_FORWARDED": 69, + "GROUP_V4_ADD_INVITE_SENT": 70, + "GROUP_PARTICIPANT_ADD_REQUEST_JOIN": 71, + "CHANGE_EPHEMERAL_SETTING": 72, } func (x WebMessageInfo_WEB_MESSAGE_INFO_STUBTYPE) Enum() *WebMessageInfo_WEB_MESSAGE_INFO_STUBTYPE { @@ -736,12 +751,12 @@ func (x *WebMessageInfo_WEB_MESSAGE_INFO_STUBTYPE) UnmarshalJSON(data []byte) er } func (WebMessageInfo_WEB_MESSAGE_INFO_STUBTYPE) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_76fb0470a3b910d8, []int{51, 1} + return fileDescriptor_76fb0470a3b910d8, []int{53, 1} } type HydratedQuickReplyButton struct { DisplayText *string `protobuf:"bytes,1,opt,name=displayText" json:"displayText,omitempty"` - ButtonId *string `protobuf:"bytes,2,opt,name=buttonId" json:"buttonId,omitempty"` + Id *string `protobuf:"bytes,2,opt,name=id" json:"id,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -779,9 +794,9 @@ func (m *HydratedQuickReplyButton) GetDisplayText() string { return "" } -func (m *HydratedQuickReplyButton) GetButtonId() string { - if m != nil && m.ButtonId != nil { - return *m.ButtonId +func (m *HydratedQuickReplyButton) GetId() string { + if m != nil && m.Id != nil { + return *m.Id } return "" } @@ -881,6 +896,7 @@ func (m *HydratedCallButton) GetPhoneNumber() string { } type HydratedTemplateButton struct { + Index *uint32 `protobuf:"varint,4,opt,name=index" json:"index,omitempty"` // Types that are valid to be assigned to HydratedButton: // *HydratedTemplateButton_QuickReplyButton // *HydratedTemplateButton_UrlButton @@ -916,6 +932,13 @@ func (m *HydratedTemplateButton) XXX_DiscardUnknown() { var xxx_messageInfo_HydratedTemplateButton proto.InternalMessageInfo +func (m *HydratedTemplateButton) GetIndex() uint32 { + if m != nil && m.Index != nil { + return *m.Index + } + return 0 +} + type isHydratedTemplateButton_HydratedButton interface { isHydratedTemplateButton_HydratedButton() } @@ -977,7 +1000,7 @@ func (*HydratedTemplateButton) XXX_OneofWrappers() []interface{} { type QuickReplyButton struct { DisplayText *HighlyStructuredMessage `protobuf:"bytes,1,opt,name=displayText" json:"displayText,omitempty"` - ButtonId *string `protobuf:"bytes,2,opt,name=buttonId" json:"buttonId,omitempty"` + Id *string `protobuf:"bytes,2,opt,name=id" json:"id,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1015,9 +1038,9 @@ func (m *QuickReplyButton) GetDisplayText() *HighlyStructuredMessage { return nil } -func (m *QuickReplyButton) GetButtonId() string { - if m != nil && m.ButtonId != nil { - return *m.ButtonId +func (m *QuickReplyButton) GetId() string { + if m != nil && m.Id != nil { + return *m.Id } return "" } @@ -1117,6 +1140,7 @@ func (m *CallButton) GetPhoneNumber() *HighlyStructuredMessage { } type TemplateButton struct { + Index *uint32 `protobuf:"varint,4,opt,name=index" json:"index,omitempty"` // Types that are valid to be assigned to Button: // *TemplateButton_QuickReplyButton // *TemplateButton_UrlButton @@ -1152,6 +1176,13 @@ func (m *TemplateButton) XXX_DiscardUnknown() { var xxx_messageInfo_TemplateButton proto.InternalMessageInfo +func (m *TemplateButton) GetIndex() uint32 { + if m != nil && m.Index != nil { + return *m.Index + } + return 0 +} + type isTemplateButton_Button interface { isTemplateButton_Button() } @@ -1461,6 +1492,8 @@ type ContextInfo struct { ForwardingScore *uint32 `protobuf:"varint,21,opt,name=forwardingScore" json:"forwardingScore,omitempty"` IsForwarded *bool `protobuf:"varint,22,opt,name=isForwarded" json:"isForwarded,omitempty"` QuotedAd *AdReplyInfo `protobuf:"bytes,23,opt,name=quotedAd" json:"quotedAd,omitempty"` + PlaceholderKey *MessageKey `protobuf:"bytes,24,opt,name=placeholderKey" json:"placeholderKey,omitempty"` + Expiration *uint32 `protobuf:"varint,25,opt,name=expiration" json:"expiration,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1568,6 +1601,20 @@ func (m *ContextInfo) GetQuotedAd() *AdReplyInfo { return nil } +func (m *ContextInfo) GetPlaceholderKey() *MessageKey { + if m != nil { + return m.PlaceholderKey + } + return nil +} + +func (m *ContextInfo) GetExpiration() uint32 { + if m != nil && m.Expiration != nil { + return *m.Expiration + } + return 0 +} + type SenderKeyDistributionMessage struct { GroupId *string `protobuf:"bytes,1,opt,name=groupId" json:"groupId,omitempty"` AxolotlSenderKeyDistributionMessage []byte `protobuf:"bytes,2,opt,name=axolotlSenderKeyDistributionMessage" json:"axolotlSenderKeyDistributionMessage,omitempty"` @@ -1616,26 +1663,30 @@ func (m *SenderKeyDistributionMessage) GetAxolotlSenderKeyDistributionMessage() } type ImageMessage struct { - Url *string `protobuf:"bytes,1,opt,name=url" json:"url,omitempty"` - Mimetype *string `protobuf:"bytes,2,opt,name=mimetype" json:"mimetype,omitempty"` - Caption *string `protobuf:"bytes,3,opt,name=caption" json:"caption,omitempty"` - FileSha256 []byte `protobuf:"bytes,4,opt,name=fileSha256" json:"fileSha256,omitempty"` - FileLength *uint64 `protobuf:"varint,5,opt,name=fileLength" json:"fileLength,omitempty"` - Height *uint32 `protobuf:"varint,6,opt,name=height" json:"height,omitempty"` - Width *uint32 `protobuf:"varint,7,opt,name=width" json:"width,omitempty"` - MediaKey []byte `protobuf:"bytes,8,opt,name=mediaKey" json:"mediaKey,omitempty"` - FileEncSha256 []byte `protobuf:"bytes,9,opt,name=fileEncSha256" json:"fileEncSha256,omitempty"` - InteractiveAnnotations []*InteractiveAnnotation `protobuf:"bytes,10,rep,name=interactiveAnnotations" json:"interactiveAnnotations,omitempty"` - DirectPath *string `protobuf:"bytes,11,opt,name=directPath" json:"directPath,omitempty"` - MediaKeyTimestamp *int64 `protobuf:"varint,12,opt,name=mediaKeyTimestamp" json:"mediaKeyTimestamp,omitempty"` - JpegThumbnail []byte `protobuf:"bytes,16,opt,name=jpegThumbnail" json:"jpegThumbnail,omitempty"` - ContextInfo *ContextInfo `protobuf:"bytes,17,opt,name=contextInfo" json:"contextInfo,omitempty"` - FirstScanSidecar []byte `protobuf:"bytes,18,opt,name=firstScanSidecar" json:"firstScanSidecar,omitempty"` - FirstScanLength *uint32 `protobuf:"varint,19,opt,name=firstScanLength" json:"firstScanLength,omitempty"` - ExperimentGroupId *uint32 `protobuf:"varint,20,opt,name=experimentGroupId" json:"experimentGroupId,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Url *string `protobuf:"bytes,1,opt,name=url" json:"url,omitempty"` + Mimetype *string `protobuf:"bytes,2,opt,name=mimetype" json:"mimetype,omitempty"` + Caption *string `protobuf:"bytes,3,opt,name=caption" json:"caption,omitempty"` + FileSha256 []byte `protobuf:"bytes,4,opt,name=fileSha256" json:"fileSha256,omitempty"` + FileLength *uint64 `protobuf:"varint,5,opt,name=fileLength" json:"fileLength,omitempty"` + Height *uint32 `protobuf:"varint,6,opt,name=height" json:"height,omitempty"` + Width *uint32 `protobuf:"varint,7,opt,name=width" json:"width,omitempty"` + MediaKey []byte `protobuf:"bytes,8,opt,name=mediaKey" json:"mediaKey,omitempty"` + FileEncSha256 []byte `protobuf:"bytes,9,opt,name=fileEncSha256" json:"fileEncSha256,omitempty"` + InteractiveAnnotations []*InteractiveAnnotation `protobuf:"bytes,10,rep,name=interactiveAnnotations" json:"interactiveAnnotations,omitempty"` + DirectPath *string `protobuf:"bytes,11,opt,name=directPath" json:"directPath,omitempty"` + MediaKeyTimestamp *int64 `protobuf:"varint,12,opt,name=mediaKeyTimestamp" json:"mediaKeyTimestamp,omitempty"` + JpegThumbnail []byte `protobuf:"bytes,16,opt,name=jpegThumbnail" json:"jpegThumbnail,omitempty"` + ContextInfo *ContextInfo `protobuf:"bytes,17,opt,name=contextInfo" json:"contextInfo,omitempty"` + FirstScanSidecar []byte `protobuf:"bytes,18,opt,name=firstScanSidecar" json:"firstScanSidecar,omitempty"` + FirstScanLength *uint32 `protobuf:"varint,19,opt,name=firstScanLength" json:"firstScanLength,omitempty"` + ExperimentGroupId *uint32 `protobuf:"varint,20,opt,name=experimentGroupId" json:"experimentGroupId,omitempty"` + ScansSidecar []byte `protobuf:"bytes,21,opt,name=scansSidecar" json:"scansSidecar,omitempty"` + ScanLengths []uint32 `protobuf:"varint,22,rep,name=scanLengths" json:"scanLengths,omitempty"` + MidQualityFileSha256 []byte `protobuf:"bytes,23,opt,name=midQualityFileSha256" json:"midQualityFileSha256,omitempty"` + MidQualityFileEncSha256 []byte `protobuf:"bytes,24,opt,name=midQualityFileEncSha256" json:"midQualityFileEncSha256,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *ImageMessage) Reset() { *m = ImageMessage{} } @@ -1782,6 +1833,34 @@ func (m *ImageMessage) GetExperimentGroupId() uint32 { return 0 } +func (m *ImageMessage) GetScansSidecar() []byte { + if m != nil { + return m.ScansSidecar + } + return nil +} + +func (m *ImageMessage) GetScanLengths() []uint32 { + if m != nil { + return m.ScanLengths + } + return nil +} + +func (m *ImageMessage) GetMidQualityFileSha256() []byte { + if m != nil { + return m.MidQualityFileSha256 + } + return nil +} + +func (m *ImageMessage) GetMidQualityFileEncSha256() []byte { + if m != nil { + return m.MidQualityFileEncSha256 + } + return nil +} + type ContactMessage struct { DisplayName *string `protobuf:"bytes,1,opt,name=displayName" json:"displayName,omitempty"` Vcard *string `protobuf:"bytes,16,opt,name=vcard" json:"vcard,omitempty"` @@ -1936,6 +2015,7 @@ type ExtendedTextMessage struct { PreviewType *ExtendedTextMessage_EXTENDED_TEXT_MESSAGE_PREVIEWTYPE `protobuf:"varint,10,opt,name=previewType,enum=proto.ExtendedTextMessage_EXTENDED_TEXT_MESSAGE_PREVIEWTYPE" json:"previewType,omitempty"` JpegThumbnail []byte `protobuf:"bytes,16,opt,name=jpegThumbnail" json:"jpegThumbnail,omitempty"` ContextInfo *ContextInfo `protobuf:"bytes,17,opt,name=contextInfo" json:"contextInfo,omitempty"` + DoNotPlayInline *bool `protobuf:"varint,18,opt,name=doNotPlayInline" json:"doNotPlayInline,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -2043,6 +2123,13 @@ func (m *ExtendedTextMessage) GetContextInfo() *ContextInfo { return nil } +func (m *ExtendedTextMessage) GetDoNotPlayInline() bool { + if m != nil && m.DoNotPlayInline != nil { + return *m.DoNotPlayInline + } + return false +} + type DocumentMessage struct { Url *string `protobuf:"bytes,1,opt,name=url" json:"url,omitempty"` Mimetype *string `protobuf:"bytes,2,opt,name=mimetype" json:"mimetype,omitempty"` @@ -2569,6 +2656,7 @@ func (m *Chat) GetId() string { type ProtocolMessage struct { Key *MessageKey `protobuf:"bytes,1,opt,name=key" json:"key,omitempty"` Type *ProtocolMessage_PROTOCOL_MESSAGE_TYPE `protobuf:"varint,2,opt,name=type,enum=proto.ProtocolMessage_PROTOCOL_MESSAGE_TYPE" json:"type,omitempty"` + EphemeralExpiration *uint32 `protobuf:"varint,4,opt,name=ephemeralExpiration" json:"ephemeralExpiration,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -2613,6 +2701,13 @@ func (m *ProtocolMessage) GetType() ProtocolMessage_PROTOCOL_MESSAGE_TYPE { return ProtocolMessage_REVOKE } +func (m *ProtocolMessage) GetEphemeralExpiration() uint32 { + if m != nil && m.EphemeralExpiration != nil { + return *m.EphemeralExpiration + } + return 0 +} + type ContactsArrayMessage struct { DisplayName *string `protobuf:"bytes,1,opt,name=displayName" json:"displayName,omitempty"` Contacts []*ContactMessage `protobuf:"bytes,2,rep,name=contacts" json:"contacts,omitempty"` @@ -3018,6 +3113,7 @@ type HighlyStructuredMessage struct { LocalizableParams []*HSMLocalizableParameter `protobuf:"bytes,6,rep,name=localizableParams" json:"localizableParams,omitempty"` DeterministicLg *string `protobuf:"bytes,7,opt,name=deterministicLg" json:"deterministicLg,omitempty"` DeterministicLc *string `protobuf:"bytes,8,opt,name=deterministicLc" json:"deterministicLc,omitempty"` + HydratedHsm *TemplateMessage `protobuf:"bytes,9,opt,name=hydratedHsm" json:"hydratedHsm,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -3104,6 +3200,13 @@ func (m *HighlyStructuredMessage) GetDeterministicLc() string { return "" } +func (m *HighlyStructuredMessage) GetHydratedHsm() *TemplateMessage { + if m != nil { + return m.HydratedHsm + } + return nil +} + type SendPaymentMessage struct { NoteMessage *Message `protobuf:"bytes,2,opt,name=noteMessage" json:"noteMessage,omitempty"` RequestMessageKey *MessageKey `protobuf:"bytes,3,opt,name=requestMessageKey" json:"requestMessageKey,omitempty"` @@ -3422,7 +3525,8 @@ type StickerMessage struct { DirectPath *string `protobuf:"bytes,8,opt,name=directPath" json:"directPath,omitempty"` FileLength *uint64 `protobuf:"varint,9,opt,name=fileLength" json:"fileLength,omitempty"` MediaKeyTimestamp *int64 `protobuf:"varint,10,opt,name=mediaKeyTimestamp" json:"mediaKeyTimestamp,omitempty"` - PngThumbnail []byte `protobuf:"bytes,16,opt,name=pngThumbnail" json:"pngThumbnail,omitempty"` + FirstFrameLength *uint32 `protobuf:"varint,11,opt,name=firstFrameLength" json:"firstFrameLength,omitempty"` + FirstFrameSidecar []byte `protobuf:"bytes,12,opt,name=firstFrameSidecar" json:"firstFrameSidecar,omitempty"` ContextInfo *ContextInfo `protobuf:"bytes,17,opt,name=contextInfo" json:"contextInfo,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -3524,9 +3628,16 @@ func (m *StickerMessage) GetMediaKeyTimestamp() int64 { return 0 } -func (m *StickerMessage) GetPngThumbnail() []byte { +func (m *StickerMessage) GetFirstFrameLength() uint32 { + if m != nil && m.FirstFrameLength != nil { + return *m.FirstFrameLength + } + return 0 +} + +func (m *StickerMessage) GetFirstFrameSidecar() []byte { if m != nil { - return m.PngThumbnail + return m.FirstFrameSidecar } return nil } @@ -3690,7 +3801,8 @@ func (*FourRowTemplate) XXX_OneofWrappers() []interface{} { type HydratedFourRowTemplate struct { HydratedContentText *string `protobuf:"bytes,6,opt,name=hydratedContentText" json:"hydratedContentText,omitempty"` HydratedFooterText *string `protobuf:"bytes,7,opt,name=hydratedFooterText" json:"hydratedFooterText,omitempty"` - HydratedButtons []*HydratedTemplateButton `protobuf:"bytes,9,rep,name=hydratedButtons" json:"hydratedButtons,omitempty"` + HydratedButtons []*HydratedTemplateButton `protobuf:"bytes,8,rep,name=hydratedButtons" json:"hydratedButtons,omitempty"` + TemplateId *string `protobuf:"bytes,9,opt,name=templateId" json:"templateId,omitempty"` // Types that are valid to be assigned to Title: // *HydratedFourRowTemplate_DocumentMessage // *HydratedFourRowTemplate_HydratedTitleText @@ -3749,6 +3861,13 @@ func (m *HydratedFourRowTemplate) GetHydratedButtons() []*HydratedTemplateButton return nil } +func (m *HydratedFourRowTemplate) GetTemplateId() string { + if m != nil && m.TemplateId != nil { + return *m.TemplateId + } + return "" +} + type isHydratedFourRowTemplate_Title interface { isHydratedFourRowTemplate_Title() } @@ -3837,6 +3956,8 @@ func (*HydratedFourRowTemplate) XXX_OneofWrappers() []interface{} { } type TemplateMessage struct { + ContextInfo *ContextInfo `protobuf:"bytes,3,opt,name=contextInfo" json:"contextInfo,omitempty"` + HydratedTemplate *HydratedFourRowTemplate `protobuf:"bytes,4,opt,name=hydratedTemplate" json:"hydratedTemplate,omitempty"` // Types that are valid to be assigned to Format: // *TemplateMessage_FourRowTemplate // *TemplateMessage_HydratedFourRowTemplate @@ -3871,6 +3992,20 @@ func (m *TemplateMessage) XXX_DiscardUnknown() { var xxx_messageInfo_TemplateMessage proto.InternalMessageInfo +func (m *TemplateMessage) GetContextInfo() *ContextInfo { + if m != nil { + return m.ContextInfo + } + return nil +} + +func (m *TemplateMessage) GetHydratedTemplate() *HydratedFourRowTemplate { + if m != nil { + return m.HydratedTemplate + } + return nil +} + type isTemplateMessage_Format interface { isTemplateMessage_Format() } @@ -3917,12 +4052,13 @@ func (*TemplateMessage) XXX_OneofWrappers() []interface{} { } type TemplateButtonReplyMessage struct { - SelectedButtonId *string `protobuf:"bytes,1,opt,name=selectedButtonId" json:"selectedButtonId,omitempty"` - SelectedButtonDisplayText []string `protobuf:"bytes,2,rep,name=selectedButtonDisplayText" json:"selectedButtonDisplayText,omitempty"` - ContextInfo *ContextInfo `protobuf:"bytes,3,opt,name=contextInfo" json:"contextInfo,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + SelectedId *string `protobuf:"bytes,1,opt,name=selectedId" json:"selectedId,omitempty"` + SelectedDisplayText *string `protobuf:"bytes,2,opt,name=selectedDisplayText" json:"selectedDisplayText,omitempty"` + ContextInfo *ContextInfo `protobuf:"bytes,3,opt,name=contextInfo" json:"contextInfo,omitempty"` + SelectedIndex *uint32 `protobuf:"varint,4,opt,name=selectedIndex" json:"selectedIndex,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *TemplateButtonReplyMessage) Reset() { *m = TemplateButtonReplyMessage{} } @@ -3950,18 +4086,18 @@ func (m *TemplateButtonReplyMessage) XXX_DiscardUnknown() { var xxx_messageInfo_TemplateButtonReplyMessage proto.InternalMessageInfo -func (m *TemplateButtonReplyMessage) GetSelectedButtonId() string { - if m != nil && m.SelectedButtonId != nil { - return *m.SelectedButtonId +func (m *TemplateButtonReplyMessage) GetSelectedId() string { + if m != nil && m.SelectedId != nil { + return *m.SelectedId } return "" } -func (m *TemplateButtonReplyMessage) GetSelectedButtonDisplayText() []string { - if m != nil { - return m.SelectedButtonDisplayText +func (m *TemplateButtonReplyMessage) GetSelectedDisplayText() string { + if m != nil && m.SelectedDisplayText != nil { + return *m.SelectedDisplayText } - return nil + return "" } func (m *TemplateButtonReplyMessage) GetContextInfo() *ContextInfo { @@ -3971,6 +4107,13 @@ func (m *TemplateButtonReplyMessage) GetContextInfo() *ContextInfo { return nil } +func (m *TemplateButtonReplyMessage) GetSelectedIndex() uint32 { + if m != nil && m.SelectedIndex != nil { + return *m.SelectedIndex + } + return 0 +} + type ProductSnapshot struct { ProductImage *ImageMessage `protobuf:"bytes,1,opt,name=productImage" json:"productImage,omitempty"` ProductId *string `protobuf:"bytes,2,opt,name=productId" json:"productId,omitempty"` @@ -3981,6 +4124,7 @@ type ProductSnapshot struct { RetailerId *string `protobuf:"bytes,7,opt,name=retailerId" json:"retailerId,omitempty"` Url *string `protobuf:"bytes,8,opt,name=url" json:"url,omitempty"` ProductImageCount *uint32 `protobuf:"varint,9,opt,name=productImageCount" json:"productImageCount,omitempty"` + FirstImageId *string `protobuf:"bytes,11,opt,name=firstImageId" json:"firstImageId,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -4074,6 +4218,13 @@ func (m *ProductSnapshot) GetProductImageCount() uint32 { return 0 } +func (m *ProductSnapshot) GetFirstImageId() string { + if m != nil && m.FirstImageId != nil { + return *m.FirstImageId + } + return "" +} + type ProductMessage struct { Product *ProductSnapshot `protobuf:"bytes,1,opt,name=product" json:"product,omitempty"` BusinessOwnerJid *string `protobuf:"bytes,2,opt,name=businessOwnerJid" json:"businessOwnerJid,omitempty"` @@ -4130,15 +4281,16 @@ func (m *ProductMessage) GetContextInfo() *ContextInfo { } type GroupInviteMessage struct { - GroupJid *string `protobuf:"bytes,1,opt,name=groupJid" json:"groupJid,omitempty"` - InviteCode *string `protobuf:"bytes,2,opt,name=inviteCode" json:"inviteCode,omitempty"` - InviteExpiration *int64 `protobuf:"varint,3,opt,name=inviteExpiration" json:"inviteExpiration,omitempty"` - GroupName *string `protobuf:"bytes,4,opt,name=groupName" json:"groupName,omitempty"` - JpegThumbnail []byte `protobuf:"bytes,5,opt,name=jpegThumbnail" json:"jpegThumbnail,omitempty"` - Caption *string `protobuf:"bytes,6,opt,name=caption" json:"caption,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + GroupJid *string `protobuf:"bytes,1,opt,name=groupJid" json:"groupJid,omitempty"` + InviteCode *string `protobuf:"bytes,2,opt,name=inviteCode" json:"inviteCode,omitempty"` + InviteExpiration *int64 `protobuf:"varint,3,opt,name=inviteExpiration" json:"inviteExpiration,omitempty"` + GroupName *string `protobuf:"bytes,4,opt,name=groupName" json:"groupName,omitempty"` + JpegThumbnail []byte `protobuf:"bytes,5,opt,name=jpegThumbnail" json:"jpegThumbnail,omitempty"` + Caption *string `protobuf:"bytes,6,opt,name=caption" json:"caption,omitempty"` + ContextInfo *ContextInfo `protobuf:"bytes,7,opt,name=contextInfo" json:"contextInfo,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *GroupInviteMessage) Reset() { *m = GroupInviteMessage{} } @@ -4208,6 +4360,99 @@ func (m *GroupInviteMessage) GetCaption() string { return "" } +func (m *GroupInviteMessage) GetContextInfo() *ContextInfo { + if m != nil { + return m.ContextInfo + } + return nil +} + +type DeviceSentMessage struct { + DestinationJid *string `protobuf:"bytes,1,opt,name=destinationJid" json:"destinationJid,omitempty"` + Message *Message `protobuf:"bytes,2,opt,name=message" json:"message,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DeviceSentMessage) Reset() { *m = DeviceSentMessage{} } +func (m *DeviceSentMessage) String() string { return proto.CompactTextString(m) } +func (*DeviceSentMessage) ProtoMessage() {} +func (*DeviceSentMessage) Descriptor() ([]byte, []int) { + return fileDescriptor_76fb0470a3b910d8, []int{44} +} + +func (m *DeviceSentMessage) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_DeviceSentMessage.Unmarshal(m, b) +} +func (m *DeviceSentMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_DeviceSentMessage.Marshal(b, m, deterministic) +} +func (m *DeviceSentMessage) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceSentMessage.Merge(m, src) +} +func (m *DeviceSentMessage) XXX_Size() int { + return xxx_messageInfo_DeviceSentMessage.Size(m) +} +func (m *DeviceSentMessage) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceSentMessage.DiscardUnknown(m) +} + +var xxx_messageInfo_DeviceSentMessage proto.InternalMessageInfo + +func (m *DeviceSentMessage) GetDestinationJid() string { + if m != nil && m.DestinationJid != nil { + return *m.DestinationJid + } + return "" +} + +func (m *DeviceSentMessage) GetMessage() *Message { + if m != nil { + return m.Message + } + return nil +} + +type DeviceSyncMessage struct { + SerializedXmlBytes []byte `protobuf:"bytes,1,opt,name=serializedXmlBytes" json:"serializedXmlBytes,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DeviceSyncMessage) Reset() { *m = DeviceSyncMessage{} } +func (m *DeviceSyncMessage) String() string { return proto.CompactTextString(m) } +func (*DeviceSyncMessage) ProtoMessage() {} +func (*DeviceSyncMessage) Descriptor() ([]byte, []int) { + return fileDescriptor_76fb0470a3b910d8, []int{45} +} + +func (m *DeviceSyncMessage) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_DeviceSyncMessage.Unmarshal(m, b) +} +func (m *DeviceSyncMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_DeviceSyncMessage.Marshal(b, m, deterministic) +} +func (m *DeviceSyncMessage) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceSyncMessage.Merge(m, src) +} +func (m *DeviceSyncMessage) XXX_Size() int { + return xxx_messageInfo_DeviceSyncMessage.Size(m) +} +func (m *DeviceSyncMessage) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceSyncMessage.DiscardUnknown(m) +} + +var xxx_messageInfo_DeviceSyncMessage proto.InternalMessageInfo + +func (m *DeviceSyncMessage) GetSerializedXmlBytes() []byte { + if m != nil { + return m.SerializedXmlBytes + } + return nil +} + type Message struct { Conversation *string `protobuf:"bytes,1,opt,name=conversation" json:"conversation,omitempty"` SenderKeyDistributionMessage *SenderKeyDistributionMessage `protobuf:"bytes,2,opt,name=senderKeyDistributionMessage" json:"senderKeyDistributionMessage,omitempty"` @@ -4231,8 +4476,11 @@ type Message struct { CancelPaymentRequestMessage *CancelPaymentRequestMessage `protobuf:"bytes,24,opt,name=cancelPaymentRequestMessage" json:"cancelPaymentRequestMessage,omitempty"` TemplateMessage *TemplateMessage `protobuf:"bytes,25,opt,name=templateMessage" json:"templateMessage,omitempty"` StickerMessage *StickerMessage `protobuf:"bytes,26,opt,name=stickerMessage" json:"stickerMessage,omitempty"` - ProductMessage *ProductMessage `protobuf:"bytes,27,opt,name=productMessage" json:"productMessage,omitempty"` GroupInviteMessage *GroupInviteMessage `protobuf:"bytes,28,opt,name=groupInviteMessage" json:"groupInviteMessage,omitempty"` + TemplateButtonReplyMessage *TemplateButtonReplyMessage `protobuf:"bytes,29,opt,name=templateButtonReplyMessage" json:"templateButtonReplyMessage,omitempty"` + ProductMessage *ProductMessage `protobuf:"bytes,30,opt,name=productMessage" json:"productMessage,omitempty"` + DeviceSentMessage *DeviceSentMessage `protobuf:"bytes,31,opt,name=deviceSentMessage" json:"deviceSentMessage,omitempty"` + DeviceSyncMessage *DeviceSyncMessage `protobuf:"bytes,32,opt,name=deviceSyncMessage" json:"deviceSyncMessage,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -4242,7 +4490,7 @@ func (m *Message) Reset() { *m = Message{} } func (m *Message) String() string { return proto.CompactTextString(m) } func (*Message) ProtoMessage() {} func (*Message) Descriptor() ([]byte, []int) { - return fileDescriptor_76fb0470a3b910d8, []int{44} + return fileDescriptor_76fb0470a3b910d8, []int{46} } func (m *Message) XXX_Unmarshal(b []byte) error { @@ -4417,6 +4665,20 @@ func (m *Message) GetStickerMessage() *StickerMessage { return nil } +func (m *Message) GetGroupInviteMessage() *GroupInviteMessage { + if m != nil { + return m.GroupInviteMessage + } + return nil +} + +func (m *Message) GetTemplateButtonReplyMessage() *TemplateButtonReplyMessage { + if m != nil { + return m.TemplateButtonReplyMessage + } + return nil +} + func (m *Message) GetProductMessage() *ProductMessage { if m != nil { return m.ProductMessage @@ -4424,9 +4686,16 @@ func (m *Message) GetProductMessage() *ProductMessage { return nil } -func (m *Message) GetGroupInviteMessage() *GroupInviteMessage { +func (m *Message) GetDeviceSentMessage() *DeviceSentMessage { if m != nil { - return m.GroupInviteMessage + return m.DeviceSentMessage + } + return nil +} + +func (m *Message) GetDeviceSyncMessage() *DeviceSyncMessage { + if m != nil { + return m.DeviceSyncMessage } return nil } @@ -4445,7 +4714,7 @@ func (m *MessageKey) Reset() { *m = MessageKey{} } func (m *MessageKey) String() string { return proto.CompactTextString(m) } func (*MessageKey) ProtoMessage() {} func (*MessageKey) Descriptor() ([]byte, []int) { - return fileDescriptor_76fb0470a3b910d8, []int{45} + return fileDescriptor_76fb0470a3b910d8, []int{47} } func (m *MessageKey) XXX_Unmarshal(b []byte) error { @@ -4495,38 +4764,46 @@ func (m *MessageKey) GetParticipant() string { } type WebFeatures struct { - LabelsDisplay *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,1,opt,name=labelsDisplay,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"labelsDisplay,omitempty"` - VoipIndividualOutgoing *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,2,opt,name=voipIndividualOutgoing,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"voipIndividualOutgoing,omitempty"` - GroupsV3 *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,3,opt,name=groupsV3,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"groupsV3,omitempty"` - GroupsV3Create *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,4,opt,name=groupsV3Create,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"groupsV3Create,omitempty"` - ChangeNumberV2 *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,5,opt,name=changeNumberV2,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"changeNumberV2,omitempty"` - QueryStatusV3Thumbnail *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,6,opt,name=queryStatusV3Thumbnail,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"queryStatusV3Thumbnail,omitempty"` - LiveLocations *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,7,opt,name=liveLocations,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"liveLocations,omitempty"` - QueryVname *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,8,opt,name=queryVname,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"queryVname,omitempty"` - VoipIndividualIncoming *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,9,opt,name=voipIndividualIncoming,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"voipIndividualIncoming,omitempty"` - QuickRepliesQuery *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,10,opt,name=quickRepliesQuery,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"quickRepliesQuery,omitempty"` - Payments *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,11,opt,name=payments,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"payments,omitempty"` - StickerPackQuery *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,12,opt,name=stickerPackQuery,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"stickerPackQuery,omitempty"` - LiveLocationsFinal *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,13,opt,name=liveLocationsFinal,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"liveLocationsFinal,omitempty"` - LabelsEdit *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,14,opt,name=labelsEdit,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"labelsEdit,omitempty"` - MediaUpload *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,15,opt,name=mediaUpload,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"mediaUpload,omitempty"` - MediaUploadRichQuickReplies *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,18,opt,name=mediaUploadRichQuickReplies,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"mediaUploadRichQuickReplies,omitempty"` - VnameV2 *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,19,opt,name=vnameV2,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"vnameV2,omitempty"` - VideoPlaybackUrl *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,20,opt,name=videoPlaybackUrl,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"videoPlaybackUrl,omitempty"` - StatusRanking *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,21,opt,name=statusRanking,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"statusRanking,omitempty"` - VoipIndividualVideo *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,22,opt,name=voipIndividualVideo,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"voipIndividualVideo,omitempty"` - ThirdPartyStickers *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,23,opt,name=thirdPartyStickers,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"thirdPartyStickers,omitempty"` - FrequentlyForwardedSetting *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,24,opt,name=frequentlyForwardedSetting,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"frequentlyForwardedSetting,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + LabelsDisplay *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,1,opt,name=labelsDisplay,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"labelsDisplay,omitempty"` + VoipIndividualOutgoing *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,2,opt,name=voipIndividualOutgoing,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"voipIndividualOutgoing,omitempty"` + GroupsV3 *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,3,opt,name=groupsV3,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"groupsV3,omitempty"` + GroupsV3Create *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,4,opt,name=groupsV3Create,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"groupsV3Create,omitempty"` + ChangeNumberV2 *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,5,opt,name=changeNumberV2,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"changeNumberV2,omitempty"` + QueryStatusV3Thumbnail *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,6,opt,name=queryStatusV3Thumbnail,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"queryStatusV3Thumbnail,omitempty"` + LiveLocations *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,7,opt,name=liveLocations,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"liveLocations,omitempty"` + QueryVname *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,8,opt,name=queryVname,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"queryVname,omitempty"` + VoipIndividualIncoming *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,9,opt,name=voipIndividualIncoming,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"voipIndividualIncoming,omitempty"` + QuickRepliesQuery *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,10,opt,name=quickRepliesQuery,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"quickRepliesQuery,omitempty"` + Payments *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,11,opt,name=payments,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"payments,omitempty"` + StickerPackQuery *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,12,opt,name=stickerPackQuery,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"stickerPackQuery,omitempty"` + LiveLocationsFinal *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,13,opt,name=liveLocationsFinal,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"liveLocationsFinal,omitempty"` + LabelsEdit *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,14,opt,name=labelsEdit,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"labelsEdit,omitempty"` + MediaUpload *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,15,opt,name=mediaUpload,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"mediaUpload,omitempty"` + MediaUploadRichQuickReplies *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,18,opt,name=mediaUploadRichQuickReplies,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"mediaUploadRichQuickReplies,omitempty"` + VnameV2 *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,19,opt,name=vnameV2,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"vnameV2,omitempty"` + VideoPlaybackUrl *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,20,opt,name=videoPlaybackUrl,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"videoPlaybackUrl,omitempty"` + StatusRanking *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,21,opt,name=statusRanking,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"statusRanking,omitempty"` + VoipIndividualVideo *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,22,opt,name=voipIndividualVideo,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"voipIndividualVideo,omitempty"` + ThirdPartyStickers *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,23,opt,name=thirdPartyStickers,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"thirdPartyStickers,omitempty"` + FrequentlyForwardedSetting *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,24,opt,name=frequentlyForwardedSetting,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"frequentlyForwardedSetting,omitempty"` + GroupsV4JoinPermission *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,25,opt,name=groupsV4JoinPermission,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"groupsV4JoinPermission,omitempty"` + RecentStickers *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,26,opt,name=recentStickers,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"recentStickers,omitempty"` + Catalog *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,27,opt,name=catalog,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"catalog,omitempty"` + StarredStickers *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,28,opt,name=starredStickers,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"starredStickers,omitempty"` + VoipGroupCall *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,29,opt,name=voipGroupCall,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"voipGroupCall,omitempty"` + TemplateMessage *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,30,opt,name=templateMessage,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"templateMessage,omitempty"` + TemplateMessageInteractivity *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,31,opt,name=templateMessageInteractivity,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"templateMessageInteractivity,omitempty"` + EphemeralMessages *WebFeatures_WEB_FEATURES_FLAG `protobuf:"varint,32,opt,name=ephemeralMessages,enum=proto.WebFeatures_WEB_FEATURES_FLAG" json:"ephemeralMessages,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *WebFeatures) Reset() { *m = WebFeatures{} } func (m *WebFeatures) String() string { return proto.CompactTextString(m) } func (*WebFeatures) ProtoMessage() {} func (*WebFeatures) Descriptor() ([]byte, []int) { - return fileDescriptor_76fb0470a3b910d8, []int{46} + return fileDescriptor_76fb0470a3b910d8, []int{48} } func (m *WebFeatures) XXX_Unmarshal(b []byte) error { @@ -4551,154 +4828,210 @@ func (m *WebFeatures) GetLabelsDisplay() WebFeatures_WEB_FEATURES_FLAG { if m != nil && m.LabelsDisplay != nil { return *m.LabelsDisplay } - return WebFeatures_NOT_IMPLEMENTED + return WebFeatures_NOT_STARTED } func (m *WebFeatures) GetVoipIndividualOutgoing() WebFeatures_WEB_FEATURES_FLAG { if m != nil && m.VoipIndividualOutgoing != nil { return *m.VoipIndividualOutgoing } - return WebFeatures_NOT_IMPLEMENTED + return WebFeatures_NOT_STARTED } func (m *WebFeatures) GetGroupsV3() WebFeatures_WEB_FEATURES_FLAG { if m != nil && m.GroupsV3 != nil { return *m.GroupsV3 } - return WebFeatures_NOT_IMPLEMENTED + return WebFeatures_NOT_STARTED } func (m *WebFeatures) GetGroupsV3Create() WebFeatures_WEB_FEATURES_FLAG { if m != nil && m.GroupsV3Create != nil { return *m.GroupsV3Create } - return WebFeatures_NOT_IMPLEMENTED + return WebFeatures_NOT_STARTED } func (m *WebFeatures) GetChangeNumberV2() WebFeatures_WEB_FEATURES_FLAG { if m != nil && m.ChangeNumberV2 != nil { return *m.ChangeNumberV2 } - return WebFeatures_NOT_IMPLEMENTED + return WebFeatures_NOT_STARTED } func (m *WebFeatures) GetQueryStatusV3Thumbnail() WebFeatures_WEB_FEATURES_FLAG { if m != nil && m.QueryStatusV3Thumbnail != nil { return *m.QueryStatusV3Thumbnail } - return WebFeatures_NOT_IMPLEMENTED + return WebFeatures_NOT_STARTED } func (m *WebFeatures) GetLiveLocations() WebFeatures_WEB_FEATURES_FLAG { if m != nil && m.LiveLocations != nil { return *m.LiveLocations } - return WebFeatures_NOT_IMPLEMENTED + return WebFeatures_NOT_STARTED } func (m *WebFeatures) GetQueryVname() WebFeatures_WEB_FEATURES_FLAG { if m != nil && m.QueryVname != nil { return *m.QueryVname } - return WebFeatures_NOT_IMPLEMENTED + return WebFeatures_NOT_STARTED } func (m *WebFeatures) GetVoipIndividualIncoming() WebFeatures_WEB_FEATURES_FLAG { if m != nil && m.VoipIndividualIncoming != nil { return *m.VoipIndividualIncoming } - return WebFeatures_NOT_IMPLEMENTED + return WebFeatures_NOT_STARTED } func (m *WebFeatures) GetQuickRepliesQuery() WebFeatures_WEB_FEATURES_FLAG { if m != nil && m.QuickRepliesQuery != nil { return *m.QuickRepliesQuery } - return WebFeatures_NOT_IMPLEMENTED + return WebFeatures_NOT_STARTED } func (m *WebFeatures) GetPayments() WebFeatures_WEB_FEATURES_FLAG { if m != nil && m.Payments != nil { return *m.Payments } - return WebFeatures_NOT_IMPLEMENTED + return WebFeatures_NOT_STARTED } func (m *WebFeatures) GetStickerPackQuery() WebFeatures_WEB_FEATURES_FLAG { if m != nil && m.StickerPackQuery != nil { return *m.StickerPackQuery } - return WebFeatures_NOT_IMPLEMENTED + return WebFeatures_NOT_STARTED } func (m *WebFeatures) GetLiveLocationsFinal() WebFeatures_WEB_FEATURES_FLAG { if m != nil && m.LiveLocationsFinal != nil { return *m.LiveLocationsFinal } - return WebFeatures_NOT_IMPLEMENTED + return WebFeatures_NOT_STARTED } func (m *WebFeatures) GetLabelsEdit() WebFeatures_WEB_FEATURES_FLAG { if m != nil && m.LabelsEdit != nil { return *m.LabelsEdit } - return WebFeatures_NOT_IMPLEMENTED + return WebFeatures_NOT_STARTED } func (m *WebFeatures) GetMediaUpload() WebFeatures_WEB_FEATURES_FLAG { if m != nil && m.MediaUpload != nil { return *m.MediaUpload } - return WebFeatures_NOT_IMPLEMENTED + return WebFeatures_NOT_STARTED } func (m *WebFeatures) GetMediaUploadRichQuickReplies() WebFeatures_WEB_FEATURES_FLAG { if m != nil && m.MediaUploadRichQuickReplies != nil { return *m.MediaUploadRichQuickReplies } - return WebFeatures_NOT_IMPLEMENTED + return WebFeatures_NOT_STARTED } func (m *WebFeatures) GetVnameV2() WebFeatures_WEB_FEATURES_FLAG { if m != nil && m.VnameV2 != nil { return *m.VnameV2 } - return WebFeatures_NOT_IMPLEMENTED + return WebFeatures_NOT_STARTED } func (m *WebFeatures) GetVideoPlaybackUrl() WebFeatures_WEB_FEATURES_FLAG { if m != nil && m.VideoPlaybackUrl != nil { return *m.VideoPlaybackUrl } - return WebFeatures_NOT_IMPLEMENTED + return WebFeatures_NOT_STARTED } func (m *WebFeatures) GetStatusRanking() WebFeatures_WEB_FEATURES_FLAG { if m != nil && m.StatusRanking != nil { return *m.StatusRanking } - return WebFeatures_NOT_IMPLEMENTED + return WebFeatures_NOT_STARTED } func (m *WebFeatures) GetVoipIndividualVideo() WebFeatures_WEB_FEATURES_FLAG { if m != nil && m.VoipIndividualVideo != nil { return *m.VoipIndividualVideo } - return WebFeatures_NOT_IMPLEMENTED + return WebFeatures_NOT_STARTED } func (m *WebFeatures) GetThirdPartyStickers() WebFeatures_WEB_FEATURES_FLAG { if m != nil && m.ThirdPartyStickers != nil { return *m.ThirdPartyStickers } - return WebFeatures_NOT_IMPLEMENTED + return WebFeatures_NOT_STARTED } func (m *WebFeatures) GetFrequentlyForwardedSetting() WebFeatures_WEB_FEATURES_FLAG { if m != nil && m.FrequentlyForwardedSetting != nil { return *m.FrequentlyForwardedSetting } - return WebFeatures_NOT_IMPLEMENTED + return WebFeatures_NOT_STARTED +} + +func (m *WebFeatures) GetGroupsV4JoinPermission() WebFeatures_WEB_FEATURES_FLAG { + if m != nil && m.GroupsV4JoinPermission != nil { + return *m.GroupsV4JoinPermission + } + return WebFeatures_NOT_STARTED +} + +func (m *WebFeatures) GetRecentStickers() WebFeatures_WEB_FEATURES_FLAG { + if m != nil && m.RecentStickers != nil { + return *m.RecentStickers + } + return WebFeatures_NOT_STARTED +} + +func (m *WebFeatures) GetCatalog() WebFeatures_WEB_FEATURES_FLAG { + if m != nil && m.Catalog != nil { + return *m.Catalog + } + return WebFeatures_NOT_STARTED +} + +func (m *WebFeatures) GetStarredStickers() WebFeatures_WEB_FEATURES_FLAG { + if m != nil && m.StarredStickers != nil { + return *m.StarredStickers + } + return WebFeatures_NOT_STARTED +} + +func (m *WebFeatures) GetVoipGroupCall() WebFeatures_WEB_FEATURES_FLAG { + if m != nil && m.VoipGroupCall != nil { + return *m.VoipGroupCall + } + return WebFeatures_NOT_STARTED +} + +func (m *WebFeatures) GetTemplateMessage() WebFeatures_WEB_FEATURES_FLAG { + if m != nil && m.TemplateMessage != nil { + return *m.TemplateMessage + } + return WebFeatures_NOT_STARTED +} + +func (m *WebFeatures) GetTemplateMessageInteractivity() WebFeatures_WEB_FEATURES_FLAG { + if m != nil && m.TemplateMessageInteractivity != nil { + return *m.TemplateMessageInteractivity + } + return WebFeatures_NOT_STARTED +} + +func (m *WebFeatures) GetEphemeralMessages() WebFeatures_WEB_FEATURES_FLAG { + if m != nil && m.EphemeralMessages != nil { + return *m.EphemeralMessages + } + return WebFeatures_NOT_STARTED } type TabletNotificationsInfo struct { @@ -4715,7 +5048,7 @@ func (m *TabletNotificationsInfo) Reset() { *m = TabletNotificationsInfo func (m *TabletNotificationsInfo) String() string { return proto.CompactTextString(m) } func (*TabletNotificationsInfo) ProtoMessage() {} func (*TabletNotificationsInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_76fb0470a3b910d8, []int{47} + return fileDescriptor_76fb0470a3b910d8, []int{49} } func (m *TabletNotificationsInfo) XXX_Unmarshal(b []byte) error { @@ -4778,7 +5111,7 @@ func (m *NotificationMessageInfo) Reset() { *m = NotificationMessageInfo func (m *NotificationMessageInfo) String() string { return proto.CompactTextString(m) } func (*NotificationMessageInfo) ProtoMessage() {} func (*NotificationMessageInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_76fb0470a3b910d8, []int{48} + return fileDescriptor_76fb0470a3b910d8, []int{50} } func (m *NotificationMessageInfo) XXX_Unmarshal(b []byte) error { @@ -4841,7 +5174,7 @@ func (m *WebNotificationsInfo) Reset() { *m = WebNotificationsInfo{} } func (m *WebNotificationsInfo) String() string { return proto.CompactTextString(m) } func (*WebNotificationsInfo) ProtoMessage() {} func (*WebNotificationsInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_76fb0470a3b910d8, []int{49} + return fileDescriptor_76fb0470a3b910d8, []int{51} } func (m *WebNotificationsInfo) XXX_Unmarshal(b []byte) error { @@ -4908,7 +5241,7 @@ func (m *PaymentInfo) Reset() { *m = PaymentInfo{} } func (m *PaymentInfo) String() string { return proto.CompactTextString(m) } func (*PaymentInfo) ProtoMessage() {} func (*PaymentInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_76fb0470a3b910d8, []int{50} + return fileDescriptor_76fb0470a3b910d8, []int{52} } func (m *PaymentInfo) XXX_Unmarshal(b []byte) error { @@ -4986,37 +5319,39 @@ func (m *PaymentInfo) GetCurrency() string { } type WebMessageInfo struct { - Key *MessageKey `protobuf:"bytes,1,req,name=key" json:"key,omitempty"` - Message *Message `protobuf:"bytes,2,opt,name=message" json:"message,omitempty"` - MessageTimestamp *uint64 `protobuf:"varint,3,opt,name=messageTimestamp" json:"messageTimestamp,omitempty"` - Status *WebMessageInfo_WEB_MESSAGE_INFO_STATUS `protobuf:"varint,4,opt,name=status,enum=proto.WebMessageInfo_WEB_MESSAGE_INFO_STATUS" json:"status,omitempty"` - Participant *string `protobuf:"bytes,5,opt,name=participant" json:"participant,omitempty"` - Ignore *bool `protobuf:"varint,16,opt,name=ignore" json:"ignore,omitempty"` - Starred *bool `protobuf:"varint,17,opt,name=starred" json:"starred,omitempty"` - Broadcast *bool `protobuf:"varint,18,opt,name=broadcast" json:"broadcast,omitempty"` - PushName *string `protobuf:"bytes,19,opt,name=pushName" json:"pushName,omitempty"` - MediaCiphertextSha256 []byte `protobuf:"bytes,20,opt,name=mediaCiphertextSha256" json:"mediaCiphertextSha256,omitempty"` - Multicast *bool `protobuf:"varint,21,opt,name=multicast" json:"multicast,omitempty"` - UrlText *bool `protobuf:"varint,22,opt,name=urlText" json:"urlText,omitempty"` - UrlNumber *bool `protobuf:"varint,23,opt,name=urlNumber" json:"urlNumber,omitempty"` - MessageStubType *WebMessageInfo_WEB_MESSAGE_INFO_STUBTYPE `protobuf:"varint,24,opt,name=messageStubType,enum=proto.WebMessageInfo_WEB_MESSAGE_INFO_STUBTYPE" json:"messageStubType,omitempty"` - ClearMedia *bool `protobuf:"varint,25,opt,name=clearMedia" json:"clearMedia,omitempty"` - MessageStubParameters []string `protobuf:"bytes,26,rep,name=messageStubParameters" json:"messageStubParameters,omitempty"` - Duration *uint32 `protobuf:"varint,27,opt,name=duration" json:"duration,omitempty"` - Labels []string `protobuf:"bytes,28,rep,name=labels" json:"labels,omitempty"` - PaymentInfo *PaymentInfo `protobuf:"bytes,29,opt,name=paymentInfo" json:"paymentInfo,omitempty"` - FinalLiveLocation *LiveLocationMessage `protobuf:"bytes,30,opt,name=finalLiveLocation" json:"finalLiveLocation,omitempty"` - QuotedPaymentInfo *PaymentInfo `protobuf:"bytes,31,opt,name=quotedPaymentInfo" json:"quotedPaymentInfo,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Key *MessageKey `protobuf:"bytes,1,req,name=key" json:"key,omitempty"` + Message *Message `protobuf:"bytes,2,opt,name=message" json:"message,omitempty"` + MessageTimestamp *uint64 `protobuf:"varint,3,opt,name=messageTimestamp" json:"messageTimestamp,omitempty"` + Status *WebMessageInfo_WEB_MESSAGE_INFO_STATUS `protobuf:"varint,4,opt,name=status,enum=proto.WebMessageInfo_WEB_MESSAGE_INFO_STATUS" json:"status,omitempty"` + Participant *string `protobuf:"bytes,5,opt,name=participant" json:"participant,omitempty"` + Ignore *bool `protobuf:"varint,16,opt,name=ignore" json:"ignore,omitempty"` + Starred *bool `protobuf:"varint,17,opt,name=starred" json:"starred,omitempty"` + Broadcast *bool `protobuf:"varint,18,opt,name=broadcast" json:"broadcast,omitempty"` + PushName *string `protobuf:"bytes,19,opt,name=pushName" json:"pushName,omitempty"` + MediaCiphertextSha256 []byte `protobuf:"bytes,20,opt,name=mediaCiphertextSha256" json:"mediaCiphertextSha256,omitempty"` + Multicast *bool `protobuf:"varint,21,opt,name=multicast" json:"multicast,omitempty"` + UrlText *bool `protobuf:"varint,22,opt,name=urlText" json:"urlText,omitempty"` + UrlNumber *bool `protobuf:"varint,23,opt,name=urlNumber" json:"urlNumber,omitempty"` + MessageStubType *WebMessageInfo_WEB_MESSAGE_INFO_STUBTYPE `protobuf:"varint,24,opt,name=messageStubType,enum=proto.WebMessageInfo_WEB_MESSAGE_INFO_STUBTYPE" json:"messageStubType,omitempty"` + ClearMedia *bool `protobuf:"varint,25,opt,name=clearMedia" json:"clearMedia,omitempty"` + MessageStubParameters []string `protobuf:"bytes,26,rep,name=messageStubParameters" json:"messageStubParameters,omitempty"` + Duration *uint32 `protobuf:"varint,27,opt,name=duration" json:"duration,omitempty"` + Labels []string `protobuf:"bytes,28,rep,name=labels" json:"labels,omitempty"` + PaymentInfo *PaymentInfo `protobuf:"bytes,29,opt,name=paymentInfo" json:"paymentInfo,omitempty"` + FinalLiveLocation *LiveLocationMessage `protobuf:"bytes,30,opt,name=finalLiveLocation" json:"finalLiveLocation,omitempty"` + QuotedPaymentInfo *PaymentInfo `protobuf:"bytes,31,opt,name=quotedPaymentInfo" json:"quotedPaymentInfo,omitempty"` + EphemeralStartTimestamp *uint64 `protobuf:"varint,32,opt,name=ephemeralStartTimestamp" json:"ephemeralStartTimestamp,omitempty"` + EphemeralDuration *uint32 `protobuf:"varint,33,opt,name=ephemeralDuration" json:"ephemeralDuration,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *WebMessageInfo) Reset() { *m = WebMessageInfo{} } func (m *WebMessageInfo) String() string { return proto.CompactTextString(m) } func (*WebMessageInfo) ProtoMessage() {} func (*WebMessageInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_76fb0470a3b910d8, []int{51} + return fileDescriptor_76fb0470a3b910d8, []int{53} } func (m *WebMessageInfo) XXX_Unmarshal(b []byte) error { @@ -5184,6 +5519,20 @@ func (m *WebMessageInfo) GetQuotedPaymentInfo() *PaymentInfo { return nil } +func (m *WebMessageInfo) GetEphemeralStartTimestamp() uint64 { + if m != nil && m.EphemeralStartTimestamp != nil { + return *m.EphemeralStartTimestamp + } + return 0 +} + +func (m *WebMessageInfo) GetEphemeralDuration() uint32 { + if m != nil && m.EphemeralDuration != nil { + return *m.EphemeralDuration + } + return 0 +} + func init() { proto.RegisterEnum("proto.AdReplyInfo_AD_REPLY_INFO_MEDIATYPE", AdReplyInfo_AD_REPLY_INFO_MEDIATYPE_name, AdReplyInfo_AD_REPLY_INFO_MEDIATYPE_value) proto.RegisterEnum("proto.ExtendedTextMessage_EXTENDED_TEXT_MESSAGE_FONTTYPE", ExtendedTextMessage_EXTENDED_TEXT_MESSAGE_FONTTYPE_name, ExtendedTextMessage_EXTENDED_TEXT_MESSAGE_FONTTYPE_value) @@ -5240,6 +5589,8 @@ func init() { proto.RegisterType((*ProductSnapshot)(nil), "proto.ProductSnapshot") proto.RegisterType((*ProductMessage)(nil), "proto.ProductMessage") proto.RegisterType((*GroupInviteMessage)(nil), "proto.GroupInviteMessage") + proto.RegisterType((*DeviceSentMessage)(nil), "proto.DeviceSentMessage") + proto.RegisterType((*DeviceSyncMessage)(nil), "proto.DeviceSyncMessage") proto.RegisterType((*Message)(nil), "proto.Message") proto.RegisterType((*MessageKey)(nil), "proto.MessageKey") proto.RegisterType((*WebFeatures)(nil), "proto.WebFeatures") @@ -5253,361 +5604,395 @@ func init() { func init() { proto.RegisterFile("def.proto", fileDescriptor_76fb0470a3b910d8) } var fileDescriptor_76fb0470a3b910d8 = []byte{ - // 5683 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3b, 0x4b, 0x6f, 0x23, 0x47, - 0x7a, 0xa2, 0x44, 0x49, 0xe4, 0x47, 0x3d, 0x5a, 0xa5, 0xd1, 0x88, 0xf3, 0xf0, 0x58, 0xee, 0xf1, - 0x7a, 0xb5, 0x13, 0x5b, 0x1e, 0xcb, 0x5e, 0x3f, 0x62, 0xef, 0xee, 0xb4, 0xc8, 0x92, 0xd4, 0x1e, - 0xb2, 0x9b, 0x2e, 0x36, 0xa5, 0x91, 0xb1, 0x08, 0xd1, 0xea, 0x2e, 0x49, 0x9d, 0xa1, 0xba, 0xe9, - 0xee, 0xe6, 0x78, 0xb4, 0x87, 0x04, 0xc8, 0x26, 0x48, 0xb0, 0xc8, 0x21, 0xa7, 0xbc, 0x80, 0x1c, - 0x02, 0x24, 0x7f, 0x21, 0x97, 0x0d, 0x90, 0x43, 0x10, 0x20, 0x40, 0x82, 0x0d, 0x90, 0x9c, 0x92, - 0x3f, 0x90, 0x6b, 0xce, 0xc9, 0x25, 0xa8, 0xea, 0x6a, 0xb2, 0x1f, 0xa4, 0x86, 0x33, 0xde, 0x47, - 0x90, 0x93, 0x58, 0xdf, 0xab, 0xab, 0xbe, 0x57, 0x7d, 0xf5, 0x55, 0x09, 0xca, 0x36, 0x3d, 0xdb, - 0xe9, 0xfb, 0x5e, 0xe8, 0xa1, 0x79, 0xfe, 0x47, 0x7e, 0x02, 0xd5, 0xc3, 0x2b, 0xdb, 0x37, 0x43, - 0x6a, 0x7f, 0x31, 0x70, 0xac, 0xa7, 0x84, 0xf6, 0x7b, 0x57, 0x7b, 0x83, 0x30, 0xf4, 0x5c, 0xb4, - 0x05, 0x15, 0xdb, 0x09, 0xfa, 0x3d, 0xf3, 0xca, 0xa0, 0xcf, 0xc3, 0x6a, 0x61, 0xab, 0xb0, 0x5d, - 0x26, 0x49, 0x10, 0xba, 0x0d, 0xa5, 0x53, 0x4e, 0xab, 0xda, 0xd5, 0x59, 0x8e, 0x1e, 0x8e, 0xe5, - 0x03, 0x58, 0x8b, 0x25, 0x77, 0x48, 0x63, 0x6a, 0x91, 0x12, 0xcc, 0x0d, 0xfc, 0x9e, 0x90, 0xc6, - 0x7e, 0xca, 0x4f, 0x00, 0xc5, 0x82, 0x6a, 0x66, 0xaf, 0x37, 0xb5, 0xa4, 0x2d, 0xa8, 0xf4, 0x2f, - 0x3c, 0x97, 0x6a, 0x83, 0xcb, 0x53, 0xea, 0x0b, 0x89, 0x49, 0x90, 0xfc, 0x5f, 0x05, 0xb8, 0x19, - 0x8b, 0x36, 0xe8, 0x65, 0xbf, 0x67, 0x86, 0x54, 0x88, 0x6f, 0x82, 0xf4, 0x55, 0x46, 0x1f, 0xfc, - 0x1b, 0x95, 0xdd, 0xd7, 0x23, 0x05, 0xee, 0x4c, 0x52, 0xdb, 0xe1, 0x0c, 0xc9, 0xb1, 0xa2, 0x8f, - 0xa1, 0x3c, 0xf0, 0xc5, 0xd4, 0xf9, 0x4c, 0x2a, 0xbb, 0xd5, 0x8c, 0x9c, 0xa1, 0x92, 0x0e, 0x67, - 0xc8, 0x88, 0x18, 0x7d, 0x0a, 0x60, 0x0d, 0x57, 0x5d, 0x9d, 0xe3, 0xac, 0xb7, 0x32, 0xac, 0x23, - 0xb5, 0x1c, 0xce, 0x90, 0x04, 0xf9, 0x9e, 0x04, 0x2b, 0x17, 0x82, 0x26, 0x82, 0xc8, 0x7d, 0x90, - 0x72, 0x76, 0x7e, 0x94, 0x57, 0x65, 0x65, 0xf7, 0x5e, 0xfc, 0x0d, 0xe7, 0xfc, 0xa2, 0x77, 0xd5, - 0x0e, 0xfd, 0x81, 0x15, 0x0e, 0x7c, 0x6a, 0x37, 0x69, 0x10, 0x98, 0xe7, 0x74, 0x7a, 0x3f, 0xf8, - 0x6d, 0x28, 0x8f, 0xec, 0xff, 0xcd, 0x3f, 0xf5, 0x70, 0xe4, 0x1f, 0x2f, 0xe6, 0xe4, 0xfe, 0xf3, - 0x47, 0x05, 0x80, 0x84, 0xe3, 0x7c, 0xf3, 0x29, 0x3c, 0xca, 0x3b, 0xd6, 0x14, 0x12, 0x92, 0x8e, - 0xf7, 0x8f, 0x05, 0x58, 0xc9, 0x38, 0x1c, 0x9e, 0xe8, 0x70, 0x9b, 0x42, 0xf2, 0x54, 0x8e, 0xf6, - 0x30, 0xef, 0x68, 0x92, 0xe0, 0x9f, 0xe0, 0x60, 0xef, 0x8f, 0x71, 0xb0, 0x35, 0xc1, 0x32, 0xd1, - 0xb1, 0x4a, 0xb0, 0x10, 0x19, 0x58, 0x0e, 0xa1, 0xd4, 0xf0, 0x2c, 0x33, 0x74, 0x3c, 0x17, 0x6d, - 0xc3, 0xaa, 0x4d, 0xcf, 0x7d, 0x4a, 0x83, 0x86, 0x19, 0x3a, 0xe1, 0xc0, 0xa6, 0x7c, 0x09, 0x05, - 0x92, 0x05, 0xa3, 0x07, 0x20, 0xc5, 0x20, 0xcf, 0x3d, 0x8f, 0x48, 0x67, 0x39, 0x69, 0x0e, 0x8e, - 0x10, 0x14, 0x5d, 0xf3, 0x92, 0xf2, 0xa9, 0x95, 0x09, 0xff, 0x2d, 0xdf, 0x87, 0xf9, 0x96, 0xe7, - 0xb8, 0x21, 0x5a, 0x82, 0xc2, 0x73, 0x8e, 0x29, 0x90, 0xc2, 0x73, 0x36, 0xba, 0xaa, 0x16, 0xa3, - 0xd1, 0x95, 0xfc, 0x07, 0x05, 0xd8, 0x50, 0xdd, 0x90, 0xfa, 0xa6, 0x15, 0x3a, 0xcf, 0xa8, 0xe2, - 0xba, 0x5e, 0x18, 0x4d, 0xf4, 0x43, 0x58, 0xed, 0x7b, 0xbd, 0xab, 0x73, 0xcf, 0x3d, 0xa2, 0x7e, - 0xe8, 0x58, 0x34, 0xa8, 0x16, 0xb6, 0xe6, 0xb6, 0x2b, 0xbb, 0x4b, 0x62, 0xe1, 0x5c, 0x38, 0xc9, - 0x12, 0xa1, 0x77, 0xa0, 0xd4, 0x13, 0x8b, 0x15, 0xca, 0x5d, 0x15, 0x0c, 0xb1, 0x0e, 0x0e, 0x67, - 0xc8, 0x90, 0x84, 0x69, 0x89, 0x7d, 0xda, 0x73, 0xe5, 0xff, 0x2e, 0x40, 0x45, 0xb1, 0xb9, 0xa1, - 0x54, 0xf7, 0xcc, 0x43, 0x6f, 0xc1, 0x8a, 0x69, 0x3f, 0x63, 0x62, 0x03, 0xea, 0x6b, 0x6c, 0x75, - 0x51, 0x02, 0xcb, 0x40, 0xd1, 0x21, 0x94, 0x2f, 0xa9, 0xed, 0x98, 0xc6, 0x55, 0x3f, 0x52, 0xd0, - 0xca, 0xee, 0x03, 0xf1, 0xc5, 0x84, 0xb8, 0x1d, 0xa5, 0xde, 0x25, 0xb8, 0xd5, 0x38, 0xe9, 0xaa, - 0xda, 0xbe, 0xde, 0x6d, 0xe2, 0xba, 0xaa, 0x18, 0x27, 0x2d, 0x4c, 0x46, 0xcc, 0xe8, 0x4d, 0x58, - 0xfe, 0xcd, 0x3e, 0x3d, 0x37, 0x2e, 0x06, 0x97, 0xa7, 0xae, 0xe9, 0xf4, 0xaa, 0xd2, 0x56, 0x61, - 0x7b, 0x89, 0xa4, 0x81, 0xa8, 0x0a, 0x8b, 0x96, 0xd9, 0xe7, 0xeb, 0x5b, 0xe3, 0x13, 0x8a, 0x87, - 0xf2, 0x27, 0xb0, 0x39, 0xe1, 0x2b, 0xa8, 0x04, 0x45, 0x4d, 0xd7, 0xb0, 0x34, 0x83, 0xca, 0x30, - 0xaf, 0x36, 0x95, 0x03, 0x2c, 0x15, 0xd8, 0xcf, 0x23, 0xb5, 0x8e, 0x75, 0x69, 0x56, 0xfe, 0xa7, - 0x39, 0xa8, 0xd4, 0x3c, 0x37, 0xa4, 0xcf, 0x43, 0xbe, 0xf8, 0xdb, 0x50, 0x0a, 0x42, 0xd3, 0xfd, - 0x91, 0xa9, 0xda, 0x62, 0xd9, 0xc3, 0x31, 0x4f, 0xda, 0x26, 0xd3, 0xb6, 0xd3, 0x37, 0xdd, 0x70, - 0x98, 0xb4, 0x47, 0x20, 0xf4, 0x01, 0x2c, 0x7f, 0x35, 0xf0, 0xc2, 0x61, 0x64, 0x09, 0x97, 0x5d, - 0x11, 0x6a, 0x89, 0xe3, 0x2d, 0x4d, 0x84, 0xee, 0x42, 0xd9, 0xa7, 0x97, 0x5e, 0x48, 0x3f, 0x77, - 0x6c, 0xee, 0x21, 0x65, 0x32, 0x02, 0x20, 0x19, 0x96, 0x2e, 0xa9, 0xcb, 0xd6, 0x49, 0x6d, 0x46, - 0xb0, 0xba, 0x35, 0xb7, 0x5d, 0x26, 0x29, 0x18, 0x73, 0x59, 0xcb, 0x73, 0x9f, 0x51, 0x3f, 0x70, - 0x3c, 0xb7, 0xed, 0x0d, 0x7c, 0x8b, 0x56, 0x11, 0x17, 0x94, 0x83, 0x33, 0xf3, 0x8e, 0x60, 0x75, - 0x33, 0x34, 0xab, 0xeb, 0x5c, 0xdb, 0x19, 0x28, 0xfa, 0x10, 0x6e, 0x26, 0x20, 0xb4, 0x67, 0x5e, - 0xb5, 0xa9, 0xe5, 0xb9, 0x76, 0x50, 0xbd, 0xb1, 0x55, 0xd8, 0x5e, 0x26, 0x13, 0xb0, 0x2c, 0xd0, - 0xce, 0x3c, 0xff, 0x6b, 0xd3, 0xb7, 0x1d, 0xf7, 0xbc, 0x6d, 0x79, 0x3e, 0xad, 0x6e, 0x70, 0x86, - 0x2c, 0x98, 0xe9, 0xd3, 0x09, 0xf6, 0x23, 0x20, 0xb5, 0xab, 0x37, 0xb7, 0x0a, 0xdb, 0x25, 0x92, - 0x04, 0xa1, 0x1d, 0x28, 0x45, 0xaa, 0x52, 0xec, 0xea, 0x26, 0x57, 0x25, 0xca, 0x7b, 0x18, 0x19, - 0xd2, 0xc8, 0x3f, 0x29, 0xc0, 0xdd, 0x36, 0x75, 0x6d, 0xea, 0x3f, 0xa6, 0x57, 0x75, 0x27, 0x08, - 0x7d, 0xe7, 0x74, 0xc0, 0xd4, 0x14, 0xab, 0xba, 0x0a, 0x8b, 0xe7, 0xbe, 0x37, 0xe8, 0x0f, 0xad, - 0x1b, 0x0f, 0x51, 0x0b, 0xee, 0x9b, 0xcf, 0xbd, 0x9e, 0x17, 0xf6, 0xae, 0x13, 0xc0, 0x8d, 0xbe, - 0x44, 0xa6, 0x21, 0x95, 0x7f, 0x32, 0x0f, 0x4b, 0xea, 0xa5, 0x79, 0x4e, 0xe3, 0x8f, 0x8b, 0xf2, - 0xa1, 0x30, 0x2c, 0x1f, 0x98, 0xb7, 0x5d, 0x3a, 0x97, 0x34, 0x8c, 0x23, 0xa8, 0x4c, 0x86, 0xe3, - 0xa4, 0xbb, 0xcf, 0xa5, 0xdc, 0x1d, 0xdd, 0x03, 0x38, 0x73, 0x7a, 0xb4, 0x7d, 0x61, 0xee, 0x7e, - 0xf7, 0x43, 0xee, 0x30, 0x4b, 0x24, 0x01, 0x89, 0xf1, 0x0d, 0xea, 0x9e, 0x87, 0x17, 0xd5, 0xf9, - 0xad, 0xc2, 0x76, 0x91, 0x24, 0x20, 0xe8, 0x26, 0x2c, 0x5c, 0x50, 0xe7, 0xfc, 0x22, 0xac, 0x2e, - 0x70, 0xc3, 0x88, 0x11, 0xba, 0x01, 0xf3, 0x5f, 0x3b, 0x76, 0x78, 0x51, 0x5d, 0xe4, 0xe0, 0x68, - 0xc0, 0xe7, 0xc8, 0x22, 0xf5, 0x31, 0xbd, 0xaa, 0x96, 0xf8, 0xb7, 0x86, 0x63, 0x16, 0xb8, 0x4c, - 0x2e, 0x76, 0x2d, 0x31, 0x99, 0x72, 0x14, 0xb8, 0x29, 0x20, 0x32, 0xe0, 0xa6, 0x33, 0x2e, 0xd5, - 0x05, 0x55, 0xe0, 0x89, 0xed, 0xae, 0xb0, 0xe9, 0xd8, 0x7c, 0x48, 0x26, 0xf0, 0xb2, 0x55, 0xda, - 0x8e, 0x4f, 0xad, 0xb0, 0x65, 0x86, 0x17, 0xd5, 0x0a, 0x57, 0x51, 0x02, 0x82, 0xde, 0x86, 0xb5, - 0x78, 0x9e, 0x86, 0x73, 0x49, 0x83, 0xd0, 0xbc, 0xec, 0x57, 0x97, 0xb6, 0x0a, 0xdb, 0x73, 0x24, - 0x8f, 0x98, 0x32, 0x05, 0x7d, 0x00, 0x15, 0x6b, 0x94, 0x2c, 0x78, 0x1a, 0x1a, 0xb9, 0x64, 0x22, - 0x8d, 0x90, 0x24, 0x19, 0x8b, 0xce, 0x33, 0xc7, 0x0f, 0xc2, 0xb6, 0x65, 0xba, 0x6d, 0xc7, 0xa6, - 0x96, 0xe9, 0xf3, 0xe8, 0x5c, 0x22, 0x39, 0x38, 0x8f, 0x9e, 0x18, 0x26, 0x0c, 0xb8, 0x2e, 0xa2, - 0x27, 0x0d, 0x66, 0xeb, 0xa3, 0xcf, 0xfb, 0xd4, 0x77, 0x58, 0x26, 0x38, 0x10, 0x4e, 0x1d, 0x85, - 0x66, 0x1e, 0x21, 0xff, 0x16, 0xac, 0xb0, 0xf9, 0x99, 0x56, 0x18, 0x7b, 0xe3, 0xa8, 0x48, 0x4d, - 0xe4, 0xf8, 0x24, 0x88, 0xf9, 0xc3, 0x33, 0xcb, 0xf4, 0x6d, 0xae, 0x8b, 0x32, 0x89, 0x06, 0xaf, - 0xa6, 0x03, 0xf9, 0xc7, 0xb3, 0xb0, 0x1a, 0xef, 0x43, 0xf1, 0x0c, 0x7e, 0x69, 0x5b, 0x32, 0x8b, - 0x25, 0xd3, 0xb6, 0x7d, 0x1a, 0x04, 0x22, 0xbf, 0xc6, 0xc3, 0x38, 0x26, 0xe7, 0x47, 0x31, 0xf9, - 0x0b, 0xf4, 0x04, 0xf9, 0xef, 0xe6, 0x61, 0x1d, 0x3f, 0x0f, 0x59, 0xd6, 0xb0, 0x59, 0xb9, 0x16, - 0x6b, 0x02, 0x41, 0x31, 0x1c, 0x9d, 0x14, 0xf8, 0x6f, 0x66, 0x9f, 0x4b, 0x33, 0xb4, 0x2e, 0x22, - 0xca, 0x78, 0xb7, 0x49, 0x80, 0xd8, 0xce, 0x60, 0x99, 0xae, 0xe7, 0x3a, 0x96, 0xd9, 0xeb, 0xf8, - 0x3d, 0xb1, 0xb4, 0x14, 0x8c, 0x5b, 0x99, 0x06, 0x96, 0xef, 0x44, 0x99, 0x64, 0x5e, 0x58, 0x79, - 0x04, 0x62, 0x56, 0x0e, 0x9d, 0xb0, 0x47, 0x79, 0x32, 0x28, 0x93, 0x68, 0xc0, 0xa2, 0x9e, 0xcd, - 0x42, 0xf1, 0xcf, 0x4f, 0x79, 0x3a, 0x58, 0x24, 0xc3, 0x31, 0xdb, 0x41, 0x4e, 0x4d, 0xeb, 0x29, - 0xcb, 0x9c, 0xae, 0xcd, 0x29, 0x4a, 0x9c, 0x22, 0x03, 0x45, 0x4d, 0x28, 0x9e, 0x79, 0x6e, 0xc8, - 0x93, 0xc2, 0xca, 0xee, 0x27, 0x42, 0x39, 0x63, 0xd6, 0xbf, 0x83, 0x9f, 0x18, 0x58, 0xab, 0xe3, - 0x7a, 0xd7, 0xc0, 0x4f, 0x8c, 0x6e, 0x13, 0xb7, 0xdb, 0xca, 0x01, 0xee, 0xee, 0xeb, 0x9a, 0xc1, - 0x4b, 0x05, 0x2e, 0x06, 0xfd, 0x06, 0x54, 0xfa, 0x3e, 0x7d, 0xe6, 0xd0, 0xaf, 0x79, 0xc5, 0x01, - 0x5c, 0xea, 0x67, 0x2f, 0x2d, 0xb5, 0x45, 0xf0, 0x91, 0x8a, 0x8f, 0xb9, 0xe0, 0xa4, 0xc0, 0x5f, - 0xa8, 0xe1, 0xff, 0xb0, 0x00, 0xf7, 0xae, 0x5f, 0x24, 0x5a, 0x01, 0x68, 0x2b, 0x5a, 0xbb, 0xdb, - 0xc6, 0x44, 0xdd, 0x8f, 0xea, 0x95, 0xe8, 0x67, 0x01, 0xad, 0xc3, 0xaa, 0xa6, 0x13, 0xb5, 0xa6, - 0x68, 0x5d, 0x82, 0x0f, 0x3a, 0x0d, 0x85, 0x48, 0xb3, 0x68, 0x0d, 0x96, 0xf7, 0xc8, 0x89, 0x56, - 0x57, 0xb4, 0xee, 0x31, 0x51, 0x0d, 0x2c, 0xcd, 0xa1, 0x0d, 0x58, 0xdb, 0xc3, 0x7b, 0x4a, 0x5b, - 0xc3, 0x1d, 0x3c, 0xa4, 0x2c, 0x22, 0x09, 0x96, 0xf4, 0xf6, 0xb1, 0xd2, 0xa8, 0x77, 0x0f, 0xb1, - 0x72, 0x74, 0x22, 0xcd, 0xcb, 0x1f, 0xc3, 0x1b, 0x2f, 0x54, 0x4e, 0xba, 0x74, 0x8a, 0xea, 0xa5, - 0x82, 0xfc, 0xd3, 0x39, 0x58, 0xad, 0x7b, 0xd6, 0x80, 0xe5, 0x96, 0x57, 0xdb, 0xd7, 0x86, 0xfe, - 0x36, 0x97, 0xf4, 0xb7, 0x6f, 0xba, 0xa7, 0xdd, 0x85, 0x72, 0xdf, 0x3c, 0xa7, 0x35, 0x6f, 0xe0, - 0xc6, 0xdb, 0xda, 0x08, 0x90, 0xda, 0xc3, 0x16, 0x33, 0x7b, 0xd8, 0x6d, 0x28, 0x31, 0x39, 0x3c, - 0x09, 0x96, 0xa2, 0xb9, 0xc6, 0xe3, 0x29, 0xf7, 0xb7, 0xf4, 0x4e, 0x04, 0xd3, 0xed, 0x44, 0x95, - 0x5f, 0xc1, 0x4e, 0x24, 0xff, 0xf9, 0x1c, 0x2c, 0x29, 0x03, 0xdb, 0xf1, 0x5e, 0xcd, 0x74, 0x69, - 0x23, 0xcd, 0xbd, 0xc0, 0x48, 0xc5, 0x9c, 0x91, 0xaa, 0xb0, 0x18, 0x88, 0x1a, 0x72, 0x9e, 0x9b, - 0x28, 0x1e, 0xb2, 0x79, 0xf4, 0xc3, 0xc8, 0x70, 0x25, 0xc2, 0x7e, 0x5e, 0x6b, 0xb2, 0x9c, 0x59, - 0x4a, 0x2f, 0x36, 0x4b, 0x79, 0x3a, 0xb3, 0xc0, 0x24, 0xb3, 0xbc, 0xf2, 0xd6, 0x1f, 0x84, 0x3e, - 0x35, 0x2f, 0x59, 0xd1, 0x9b, 0xde, 0xfa, 0xb3, 0x70, 0xf9, 0x77, 0x16, 0x60, 0xe9, 0xc8, 0xb1, - 0xe9, 0xff, 0x39, 0xe3, 0x24, 0x4d, 0xb1, 0x90, 0x31, 0x45, 0xa2, 0x4a, 0x5d, 0x4c, 0x57, 0xa9, - 0x5b, 0x50, 0x39, 0x77, 0xce, 0x5a, 0x3d, 0xf3, 0x8a, 0x6d, 0x0b, 0xdc, 0x44, 0x25, 0x92, 0x04, - 0x25, 0xea, 0xd0, 0xf2, 0xf8, 0x3a, 0x14, 0x92, 0x75, 0x68, 0xce, 0xe8, 0x95, 0x97, 0xab, 0x35, - 0x97, 0x7e, 0x6e, 0xb5, 0xe6, 0xf2, 0x74, 0xae, 0xb4, 0xf2, 0x2b, 0xaa, 0x35, 0xa7, 0x75, 0x38, - 0xd4, 0x81, 0x95, 0x73, 0xe7, 0x4c, 0x09, 0x87, 0x27, 0x17, 0x5e, 0x6a, 0xae, 0xec, 0xbe, 0x23, - 0x3e, 0x92, 0x74, 0xc6, 0x1d, 0xbe, 0x01, 0x0c, 0xf7, 0x09, 0xc5, 0x30, 0x88, 0xba, 0xd7, 0x31, - 0x54, 0x5d, 0x23, 0x19, 0x21, 0xf2, 0xa7, 0x70, 0x6b, 0x22, 0x71, 0x7a, 0x53, 0x39, 0x50, 0x5b, - 0x87, 0x27, 0xd1, 0x79, 0xdc, 0xc0, 0x9a, 0x4e, 0xa4, 0x59, 0x79, 0x0b, 0x8a, 0x35, 0xb3, 0x27, - 0x0e, 0xfb, 0xbd, 0x1e, 0x73, 0xb9, 0x02, 0x9f, 0x7e, 0x3c, 0x94, 0x3f, 0x86, 0x62, 0xed, 0xc2, - 0x0c, 0xa7, 0xa8, 0x5f, 0x57, 0x60, 0xd6, 0x89, 0x7b, 0x7e, 0xb3, 0x8e, 0x2d, 0xff, 0x45, 0x01, - 0x56, 0x5b, 0x6c, 0x65, 0x96, 0xd7, 0x8b, 0x63, 0xec, 0x3e, 0xcc, 0x3d, 0x15, 0xdf, 0x18, 0xb5, - 0x96, 0x04, 0xf2, 0x31, 0xbd, 0x22, 0x0c, 0x8b, 0x1e, 0x41, 0x31, 0x1c, 0x35, 0x39, 0xde, 0x8e, - 0xfb, 0x30, 0x69, 0x51, 0x3b, 0x2d, 0xa2, 0x1b, 0x7a, 0x4d, 0x6f, 0x0c, 0xd7, 0x1d, 0xd5, 0x2e, - 0x8c, 0x53, 0xbe, 0x0f, 0x1b, 0x63, 0xd1, 0x08, 0x60, 0x81, 0xe0, 0x23, 0xfd, 0x31, 0x96, 0x66, - 0xe4, 0xbf, 0x2c, 0xc0, 0x0d, 0x51, 0xa4, 0x07, 0x8a, 0xef, 0x9b, 0x57, 0xd3, 0x97, 0xea, 0xef, - 0x41, 0xc9, 0x12, 0x9c, 0xd5, 0x59, 0xee, 0xe8, 0x1b, 0x09, 0x4f, 0x19, 0x55, 0xfd, 0x64, 0x48, - 0xf6, 0x8a, 0x3b, 0xc8, 0x17, 0x50, 0x39, 0x6c, 0x37, 0x6b, 0x03, 0xdf, 0xa7, 0xae, 0x75, 0xc5, - 0x4b, 0x50, 0xf1, 0xbb, 0xe6, 0xd9, 0xf1, 0xd4, 0x52, 0x30, 0x16, 0x3c, 0xe6, 0x25, 0xdb, 0x86, - 0xdf, 0x7b, 0xf8, 0xf0, 0x21, 0xd7, 0xe1, 0x1c, 0x49, 0x40, 0xe4, 0x3f, 0x2b, 0xc2, 0x8d, 0xc3, - 0x76, 0xb3, 0x6e, 0x86, 0x94, 0xc5, 0x48, 0xcd, 0xbb, 0xec, 0x7b, 0x2e, 0x75, 0x43, 0xd4, 0x85, - 0xb2, 0x6d, 0x5e, 0xe9, 0x67, 0xc7, 0x94, 0x3e, 0xe5, 0x92, 0x57, 0x76, 0x95, 0xb8, 0x93, 0x39, - 0x86, 0x9e, 0x01, 0xbb, 0x75, 0xc5, 0xc0, 0x5d, 0x43, 0x6d, 0xe2, 0x6e, 0x4d, 0x6f, 0xb6, 0x74, - 0x0d, 0x6b, 0x46, 0xb7, 0xae, 0x9c, 0xe8, 0xfb, 0xc7, 0x18, 0x3f, 0x8e, 0xfa, 0x4e, 0x43, 0x99, - 0xac, 0xec, 0xbe, 0xa2, 0x66, 0xd4, 0x25, 0x5d, 0x26, 0xfc, 0x37, 0x4b, 0x3e, 0x97, 0x9e, 0x1b, - 0x5e, 0xf0, 0x0c, 0xba, 0x4c, 0xa2, 0x01, 0x4f, 0x00, 0x8c, 0xad, 0xc9, 0x51, 0x45, 0x8e, 0x4a, - 0x40, 0x98, 0xa4, 0x0b, 0x6f, 0xe0, 0x8b, 0xcc, 0xc9, 0x7f, 0xb3, 0xf4, 0x76, 0xe9, 0xb8, 0x83, - 0x90, 0xc6, 0xc7, 0xec, 0x68, 0x84, 0x7e, 0x08, 0x25, 0xcb, 0xec, 0x51, 0xd7, 0x36, 0x7d, 0x9e, - 0x33, 0x57, 0x76, 0x1f, 0xbd, 0xca, 0xaa, 0x6a, 0x4a, 0x03, 0x6b, 0x75, 0x85, 0xf0, 0x45, 0x0d, - 0x25, 0xca, 0x3f, 0x2e, 0xc0, 0xb7, 0xa6, 0x52, 0x04, 0x73, 0xbd, 0xa6, 0xae, 0xd5, 0x15, 0x16, - 0x81, 0x15, 0x58, 0x34, 0x3a, 0xb8, 0xcd, 0x06, 0xb3, 0x68, 0x19, 0xca, 0xc7, 0xb8, 0xae, 0x45, - 0xc3, 0x39, 0xb4, 0x04, 0x25, 0xe3, 0xb0, 0x43, 0xf8, 0xa8, 0xc8, 0xb8, 0xf6, 0x89, 0xca, 0x7e, - 0xcf, 0x33, 0x4c, 0x5b, 0x31, 0x3a, 0x84, 0x8d, 0x16, 0x18, 0xa6, 0xdd, 0xe1, 0xf2, 0x16, 0xe5, - 0x7d, 0x78, 0x73, 0x9a, 0x79, 0xb3, 0x4f, 0x1d, 0x10, 0x7c, 0xa0, 0x13, 0x55, 0xd1, 0xa4, 0x02, - 0x5a, 0x85, 0x4a, 0x5b, 0x6f, 0x28, 0xa4, 0x7b, 0xa8, 0x7e, 0x4e, 0x54, 0x69, 0x56, 0xfe, 0x20, - 0xe5, 0x1a, 0x1d, 0xd7, 0x79, 0x8e, 0xfb, 0x9e, 0xc5, 0xcb, 0xbd, 0x70, 0x98, 0x68, 0x0b, 0xdc, - 0xa5, 0x46, 0x00, 0xf9, 0x4f, 0x0b, 0xdc, 0x4b, 0x63, 0x36, 0xf4, 0x29, 0x94, 0xad, 0x58, 0x9f, - 0x22, 0xd4, 0xef, 0x5c, 0xa3, 0xf2, 0xc3, 0x19, 0x32, 0xa2, 0x67, 0xcc, 0x83, 0xf8, 0xbb, 0xa2, - 0xb1, 0x3a, 0x86, 0x79, 0x38, 0x35, 0xde, 0xc0, 0x8e, 0x07, 0x7b, 0xab, 0xb0, 0x6c, 0x9b, 0x21, - 0x65, 0x53, 0xd3, 0x5d, 0xea, 0x9d, 0xc9, 0x7f, 0x5d, 0x80, 0xcd, 0xc3, 0x76, 0x93, 0x1d, 0x85, - 0x7b, 0xce, 0x8f, 0xcc, 0xd3, 0x1e, 0x6d, 0x99, 0xbe, 0x79, 0x49, 0x43, 0xea, 0xb3, 0x9c, 0x67, - 0xd3, 0x33, 0x73, 0xd0, 0x8b, 0x0f, 0x82, 0xf1, 0x10, 0x3d, 0x84, 0x52, 0x1c, 0x52, 0x62, 0x0a, - 0x68, 0x34, 0x85, 0x38, 0x18, 0x0f, 0x67, 0xc8, 0x90, 0x8a, 0x71, 0xd8, 0x62, 0x6a, 0xa2, 0x09, - 0x89, 0xf2, 0x93, 0x66, 0x1c, 0x31, 0xd5, 0xde, 0x12, 0x40, 0x9f, 0x4d, 0x25, 0x9a, 0xe7, 0xbf, - 0xcd, 0xc2, 0xe6, 0x84, 0xeb, 0x02, 0xa6, 0x7c, 0x76, 0xaa, 0x0e, 0xfa, 0xa6, 0x15, 0x47, 0xfc, - 0x08, 0xc0, 0x92, 0x15, 0xed, 0x51, 0x76, 0x3e, 0xe0, 0xc9, 0x4a, 0x9c, 0x5b, 0x13, 0x20, 0x16, - 0x18, 0xfc, 0x4b, 0x41, 0x75, 0x8e, 0xf7, 0x32, 0xc5, 0x88, 0x57, 0x28, 0x66, 0xaf, 0xc7, 0x6a, - 0x83, 0xc6, 0xb9, 0x38, 0xcd, 0x26, 0x20, 0x29, 0xbc, 0x25, 0x8e, 0xb2, 0x09, 0x08, 0x6a, 0xc0, - 0x5a, 0x2f, 0xa3, 0xd7, 0xa0, 0xba, 0xc0, 0xb3, 0xe1, 0xbd, 0xd1, 0xe2, 0xc7, 0xa9, 0x9e, 0xe4, - 0x19, 0xa3, 0xee, 0x44, 0x48, 0xfd, 0x4b, 0xc7, 0x75, 0x82, 0xd0, 0xb1, 0x1a, 0xe7, 0xa2, 0xc2, - 0xc9, 0x82, 0xf3, 0x94, 0x96, 0x38, 0x48, 0x64, 0xc1, 0xf2, 0xef, 0x17, 0x00, 0xb5, 0xa9, 0x6b, - 0xb7, 0xcc, 0xab, 0xe4, 0x01, 0xea, 0x21, 0x54, 0x5c, 0x2f, 0xa4, 0xc9, 0x1e, 0x63, 0xbe, 0x69, - 0x9c, 0x24, 0x41, 0x3f, 0x80, 0x35, 0x9f, 0x7e, 0x35, 0xa0, 0x41, 0x38, 0xda, 0xab, 0x32, 0xf7, - 0x23, 0x89, 0x4d, 0x2c, 0x4f, 0x2b, 0xff, 0x67, 0x01, 0x36, 0x48, 0x04, 0xbd, 0x7e, 0x32, 0xc5, - 0x17, 0x4f, 0xe6, 0x21, 0xac, 0x27, 0x13, 0xbe, 0x1a, 0x78, 0x1f, 0xec, 0xbe, 0xf7, 0x91, 0xf0, - 0x8c, 0x71, 0xa8, 0x31, 0x5b, 0x42, 0x31, 0xb9, 0x25, 0x30, 0x1f, 0x12, 0x53, 0xde, 0xf7, 0xbd, - 0x4b, 0x71, 0x52, 0x4c, 0x82, 0x98, 0xce, 0xe9, 0xf3, 0xbe, 0xe3, 0x27, 0xea, 0xad, 0x79, 0x9e, - 0x06, 0xb2, 0x60, 0xb9, 0x06, 0x77, 0xeb, 0xd4, 0xea, 0x39, 0x2e, 0x15, 0x0b, 0x25, 0x29, 0x65, - 0x4c, 0x55, 0x01, 0xc8, 0x7b, 0x70, 0xa7, 0x66, 0xba, 0x16, 0xed, 0x7d, 0x03, 0x19, 0x7f, 0x3f, - 0x07, 0xeb, 0x0d, 0xe7, 0x19, 0xfd, 0xe5, 0xb4, 0xc1, 0x1e, 0x80, 0x64, 0x5a, 0xd6, 0xc0, 0x37, - 0xad, 0x2b, 0xd5, 0x6d, 0x32, 0x3f, 0x0c, 0xc4, 0x96, 0x96, 0x83, 0x33, 0x73, 0x04, 0x7d, 0x4a, - 0x6d, 0xd5, 0x6d, 0xf6, 0xa3, 0x0e, 0xd9, 0x2c, 0x49, 0x40, 0x50, 0x03, 0xde, 0x10, 0xf2, 0x6b, - 0x3d, 0xcf, 0x7a, 0xfa, 0xb5, 0x13, 0x50, 0x66, 0x84, 0xa6, 0x79, 0xee, 0xd2, 0xd0, 0xb1, 0x34, - 0xcf, 0x17, 0x67, 0xf2, 0x65, 0xf2, 0x62, 0xc2, 0xe4, 0x91, 0x61, 0x21, 0x7d, 0x64, 0x78, 0x0b, - 0x56, 0x02, 0xa6, 0x58, 0xd7, 0x8a, 0xef, 0x2f, 0x17, 0xb9, 0x4d, 0x33, 0x50, 0x36, 0x5f, 0x9e, - 0x51, 0xcf, 0xce, 0x02, 0x1a, 0xf2, 0x58, 0x5b, 0x26, 0x09, 0xc8, 0x2f, 0xf4, 0x08, 0xfd, 0xc7, - 0x73, 0xb0, 0xd2, 0x0e, 0x1d, 0xeb, 0x29, 0xf5, 0x27, 0x9f, 0xd3, 0xd2, 0x67, 0xb1, 0xd9, 0xdc, - 0x59, 0x2c, 0x77, 0x96, 0x99, 0x1b, 0x77, 0x96, 0x49, 0x9e, 0xbb, 0x8a, 0xf9, 0xae, 0xc5, 0xf0, - 0x24, 0x38, 0x9f, 0x39, 0x09, 0xbe, 0x5c, 0x7f, 0x3f, 0x7d, 0xb6, 0x29, 0xe5, 0xce, 0x36, 0xe9, - 0x73, 0x63, 0x39, 0x77, 0x6e, 0x7c, 0xb9, 0x63, 0xb4, 0x0c, 0x4b, 0x7d, 0x37, 0x67, 0x99, 0x14, - 0xec, 0x15, 0x0d, 0xf3, 0x27, 0x45, 0x58, 0xdd, 0xf7, 0x06, 0x3e, 0xf1, 0xbe, 0x8e, 0xaf, 0xaf, - 0xd1, 0xc7, 0xb0, 0xc8, 0x49, 0x44, 0x4f, 0xe8, 0xc5, 0x37, 0xe1, 0x31, 0x39, 0xfa, 0x10, 0x16, - 0xce, 0x3c, 0x2f, 0x14, 0x2e, 0xf8, 0x62, 0x46, 0x41, 0x8d, 0xde, 0x85, 0xc5, 0xe8, 0xf2, 0x39, - 0xa8, 0x96, 0x52, 0x75, 0x78, 0xfa, 0x4a, 0x9d, 0xc4, 0x54, 0x68, 0x0f, 0x56, 0xed, 0x74, 0x3f, - 0x4d, 0xa4, 0x91, 0x9b, 0x82, 0x31, 0xd3, 0x6d, 0x3b, 0x9c, 0x21, 0x59, 0x06, 0xf4, 0x25, 0x6c, - 0x5e, 0x8c, 0x9f, 0xd7, 0x74, 0x0f, 0x00, 0x0e, 0x67, 0xc8, 0x24, 0x01, 0xe8, 0x13, 0x58, 0x72, - 0x12, 0x97, 0x58, 0x62, 0x93, 0x59, 0x8f, 0x8f, 0xd1, 0x09, 0xd4, 0xe1, 0x0c, 0x49, 0x91, 0x32, - 0xd6, 0x67, 0x89, 0x23, 0xa4, 0xd8, 0x4a, 0xd6, 0xc7, 0x9c, 0x2e, 0x19, 0x6b, 0x92, 0x94, 0x69, - 0xa5, 0x97, 0x4e, 0x93, 0xdc, 0xcb, 0x47, 0x5a, 0xc9, 0x24, 0x51, 0xa6, 0x95, 0x0c, 0xc3, 0xde, - 0xa2, 0x68, 0x34, 0xca, 0xff, 0x33, 0x07, 0x9b, 0xf1, 0x73, 0x94, 0xac, 0x87, 0x3c, 0x84, 0xf5, - 0xf8, 0x15, 0x4a, 0x2d, 0x32, 0x3d, 0xef, 0xb6, 0x47, 0x89, 0x69, 0x1c, 0x0a, 0xed, 0x00, 0xba, - 0x18, 0x0a, 0x63, 0x36, 0xe7, 0x0c, 0x51, 0x69, 0x30, 0x06, 0x83, 0x0e, 0x60, 0x35, 0xfd, 0xce, - 0x25, 0xa8, 0x96, 0xb9, 0x67, 0xbc, 0x96, 0x79, 0x29, 0x93, 0xf1, 0x90, 0x2c, 0xd7, 0xcf, 0xc5, - 0x53, 0x76, 0x60, 0x2d, 0x16, 0x6b, 0x30, 0xdd, 0x8c, 0xae, 0x16, 0x0e, 0x67, 0x48, 0x1e, 0xf5, - 0xff, 0xc1, 0xfa, 0x3f, 0x2d, 0xc0, 0x6a, 0xac, 0xda, 0xc4, 0x07, 0xce, 0xd2, 0x8e, 0x90, 0x51, - 0x65, 0xc6, 0x4d, 0xd8, 0x07, 0x32, 0x0c, 0x3c, 0xe8, 0xc6, 0x3b, 0x55, 0x36, 0xe8, 0xc6, 0x53, - 0xf1, 0xa0, 0x1b, 0x8f, 0xda, 0x2b, 0xb1, 0xec, 0xe3, 0x5f, 0x9a, 0xa1, 0xfc, 0xb7, 0x05, 0xb8, - 0x9d, 0x71, 0x0c, 0xda, 0xef, 0x0d, 0x3b, 0x03, 0x0f, 0x40, 0x0a, 0x68, 0x8f, 0x5a, 0x43, 0x37, - 0x19, 0x5e, 0x6c, 0xe7, 0xe0, 0xe8, 0x33, 0xb8, 0x95, 0x86, 0xd5, 0x13, 0x4f, 0x8d, 0x66, 0x79, - 0x25, 0x3e, 0x99, 0x20, 0x9b, 0x94, 0xe7, 0xa6, 0x4b, 0xca, 0x3f, 0x9b, 0xe5, 0x2d, 0x17, 0x7b, - 0x60, 0x85, 0x6d, 0xd7, 0xec, 0x07, 0x17, 0x5e, 0x88, 0x3e, 0x82, 0xa5, 0x7e, 0x04, 0xe2, 0xfe, - 0x23, 0x34, 0x3f, 0xce, 0xa7, 0x48, 0x8a, 0x90, 0xf7, 0xf8, 0xc5, 0x38, 0x6e, 0xeb, 0x8c, 0x00, - 0x13, 0xee, 0x15, 0x32, 0xf7, 0x5f, 0xc5, 0xfc, 0xfd, 0x57, 0xb6, 0x85, 0x31, 0x3f, 0xa6, 0x85, - 0xb1, 0x0d, 0xab, 0x7d, 0xdf, 0xb1, 0xa8, 0x32, 0x2a, 0x5a, 0x17, 0xa2, 0x6a, 0x33, 0x03, 0x66, - 0xbb, 0xa5, 0x4f, 0x43, 0xd3, 0xe9, 0x51, 0x5f, 0xb5, 0x45, 0x56, 0x48, 0x40, 0xe2, 0x5a, 0xa1, - 0x34, 0xaa, 0x15, 0xde, 0x86, 0xb5, 0xe4, 0x2a, 0xa3, 0x1b, 0x8c, 0xa8, 0x21, 0x9a, 0x47, 0xc8, - 0x7f, 0x55, 0x80, 0x15, 0xa1, 0xd0, 0x51, 0xf9, 0xbd, 0x28, 0xe8, 0x32, 0x4e, 0x9c, 0x51, 0x3c, - 0x89, 0xc9, 0x98, 0xd7, 0x9c, 0x0e, 0x02, 0xc7, 0xa5, 0x41, 0xa0, 0x7f, 0xed, 0x52, 0xff, 0xf3, - 0x61, 0x9b, 0x2c, 0x07, 0x7f, 0xc5, 0xcd, 0xf8, 0x3f, 0x0a, 0x80, 0xa2, 0xab, 0x67, 0xf7, 0x99, - 0x33, 0x8a, 0xbb, 0xdb, 0x50, 0xe2, 0xef, 0x2d, 0xd8, 0x07, 0xc5, 0xeb, 0x9a, 0x78, 0xcc, 0x34, - 0xe7, 0x70, 0x62, 0x6e, 0x85, 0x68, 0x3a, 0x09, 0x08, 0x9b, 0x74, 0x34, 0xc2, 0xac, 0xc0, 0x37, - 0x87, 0x0f, 0x23, 0xe6, 0x48, 0x0e, 0xce, 0x3c, 0x85, 0xcb, 0xe5, 0x27, 0x50, 0xf1, 0xa2, 0x66, - 0x08, 0xc8, 0x97, 0x87, 0xf3, 0x2f, 0x78, 0x6e, 0x94, 0x2e, 0x53, 0xe5, 0x9f, 0x2d, 0xc3, 0x62, - 0xbc, 0x22, 0xe6, 0x3d, 0xd1, 0x3b, 0x98, 0x68, 0x46, 0x71, 0x03, 0x2c, 0x01, 0x43, 0xe7, 0x70, - 0x37, 0x78, 0xd1, 0x9b, 0x92, 0xca, 0xee, 0x7d, 0xa1, 0xd3, 0xeb, 0xde, 0x94, 0x90, 0x6b, 0x05, - 0xb1, 0xc8, 0x9a, 0x32, 0x5b, 0x67, 0x72, 0xf5, 0xf7, 0xf8, 0x9b, 0xa0, 0x44, 0x9f, 0x50, 0x64, - 0xeb, 0x09, 0x4d, 0xc4, 0x0c, 0x31, 0x7a, 0xf4, 0x92, 0xf9, 0x3a, 0x97, 0xad, 0x51, 0x03, 0xd6, - 0x69, 0xfe, 0x06, 0x57, 0x14, 0x6d, 0xb7, 0x27, 0xdf, 0xf1, 0x92, 0x71, 0x6c, 0x6c, 0x3e, 0xd9, - 0x9d, 0x72, 0xf1, 0xba, 0x9d, 0x32, 0xbf, 0x4f, 0x7e, 0x04, 0x4b, 0x66, 0xe2, 0x9e, 0x8c, 0xc7, - 0xeb, 0x48, 0x93, 0xc9, 0x2b, 0x34, 0x92, 0x22, 0x64, 0x8c, 0xa9, 0x5d, 0xaf, 0x3c, 0x71, 0xd7, - 0xcb, 0xec, 0x79, 0xaf, 0x43, 0xd1, 0x32, 0x7b, 0x3d, 0x5e, 0x39, 0x57, 0x76, 0x2b, 0x89, 0x47, - 0x8e, 0x84, 0x23, 0x38, 0xc1, 0x85, 0x19, 0xf2, 0x6b, 0x8f, 0x04, 0xc1, 0x85, 0x19, 0x12, 0x8e, - 0x60, 0xab, 0xee, 0xa7, 0x5b, 0xd2, 0xfc, 0xb9, 0x4b, 0x2a, 0x1f, 0x24, 0xb1, 0x24, 0x4b, 0x8e, - 0x74, 0xb8, 0x61, 0x8d, 0xe9, 0x3f, 0xf3, 0x0b, 0x8f, 0x51, 0xd7, 0x6b, 0x5c, 0x8b, 0x9a, 0x8c, - 0x65, 0x44, 0x4f, 0x26, 0x17, 0xa6, 0x2b, 0x53, 0x95, 0xd5, 0x13, 0xcb, 0xd2, 0x1f, 0x17, 0xe0, - 0xc1, 0x99, 0x19, 0x84, 0x84, 0xbf, 0x87, 0x08, 0x1f, 0xd3, 0xab, 0x6b, 0x9f, 0x6d, 0xad, 0x4e, - 0x1f, 0x62, 0x2f, 0x21, 0x16, 0xa9, 0x80, 0x82, 0x5c, 0x3b, 0x87, 0x9f, 0x69, 0x46, 0x0f, 0xa1, - 0xf3, 0xfd, 0x1e, 0x32, 0x86, 0x89, 0x45, 0x40, 0x2f, 0xdf, 0x1c, 0xe0, 0x77, 0x37, 0xa3, 0x08, - 0x18, 0xd3, 0x3e, 0x20, 0xe3, 0xd8, 0x10, 0x81, 0x0d, 0x7f, 0x5c, 0x77, 0x87, 0x3f, 0xb2, 0x1b, - 0xdd, 0x82, 0x8d, 0xed, 0x00, 0x91, 0xf1, 0xac, 0x2c, 0x8d, 0xd9, 0xd7, 0x34, 0x52, 0xc4, 0x03, - 0xbd, 0x58, 0xc7, 0xd7, 0xf5, 0x5c, 0xc8, 0xb5, 0x82, 0x90, 0x0d, 0x77, 0xac, 0xc9, 0xcd, 0x96, - 0x6a, 0x95, 0x7f, 0x47, 0x1e, 0x46, 0xc8, 0x44, 0x4a, 0x72, 0x9d, 0x18, 0x16, 0x2e, 0x61, 0xba, - 0x2c, 0xac, 0xde, 0x4a, 0x85, 0x4b, 0xa6, 0x68, 0x24, 0x59, 0x72, 0x96, 0x35, 0x83, 0x54, 0x27, - 0xa0, 0x7a, 0x3b, 0x95, 0x35, 0xd3, 0x6d, 0x02, 0x92, 0x21, 0x66, 0xec, 0xfd, 0xd4, 0x4e, 0x5e, - 0xbd, 0x93, 0x62, 0x4f, 0x6f, 0xf3, 0x24, 0x43, 0xcc, 0x7c, 0xef, 0x3c, 0xb7, 0xc3, 0x56, 0xef, - 0xa6, 0x7c, 0x2f, 0xbf, 0x05, 0x93, 0x31, 0x4c, 0x72, 0x08, 0x30, 0x6a, 0x56, 0xa5, 0x9f, 0xa3, - 0x16, 0xb2, 0xcf, 0x51, 0x6f, 0xc2, 0xc2, 0x99, 0xef, 0x5d, 0x36, 0xa3, 0x6d, 0xab, 0x44, 0xc4, - 0x48, 0x5c, 0xb6, 0xcd, 0xc5, 0x97, 0x6d, 0xd9, 0xc7, 0xb2, 0xc5, 0xdc, 0x63, 0x59, 0xf9, 0x5f, - 0x57, 0xa0, 0x72, 0x4c, 0x4f, 0xf7, 0xa9, 0xc9, 0x22, 0x3b, 0x40, 0x9f, 0xc3, 0x72, 0xcf, 0x3c, - 0xa5, 0xbd, 0x40, 0x94, 0x9d, 0xe2, 0xca, 0xe7, 0x4d, 0xb1, 0x96, 0x04, 0xe9, 0xce, 0x31, 0xde, - 0xeb, 0xee, 0x63, 0xc5, 0xe8, 0x10, 0xdc, 0xee, 0xee, 0x37, 0x94, 0x03, 0x92, 0x66, 0x45, 0x3f, - 0x84, 0x9b, 0xcf, 0x3c, 0xa7, 0xaf, 0xba, 0xb6, 0xf3, 0xcc, 0xb1, 0x07, 0x66, 0x4f, 0x1f, 0x84, - 0xe7, 0x9e, 0xe3, 0x9e, 0x8b, 0x3b, 0xbc, 0xe9, 0x84, 0x4e, 0x90, 0x81, 0x1e, 0x89, 0x32, 0x26, - 0x38, 0x7a, 0x9f, 0xaf, 0x78, 0x5a, 0x79, 0x43, 0x2e, 0xd4, 0x80, 0x95, 0xf8, 0x77, 0xcd, 0xa7, - 0xec, 0xcc, 0x50, 0x7c, 0x09, 0x39, 0x19, 0x5e, 0x26, 0xcd, 0xba, 0x30, 0xdd, 0x73, 0xd1, 0x1f, - 0x3b, 0xda, 0xe5, 0xdb, 0xef, 0xd4, 0xd2, 0xd2, 0xbc, 0x4c, 0x77, 0x5f, 0x0d, 0xa8, 0x7f, 0xd5, - 0x0e, 0xcd, 0x70, 0x10, 0x1c, 0xbd, 0x3f, 0xaa, 0x93, 0x16, 0x5e, 0x46, 0x77, 0xe3, 0x65, 0x70, - 0x2b, 0x27, 0x12, 0x56, 0x20, 0xae, 0xc0, 0xa6, 0xb5, 0x72, 0x92, 0x15, 0xd5, 0x01, 0xf8, 0x57, - 0x8e, 0xdc, 0xf8, 0xf1, 0xce, 0xb4, 0x82, 0x12, 0x7c, 0x79, 0x5f, 0x51, 0x5d, 0xcb, 0xbb, 0x64, - 0xbe, 0x52, 0x7e, 0x75, 0x5f, 0x89, 0x65, 0x20, 0x02, 0x6b, 0xc3, 0x7f, 0x84, 0x70, 0x68, 0xf0, - 0x05, 0xfb, 0xae, 0x78, 0xbb, 0x36, 0x9d, 0xe0, 0x3c, 0x3b, 0xf3, 0xbf, 0x7e, 0x94, 0xd3, 0x02, - 0x5e, 0x0e, 0x4c, 0xed, 0x7f, 0x31, 0x17, 0x6a, 0x81, 0x24, 0xb2, 0x51, 0xcb, 0xb4, 0x9e, 0x46, - 0x93, 0x5a, 0x7a, 0x09, 0x49, 0x39, 0x6e, 0x64, 0x00, 0x4a, 0x19, 0x67, 0xdf, 0x71, 0xcd, 0x1e, - 0xaf, 0x1c, 0xa6, 0x95, 0x39, 0x86, 0x9f, 0x59, 0x38, 0x0a, 0x6c, 0x6c, 0x3b, 0x21, 0xaf, 0x19, - 0xa6, 0xb6, 0xf0, 0x88, 0x0f, 0xed, 0x43, 0x85, 0x77, 0x22, 0x3b, 0xfd, 0x9e, 0x67, 0xda, 0xbc, - 0x18, 0x98, 0x56, 0x4c, 0x92, 0x11, 0x9d, 0xc1, 0x9d, 0xc4, 0x90, 0x38, 0xd6, 0xc5, 0x17, 0x09, - 0xdb, 0xf0, 0xbd, 0x7a, 0x5a, 0xb9, 0xd7, 0x09, 0x42, 0xdf, 0x87, 0xc5, 0x67, 0xcc, 0x35, 0x8f, - 0x76, 0xc5, 0x8b, 0x8c, 0xe9, 0x64, 0xc6, 0x4c, 0xcc, 0xba, 0xbc, 0xb6, 0x8c, 0x5f, 0xda, 0x74, - 0xfc, 0x1e, 0x7f, 0x19, 0x3c, 0xb5, 0x75, 0xb3, 0xdc, 0x2c, 0x6a, 0x03, 0x1e, 0xca, 0xc4, 0x74, - 0x9f, 0xb2, 0xd0, 0xd8, 0x78, 0x99, 0xa8, 0x4d, 0xb1, 0xa2, 0x23, 0x58, 0x4f, 0xc7, 0x0a, 0xaf, - 0x8a, 0x79, 0x65, 0x32, 0xad, 0xc4, 0x71, 0x02, 0x98, 0x07, 0x86, 0x17, 0x8e, 0x6f, 0xb7, 0x4c, - 0x3f, 0xbc, 0x12, 0x7b, 0x6f, 0xc0, 0xab, 0x92, 0xa9, 0x3d, 0x30, 0xcf, 0x8f, 0x6c, 0xb8, 0x7d, - 0xc6, 0xeb, 0x21, 0x37, 0xec, 0x5d, 0x0d, 0xff, 0x33, 0xa1, 0x4d, 0xc3, 0x90, 0xa9, 0xa1, 0xfa, - 0x12, 0xd2, 0xaf, 0x91, 0x23, 0x1f, 0xc0, 0x5a, 0x8e, 0x21, 0x7a, 0xf6, 0x69, 0x74, 0xd5, 0x66, - 0xab, 0x81, 0x9b, 0x58, 0x33, 0x70, 0x5d, 0x9a, 0x41, 0xab, 0x50, 0x49, 0x02, 0x0a, 0x68, 0x09, - 0x4a, 0x7a, 0xcb, 0x50, 0x75, 0x4d, 0x69, 0x48, 0xb3, 0xf2, 0xbf, 0x14, 0x60, 0xd3, 0x30, 0x4f, - 0x7b, 0x34, 0xd4, 0xbc, 0xd0, 0x39, 0x73, 0x44, 0x34, 0xf1, 0xb7, 0x41, 0xa9, 0x4b, 0xf3, 0xe8, - 0xd2, 0x6d, 0x04, 0x60, 0x1b, 0xf6, 0xc0, 0xf5, 0xa9, 0x69, 0xb3, 0x23, 0x45, 0x7c, 0x57, 0x94, - 0x04, 0xa1, 0x1d, 0x40, 0x2e, 0x13, 0x1a, 0x97, 0xf7, 0x51, 0xab, 0x22, 0x7a, 0x0c, 0x31, 0x06, - 0x83, 0xea, 0xb0, 0x9c, 0x82, 0x56, 0xe7, 0x53, 0x77, 0xb1, 0xc9, 0x09, 0x0a, 0x0a, 0xde, 0x48, - 0x48, 0x33, 0xc9, 0x7f, 0x53, 0x80, 0xcd, 0x09, 0xa4, 0xd3, 0xbd, 0xde, 0xd9, 0x86, 0xc5, 0xcb, - 0x6b, 0x6f, 0x56, 0x63, 0x34, 0x7a, 0x00, 0x92, 0xf8, 0x39, 0xba, 0xc9, 0x98, 0xe3, 0x7a, 0xca, - 0xc1, 0xa7, 0xa8, 0x6f, 0xfe, 0xa1, 0x00, 0x37, 0x8e, 0xe9, 0xe9, 0xaf, 0xde, 0x0e, 0xdf, 0x83, - 0x95, 0x14, 0x34, 0x10, 0x86, 0xd8, 0x18, 0xb9, 0x6d, 0x52, 0xff, 0x19, 0x62, 0xf9, 0x9f, 0x8b, - 0x50, 0x11, 0x25, 0x34, 0x9f, 0xfe, 0x54, 0x97, 0xb7, 0x16, 0x75, 0x9e, 0x45, 0x8d, 0xa5, 0xe1, - 0xe5, 0xed, 0x10, 0x84, 0xbe, 0x0f, 0x0b, 0x51, 0x4a, 0x10, 0x55, 0xcf, 0x5b, 0x71, 0xc5, 0x3b, - 0xfa, 0xca, 0x4e, 0x4b, 0x39, 0x61, 0x2e, 0x1e, 0xfd, 0x3f, 0x57, 0xdb, 0x50, 0x8c, 0x4e, 0x9b, - 0x08, 0x2e, 0xb4, 0x0b, 0x37, 0x42, 0xdf, 0x74, 0x83, 0xe8, 0x1f, 0xd8, 0xd2, 0x37, 0xc0, 0x45, - 0x32, 0x16, 0x37, 0xfe, 0xc6, 0x7c, 0x61, 0xfa, 0x1b, 0xf3, 0x71, 0x37, 0xce, 0x8b, 0xfc, 0x7b, - 0x59, 0x30, 0xbf, 0xdd, 0x1b, 0xb0, 0x2c, 0xd0, 0xf7, 0x3d, 0xef, 0x8c, 0xda, 0xe2, 0xed, 0x63, - 0x1a, 0x88, 0x6e, 0x27, 0xde, 0x74, 0x44, 0x8f, 0x53, 0x87, 0x63, 0xf9, 0xdf, 0x0b, 0xb0, 0x3e, - 0x46, 0x01, 0x08, 0xc1, 0x4a, 0x47, 0x7b, 0xac, 0xe9, 0xc7, 0x9a, 0x80, 0x48, 0x33, 0x68, 0x05, - 0xa0, 0x45, 0xf4, 0x1a, 0x6e, 0xb7, 0x55, 0xed, 0x40, 0x2a, 0xa0, 0x12, 0x14, 0xdb, 0x58, 0x33, - 0xa4, 0x59, 0x46, 0xad, 0x61, 0x5c, 0xef, 0x1a, 0x7a, 0x57, 0xa9, 0xd5, 0x70, 0xcb, 0x88, 0x1e, - 0xf3, 0xd4, 0x74, 0x96, 0x3f, 0x0c, 0x2c, 0x15, 0xd1, 0x4d, 0x40, 0x35, 0xbd, 0xd3, 0xa8, 0x77, - 0x59, 0x9e, 0x19, 0xc2, 0xf9, 0xc3, 0x1e, 0x82, 0xf7, 0x3b, 0x5a, 0x1d, 0xd7, 0xa5, 0x05, 0x54, - 0x81, 0x45, 0xfc, 0xa4, 0xa5, 0x12, 0x5c, 0x97, 0x16, 0x23, 0xd4, 0xe7, 0xb8, 0xc6, 0x92, 0x4f, - 0x09, 0x2d, 0x43, 0xb9, 0xa6, 0x68, 0x35, 0xdc, 0x68, 0xe0, 0xba, 0x54, 0x46, 0x1b, 0xb0, 0x76, - 0xac, 0xa8, 0x86, 0xaa, 0x1d, 0x74, 0xf7, 0x75, 0xd2, 0x6d, 0x29, 0x27, 0x98, 0x48, 0xc0, 0x04, - 0x08, 0xb0, 0x54, 0x91, 0x7f, 0xef, 0x16, 0xac, 0xa4, 0x3d, 0x6e, 0x14, 0xc6, 0xb3, 0xbf, 0xf4, - 0x30, 0xc6, 0x19, 0x57, 0x7c, 0x67, 0x6c, 0x4c, 0xf0, 0x6c, 0x1e, 0xbf, 0xdb, 0x1b, 0xe7, 0x91, - 0x99, 0x6c, 0x30, 0x9f, 0xff, 0xd7, 0xc0, 0x9b, 0xb0, 0xe0, 0x9c, 0xbb, 0x9e, 0x1f, 0xb5, 0x07, - 0x4a, 0x44, 0x8c, 0xf8, 0xb3, 0xdb, 0xd0, 0xf4, 0x7d, 0x6a, 0xf3, 0xde, 0x6a, 0x89, 0xc4, 0x43, - 0x96, 0x26, 0x4e, 0x7d, 0xcf, 0xb4, 0x2d, 0x33, 0x08, 0x79, 0x6d, 0x51, 0x22, 0x23, 0x00, 0x73, - 0x9f, 0xfe, 0x20, 0xb8, 0xe0, 0x1d, 0xce, 0xf5, 0xc8, 0x7d, 0xe2, 0x31, 0xfa, 0x00, 0x36, 0x78, - 0x79, 0x51, 0x73, 0xfa, 0x17, 0xd4, 0x0f, 0xe9, 0xf3, 0x50, 0x5c, 0x33, 0xdf, 0xe0, 0x8d, 0xce, - 0xf1, 0x48, 0xf6, 0xbd, 0xcb, 0x41, 0x2f, 0x74, 0xf8, 0xf7, 0x36, 0xa2, 0xef, 0x0d, 0x01, 0x6c, - 0x9e, 0x03, 0xbf, 0xc7, 0xef, 0x0a, 0xa2, 0x7f, 0xd4, 0x8b, 0x87, 0x8c, 0x6f, 0xe0, 0xf7, 0xc4, - 0x85, 0xfd, 0x66, 0xc4, 0x37, 0x04, 0xa0, 0x13, 0x58, 0x15, 0x4a, 0x6f, 0x87, 0x83, 0x53, 0xfe, - 0x9f, 0x1b, 0xd1, 0xa6, 0xf9, 0xee, 0xd4, 0x9a, 0xee, 0xec, 0xf1, 0x37, 0x6e, 0x59, 0x39, 0x2c, - 0x11, 0x59, 0x3d, 0x6a, 0xfa, 0x4d, 0xb6, 0x1c, 0x7e, 0x78, 0x2f, 0x91, 0x04, 0x24, 0x52, 0xc3, - 0x90, 0x65, 0xf8, 0xd8, 0x27, 0xa8, 0xde, 0xe6, 0x97, 0x1d, 0xe3, 0x91, 0x4c, 0xb1, 0xf6, 0x40, - 0xf4, 0x97, 0xef, 0xf0, 0x9c, 0x3a, 0x1c, 0x33, 0x23, 0x46, 0x65, 0x65, 0xf5, 0x6e, 0xf4, 0x72, - 0x29, 0x1a, 0xa1, 0x0f, 0x98, 0xf9, 0x87, 0xb9, 0xab, 0xfa, 0x5a, 0xaa, 0x49, 0x9e, 0xc8, 0x6a, - 0x24, 0x49, 0x86, 0x0e, 0x61, 0xed, 0x8c, 0x55, 0xb9, 0xc9, 0xae, 0x4e, 0xf5, 0xde, 0x0b, 0x1b, - 0x3e, 0x79, 0x26, 0xf4, 0x88, 0x1d, 0x32, 0xbc, 0x90, 0xda, 0x89, 0x6f, 0x55, 0x5f, 0x9f, 0x38, - 0x8b, 0x3c, 0xb1, 0xec, 0xc0, 0xe6, 0x04, 0x1f, 0x47, 0x65, 0x98, 0xc7, 0x84, 0xe8, 0x44, 0x9a, - 0x61, 0x81, 0xdc, 0xc2, 0x5a, 0x3d, 0x4a, 0x34, 0x2b, 0x00, 0x6d, 0x4c, 0x8e, 0x30, 0xe9, 0x2a, - 0xb5, 0xc7, 0xd2, 0x2c, 0x92, 0x60, 0xa9, 0x8e, 0x1b, 0xea, 0x11, 0x26, 0x27, 0x1c, 0x32, 0xc7, - 0x52, 0x11, 0xc1, 0x4a, 0x3d, 0x7a, 0x35, 0xd8, 0x6a, 0x28, 0x27, 0xb8, 0x2e, 0xcd, 0xcb, 0xbf, - 0xbb, 0x06, 0xb7, 0x26, 0x5a, 0x99, 0x7d, 0x42, 0xa4, 0x38, 0x69, 0x26, 0xf1, 0x3a, 0x96, 0x7f, - 0xae, 0xa6, 0xb6, 0x0e, 0x31, 0x31, 0xf0, 0x13, 0x96, 0xdd, 0x56, 0xa1, 0xb2, 0xdf, 0x61, 0xd5, - 0x52, 0x8b, 0xe8, 0xfa, 0xbe, 0x34, 0x87, 0xee, 0xc0, 0xa6, 0xa6, 0x6b, 0xdd, 0x23, 0x4c, 0xd4, - 0x7d, 0x95, 0xa5, 0x3d, 0xa2, 0x68, 0x6d, 0x95, 0x55, 0x46, 0x52, 0x11, 0xdd, 0x82, 0x8d, 0x8e, - 0x36, 0x0e, 0x35, 0x8f, 0x36, 0x61, 0x7d, 0x1c, 0x62, 0x01, 0x55, 0xe1, 0xc6, 0x10, 0xd1, 0xd0, - 0x8f, 0xbb, 0xf1, 0xbc, 0x16, 0xd1, 0x1a, 0x2c, 0x0f, 0x31, 0x87, 0xea, 0xc1, 0xa1, 0x54, 0x42, - 0x77, 0xa1, 0x3a, 0x04, 0xa9, 0x9a, 0x6a, 0xa8, 0x4a, 0x63, 0xc8, 0x50, 0x4e, 0x89, 0x8a, 0xb1, - 0x0d, 0xfd, 0x58, 0x02, 0x36, 0xb1, 0x1c, 0x86, 0x8b, 0xac, 0xa0, 0xfb, 0xf0, 0xfa, 0x98, 0x89, - 0x75, 0x15, 0xed, 0x84, 0xa5, 0x74, 0xfe, 0x8c, 0x7a, 0xe9, 0x05, 0x44, 0x5c, 0xd2, 0xf2, 0x24, - 0x22, 0x86, 0x65, 0x54, 0x6c, 0x26, 0x2b, 0xe8, 0xdb, 0x70, 0xff, 0x3a, 0xa2, 0x78, 0x31, 0xab, - 0xe8, 0x2d, 0x90, 0xc7, 0x11, 0xc6, 0x3b, 0x93, 0x10, 0x28, 0x4d, 0xa2, 0x63, 0xaa, 0x4c, 0xc8, - 0x5b, 0x9b, 0x34, 0x3b, 0xb6, 0xc0, 0x58, 0x18, 0x9a, 0x34, 0xbb, 0x98, 0x28, 0x96, 0xb6, 0xce, - 0xdc, 0xf0, 0x80, 0xe8, 0x9d, 0x56, 0xb7, 0x46, 0xb0, 0x62, 0x60, 0xe9, 0x06, 0x53, 0xbe, 0x80, - 0x1c, 0x2a, 0xda, 0x01, 0xee, 0xb6, 0x3b, 0x7b, 0x6c, 0x03, 0x93, 0x36, 0xd8, 0x7e, 0x95, 0xc2, - 0xa8, 0x35, 0x5d, 0x93, 0x6e, 0x32, 0x5b, 0xa6, 0xc1, 0xda, 0x91, 0x6a, 0xe0, 0x6e, 0x43, 0xd5, - 0x1e, 0x4b, 0x9b, 0x39, 0x6c, 0x1d, 0xb7, 0x6b, 0x44, 0xe5, 0x25, 0xb8, 0x54, 0x65, 0xf6, 0x4c, - 0x61, 0x09, 0x6e, 0x1b, 0x44, 0xad, 0x19, 0xd2, 0xad, 0x1c, 0x4a, 0xd1, 0x34, 0xbd, 0xa3, 0xd5, - 0xb0, 0x74, 0x7b, 0x84, 0x6a, 0x29, 0xc4, 0x50, 0x6b, 0x6a, 0x4b, 0xd1, 0x8c, 0xae, 0x52, 0xaf, - 0x4b, 0x77, 0x46, 0x9f, 0x4b, 0xa2, 0x08, 0x6e, 0xea, 0x47, 0x58, 0xba, 0x8b, 0x5e, 0x83, 0x5b, - 0x79, 0x6c, 0x8b, 0xe8, 0x4d, 0xdd, 0xc0, 0xd2, 0x6b, 0xe3, 0x99, 0xeb, 0x98, 0x63, 0xef, 0x8d, - 0xc7, 0x46, 0x8b, 0x95, 0x5e, 0x67, 0xf1, 0x94, 0xc7, 0x36, 0xb0, 0x72, 0x84, 0xa5, 0x2d, 0x66, - 0xb3, 0x3c, 0x52, 0xac, 0x4b, 0xeb, 0x34, 0xf7, 0x30, 0x91, 0xde, 0x40, 0x37, 0x40, 0xda, 0x23, - 0xba, 0x52, 0xaf, 0x29, 0x6d, 0x23, 0x36, 0x87, 0x1c, 0xfd, 0xe3, 0x5a, 0x0c, 0x65, 0x6b, 0xbc, - 0x9f, 0x26, 0x14, 0x6b, 0x7b, 0x93, 0xdb, 0x0d, 0x6b, 0x98, 0xa8, 0x35, 0x56, 0x9f, 0xa8, 0xfb, - 0x6a, 0x4d, 0xe1, 0x4a, 0xfe, 0x16, 0xc3, 0xe0, 0x5d, 0xdc, 0x55, 0xeb, 0x58, 0x33, 0x54, 0xe3, - 0x44, 0x7c, 0xb8, 0x2e, 0xbd, 0xc5, 0x84, 0x33, 0x0c, 0xd6, 0x6a, 0xe4, 0xa4, 0xc5, 0x6a, 0x94, - 0x6f, 0x33, 0x23, 0xd7, 0x94, 0x46, 0xa3, 0xdb, 0x54, 0xdb, 0x6d, 0x5c, 0xef, 0x1e, 0xe9, 0x6a, - 0x0d, 0x4b, 0xdb, 0x39, 0x30, 0xff, 0x07, 0xb7, 0xef, 0x30, 0x9d, 0xa8, 0x5a, 0x5d, 0x3d, 0x52, - 0xeb, 0x1d, 0xa5, 0x91, 0x59, 0xd1, 0x83, 0x91, 0x73, 0xd5, 0x31, 0x2f, 0x95, 0x7e, 0x8d, 0x39, - 0x79, 0x04, 0x89, 0xad, 0xd9, 0x6d, 0xea, 0x75, 0x3c, 0x4c, 0x6e, 0x7b, 0x91, 0x85, 0xdf, 0x66, - 0xda, 0x4c, 0x7e, 0x2e, 0xe2, 0x89, 0xe6, 0xf2, 0xce, 0x04, 0x24, 0x9f, 0xd1, 0x0e, 0x2b, 0xd2, - 0xe2, 0x5a, 0x30, 0x91, 0x00, 0xdf, 0x65, 0x79, 0x2b, 0x86, 0x27, 0x13, 0xe1, 0x43, 0xf4, 0x36, - 0x6c, 0xc7, 0x08, 0x1e, 0x29, 0x4a, 0x8d, 0x87, 0x4a, 0x94, 0xce, 0xbb, 0x9d, 0x16, 0x7f, 0x95, - 0xbd, 0xaf, 0xa8, 0xac, 0x66, 0x7b, 0x0f, 0xed, 0xc0, 0x83, 0x17, 0x53, 0x0f, 0xab, 0xc1, 0x5d, - 0xf4, 0x3e, 0xbc, 0x3b, 0x2d, 0x7d, 0xfc, 0x91, 0xf7, 0xd1, 0x77, 0xe1, 0xbd, 0x6b, 0x98, 0x08, - 0xae, 0x61, 0xb6, 0x6f, 0x74, 0xc5, 0xe6, 0xd2, 0x6d, 0x63, 0xa3, 0xd3, 0x92, 0x3e, 0x40, 0x9f, - 0xc1, 0xc7, 0xd3, 0xb0, 0xb5, 0x3b, 0x35, 0x56, 0xff, 0x76, 0x95, 0x7d, 0x03, 0x93, 0xee, 0xa1, - 0x5a, 0xab, 0x75, 0x5a, 0xd2, 0x77, 0xd1, 0x77, 0xe0, 0x5b, 0x31, 0xb7, 0x60, 0x54, 0x6a, 0x35, - 0xbd, 0xa3, 0x19, 0x91, 0x7c, 0xe6, 0x68, 0xaa, 0x56, 0xc7, 0x44, 0xfa, 0x10, 0x6d, 0xc3, 0x9b, - 0x19, 0xd2, 0x36, 0xd6, 0xea, 0xdd, 0x18, 0x36, 0xa4, 0xfc, 0x08, 0x3d, 0x80, 0xb7, 0xae, 0xa3, - 0xe4, 0xd1, 0x13, 0xb9, 0xe9, 0xc7, 0x2c, 0x48, 0x32, 0xb4, 0x04, 0x7f, 0xd1, 0xc1, 0x6d, 0x16, - 0x82, 0xb5, 0x86, 0xaa, 0xe1, 0xba, 0xf4, 0x09, 0x92, 0xe1, 0xde, 0x04, 0xa2, 0xb8, 0xe8, 0xfe, - 0x75, 0xf4, 0x26, 0x6c, 0x4d, 0xa0, 0x19, 0x55, 0xdf, 0x9f, 0xb2, 0xf5, 0xee, 0xa9, 0x5f, 0x8e, - 0xdb, 0x00, 0xbb, 0x86, 0xde, 0x62, 0x59, 0x72, 0x4f, 0x37, 0x0c, 0xbd, 0x29, 0x7d, 0x76, 0x1d, - 0x69, 0x44, 0xc3, 0xa8, 0x0d, 0xbd, 0x25, 0x7d, 0x8f, 0x87, 0xab, 0xfa, 0x65, 0x57, 0xd5, 0x0c, - 0x12, 0x81, 0xbe, 0xcf, 0xc3, 0x75, 0x08, 0x12, 0x32, 0x7f, 0x80, 0xd6, 0x61, 0x95, 0x41, 0x35, - 0xa5, 0x89, 0x45, 0xdc, 0x48, 0x8f, 0x58, 0x38, 0x31, 0x20, 0x8b, 0x68, 0x26, 0xb2, 0xa6, 0x6b, - 0xed, 0x4e, 0x93, 0x95, 0x0c, 0xad, 0x96, 0xa4, 0xa0, 0x7b, 0x70, 0x9b, 0x61, 0x8d, 0x63, 0xbd, - 0x6b, 0xa8, 0x98, 0x74, 0x9b, 0xea, 0x01, 0x51, 0xe2, 0x09, 0x4b, 0x7b, 0xe8, 0x0d, 0x78, 0x6d, - 0x02, 0x5e, 0x7c, 0xb5, 0xc6, 0x4e, 0x20, 0xfa, 0x11, 0x26, 0x6d, 0xf5, 0x4b, 0x5c, 0x97, 0xea, - 0xcc, 0x90, 0xa9, 0x1c, 0xab, 0xe9, 0xdd, 0x7d, 0xae, 0x2b, 0xcd, 0x68, 0x9c, 0xb0, 0x43, 0xc9, - 0xb1, 0x42, 0x98, 0x1f, 0xe3, 0xff, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x2d, 0xd8, 0x08, 0x69, 0x70, - 0x4a, 0x00, 0x00, + // 6235 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x7b, 0x4b, 0x6f, 0x1c, 0x49, + 0x72, 0x30, 0x9b, 0xcf, 0x66, 0x34, 0x1f, 0xc5, 0xa4, 0x28, 0xf6, 0x48, 0x1a, 0x0d, 0xa7, 0x67, + 0x76, 0x96, 0xab, 0x6f, 0x46, 0xa3, 0xe1, 0x68, 0x67, 0x34, 0x3b, 0xfb, 0x50, 0xb1, 0xbb, 0x48, + 0x96, 0xd4, 0x5d, 0xd5, 0x93, 0x5d, 0x4d, 0x8a, 0x83, 0xc5, 0xd7, 0x28, 0x55, 0x25, 0xc9, 0xfa, + 0x54, 0x5d, 0xd5, 0x53, 0x55, 0xad, 0x11, 0xf7, 0xf0, 0x7d, 0xc0, 0xb7, 0x80, 0x6d, 0x18, 0x36, + 0xb0, 0x37, 0xbf, 0x4e, 0x06, 0x6c, 0xff, 0x04, 0x5f, 0x0c, 0x1b, 0x30, 0x0c, 0x5f, 0x8c, 0x05, + 0x0c, 0x1f, 0x7d, 0xf1, 0xd1, 0x8f, 0xab, 0x6f, 0xf6, 0xc9, 0xc8, 0xac, 0xac, 0x77, 0x35, 0xd5, + 0xd2, 0xec, 0xc3, 0xf0, 0xa9, 0x3b, 0x23, 0x23, 0x22, 0x33, 0x23, 0x22, 0x23, 0x23, 0x23, 0xa3, + 0x60, 0xd9, 0x24, 0x67, 0x77, 0x47, 0x9e, 0x1b, 0xb8, 0x68, 0x81, 0xfd, 0x34, 0xda, 0x50, 0x3f, + 0xba, 0x34, 0x3d, 0x3d, 0x20, 0xe6, 0x17, 0x63, 0xcb, 0x78, 0x86, 0xc9, 0xc8, 0xbe, 0xdc, 0x1f, + 0x07, 0x81, 0xeb, 0xa0, 0x1d, 0xa8, 0x99, 0x96, 0x3f, 0xb2, 0xf5, 0x4b, 0x8d, 0xbc, 0x08, 0xea, + 0x95, 0x9d, 0xca, 0xee, 0x32, 0x4e, 0x83, 0xd0, 0x1a, 0xcc, 0x5a, 0x66, 0x7d, 0x96, 0x75, 0xcc, + 0x5a, 0x66, 0xe3, 0x10, 0x36, 0x22, 0x6e, 0x7d, 0xdc, 0x9e, 0x9a, 0x8d, 0x00, 0x73, 0x63, 0xcf, + 0xe6, 0x7c, 0xe8, 0xdf, 0xc6, 0x13, 0x40, 0x11, 0xa3, 0xa6, 0x6e, 0xdb, 0x53, 0x73, 0xda, 0x81, + 0xda, 0xe8, 0xc2, 0x75, 0x88, 0x32, 0x1e, 0x3e, 0x25, 0x1e, 0xe7, 0x98, 0x06, 0x35, 0x7e, 0x63, + 0x16, 0xae, 0x47, 0xac, 0x35, 0x32, 0x1c, 0xd9, 0x7a, 0x40, 0x38, 0xfb, 0x6b, 0xb0, 0x60, 0x39, + 0x26, 0x79, 0x51, 0x9f, 0xdf, 0xa9, 0xec, 0xae, 0xe2, 0xb0, 0x81, 0x3a, 0x20, 0x7c, 0x95, 0x93, + 0x0c, 0x1b, 0xb9, 0xb6, 0xf7, 0x56, 0x28, 0xca, 0xbb, 0x93, 0x04, 0x78, 0x34, 0x83, 0x0b, 0xa4, + 0xe8, 0x01, 0x2c, 0x8f, 0x3d, 0xbe, 0x20, 0x36, 0xbf, 0xda, 0x5e, 0x3d, 0xc7, 0x27, 0x16, 0xdd, + 0xd1, 0x0c, 0x4e, 0x90, 0xd1, 0xe7, 0x00, 0x46, 0x2c, 0x8b, 0xfa, 0x1c, 0x23, 0x7d, 0x23, 0x47, + 0x9a, 0x08, 0xeb, 0x68, 0x06, 0xa7, 0xd0, 0xf7, 0x05, 0x58, 0xbb, 0xe0, 0x38, 0x21, 0xa4, 0x61, + 0x82, 0x50, 0xd0, 0xf8, 0xc3, 0xa2, 0x80, 0x6b, 0x7b, 0xb7, 0xa3, 0x31, 0xac, 0xf3, 0x0b, 0xfb, + 0xb2, 0x17, 0x78, 0x63, 0x23, 0x18, 0x7b, 0xc4, 0xec, 0x10, 0xdf, 0xd7, 0xcf, 0xc9, 0xd5, 0x16, + 0xf1, 0xff, 0x60, 0x39, 0xb1, 0x84, 0x6f, 0xce, 0xfe, 0x5e, 0x62, 0x29, 0x2f, 0xa7, 0x64, 0x96, + 0xf4, 0xb3, 0x0a, 0x40, 0xca, 0x84, 0xbe, 0xf9, 0x14, 0x1e, 0x16, 0x4d, 0x6c, 0x0a, 0x0e, 0x69, + 0x13, 0xfc, 0xa7, 0x0a, 0xac, 0x4d, 0x65, 0x7a, 0xd2, 0x44, 0xd3, 0xdb, 0xe6, 0xe3, 0x4d, 0x65, + 0x72, 0xf7, 0x8a, 0x26, 0x27, 0x70, 0xfa, 0x09, 0xa6, 0xf6, 0x71, 0x89, 0xa9, 0x6d, 0x70, 0x92, + 0x89, 0x26, 0x56, 0x85, 0xc5, 0xa7, 0xa1, 0x69, 0x05, 0x50, 0x6d, 0xbb, 0x86, 0x1e, 0x58, 0xae, + 0x83, 0x76, 0x61, 0xdd, 0x24, 0xe7, 0x1e, 0x21, 0x7e, 0x5b, 0x0f, 0xac, 0x60, 0x6c, 0x12, 0xb6, + 0x84, 0x0a, 0xce, 0x83, 0xd1, 0x1d, 0x10, 0x22, 0x90, 0xeb, 0x9c, 0x87, 0xa8, 0xb3, 0x0c, 0xb5, + 0x00, 0x47, 0x08, 0xe6, 0x1d, 0x7d, 0x48, 0xd8, 0xd4, 0x96, 0x31, 0xfb, 0xdf, 0x78, 0x07, 0x16, + 0xba, 0xae, 0xe5, 0x04, 0x68, 0x05, 0x2a, 0x2f, 0x58, 0x4f, 0x05, 0x57, 0x5e, 0xd0, 0xd6, 0x25, + 0x13, 0x6b, 0x05, 0x57, 0x2e, 0x1b, 0xbf, 0x55, 0x81, 0x2d, 0xd9, 0x09, 0x88, 0xa7, 0x1b, 0x81, + 0xf5, 0x9c, 0x88, 0x8e, 0xe3, 0x06, 0xe1, 0x44, 0x3f, 0x81, 0xf5, 0x91, 0x6b, 0x5f, 0x9e, 0xbb, + 0xce, 0x31, 0xf1, 0x02, 0xcb, 0x20, 0x7e, 0xbd, 0xb2, 0x33, 0xb7, 0x5b, 0xdb, 0x5b, 0xe1, 0x0b, + 0x67, 0xcc, 0x71, 0x1e, 0x09, 0x7d, 0x00, 0x55, 0x9b, 0x2f, 0x96, 0x0b, 0x77, 0x9d, 0x13, 0x44, + 0x32, 0x38, 0x9a, 0xc1, 0x31, 0x0a, 0x95, 0x12, 0x1d, 0xda, 0x75, 0x1a, 0xff, 0x59, 0x81, 0x9a, + 0x68, 0x32, 0x45, 0xc9, 0xce, 0x99, 0x8b, 0xde, 0x83, 0x35, 0xdd, 0x7c, 0x4e, 0xd9, 0xfa, 0xc4, + 0x53, 0xe8, 0xea, 0x42, 0x07, 0x97, 0x83, 0xa2, 0x23, 0x58, 0x1e, 0x12, 0xd3, 0xd2, 0xb5, 0xcb, + 0x51, 0x28, 0xa0, 0xb5, 0xbd, 0x3b, 0x7c, 0xc4, 0x14, 0xbb, 0xbb, 0x62, 0x6b, 0x80, 0xa5, 0x6e, + 0xfb, 0x74, 0x20, 0x2b, 0x07, 0xea, 0xa0, 0x23, 0xb5, 0x64, 0x51, 0x3b, 0xed, 0x4a, 0x38, 0x21, + 0x46, 0xef, 0xc2, 0xea, 0xff, 0x19, 0x91, 0x73, 0xed, 0x62, 0x3c, 0x7c, 0xea, 0xe8, 0x96, 0x5d, + 0x17, 0x76, 0x2a, 0xbb, 0x2b, 0x38, 0x0b, 0x44, 0x75, 0x58, 0x32, 0xf4, 0x11, 0x5b, 0xdf, 0x06, + 0x9b, 0x50, 0xd4, 0x6c, 0x7c, 0x06, 0xdb, 0x13, 0x46, 0x41, 0x55, 0x98, 0x57, 0x54, 0x45, 0x12, + 0x66, 0xd0, 0x32, 0x2c, 0xc8, 0x1d, 0xf1, 0x50, 0x12, 0x2a, 0xf4, 0xef, 0xb1, 0xdc, 0x92, 0x54, + 0x61, 0xb6, 0xf1, 0x67, 0xf3, 0x50, 0x6b, 0xba, 0x4e, 0x40, 0x5e, 0x04, 0x6c, 0xf1, 0x37, 0xa0, + 0xea, 0x07, 0xba, 0xf3, 0x13, 0x5d, 0x36, 0xf9, 0xb2, 0xe3, 0x36, 0x73, 0xea, 0x3a, 0x95, 0xb6, + 0x35, 0xd2, 0x9d, 0x20, 0x76, 0xea, 0x09, 0x08, 0xdd, 0x87, 0xd5, 0xaf, 0xc6, 0x6e, 0x10, 0xef, + 0x37, 0x6e, 0xb2, 0x6b, 0x5c, 0x2c, 0xd1, 0x2e, 0xcc, 0x22, 0xa1, 0x5b, 0xb0, 0xec, 0x91, 0xa1, + 0x1b, 0x90, 0x47, 0x96, 0xc9, 0x2c, 0x64, 0x19, 0x27, 0x00, 0xd4, 0x80, 0x95, 0x21, 0x71, 0xe8, + 0x3a, 0x89, 0x49, 0x11, 0xd6, 0x77, 0xe6, 0x76, 0x97, 0x71, 0x06, 0x46, 0x4d, 0xd6, 0x70, 0x9d, + 0xe7, 0xc4, 0xf3, 0x2d, 0xd7, 0xe9, 0xb9, 0x63, 0xcf, 0x20, 0x75, 0xc4, 0x18, 0x15, 0xe0, 0x54, + 0xbd, 0x09, 0xac, 0xa5, 0x07, 0x7a, 0x7d, 0x93, 0x49, 0x3b, 0x07, 0x45, 0x9f, 0xc0, 0xf5, 0x14, + 0x84, 0xd8, 0xfa, 0x65, 0x8f, 0x18, 0xae, 0x63, 0xfa, 0xf5, 0x6b, 0xcc, 0x37, 0x4c, 0xe8, 0xa5, + 0x1b, 0xed, 0xcc, 0xf5, 0xbe, 0xd6, 0x3d, 0xd3, 0x72, 0xce, 0x7b, 0x86, 0xeb, 0x91, 0xfa, 0x16, + 0x23, 0xc8, 0x83, 0xa9, 0x3c, 0x2d, 0xff, 0x20, 0x04, 0x12, 0xb3, 0x7e, 0x7d, 0xa7, 0xb2, 0x5b, + 0xc5, 0x69, 0x10, 0xba, 0x0b, 0xd5, 0x50, 0x54, 0xa2, 0x59, 0xdf, 0x66, 0xa2, 0x44, 0x45, 0x0b, + 0xc3, 0x31, 0x0e, 0xfa, 0x0c, 0xd6, 0x46, 0xb6, 0x6e, 0x90, 0x0b, 0xd7, 0x36, 0x89, 0xf7, 0x98, + 0x5c, 0xd6, 0xeb, 0x19, 0x9f, 0xc1, 0x25, 0xfe, 0x98, 0x5c, 0xe2, 0x1c, 0x22, 0xba, 0x0d, 0x40, + 0x5e, 0x8c, 0x2c, 0x2f, 0xdc, 0x40, 0x6f, 0xb0, 0x19, 0xa7, 0x20, 0x8d, 0xdf, 0xae, 0xc0, 0xad, + 0x1e, 0x71, 0x42, 0xec, 0x96, 0xe5, 0x07, 0x9e, 0xf5, 0x74, 0x4c, 0x7b, 0x22, 0x2d, 0xd6, 0x61, + 0xe9, 0xdc, 0x73, 0xc7, 0xa3, 0xd8, 0x70, 0xa2, 0x26, 0xea, 0xc2, 0x3b, 0xfa, 0x0b, 0xd7, 0x76, + 0x03, 0xfb, 0x2a, 0x06, 0xcc, 0x9e, 0x56, 0xf0, 0x34, 0xa8, 0x8d, 0xbf, 0x5a, 0x84, 0x15, 0x79, + 0xa8, 0x9f, 0x93, 0x68, 0x70, 0x1e, 0xb9, 0x54, 0xe2, 0xc8, 0x85, 0x1a, 0xf2, 0xd0, 0x1a, 0x92, + 0x20, 0xda, 0x9c, 0xcb, 0x38, 0x6e, 0xa7, 0x77, 0xd2, 0x5c, 0x66, 0x27, 0x51, 0x29, 0x9c, 0x59, + 0x36, 0xe9, 0x5d, 0xe8, 0x7b, 0xdf, 0xfd, 0x84, 0xd9, 0xe2, 0x0a, 0x4e, 0x41, 0xa2, 0xfe, 0x36, + 0x71, 0xce, 0x83, 0x8b, 0xfa, 0xc2, 0x4e, 0x65, 0x77, 0x1e, 0xa7, 0x20, 0xe8, 0x3a, 0x2c, 0x5e, + 0x10, 0xeb, 0xfc, 0x22, 0xa8, 0x2f, 0x32, 0x09, 0xf2, 0x16, 0x3d, 0x57, 0xbe, 0xb6, 0xcc, 0xe0, + 0xa2, 0xbe, 0x14, 0x9e, 0x2b, 0xac, 0xc1, 0xe6, 0x48, 0x9d, 0x00, 0x55, 0x54, 0x95, 0x8d, 0x15, + 0xb7, 0xa9, 0x4f, 0xa0, 0x7c, 0x25, 0xc7, 0xe0, 0x93, 0x59, 0x0e, 0x7d, 0x42, 0x06, 0x88, 0x34, + 0xb8, 0x6e, 0x95, 0x79, 0x51, 0xbf, 0x0e, 0xcc, 0x67, 0xde, 0xe2, 0x8a, 0x2f, 0x75, 0xb5, 0x78, + 0x02, 0x2d, 0x5d, 0xa5, 0x69, 0x79, 0xc4, 0x08, 0xba, 0x7a, 0x70, 0x51, 0xaf, 0x31, 0x11, 0xa5, + 0x20, 0xe8, 0x7d, 0xd8, 0x88, 0xe6, 0xa9, 0x59, 0x43, 0xe2, 0x07, 0xfa, 0x70, 0x54, 0x5f, 0xd9, + 0xa9, 0xec, 0xce, 0xe1, 0x62, 0xc7, 0x94, 0xde, 0xed, 0x3e, 0xd4, 0x8c, 0xc4, 0x0f, 0x31, 0x0f, + 0x97, 0x58, 0x7b, 0xca, 0x43, 0xe1, 0x34, 0x1a, 0xdd, 0xf8, 0x67, 0x96, 0xe7, 0x07, 0x3d, 0x43, + 0x77, 0x7a, 0x96, 0x49, 0x0c, 0xdd, 0x63, 0x1b, 0x7f, 0x05, 0x17, 0xe0, 0x6c, 0x63, 0x46, 0x30, + 0xae, 0xc0, 0x4d, 0xbe, 0x31, 0xb3, 0x60, 0xba, 0x3e, 0xf2, 0x62, 0x44, 0x3c, 0x8b, 0x3a, 0x99, + 0x43, 0x6e, 0xd4, 0xe1, 0xae, 0x2f, 0x76, 0x50, 0x07, 0xe5, 0x1b, 0xba, 0xe3, 0x47, 0xe3, 0x6f, + 0xb1, 0xf1, 0x33, 0x30, 0xba, 0xd5, 0xfd, 0x98, 0xbf, 0x5f, 0xbf, 0xbe, 0x33, 0xb7, 0xbb, 0x8a, + 0xd3, 0x20, 0xb4, 0x07, 0xd7, 0x86, 0x96, 0xf9, 0xc5, 0x58, 0xb7, 0xad, 0xe0, 0xf2, 0x20, 0xb1, + 0xc1, 0x6d, 0xc6, 0xad, 0xb4, 0x0f, 0x3d, 0x80, 0xed, 0x2c, 0x3c, 0xb1, 0x96, 0x3a, 0x23, 0x9b, + 0xd4, 0xdd, 0xf8, 0xbf, 0xb0, 0x46, 0x65, 0xaa, 0x1b, 0x41, 0xb4, 0x83, 0x92, 0x98, 0x3e, 0x75, + 0xe4, 0xa5, 0x41, 0xd4, 0x86, 0x9f, 0x1b, 0xba, 0x67, 0x32, 0xfd, 0x2d, 0xe3, 0xb0, 0xf1, 0x7a, + 0x7a, 0x6b, 0xfc, 0x74, 0x16, 0xd6, 0xa3, 0x63, 0x39, 0x9a, 0xc1, 0xaf, 0x2c, 0x42, 0xa1, 0xfb, + 0x5f, 0x37, 0x4d, 0x8f, 0xf8, 0x3e, 0x3f, 0x6e, 0xa2, 0x66, 0xe4, 0x47, 0x16, 0x12, 0x3f, 0xf2, + 0x4b, 0xb4, 0xde, 0xc6, 0xbf, 0x2d, 0xc0, 0xa6, 0xf4, 0x22, 0xa0, 0x9e, 0xce, 0xa4, 0x31, 0x6d, + 0x24, 0x09, 0x04, 0xf3, 0x41, 0x72, 0xb1, 0x62, 0xff, 0xa9, 0x7e, 0x86, 0x7a, 0x60, 0x5c, 0x84, + 0x98, 0xd1, 0xe1, 0x9b, 0x02, 0x51, 0x3b, 0x34, 0x74, 0xc7, 0x75, 0x2c, 0x43, 0xb7, 0xfb, 0x9e, + 0xcd, 0x97, 0x96, 0x81, 0x31, 0x2d, 0x13, 0xdf, 0xf0, 0xac, 0xd0, 0xfb, 0x2d, 0x70, 0x2d, 0x27, + 0x20, 0xaa, 0xe5, 0xc0, 0x0a, 0x6c, 0xc2, 0x1c, 0xd8, 0x32, 0x0e, 0x1b, 0xd4, 0x53, 0xd1, 0x59, + 0x88, 0xde, 0xf9, 0x53, 0xe6, 0xc2, 0x96, 0x70, 0xdc, 0xa6, 0x07, 0xea, 0x53, 0xdd, 0x78, 0x46, + 0xbd, 0xbd, 0x63, 0x32, 0x8c, 0x2a, 0xc3, 0xc8, 0x41, 0x51, 0x07, 0xe6, 0xcf, 0x5c, 0x27, 0x60, + 0x8e, 0x6c, 0x6d, 0xef, 0x33, 0x2e, 0x9c, 0x92, 0xf5, 0xdf, 0x95, 0x9e, 0x68, 0x92, 0xd2, 0x92, + 0x5a, 0x03, 0x4d, 0x7a, 0xa2, 0x0d, 0x3a, 0x52, 0xaf, 0x27, 0x1e, 0x4a, 0x83, 0x03, 0x55, 0xd1, + 0x58, 0xe4, 0xc4, 0xd8, 0xa0, 0xff, 0x0d, 0xb5, 0x91, 0x47, 0x9e, 0x5b, 0xe4, 0x6b, 0x16, 0x80, + 0x01, 0xe3, 0xfa, 0xfd, 0x57, 0xe6, 0xda, 0xc5, 0xd2, 0xb1, 0x2c, 0x9d, 0x30, 0xc6, 0x69, 0x86, + 0xbf, 0x54, 0xb7, 0x45, 0x4d, 0xdd, 0x55, 0xdc, 0xa0, 0x6b, 0xeb, 0x97, 0xb2, 0x63, 0x5b, 0x4e, + 0x18, 0xae, 0x54, 0x71, 0x1e, 0xdc, 0xf8, 0x9d, 0x0a, 0xdc, 0xbe, 0x5a, 0x1c, 0x68, 0x0d, 0xa0, + 0x27, 0x2a, 0xbd, 0x41, 0x4f, 0xc2, 0xf2, 0x41, 0x18, 0xe8, 0x85, 0x7f, 0x2b, 0x68, 0x13, 0xd6, + 0x15, 0x15, 0xcb, 0x4d, 0x51, 0x19, 0x60, 0xe9, 0xb0, 0xdf, 0x16, 0xb1, 0x30, 0x8b, 0x36, 0x60, + 0x75, 0x1f, 0x9f, 0x2a, 0x2d, 0x51, 0x19, 0x9c, 0x60, 0x59, 0x93, 0x84, 0x39, 0xb4, 0x05, 0x1b, + 0xfb, 0xd2, 0xbe, 0xd8, 0x53, 0xa4, 0xbe, 0x14, 0x63, 0xce, 0x23, 0x01, 0x56, 0xd4, 0xde, 0x89, + 0xd8, 0x6e, 0x0d, 0x8e, 0x24, 0xf1, 0xf8, 0x54, 0x58, 0x68, 0x3c, 0x80, 0xb7, 0x5f, 0x2a, 0xc6, + 0x6c, 0xcc, 0x19, 0x06, 0x9a, 0x95, 0xc6, 0x5f, 0xcc, 0xc1, 0x7a, 0xcb, 0x35, 0xc6, 0xd4, 0x73, + 0xbe, 0xde, 0xa9, 0x1d, 0x5b, 0xe6, 0x5c, 0xda, 0x32, 0xbf, 0xe9, 0x89, 0x7d, 0x0b, 0x96, 0x47, + 0xfa, 0x39, 0x69, 0xba, 0x63, 0x27, 0x3a, 0xb4, 0x13, 0x40, 0xe6, 0x84, 0x5e, 0xca, 0x9d, 0xd0, + 0x37, 0xa0, 0x4a, 0xf9, 0x30, 0x77, 0x59, 0x0d, 0xe7, 0x1a, 0xb5, 0xa7, 0x3c, 0xbd, 0xb3, 0xe7, + 0x2c, 0x4c, 0x77, 0xce, 0xd6, 0x7e, 0x0d, 0xe7, 0x6c, 0xe3, 0x0f, 0xe7, 0x60, 0x45, 0x1c, 0x9b, + 0x96, 0xfb, 0x7a, 0xaa, 0xcb, 0x2a, 0x69, 0xee, 0x25, 0x4a, 0x9a, 0x2f, 0x28, 0xa9, 0x0e, 0x4b, + 0x3e, 0x0f, 0xbe, 0x17, 0x98, 0x8a, 0xa2, 0x26, 0x9d, 0xc7, 0x28, 0x08, 0x15, 0x57, 0xc5, 0xf4, + 0xef, 0x95, 0x2a, 0x2b, 0xa8, 0xa5, 0xfa, 0x72, 0xb5, 0x2c, 0x4f, 0xa7, 0x16, 0x98, 0xa4, 0x96, + 0xd7, 0x0e, 0x6c, 0xfc, 0xc0, 0x23, 0xfa, 0x90, 0xde, 0x16, 0xb2, 0x81, 0x4d, 0x1e, 0xde, 0xf8, + 0xff, 0x8b, 0xb0, 0x72, 0x6c, 0x99, 0xe4, 0xbf, 0x9d, 0x72, 0xd2, 0xaa, 0x58, 0xcc, 0xa9, 0x22, + 0x15, 0x83, 0x2f, 0x65, 0x63, 0xf0, 0x1d, 0xa8, 0x9d, 0x5b, 0x67, 0xd4, 0x07, 0xd2, 0x03, 0x84, + 0xa9, 0xa8, 0x8a, 0xd3, 0xa0, 0x54, 0x94, 0xbd, 0x5c, 0x1e, 0x65, 0x43, 0x3a, 0xca, 0x2e, 0x28, + 0xbd, 0xf6, 0x6a, 0x91, 0xf4, 0xca, 0x2f, 0x2c, 0x92, 0x5e, 0x9d, 0xce, 0x94, 0xd6, 0x7e, 0x4d, + 0x91, 0xf4, 0xb4, 0x06, 0x87, 0xfa, 0xb0, 0x76, 0x6e, 0x9d, 0x89, 0x41, 0x7c, 0x2f, 0x63, 0x81, + 0xf4, 0xda, 0xde, 0x07, 0x7c, 0x90, 0xb4, 0x31, 0xde, 0x65, 0x07, 0x40, 0x7c, 0x4e, 0x88, 0x9a, + 0x86, 0xe5, 0xfd, 0xbe, 0x26, 0xab, 0x0a, 0xce, 0x31, 0x69, 0x7c, 0x0e, 0x6f, 0x4c, 0x44, 0xce, + 0x1e, 0x2a, 0x87, 0x72, 0xf7, 0xe8, 0x34, 0x4c, 0x64, 0x68, 0x92, 0xa2, 0x62, 0x61, 0xb6, 0xb1, + 0x03, 0xf3, 0x4d, 0xdd, 0xe6, 0x59, 0x12, 0xdb, 0xa6, 0x26, 0x57, 0x61, 0xd3, 0x8f, 0x9a, 0x8d, + 0x07, 0x30, 0xdf, 0xbc, 0xd0, 0x83, 0x29, 0x22, 0xdd, 0x7c, 0xf2, 0xf4, 0x9f, 0x2b, 0xb0, 0xde, + 0xa5, 0x2b, 0x33, 0x5c, 0x3b, 0xda, 0x63, 0xef, 0xc0, 0xdc, 0x33, 0x3e, 0x46, 0xe9, 0xfd, 0x9a, + 0xf6, 0xa2, 0x87, 0x30, 0x1f, 0x24, 0xd9, 0xa1, 0xf7, 0xa3, 0x04, 0x56, 0x96, 0xd5, 0xdd, 0x2e, + 0x56, 0x35, 0xb5, 0xa9, 0xb6, 0xe3, 0x75, 0x87, 0x51, 0x0e, 0xdb, 0x9c, 0xf7, 0x60, 0x93, 0x8c, + 0x2e, 0xc8, 0x90, 0x78, 0xba, 0x2d, 0x25, 0xf7, 0xf3, 0x30, 0x3d, 0x59, 0xd6, 0xd5, 0xf8, 0x1e, + 0x6c, 0x95, 0x32, 0x44, 0x00, 0x8b, 0x58, 0x3a, 0x56, 0x1f, 0x53, 0x19, 0x6e, 0xc1, 0x86, 0xd4, + 0x3d, 0x92, 0x3a, 0x12, 0x16, 0xdb, 0x83, 0x9e, 0xa4, 0x69, 0xb2, 0x72, 0x28, 0xcc, 0x35, 0xfe, + 0xb8, 0x02, 0xd7, 0xf8, 0xbd, 0xc0, 0x17, 0x3d, 0x4f, 0xbf, 0x9c, 0xfe, 0x76, 0xf0, 0x11, 0x54, + 0x0d, 0x4e, 0x59, 0x9f, 0x65, 0x3b, 0x66, 0x2b, 0x65, 0x72, 0xc9, 0x45, 0x03, 0xc7, 0x68, 0xaf, + 0x79, 0x14, 0x7d, 0x01, 0xb5, 0xa3, 0x5e, 0xa7, 0x39, 0xf6, 0x3c, 0xe2, 0x18, 0x97, 0x2c, 0xea, + 0xe5, 0xff, 0x9b, 0xae, 0x19, 0x4d, 0x2d, 0x03, 0xa3, 0xbb, 0x50, 0x1f, 0xd2, 0xf3, 0xfc, 0xa3, + 0x7b, 0xf7, 0xee, 0x31, 0x65, 0xcc, 0xe1, 0x14, 0xa4, 0xf1, 0x07, 0xf3, 0x70, 0xed, 0xa8, 0xd7, + 0x69, 0xe9, 0x01, 0xa1, 0x9b, 0xad, 0xe9, 0x0e, 0x47, 0xae, 0x43, 0x9c, 0x00, 0x0d, 0x60, 0xd9, + 0xd4, 0x2f, 0xd5, 0xb3, 0x13, 0x42, 0x9e, 0x31, 0xce, 0x6b, 0x7b, 0x62, 0x94, 0x61, 0x2e, 0xc1, + 0xa7, 0xc0, 0x41, 0x4b, 0xd4, 0xa4, 0x81, 0x26, 0x77, 0xa4, 0x41, 0x53, 0xed, 0x74, 0x55, 0x45, + 0x52, 0xb4, 0x41, 0x4b, 0x3c, 0x55, 0x0f, 0x4e, 0x24, 0xe9, 0x71, 0x98, 0xf9, 0x8b, 0x79, 0xd2, + 0x48, 0xff, 0x92, 0xe8, 0x61, 0xf6, 0x7a, 0x15, 0xb3, 0xff, 0xd4, 0x8b, 0x0d, 0x5d, 0x27, 0xb8, + 0x60, 0xae, 0x78, 0x15, 0x87, 0x0d, 0xe6, 0x49, 0x28, 0x59, 0x87, 0x75, 0x85, 0xfa, 0x4f, 0x41, + 0x28, 0xa7, 0x0b, 0x77, 0xec, 0x71, 0x17, 0xcc, 0xfe, 0x53, 0x3f, 0x39, 0xb4, 0x9c, 0x71, 0x40, + 0xa2, 0x6c, 0x44, 0xd8, 0x42, 0x3f, 0x86, 0xaa, 0xa1, 0xdb, 0xc4, 0x31, 0x75, 0x8f, 0x39, 0xdf, + 0xb5, 0xbd, 0x87, 0xaf, 0xb3, 0xaa, 0xa6, 0xd8, 0x96, 0x94, 0x96, 0x88, 0xd9, 0xa2, 0x62, 0x8e, + 0x8d, 0x9f, 0x56, 0xe0, 0x5b, 0x53, 0x09, 0x82, 0x5a, 0x64, 0x47, 0x55, 0x5a, 0x22, 0xdd, 0xca, + 0x35, 0x58, 0xd2, 0xfa, 0x52, 0x8f, 0x36, 0x66, 0xd1, 0x2a, 0x2c, 0x9f, 0x48, 0x2d, 0x25, 0x6c, + 0xce, 0xa1, 0x15, 0xa8, 0x6a, 0x47, 0x7d, 0xcc, 0x5a, 0xf3, 0x94, 0xea, 0x00, 0xcb, 0xf4, 0xff, + 0x02, 0xed, 0xe9, 0x89, 0x5a, 0x1f, 0xd3, 0xd6, 0x22, 0xed, 0xe9, 0xf5, 0x19, 0xbf, 0xa5, 0xc6, + 0x01, 0xbc, 0x3b, 0xcd, 0xbc, 0xe9, 0x50, 0x87, 0x58, 0x3a, 0x54, 0xb1, 0x2c, 0x2a, 0x42, 0x05, + 0xad, 0x43, 0xad, 0xa7, 0xb6, 0x45, 0x3c, 0x38, 0x92, 0x1f, 0x61, 0x59, 0x98, 0x6d, 0xdc, 0xcf, + 0x98, 0x46, 0xdf, 0xb1, 0x5e, 0x48, 0x23, 0xd7, 0x60, 0x71, 0x63, 0x10, 0x7b, 0xec, 0x0a, 0x33, + 0xa9, 0x04, 0xd0, 0xf8, 0xfd, 0x0a, 0xb3, 0xd2, 0x88, 0x0c, 0x7d, 0x0e, 0xcb, 0x46, 0x24, 0x4f, + 0xee, 0x33, 0x6e, 0x5e, 0x21, 0xf2, 0xa3, 0x19, 0x9c, 0xe0, 0x53, 0xe2, 0x71, 0x34, 0x2e, 0x4f, + 0x6d, 0x97, 0x10, 0xc7, 0x53, 0x63, 0x4f, 0x08, 0x51, 0x63, 0x7f, 0x1d, 0x56, 0x4d, 0x3d, 0x20, + 0x74, 0x6a, 0xaa, 0x43, 0xdc, 0xb3, 0xc6, 0x9f, 0x56, 0x60, 0xfb, 0xa8, 0xd7, 0xa1, 0xb7, 0x6f, + 0xdb, 0xfa, 0x89, 0xfe, 0xd4, 0x26, 0x5d, 0xdd, 0xd3, 0x87, 0x24, 0x20, 0x1e, 0x75, 0x9e, 0x26, + 0x39, 0xd3, 0xc7, 0x76, 0x74, 0xf7, 0x8c, 0x9a, 0xe8, 0x1e, 0x54, 0xa3, 0x2d, 0xc5, 0xa7, 0x80, + 0x92, 0x29, 0x44, 0x9b, 0xf1, 0x68, 0x06, 0xc7, 0x58, 0x94, 0xc2, 0xe4, 0x53, 0xe3, 0x69, 0x60, + 0x54, 0x9c, 0x34, 0xa5, 0x88, 0xb0, 0xf6, 0x57, 0x00, 0x46, 0x74, 0x2a, 0xe1, 0x3c, 0x7f, 0x77, + 0x0e, 0xb6, 0x27, 0x3c, 0xe3, 0x50, 0xe1, 0xd3, 0x8b, 0xbc, 0x3f, 0xd2, 0x8d, 0x68, 0xc7, 0x27, + 0x00, 0xea, 0xac, 0x88, 0x4d, 0xe8, 0x45, 0x83, 0x39, 0x2b, 0x7e, 0x55, 0x4e, 0x81, 0xe8, 0xc6, + 0x60, 0x23, 0xf9, 0xf5, 0x39, 0x96, 0x4d, 0xe6, 0x2d, 0x16, 0xea, 0xe8, 0xb6, 0x4d, 0x83, 0x8c, + 0xf6, 0x39, 0xbf, 0x40, 0xa7, 0x20, 0x99, 0x7e, 0x83, 0xdf, 0x9e, 0x53, 0x10, 0xd4, 0x86, 0x0d, + 0x3b, 0x27, 0x57, 0xbf, 0xbe, 0xc8, 0xbc, 0xe1, 0xed, 0x64, 0xf1, 0x65, 0xa2, 0xc7, 0x45, 0xc2, + 0x30, 0x21, 0x12, 0x10, 0x6f, 0x68, 0x39, 0x96, 0x1f, 0x58, 0x46, 0xfb, 0x9c, 0x87, 0x4a, 0x79, + 0x70, 0x11, 0xd3, 0xe0, 0x37, 0x92, 0x3c, 0x18, 0x3d, 0x80, 0x5a, 0xf4, 0xfe, 0x78, 0xe4, 0x0f, + 0x59, 0xfc, 0x54, 0xdb, 0xbb, 0xce, 0xe7, 0x16, 0x3d, 0x86, 0xc5, 0xaf, 0x65, 0x29, 0xd4, 0xc6, + 0x6f, 0x56, 0x00, 0xf5, 0x88, 0x63, 0x76, 0xf5, 0xcb, 0xf4, 0x1d, 0xee, 0x1e, 0xd4, 0x1c, 0x37, + 0x26, 0xe1, 0xb6, 0x91, 0x4f, 0xf8, 0xa7, 0x51, 0xd0, 0x8f, 0x60, 0xc3, 0x23, 0x5f, 0x8d, 0x89, + 0x1f, 0x24, 0xc7, 0x65, 0xee, 0x6d, 0x2b, 0x75, 0x8e, 0x16, 0x71, 0x1b, 0xff, 0x52, 0x81, 0x2d, + 0x1c, 0x42, 0xaf, 0x9e, 0xcc, 0xfc, 0xcb, 0x27, 0x73, 0x0f, 0x36, 0xd3, 0x47, 0x85, 0xec, 0xbb, + 0xf7, 0xf7, 0x3e, 0xfa, 0x94, 0xdb, 0x54, 0x59, 0x57, 0xc9, 0x61, 0x32, 0x9f, 0x3e, 0x4c, 0xa8, + 0xf5, 0xf1, 0x29, 0x1f, 0x78, 0xee, 0x90, 0x5f, 0x56, 0xd3, 0x20, 0xaa, 0x2d, 0x96, 0x58, 0x4f, + 0x85, 0x7c, 0x0b, 0xcc, 0x81, 0xe4, 0xc1, 0x8d, 0x26, 0xdc, 0x6a, 0x11, 0xc3, 0xb6, 0x1c, 0xc2, + 0x17, 0x8a, 0x33, 0xc2, 0x98, 0x2a, 0x08, 0x69, 0xec, 0xc3, 0xcd, 0xa6, 0xee, 0x18, 0xc4, 0xfe, + 0x06, 0x3c, 0xfe, 0x66, 0x0e, 0x36, 0xdb, 0xd6, 0x73, 0xf2, 0xab, 0xc9, 0xd9, 0xdd, 0x01, 0x41, + 0x37, 0x8c, 0xb1, 0xa7, 0x1b, 0x97, 0xb2, 0xd3, 0xa1, 0x16, 0xec, 0xf3, 0xc3, 0xb0, 0x00, 0xa7, + 0xea, 0xf0, 0x47, 0x84, 0x98, 0xb2, 0xd3, 0x19, 0x85, 0xe9, 0xbc, 0x59, 0x9c, 0x82, 0xa0, 0x36, + 0xbc, 0xcd, 0xf9, 0x37, 0x6d, 0xd7, 0x78, 0xf6, 0xb5, 0xe5, 0x13, 0xaa, 0x84, 0x8e, 0x7e, 0xee, + 0x90, 0xc0, 0x32, 0x14, 0xd7, 0xe3, 0x69, 0x81, 0x55, 0xfc, 0x72, 0xc4, 0xf4, 0xad, 0x65, 0x31, + 0x7b, 0x6b, 0x79, 0x0f, 0xd6, 0x7c, 0x2a, 0x58, 0xc7, 0x88, 0x5e, 0xa4, 0x97, 0x98, 0x4e, 0x73, + 0x50, 0x3a, 0x5f, 0xe6, 0x8b, 0xcf, 0xce, 0x7c, 0x12, 0xb0, 0x5d, 0xba, 0x8a, 0x53, 0x90, 0x5f, + 0xea, 0x2d, 0xfe, 0xe7, 0x73, 0xb0, 0xd6, 0x0b, 0x2c, 0xe3, 0x19, 0xf1, 0x26, 0x5f, 0x15, 0xb3, + 0xd7, 0xc1, 0xd9, 0xc2, 0x75, 0xb0, 0x70, 0x9d, 0x9a, 0x2b, 0xbb, 0x4e, 0xa5, 0xaf, 0x7e, 0xf3, + 0xc5, 0xc4, 0x49, 0x7c, 0x19, 0x5d, 0xc8, 0x5d, 0x46, 0x5f, 0xed, 0x01, 0x25, 0x7b, 0xbd, 0xaa, + 0x16, 0xae, 0x57, 0xd9, 0xab, 0xeb, 0x72, 0xe1, 0xea, 0xfa, 0x6a, 0x37, 0xf9, 0xe8, 0xb1, 0xe1, + 0x80, 0xfa, 0x6c, 0xce, 0xb3, 0x16, 0x9a, 0x65, 0x1e, 0x4e, 0x39, 0x27, 0xb0, 0xe8, 0x3e, 0xb5, + 0xc2, 0x04, 0x51, 0xec, 0x78, 0x4d, 0x75, 0xfe, 0xde, 0x3c, 0xac, 0x1f, 0xb8, 0x63, 0x0f, 0xbb, + 0x5f, 0x47, 0x9e, 0x1b, 0x3d, 0x80, 0x25, 0x86, 0xc2, 0x93, 0x59, 0x2f, 0xaf, 0x88, 0x88, 0xd0, + 0xd1, 0x27, 0xb0, 0x78, 0xe6, 0xba, 0x01, 0x37, 0xdc, 0x97, 0x13, 0x72, 0x6c, 0xf4, 0x21, 0x2c, + 0x85, 0xe5, 0x06, 0x7e, 0xbd, 0x9a, 0x89, 0xfb, 0xb3, 0xa5, 0x15, 0x38, 0xc2, 0x42, 0xfb, 0xb0, + 0x6e, 0x66, 0x13, 0x81, 0xdc, 0xf9, 0x44, 0xc7, 0x50, 0x2e, 0x4d, 0x78, 0x34, 0x83, 0xf3, 0x04, + 0xe8, 0x4b, 0xd8, 0xbe, 0x28, 0x9f, 0xd7, 0x74, 0x85, 0x20, 0x47, 0x33, 0x78, 0x12, 0x03, 0xf4, + 0x19, 0xac, 0x58, 0xa9, 0xb7, 0x45, 0x7e, 0x34, 0x6d, 0x46, 0xf7, 0xff, 0x54, 0xd7, 0xd1, 0x0c, + 0xce, 0xa0, 0x52, 0xd2, 0xe7, 0xa9, 0xbb, 0x2f, 0x3f, 0x80, 0x36, 0x4b, 0xae, 0xc5, 0x94, 0x34, + 0x8d, 0x4a, 0xa5, 0x62, 0x67, 0x9d, 0x2b, 0xdb, 0x1b, 0x89, 0x54, 0x72, 0xae, 0x97, 0x4a, 0x25, + 0x47, 0xb0, 0xbf, 0xc4, 0x33, 0xa4, 0x8d, 0x3f, 0x9a, 0x87, 0xed, 0xa8, 0x14, 0x29, 0x6f, 0x21, + 0xf7, 0x60, 0x33, 0x3a, 0xd6, 0x9b, 0xa1, 0xea, 0xd9, 0x83, 0x42, 0xe8, 0xce, 0xca, 0xba, 0xd0, + 0x5d, 0x40, 0x17, 0x31, 0x33, 0xaa, 0x73, 0x46, 0x10, 0x86, 0x22, 0x25, 0x3d, 0xe8, 0x10, 0xd6, + 0xb3, 0x35, 0x4e, 0x91, 0x65, 0xbc, 0x99, 0xab, 0x92, 0xca, 0x59, 0x48, 0x9e, 0x8a, 0xf9, 0x4a, + 0x8e, 0x22, 0x9b, 0x51, 0x22, 0x2e, 0x81, 0xfc, 0x42, 0x2c, 0xe9, 0x2e, 0x6c, 0x44, 0xc3, 0x6a, + 0x54, 0x76, 0xc9, 0xeb, 0xca, 0xd1, 0x0c, 0x2e, 0x76, 0xfd, 0x4f, 0xb0, 0x8e, 0xbf, 0x9c, 0x85, + 0xf5, 0x5c, 0xa8, 0x97, 0xf7, 0x40, 0x73, 0xd3, 0x25, 0x8d, 0x1e, 0x81, 0x70, 0x91, 0xd3, 0x25, + 0x5f, 0xd5, 0xed, 0x9c, 0xaa, 0x73, 0x56, 0x88, 0x0b, 0x74, 0x74, 0x89, 0x67, 0x59, 0xa4, 0x9c, + 0x32, 0x73, 0x2c, 0xe8, 0x12, 0x73, 0x04, 0xcc, 0x2d, 0x94, 0x0f, 0x98, 0x77, 0x0b, 0xe5, 0x58, + 0xcc, 0x2d, 0x94, 0x77, 0xed, 0x57, 0xa9, 0x7f, 0xf4, 0x86, 0x7a, 0xd0, 0xf8, 0xbb, 0x0a, 0xdc, + 0xc8, 0x99, 0x2e, 0x19, 0xd9, 0x71, 0xae, 0x84, 0x46, 0x24, 0xc4, 0x26, 0x46, 0x40, 0xcc, 0xb8, + 0x16, 0x22, 0x05, 0xa1, 0x1b, 0x30, 0x6a, 0xb5, 0x52, 0x25, 0x70, 0xe1, 0x35, 0xa5, 0xac, 0xeb, + 0x35, 0x95, 0xf3, 0x2e, 0xac, 0xc6, 0xa3, 0xa6, 0x6a, 0xda, 0xb2, 0xc0, 0xc6, 0xbf, 0xcf, 0xb2, + 0xdc, 0x96, 0x39, 0x36, 0x82, 0x9e, 0xa3, 0x8f, 0xfc, 0x0b, 0x37, 0x40, 0x9f, 0xc2, 0xca, 0x28, + 0x04, 0x31, 0x7b, 0xe6, 0x7a, 0x28, 0xb3, 0x71, 0x9c, 0x41, 0x64, 0x8f, 0x29, 0xbc, 0x1d, 0xe5, + 0xcf, 0x12, 0xc0, 0x84, 0x07, 0x9c, 0xdc, 0x93, 0xe4, 0x7c, 0xf1, 0x49, 0x32, 0x9f, 0xe2, 0x59, + 0x28, 0x49, 0xf1, 0xec, 0xc2, 0xfa, 0xc8, 0xb3, 0x0c, 0x22, 0x26, 0xa1, 0xf9, 0x62, 0x18, 0x53, + 0xe7, 0xc0, 0x54, 0x3d, 0x1e, 0x09, 0x74, 0xcb, 0x26, 0x9e, 0x6c, 0x72, 0x2f, 0x96, 0x82, 0x44, + 0x11, 0x51, 0x35, 0x89, 0x88, 0xde, 0x87, 0x8d, 0xf4, 0x2a, 0xc3, 0xa7, 0xa2, 0x30, 0xf3, 0x5c, + 0xec, 0xa0, 0xb3, 0x65, 0x07, 0x3c, 0x03, 0xc9, 0x26, 0x2f, 0x9f, 0xc8, 0xc0, 0x1a, 0x7f, 0x52, + 0x81, 0x35, 0x2e, 0xf4, 0xe4, 0x22, 0xb2, 0xc4, 0x79, 0xe5, 0xcc, 0x3e, 0xa7, 0x1c, 0x1c, 0xa1, + 0xd1, 0x70, 0xe4, 0xe9, 0xd8, 0xb7, 0x1c, 0xe2, 0xfb, 0xea, 0xd7, 0x0e, 0xf1, 0x1e, 0xc5, 0x39, + 0xcb, 0x02, 0xfc, 0x35, 0x03, 0x8c, 0x9f, 0xcd, 0x02, 0x0a, 0xab, 0x1c, 0x9c, 0xe7, 0x56, 0xe2, + 0x2b, 0x6e, 0x40, 0x95, 0x95, 0xf6, 0xd0, 0x01, 0x79, 0x8d, 0x58, 0xd4, 0xa6, 0xd2, 0xb5, 0x18, + 0x32, 0xd3, 0x54, 0x38, 0x9d, 0x14, 0x84, 0x4e, 0x3a, 0x6c, 0xa5, 0x92, 0x99, 0x73, 0x4c, 0x51, + 0x05, 0x38, 0xb5, 0x26, 0xc6, 0x97, 0xdd, 0xe2, 0x79, 0x5d, 0x58, 0x0c, 0x28, 0x06, 0xca, 0x0b, + 0x2f, 0x29, 0x9a, 0xcb, 0x05, 0xec, 0x39, 0x91, 0x2c, 0x4d, 0x27, 0x12, 0x02, 0x1b, 0x2d, 0xf2, + 0xdc, 0x32, 0x48, 0x2f, 0x75, 0x86, 0xbc, 0x07, 0x6b, 0x26, 0xf1, 0x03, 0xcb, 0x61, 0xf3, 0x4e, + 0xc4, 0x92, 0x83, 0xa2, 0x5d, 0x58, 0x1a, 0x5e, 0x79, 0x4f, 0x8e, 0xba, 0x1b, 0xcd, 0x78, 0x98, + 0x4b, 0xc7, 0x48, 0x8e, 0x2a, 0xe4, 0x13, 0xcf, 0xd2, 0x6d, 0xeb, 0x27, 0xc4, 0x7c, 0x32, 0xb4, + 0xf7, 0x2f, 0x03, 0x56, 0x1c, 0x49, 0x97, 0x5d, 0xd2, 0xd3, 0xf8, 0xeb, 0x75, 0x58, 0x8a, 0x68, + 0xe9, 0x1e, 0x0a, 0xeb, 0xd5, 0x42, 0x99, 0x47, 0x69, 0xd2, 0x14, 0x0c, 0x9d, 0xc3, 0x2d, 0xff, + 0x65, 0x05, 0x5a, 0xb5, 0xbd, 0x77, 0xf8, 0x9c, 0xaf, 0x2a, 0xd0, 0xc2, 0x57, 0x32, 0xa2, 0xfe, + 0x65, 0xca, 0x33, 0x34, 0x77, 0x82, 0xfe, 0x80, 0xd5, 0xee, 0xa5, 0xb2, 0xc9, 0xfc, 0xb4, 0x99, + 0x90, 0x6a, 0xce, 0x21, 0xa3, 0x87, 0xaf, 0x78, 0x8a, 0x16, 0xce, 0x50, 0xd4, 0x86, 0x4d, 0x52, + 0x2c, 0x2d, 0xe0, 0xa1, 0xf6, 0x8d, 0xc9, 0xc5, 0x07, 0xb8, 0x8c, 0x8c, 0xce, 0x27, 0x1f, 0xbf, + 0x2c, 0x5d, 0x15, 0xbf, 0x14, 0xa3, 0x97, 0x4f, 0x61, 0x45, 0x4f, 0x3d, 0xcb, 0x32, 0xaf, 0x95, + 0x48, 0x32, 0xfd, 0x62, 0x8b, 0x33, 0x88, 0x94, 0x30, 0x13, 0x8b, 0x2c, 0x4f, 0x8c, 0x45, 0x72, + 0x91, 0xc8, 0x5b, 0x30, 0x6f, 0xe8, 0xb6, 0xcd, 0x6e, 0x49, 0xb5, 0xbd, 0x5a, 0xaa, 0x18, 0x19, + 0xb3, 0x0e, 0x86, 0x70, 0xa1, 0x07, 0xcc, 0xef, 0xa5, 0x10, 0x2e, 0xf4, 0x00, 0xb3, 0x0e, 0xba, + 0xea, 0x51, 0xf6, 0x05, 0x84, 0x5d, 0x8c, 0x32, 0x1e, 0x2f, 0xdd, 0x8b, 0xf3, 0xe8, 0x48, 0x85, + 0x6b, 0x46, 0xc9, 0x2b, 0x05, 0x7b, 0x5f, 0x4b, 0x72, 0xa3, 0x65, 0x0f, 0x19, 0xb8, 0x94, 0x10, + 0x3d, 0x99, 0x7c, 0x9d, 0x58, 0x9b, 0xea, 0x32, 0x34, 0xf1, 0x32, 0xf1, 0xd3, 0x0a, 0xdc, 0x39, + 0xd3, 0xfd, 0x00, 0xb3, 0x42, 0x9d, 0xe0, 0x31, 0xb9, 0xbc, 0xb2, 0x06, 0x72, 0x7d, 0xfa, 0x2d, + 0xf6, 0x0a, 0x6c, 0x91, 0x4c, 0x3d, 0x47, 0x3e, 0x75, 0xc7, 0x32, 0x0b, 0xc9, 0xa7, 0x0b, 0xc5, + 0xdc, 0x1e, 0x2e, 0x21, 0xa2, 0x3b, 0xc0, 0x2e, 0x26, 0x82, 0xd8, 0x53, 0x61, 0xb2, 0x03, 0x4a, + 0x52, 0x45, 0xb8, 0x8c, 0x0c, 0x61, 0xd8, 0xf2, 0xca, 0x32, 0x79, 0xac, 0x18, 0x36, 0x79, 0x74, + 0x2d, 0xcd, 0xf6, 0xe1, 0x72, 0x52, 0xea, 0xc6, 0xcc, 0x2b, 0x92, 0x66, 0xbc, 0x90, 0x36, 0x92, + 0xf1, 0x55, 0xf9, 0x35, 0x7c, 0x25, 0x23, 0x64, 0xc2, 0x4d, 0x63, 0x72, 0x62, 0x8d, 0x97, 0xde, + 0x36, 0xe2, 0x1d, 0x32, 0x11, 0x13, 0x5f, 0xc5, 0x86, 0x6e, 0x97, 0x20, 0x1b, 0xac, 0xb3, 0xea, + 0xdc, 0xc9, 0x59, 0xdb, 0x3c, 0x3a, 0xf5, 0x9a, 0x7e, 0x26, 0xeb, 0x53, 0xbf, 0x91, 0xf1, 0x9a, + 0xd9, 0x94, 0x10, 0xce, 0x21, 0x53, 0xe3, 0x39, 0x2f, 0x04, 0x01, 0xf5, 0x5b, 0x19, 0xe3, 0x29, + 0x46, 0x09, 0xb8, 0x84, 0x08, 0xe9, 0x70, 0x23, 0x98, 0x18, 0x38, 0xd7, 0xdf, 0x64, 0x2c, 0xdf, + 0x2e, 0x4f, 0x1f, 0xa4, 0x10, 0xf1, 0x15, 0x4c, 0xe8, 0x62, 0x47, 0x99, 0xc8, 0xaa, 0x7e, 0x3b, + 0xb3, 0xd8, 0x6c, 0xd8, 0x85, 0x73, 0xc8, 0xe8, 0x00, 0x36, 0xcc, 0xfc, 0xf9, 0x5e, 0x7f, 0x2b, + 0xf3, 0x79, 0x50, 0xe1, 0xfc, 0xc7, 0x45, 0x92, 0x14, 0x9f, 0xe4, 0x00, 0xaf, 0xef, 0x94, 0xf1, + 0x49, 0xfa, 0x71, 0x91, 0xa4, 0x11, 0x00, 0x24, 0xb9, 0xd8, 0x6c, 0xa5, 0x7c, 0x25, 0x5f, 0x29, + 0x7f, 0x1d, 0x16, 0xcf, 0x3c, 0x77, 0xd8, 0x09, 0x4f, 0xea, 0x2a, 0xe6, 0x2d, 0xfe, 0x9c, 0x3d, + 0x17, 0x3d, 0x67, 0xe7, 0xeb, 0xf8, 0xe7, 0x0b, 0x75, 0xfc, 0x8d, 0xff, 0xd8, 0x84, 0xda, 0x09, + 0x79, 0x7a, 0x40, 0x74, 0xea, 0xcc, 0x7c, 0xf4, 0x08, 0x56, 0x6d, 0xfd, 0x29, 0xb1, 0x7d, 0x7e, + 0x2b, 0xe1, 0x6f, 0xa1, 0xef, 0xf2, 0x95, 0xa4, 0x50, 0xef, 0x9e, 0x48, 0xfb, 0x83, 0x03, 0x49, + 0xd4, 0xfa, 0x58, 0xea, 0x0d, 0x0e, 0xda, 0xe2, 0x21, 0xce, 0x92, 0xa2, 0x1f, 0xc3, 0xf5, 0xe7, + 0xae, 0x35, 0x92, 0x1d, 0xd3, 0x7a, 0x6e, 0x99, 0x63, 0xdd, 0x56, 0xc7, 0xc1, 0xb9, 0x6b, 0x39, + 0xe7, 0xfc, 0x95, 0x7c, 0x3a, 0xa6, 0x13, 0x78, 0xa0, 0x87, 0x3c, 0x36, 0xf5, 0x8f, 0x3f, 0x66, + 0x2b, 0x9e, 0x96, 0x5f, 0x4c, 0x85, 0xda, 0xb0, 0x16, 0xfd, 0x6f, 0x7a, 0x24, 0xba, 0xd1, 0x4e, + 0xcb, 0x27, 0x47, 0x4b, 0xb9, 0x19, 0x17, 0xba, 0x73, 0xce, 0xd3, 0xbf, 0xc7, 0x7b, 0x2c, 0xe2, + 0x98, 0x9a, 0x5b, 0x96, 0x96, 0xca, 0xee, 0xab, 0x31, 0xf1, 0x2e, 0x7b, 0x81, 0x1e, 0x8c, 0xfd, + 0xe3, 0x8f, 0x93, 0xe0, 0x77, 0xf1, 0x55, 0x64, 0x57, 0xce, 0x83, 0x69, 0x39, 0xe5, 0xa3, 0x7d, + 0xfe, 0x36, 0x3c, 0xad, 0x96, 0xd3, 0xa4, 0xa8, 0x05, 0xc0, 0x46, 0x39, 0x76, 0xa2, 0xf2, 0xb8, + 0x69, 0x19, 0xa5, 0xe8, 0x8a, 0xb6, 0x22, 0x3b, 0x86, 0x3b, 0xa4, 0xb6, 0xb2, 0xfc, 0xfa, 0xb6, + 0x12, 0xf1, 0x40, 0x18, 0x36, 0xe2, 0x6f, 0xb4, 0x2c, 0xe2, 0x7f, 0x41, 0xc7, 0xe5, 0x75, 0xa4, + 0xd3, 0x31, 0x2e, 0x92, 0x53, 0xfb, 0x1b, 0x85, 0x6e, 0xdc, 0x67, 0x11, 0xd0, 0xd4, 0xf6, 0x17, + 0x51, 0xa1, 0x2e, 0x08, 0xdc, 0x01, 0x77, 0x75, 0xe3, 0x59, 0x38, 0xa9, 0x95, 0x57, 0xe0, 0x54, + 0xa0, 0x46, 0x1a, 0xa0, 0x8c, 0x72, 0x0e, 0x2c, 0x47, 0xb7, 0x59, 0xb0, 0x34, 0x2d, 0xcf, 0x12, + 0x7a, 0xaa, 0xe1, 0x70, 0x63, 0x4b, 0xa6, 0x15, 0xb0, 0x30, 0x69, 0x6a, 0x0d, 0x27, 0x74, 0xe8, + 0x00, 0x6a, 0x2c, 0xd1, 0xde, 0x1f, 0xd9, 0xae, 0x6e, 0xb2, 0xf8, 0x67, 0x5a, 0x36, 0x69, 0x42, + 0x74, 0x06, 0x37, 0x53, 0x4d, 0x6c, 0x19, 0x17, 0x5f, 0xa4, 0x74, 0xc3, 0xc2, 0x93, 0x69, 0xf9, + 0x5e, 0xc5, 0x08, 0xfd, 0x10, 0x96, 0x9e, 0x53, 0xd3, 0x3c, 0xde, 0xe3, 0x35, 0x4f, 0xd3, 0xf1, + 0x8c, 0x88, 0xa8, 0x76, 0x59, 0x38, 0x1d, 0xd5, 0xb2, 0xf5, 0x3d, 0x9b, 0x7d, 0x59, 0x30, 0xb5, + 0x76, 0xf3, 0xd4, 0x74, 0xd7, 0xfa, 0x6c, 0x2b, 0x63, 0xdd, 0x79, 0x46, 0xb7, 0xc6, 0xd6, 0xab, + 0xec, 0xda, 0x0c, 0x29, 0x3a, 0x86, 0xcd, 0xec, 0x5e, 0x61, 0x17, 0x01, 0x16, 0x8c, 0x4d, 0xcb, + 0xb1, 0x8c, 0x01, 0xb5, 0xc0, 0xe0, 0xc2, 0xf2, 0xcc, 0xae, 0xee, 0x05, 0x97, 0x3c, 0xdc, 0xf0, + 0x59, 0x20, 0x36, 0xb5, 0x05, 0x16, 0xe9, 0x91, 0x09, 0x37, 0xce, 0x58, 0x08, 0xe8, 0x04, 0xf6, + 0x65, 0xfc, 0xd1, 0x54, 0x8f, 0x04, 0x01, 0x15, 0x43, 0xfd, 0x15, 0xb8, 0x5f, 0xc1, 0x87, 0xfa, + 0x20, 0xee, 0xd3, 0xef, 0x3f, 0x72, 0x2d, 0xa7, 0x4b, 0xbc, 0xa1, 0xe5, 0xfb, 0xd1, 0x47, 0x52, + 0x53, 0xfb, 0xa0, 0x72, 0x1e, 0xf4, 0x7c, 0xf0, 0x88, 0x41, 0x9c, 0x20, 0x96, 0xca, 0x8d, 0x57, + 0x39, 0x1f, 0xb2, 0xb4, 0xd4, 0x3a, 0x0d, 0x3d, 0xd0, 0x6d, 0xf7, 0xbc, 0x7e, 0xf3, 0x55, 0xac, + 0x93, 0x13, 0x21, 0x05, 0xd6, 0xfd, 0x40, 0xf7, 0x3c, 0x62, 0xc6, 0xd3, 0xb9, 0xf5, 0x0a, 0x7c, + 0xf2, 0xc4, 0xd4, 0x36, 0xa9, 0x39, 0xb0, 0xe8, 0x90, 0x5e, 0x11, 0x59, 0x88, 0x37, 0xb5, 0x6d, + 0x66, 0x48, 0xe9, 0xdc, 0xf2, 0x71, 0xf0, 0xed, 0x57, 0x99, 0x5b, 0x3e, 0x2a, 0xbe, 0x80, 0x5b, + 0x39, 0x50, 0x52, 0xda, 0x69, 0x05, 0x97, 0x2c, 0xe8, 0x9b, 0x96, 0xf9, 0x95, 0x9c, 0xe8, 0x39, + 0x13, 0x17, 0xea, 0x71, 0x04, 0x9f, 0xc5, 0x82, 0x53, 0x9f, 0x33, 0x05, 0xf2, 0xc6, 0x13, 0xd8, + 0x28, 0xe0, 0xa1, 0x75, 0xa8, 0x29, 0xaa, 0x36, 0xe8, 0x69, 0x22, 0xd6, 0xa4, 0x96, 0x30, 0x83, + 0x36, 0x60, 0xf5, 0x40, 0xc5, 0x4d, 0x69, 0xd0, 0xef, 0x1e, 0x62, 0xb1, 0x25, 0x85, 0x05, 0x4e, + 0x2d, 0xe9, 0x58, 0x6a, 0xab, 0xdd, 0x8e, 0xa4, 0x68, 0xc2, 0x2c, 0x5a, 0x03, 0xe8, 0x62, 0xb5, + 0xd5, 0x6f, 0x6a, 0xb2, 0xaa, 0x08, 0x73, 0x8d, 0xbf, 0xaf, 0xc0, 0xb6, 0xa6, 0x3f, 0xb5, 0x49, + 0xa0, 0xb8, 0x81, 0x75, 0x66, 0x71, 0xa7, 0xcf, 0x52, 0xca, 0x99, 0xa2, 0xa7, 0xb0, 0xf4, 0x21, + 0x01, 0xd0, 0xb8, 0x72, 0xec, 0x78, 0x44, 0x37, 0xe9, 0x65, 0x3f, 0x7a, 0xb1, 0x4f, 0x83, 0xd0, + 0x5d, 0x40, 0x0e, 0x65, 0x1a, 0x45, 0xeb, 0x61, 0x2a, 0x35, 0xcc, 0x4b, 0x97, 0xf4, 0xa0, 0x16, + 0xac, 0x66, 0xa0, 0xf5, 0x85, 0x4c, 0x2d, 0x4d, 0x7a, 0x82, 0xb1, 0xe4, 0xcf, 0x5c, 0x9c, 0x25, + 0x6a, 0xfc, 0x79, 0x05, 0xb6, 0x27, 0xa0, 0x4e, 0x57, 0xc6, 0x39, 0x75, 0xde, 0x0e, 0xdd, 0x01, + 0x81, 0xff, 0x4d, 0xde, 0x93, 0xe7, 0x98, 0x9c, 0x0a, 0xf0, 0x29, 0xc2, 0xf0, 0xbf, 0xad, 0xc0, + 0xb5, 0x13, 0xf2, 0xf4, 0xd7, 0xaf, 0x87, 0x1f, 0xc0, 0x5a, 0x06, 0xea, 0x73, 0x45, 0x6c, 0x25, + 0xe6, 0x9b, 0x96, 0x7f, 0x0e, 0xb9, 0xf1, 0xf3, 0x79, 0xa8, 0xf1, 0xcb, 0x2d, 0x9b, 0xfe, 0x54, + 0x25, 0x34, 0x06, 0xb1, 0x9e, 0x87, 0x49, 0xed, 0xb8, 0x84, 0x26, 0x06, 0xa1, 0x1f, 0xc2, 0x62, + 0x78, 0x72, 0xf1, 0xe0, 0xfc, 0xbd, 0xe8, 0x76, 0x97, 0x8c, 0x72, 0xb7, 0x2b, 0x9e, 0x52, 0x13, + 0x0f, 0xbf, 0x88, 0xee, 0x69, 0xa2, 0xd6, 0xef, 0x61, 0x4e, 0x85, 0xf6, 0xe0, 0x5a, 0xe0, 0xe9, + 0x8e, 0x1f, 0x7e, 0x02, 0x9e, 0xad, 0xc3, 0x99, 0xc7, 0xa5, 0x7d, 0xe5, 0x75, 0x4b, 0x8b, 0xd3, + 0xd7, 0x2d, 0x95, 0xd5, 0xfd, 0x2c, 0xb1, 0xf1, 0xf2, 0x60, 0x56, 0x63, 0x31, 0xa6, 0xde, 0x60, + 0xe4, 0xb9, 0xee, 0x19, 0x31, 0x79, 0x11, 0x7c, 0x16, 0x88, 0x6e, 0xa4, 0x6a, 0xf2, 0xc2, 0xc7, + 0xd1, 0xb8, 0xdd, 0xf8, 0xc7, 0x0a, 0x6c, 0x96, 0x08, 0x00, 0x21, 0x58, 0xeb, 0x2b, 0x8f, 0x15, + 0xf5, 0x44, 0xe1, 0x10, 0x61, 0x86, 0x7b, 0x80, 0xa6, 0xd4, 0xeb, 0xc9, 0xca, 0xa1, 0x50, 0x41, + 0x55, 0x98, 0xef, 0x85, 0xbe, 0x01, 0xc1, 0x9a, 0x22, 0x49, 0xad, 0x81, 0xa6, 0x0e, 0xc4, 0x66, + 0x53, 0xea, 0x6a, 0x61, 0x31, 0x66, 0x53, 0xed, 0x74, 0xdb, 0x92, 0x26, 0x09, 0xf3, 0xe8, 0x3a, + 0xa0, 0xa6, 0xda, 0x6f, 0xb7, 0x06, 0xd4, 0xf1, 0xc4, 0x70, 0x56, 0x98, 0x89, 0xa5, 0x83, 0xbe, + 0xd2, 0x92, 0x5a, 0xc2, 0x22, 0xaa, 0xc1, 0x92, 0xf4, 0xa4, 0x2b, 0x63, 0xa9, 0x25, 0x2c, 0x85, + 0x5d, 0x8f, 0xa4, 0x26, 0x75, 0x51, 0x55, 0xb4, 0x0a, 0xcb, 0x4d, 0x51, 0x69, 0x4a, 0xed, 0xb6, + 0xd4, 0x12, 0x96, 0xd1, 0x16, 0x6c, 0x9c, 0x88, 0xb2, 0x26, 0x2b, 0x87, 0x83, 0x03, 0x15, 0x0f, + 0xba, 0xe2, 0xa9, 0x84, 0x05, 0xa0, 0x0c, 0x38, 0x58, 0xa8, 0x35, 0xfe, 0xe1, 0x06, 0xac, 0x65, + 0x2d, 0x2e, 0xd9, 0xc6, 0xb3, 0xbf, 0xf2, 0x6d, 0x2c, 0xe5, 0x4c, 0xf1, 0x83, 0xd2, 0x3d, 0xc1, + 0xbc, 0x7a, 0x54, 0x8e, 0x5d, 0x66, 0x91, 0x39, 0x6f, 0xb0, 0x50, 0xfc, 0xb8, 0xfe, 0x3a, 0x2c, + 0x5a, 0xe7, 0x8e, 0xeb, 0x85, 0x89, 0xbb, 0x2a, 0xe6, 0x2d, 0xf6, 0xfd, 0x45, 0x78, 0xee, 0xb2, + 0x77, 0x9d, 0x2a, 0x8e, 0x9a, 0xd4, 0x4d, 0x3c, 0xf5, 0x5c, 0xdd, 0x34, 0x74, 0x3f, 0xe0, 0x1f, + 0x98, 0x25, 0x00, 0x6a, 0x3e, 0xa3, 0xb1, 0x7f, 0xc1, 0x5e, 0x57, 0x36, 0x43, 0xf3, 0x89, 0xda, + 0xe8, 0x3e, 0x6c, 0xb1, 0x28, 0xb8, 0x69, 0x8d, 0x2e, 0x88, 0x17, 0x90, 0x17, 0x01, 0x2f, 0xf6, + 0xb9, 0xc6, 0x5e, 0x1b, 0xca, 0x3b, 0xe9, 0x78, 0xc3, 0xb1, 0x1d, 0x58, 0x6c, 0xbc, 0xad, 0x70, + 0xbc, 0x18, 0x40, 0xe7, 0x39, 0xf6, 0x6c, 0xf6, 0xd6, 0x19, 0x7e, 0xea, 0x1e, 0x35, 0x29, 0xdd, + 0xd8, 0xb3, 0x79, 0xd9, 0xd4, 0x76, 0x48, 0x17, 0x03, 0xd0, 0x29, 0xac, 0x73, 0xa1, 0xf7, 0x82, + 0xf1, 0x53, 0xf6, 0xb1, 0x5f, 0x18, 0xdb, 0x7d, 0x38, 0xb5, 0xa4, 0xfb, 0xfb, 0xac, 0x46, 0x39, + 0xcf, 0x87, 0x3a, 0x22, 0xc3, 0x26, 0xba, 0xd7, 0xa1, 0xcb, 0x61, 0xf1, 0x5c, 0x15, 0xa7, 0x20, + 0xa1, 0x18, 0x62, 0x92, 0xb8, 0x58, 0x93, 0x06, 0x69, 0x73, 0xbb, 0xcb, 0xb8, 0xbc, 0x93, 0x0a, + 0xd6, 0x1c, 0xf3, 0xb7, 0xad, 0x9b, 0xcc, 0xa7, 0xc6, 0x6d, 0xaa, 0xc4, 0xf0, 0xf6, 0x53, 0xbf, + 0x15, 0x56, 0x9e, 0x86, 0x2d, 0x74, 0x9f, 0xaa, 0x3f, 0xf6, 0x5d, 0x3c, 0x15, 0x86, 0x8a, 0x5e, + 0x0d, 0xa7, 0xd1, 0xd0, 0x11, 0x6c, 0x9c, 0xd1, 0xcb, 0x58, 0x3a, 0xdf, 0xca, 0xf3, 0x5d, 0x57, + 0xa5, 0x62, 0x8b, 0x44, 0xe8, 0x21, 0xbd, 0x0b, 0xbb, 0x01, 0x31, 0x53, 0x63, 0xf1, 0xbc, 0x57, + 0xd9, 0x2c, 0x8a, 0xc8, 0xe8, 0x01, 0x6c, 0xc7, 0x61, 0x4a, 0x2f, 0xd0, 0xbd, 0x20, 0xd9, 0x3a, + 0x3b, 0x6c, 0xeb, 0x4c, 0xea, 0x66, 0x9f, 0x5b, 0x47, 0x5d, 0xad, 0x48, 0x70, 0x6f, 0xf3, 0xcf, + 0xad, 0xf3, 0x1d, 0x0d, 0x0b, 0xb6, 0x27, 0xec, 0x25, 0xb4, 0x0c, 0x0b, 0x12, 0xc6, 0x2a, 0x16, + 0x66, 0xa8, 0xc3, 0xe8, 0x4a, 0x4a, 0x2b, 0x74, 0x68, 0x6b, 0x00, 0x3d, 0x09, 0x1f, 0x4b, 0x78, + 0x20, 0x36, 0x1f, 0x0b, 0xb3, 0x48, 0x80, 0x95, 0x96, 0xd4, 0x96, 0x8f, 0x25, 0x7c, 0xca, 0x20, + 0x73, 0xd4, 0xe5, 0x61, 0x49, 0x6c, 0x85, 0xd5, 0xe5, 0xdd, 0xb6, 0x78, 0x2a, 0xb5, 0x84, 0x85, + 0xc6, 0xbf, 0x6e, 0xc0, 0x1b, 0x13, 0xad, 0x89, 0x0e, 0xc1, 0x5d, 0xa9, 0x30, 0x93, 0xfa, 0xb8, + 0x82, 0x0d, 0xd7, 0x94, 0xbb, 0x47, 0x12, 0xd6, 0xa4, 0x27, 0xd4, 0x8b, 0xae, 0x43, 0xed, 0xa0, + 0x4f, 0xc3, 0xb4, 0x2e, 0x56, 0xd5, 0x03, 0x61, 0x0e, 0xdd, 0x84, 0x6d, 0x45, 0x55, 0x06, 0xc7, + 0x12, 0x96, 0x0f, 0x64, 0xea, 0x5e, 0xb1, 0xa8, 0xf4, 0x64, 0x16, 0x7f, 0xcd, 0xa3, 0x37, 0x60, + 0xab, 0xaf, 0x94, 0x75, 0x2d, 0xa0, 0x6d, 0xd8, 0x2c, 0xeb, 0x58, 0x44, 0x75, 0xb8, 0x16, 0x77, + 0xb4, 0xd5, 0x93, 0x41, 0x34, 0xaf, 0x25, 0x1a, 0x01, 0xc6, 0x3d, 0x47, 0xf2, 0xe1, 0x91, 0x50, + 0x45, 0xb7, 0xa0, 0x1e, 0x83, 0x64, 0x45, 0xd6, 0x64, 0xb1, 0x1d, 0x13, 0x2c, 0x67, 0x58, 0x45, + 0xbd, 0x6d, 0xf5, 0x44, 0x00, 0x3a, 0xb1, 0x42, 0x0f, 0x63, 0x59, 0x43, 0xef, 0xc0, 0x5b, 0x25, + 0x13, 0x1b, 0x88, 0xca, 0x29, 0x3d, 0x3a, 0xd8, 0x77, 0x3b, 0x2b, 0x2f, 0x41, 0x62, 0x9c, 0x56, + 0x27, 0x21, 0xd1, 0x5e, 0x8a, 0x45, 0x67, 0xb2, 0x86, 0xbe, 0x0d, 0xef, 0x5c, 0x85, 0x14, 0x2d, + 0x66, 0x1d, 0xbd, 0x07, 0x8d, 0x32, 0xc4, 0xe8, 0x04, 0xe4, 0x0c, 0x85, 0x49, 0x78, 0x54, 0x94, + 0x29, 0x7e, 0x1b, 0x93, 0x66, 0x47, 0x17, 0x18, 0x31, 0x43, 0x93, 0x66, 0x17, 0x21, 0x45, 0xdc, + 0x36, 0xa9, 0x19, 0x1e, 0x62, 0xb5, 0xdf, 0x1d, 0x34, 0xb1, 0x24, 0x6a, 0x92, 0x70, 0x8d, 0x0a, + 0x9f, 0x43, 0x8e, 0x44, 0xe5, 0x50, 0x1a, 0xf4, 0xfa, 0xfb, 0xf4, 0xa0, 0x14, 0xb6, 0xe8, 0xb9, + 0x98, 0xe9, 0x91, 0x9b, 0xaa, 0x22, 0x5c, 0xa7, 0xba, 0xcc, 0x82, 0x95, 0x63, 0x59, 0x93, 0x06, + 0x6d, 0x59, 0x79, 0x2c, 0x6c, 0x17, 0x7a, 0x5b, 0x52, 0xaf, 0x89, 0xe5, 0x2e, 0x33, 0x9a, 0x3a, + 0xd5, 0x67, 0xa6, 0x17, 0x4b, 0x3d, 0x0d, 0xcb, 0x4d, 0x4d, 0x78, 0xa3, 0xd0, 0x25, 0x2a, 0x8a, + 0xda, 0x57, 0x9a, 0x92, 0x70, 0x23, 0xe9, 0xea, 0x8a, 0x58, 0x93, 0x9b, 0x72, 0x57, 0x54, 0xb4, + 0x81, 0xd8, 0x6a, 0x09, 0x37, 0x93, 0xe1, 0xd2, 0x5d, 0x58, 0xea, 0xa8, 0xc7, 0x92, 0x70, 0x0b, + 0xbd, 0x09, 0x6f, 0x14, 0x7b, 0xbb, 0x58, 0xed, 0xa8, 0x9a, 0x24, 0xbc, 0x59, 0x4e, 0xdc, 0x92, + 0x58, 0xef, 0xed, 0xf2, 0xde, 0x70, 0xb1, 0xc2, 0x5b, 0x74, 0x3f, 0x15, 0x7b, 0xdb, 0x92, 0x78, + 0x2c, 0x09, 0x3b, 0x54, 0x67, 0xc5, 0x4e, 0xbe, 0x2e, 0xa5, 0xdf, 0xd9, 0x97, 0xb0, 0xf0, 0x36, + 0xba, 0x06, 0xc2, 0x3e, 0x56, 0xc5, 0x56, 0x53, 0xec, 0x69, 0x91, 0x3a, 0x1a, 0xe1, 0x97, 0xd2, + 0x11, 0x94, 0xae, 0xf1, 0x9d, 0x2c, 0x22, 0x5f, 0xdb, 0xbb, 0x4c, 0x6f, 0x92, 0x22, 0x61, 0xb9, + 0x49, 0xe3, 0x20, 0xf9, 0x40, 0x6e, 0x8a, 0x4c, 0xc8, 0xdf, 0xa2, 0x3d, 0xd2, 0x9e, 0x34, 0x90, + 0x5b, 0x92, 0xa2, 0xc9, 0xda, 0x29, 0x1f, 0xb8, 0x25, 0xbc, 0x47, 0x99, 0xd3, 0x1e, 0x49, 0x69, + 0xe2, 0xd3, 0x2e, 0x8d, 0x85, 0xbe, 0x4d, 0x95, 0xdc, 0x14, 0xdb, 0xed, 0x41, 0x47, 0xee, 0xf5, + 0xa4, 0xd6, 0xe0, 0x58, 0x95, 0x9b, 0x92, 0xb0, 0x5b, 0x00, 0xb3, 0x2f, 0xaa, 0xbf, 0x43, 0x65, + 0x22, 0x2b, 0x2d, 0xf9, 0x58, 0x6e, 0xf5, 0xc5, 0x76, 0x6e, 0x45, 0x77, 0x12, 0xe3, 0x6a, 0x49, + 0x2c, 0x24, 0xfb, 0x5f, 0xd4, 0xc8, 0x43, 0x48, 0xa4, 0xcd, 0x41, 0x47, 0x6d, 0x49, 0xb1, 0x73, + 0xdb, 0x0f, 0x35, 0xfc, 0x3e, 0x95, 0x66, 0x7a, 0xb8, 0x90, 0x26, 0x9c, 0xcb, 0x07, 0x13, 0x3a, + 0xd9, 0x8c, 0xee, 0xd2, 0x60, 0x30, 0x8a, 0x39, 0x53, 0x0e, 0xf0, 0x43, 0xea, 0xb7, 0x22, 0x78, + 0xda, 0x11, 0xde, 0x43, 0xef, 0xc3, 0x6e, 0xd4, 0xc1, 0x76, 0x8a, 0xc8, 0x2e, 0xa1, 0xdc, 0x9d, + 0x0f, 0xfa, 0x5d, 0xf6, 0xf5, 0xce, 0x81, 0x28, 0xd3, 0xd8, 0xf0, 0x23, 0x74, 0x17, 0xee, 0xbc, + 0x1c, 0x3b, 0x8e, 0x3a, 0xf7, 0xd0, 0xc7, 0xf0, 0xe1, 0xb4, 0xf8, 0xd1, 0x20, 0x1f, 0xa3, 0xef, + 0xc2, 0x47, 0x57, 0x10, 0x61, 0xa9, 0x29, 0xd1, 0x73, 0x63, 0xc0, 0x0f, 0x97, 0x41, 0x4f, 0xd2, + 0xfa, 0x5d, 0xe1, 0x3e, 0xfa, 0x3e, 0x3c, 0x98, 0x86, 0xac, 0xd7, 0x6f, 0xd2, 0x38, 0x7b, 0x20, + 0x1e, 0x68, 0x12, 0x1e, 0x1c, 0xc9, 0xcd, 0x66, 0xbf, 0x2b, 0x7c, 0x17, 0x7d, 0x07, 0xbe, 0x15, + 0x51, 0x73, 0x42, 0xb1, 0xd9, 0x54, 0xfb, 0x8a, 0x16, 0xf2, 0xa7, 0x86, 0x26, 0x2b, 0x2d, 0x09, + 0x0b, 0x9f, 0xa0, 0x5d, 0x78, 0x37, 0x87, 0xda, 0x93, 0x94, 0xd6, 0x20, 0x82, 0xc5, 0x98, 0x9f, + 0xa2, 0x3b, 0xf0, 0xde, 0x55, 0x98, 0x6c, 0xf7, 0x84, 0x66, 0xfa, 0x80, 0x6e, 0x92, 0x1c, 0x2e, + 0x96, 0xbe, 0xe8, 0x4b, 0x3d, 0xba, 0x05, 0x9b, 0x6d, 0x59, 0x91, 0x5a, 0xc2, 0x67, 0xa8, 0x01, + 0xb7, 0x27, 0x20, 0x45, 0xc1, 0xfd, 0xf7, 0xd0, 0xbb, 0xb0, 0x33, 0x01, 0x27, 0x89, 0xf2, 0x3f, + 0xa7, 0xeb, 0xdd, 0x97, 0xbf, 0x2c, 0x3b, 0x00, 0x07, 0x9a, 0xda, 0xa5, 0x5e, 0x72, 0x5f, 0xd5, + 0x34, 0xb5, 0x23, 0x7c, 0xff, 0x2a, 0xd4, 0x10, 0x87, 0x62, 0x6b, 0x6a, 0x57, 0xf8, 0x01, 0xdb, + 0xae, 0xf2, 0x97, 0x03, 0x59, 0xd1, 0x70, 0x08, 0xfa, 0x21, 0xdb, 0xae, 0x31, 0x88, 0xf3, 0xfc, + 0x11, 0xda, 0x84, 0x75, 0x0a, 0x55, 0xc4, 0x8e, 0xc4, 0xf7, 0x8d, 0xf0, 0x90, 0x6e, 0x27, 0x0a, + 0xa4, 0x3b, 0x9a, 0xb2, 0x6c, 0xaa, 0x4a, 0xaf, 0xdf, 0xa1, 0x21, 0x43, 0xb7, 0x2b, 0x88, 0xe8, + 0x36, 0xdc, 0xa0, 0xbd, 0xda, 0x89, 0x3a, 0xd0, 0x64, 0x09, 0x0f, 0x3a, 0xf2, 0x21, 0x16, 0xa3, + 0x09, 0x0b, 0xfb, 0xe8, 0x6d, 0x78, 0x73, 0x42, 0x3f, 0x1f, 0xb5, 0x49, 0x6f, 0x3a, 0xea, 0xb1, + 0x84, 0x7b, 0xf2, 0x97, 0x52, 0x4b, 0x68, 0x51, 0x45, 0x66, 0x7c, 0xac, 0xa2, 0x0e, 0x0e, 0x98, + 0xac, 0x14, 0xad, 0x7d, 0x4a, 0x2f, 0x3f, 0x27, 0x22, 0xa6, 0x76, 0x2c, 0x25, 0xce, 0xef, 0xf8, + 0x3e, 0xf5, 0x42, 0x91, 0x93, 0x67, 0x77, 0xb4, 0x83, 0x64, 0x5b, 0xe7, 0x1c, 0x72, 0x2c, 0xf8, + 0x47, 0xaa, 0xac, 0x08, 0x87, 0x94, 0x0b, 0x1f, 0xa9, 0xf8, 0xe5, 0xe7, 0xd1, 0x7f, 0x05, 0x00, + 0x00, 0xff, 0xff, 0x82, 0xf8, 0x8e, 0x8c, 0x92, 0x52, 0x00, 0x00, } diff --git a/vendor/github.com/Rhymen/go-whatsapp/binary/proto/def.proto b/vendor/github.com/Rhymen/go-whatsapp/binary/proto/def.proto index d5f70cc1..6d4006d7 100644 --- a/vendor/github.com/Rhymen/go-whatsapp/binary/proto/def.proto +++ b/vendor/github.com/Rhymen/go-whatsapp/binary/proto/def.proto @@ -3,7 +3,7 @@ package proto; message HydratedQuickReplyButton { optional string displayText = 1; - optional string buttonId = 2; + optional string id = 2; } message HydratedURLButton { @@ -17,6 +17,7 @@ message HydratedCallButton { } message HydratedTemplateButton { + optional uint32 index = 4; oneof hydratedButton { HydratedQuickReplyButton quickReplyButton = 1; HydratedURLButton urlButton = 2; @@ -26,7 +27,7 @@ message HydratedTemplateButton { message QuickReplyButton { optional HighlyStructuredMessage displayText = 1; - optional string buttonId = 2; + optional string id = 2; } message URLButton { @@ -40,6 +41,7 @@ message CallButton { } message TemplateButton { + optional uint32 index = 4; oneof button { QuickReplyButton quickReplyButton = 1; URLButton urlButton = 2; @@ -89,6 +91,8 @@ message ContextInfo { optional uint32 forwardingScore = 21; optional bool isForwarded = 22; optional AdReplyInfo quotedAd = 23; + optional MessageKey placeholderKey = 24; + optional uint32 expiration = 25; } message SenderKeyDistributionMessage { @@ -114,6 +118,10 @@ message ImageMessage { optional bytes firstScanSidecar = 18; optional uint32 firstScanLength = 19; optional uint32 experimentGroupId = 20; + optional bytes scansSidecar = 21; + repeated uint32 scanLengths = 22; + optional bytes midQualityFileSha256 = 23; + optional bytes midQualityFileEncSha256 = 24; } message ContactMessage { @@ -156,6 +164,7 @@ message ExtendedTextMessage { optional EXTENDED_TEXT_MESSAGE_PREVIEWTYPE previewType = 10; optional bytes jpegThumbnail = 16; optional ContextInfo contextInfo = 17; + optional bool doNotPlayInline = 18; } message DocumentMessage { @@ -228,8 +237,10 @@ message ProtocolMessage { optional MessageKey key = 1; enum PROTOCOL_MESSAGE_TYPE { REVOKE = 0; + EPHEMERAL_SETTING = 3; } optional PROTOCOL_MESSAGE_TYPE type = 2; + optional uint32 ephemeralExpiration = 4; } message ContactsArrayMessage { @@ -294,6 +305,7 @@ message HighlyStructuredMessage { repeated HSMLocalizableParameter localizableParams = 6; optional string deterministicLg = 7; optional string deterministicLc = 8; + optional TemplateMessage hydratedHsm = 9; } message SendPaymentMessage { @@ -341,7 +353,8 @@ message StickerMessage { optional string directPath = 8; optional uint64 fileLength = 9; optional int64 mediaKeyTimestamp = 10; - optional bytes pngThumbnail = 16; + optional uint32 firstFrameLength = 11; + optional bytes firstFrameSidecar = 12; optional ContextInfo contextInfo = 17; } @@ -361,7 +374,8 @@ message FourRowTemplate { message HydratedFourRowTemplate { optional string hydratedContentText = 6; optional string hydratedFooterText = 7; - repeated HydratedTemplateButton hydratedButtons = 9; + repeated HydratedTemplateButton hydratedButtons = 8; + optional string templateId = 9; oneof title { DocumentMessage documentMessage = 1; string hydratedTitleText = 2; @@ -372,6 +386,8 @@ message HydratedFourRowTemplate { } message TemplateMessage { + optional ContextInfo contextInfo = 3; + optional HydratedFourRowTemplate hydratedTemplate = 4; oneof format { FourRowTemplate fourRowTemplate = 1; HydratedFourRowTemplate hydratedFourRowTemplate = 2; @@ -379,9 +395,10 @@ message TemplateMessage { } message TemplateButtonReplyMessage { - optional string selectedButtonId = 1; - repeated string selectedButtonDisplayText = 2; + optional string selectedId = 1; + optional string selectedDisplayText = 2; optional ContextInfo contextInfo = 3; + optional uint32 selectedIndex = 4; } message ProductSnapshot { @@ -394,6 +411,7 @@ message ProductSnapshot { optional string retailerId = 7; optional string url = 8; optional uint32 productImageCount = 9; + optional string firstImageId = 11; } message ProductMessage { @@ -409,6 +427,16 @@ message GroupInviteMessage { optional string groupName = 4; optional bytes jpegThumbnail = 5; optional string caption = 6; + optional ContextInfo contextInfo = 7; +} + +message DeviceSentMessage { + optional string destinationJid = 1; + optional Message message = 2; +} + +message DeviceSyncMessage { + optional bytes serializedXmlBytes = 1; } message Message { @@ -434,8 +462,11 @@ message Message { optional CancelPaymentRequestMessage cancelPaymentRequestMessage = 24; optional TemplateMessage templateMessage = 25; optional StickerMessage stickerMessage = 26; - optional ProductMessage productMessage = 27; optional GroupInviteMessage groupInviteMessage = 28; + optional TemplateButtonReplyMessage templateButtonReplyMessage = 29; + optional ProductMessage productMessage = 30; + optional DeviceSentMessage deviceSentMessage = 31; + optional DeviceSyncMessage deviceSyncMessage = 32; } message MessageKey { @@ -447,9 +478,10 @@ message MessageKey { message WebFeatures { enum WEB_FEATURES_FLAG { - NOT_IMPLEMENTED = 0; - IMPLEMENTED = 1; - OPTIONAL = 2; + NOT_STARTED = 0; + FORCE_UPGRADE = 1; + DEVELOPMENT = 2; + PRODUCTION = 3; } optional WEB_FEATURES_FLAG labelsDisplay = 1; optional WEB_FEATURES_FLAG voipIndividualOutgoing = 2; @@ -473,6 +505,14 @@ message WebFeatures { optional WEB_FEATURES_FLAG voipIndividualVideo = 22; optional WEB_FEATURES_FLAG thirdPartyStickers = 23; optional WEB_FEATURES_FLAG frequentlyForwardedSetting = 24; + optional WEB_FEATURES_FLAG groupsV4JoinPermission = 25; + optional WEB_FEATURES_FLAG recentStickers = 26; + optional WEB_FEATURES_FLAG catalog = 27; + optional WEB_FEATURES_FLAG starredStickers = 28; + optional WEB_FEATURES_FLAG voipGroupCall = 29; + optional WEB_FEATURES_FLAG templateMessage = 30; + optional WEB_FEATURES_FLAG templateMessageInteractivity = 31; + optional WEB_FEATURES_FLAG ephemeralMessages = 32; } message TabletNotificationsInfo { @@ -614,6 +654,9 @@ message WebMessageInfo { BIZ_TWO_TIER_MIGRATION_BOTTOM = 67; OVERSIZED = 68; GROUP_CHANGE_NO_FREQUENTLY_FORWARDED = 69; + GROUP_V4_ADD_INVITE_SENT = 70; + GROUP_PARTICIPANT_ADD_REQUEST_JOIN = 71; + CHANGE_EPHEMERAL_SETTING = 72; } optional WEB_MESSAGE_INFO_STUBTYPE messageStubType = 24; optional bool clearMedia = 25; @@ -623,4 +666,6 @@ message WebMessageInfo { optional PaymentInfo paymentInfo = 29; optional LiveLocationMessage finalLiveLocation = 30; optional PaymentInfo quotedPaymentInfo = 31; -} + optional uint64 ephemeralStartTimestamp = 32; + optional uint32 ephemeralDuration = 33; +}
\ No newline at end of file diff --git a/vendor/github.com/Rhymen/go-whatsapp/conn.go b/vendor/github.com/Rhymen/go-whatsapp/conn.go index 915ad4d9..26df39da 100644 --- a/vendor/github.com/Rhymen/go-whatsapp/conn.go +++ b/vendor/github.com/Rhymen/go-whatsapp/conn.go @@ -93,6 +93,8 @@ type Conn struct { loginSessionLock sync.RWMutex Proxy func(*http.Request) (*url.URL, error) + + writerLock sync.RWMutex } type websocketWrapper struct { diff --git a/vendor/github.com/Rhymen/go-whatsapp/contact.go b/vendor/github.com/Rhymen/go-whatsapp/contact.go index bcaf8734..92d0a4ad 100644 --- a/vendor/github.com/Rhymen/go-whatsapp/contact.go +++ b/vendor/github.com/Rhymen/go-whatsapp/contact.go @@ -10,11 +10,11 @@ import ( type Presence string const ( - PresenceAvailable = "available" - PresenceUnavailable = "unavailable" - PresenceComposing = "composing" - PresenceRecording = "recording" - PresencePaused = "paused" + PresenceAvailable Presence = "available" + PresenceUnavailable Presence = "unavailable" + PresenceComposing Presence = "composing" + PresenceRecording Presence = "recording" + PresencePaused Presence = "paused" ) //TODO: filename? WhatsApp uses Store.Contacts for these functions diff --git a/vendor/github.com/Rhymen/go-whatsapp/go.mod b/vendor/github.com/Rhymen/go-whatsapp/go.mod index ead71f94..53ba08f5 100644 --- a/vendor/github.com/Rhymen/go-whatsapp/go.mod +++ b/vendor/github.com/Rhymen/go-whatsapp/go.mod @@ -10,3 +10,5 @@ require ( github.com/pkg/errors v0.8.1 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 ) + +go 1.13 diff --git a/vendor/github.com/Rhymen/go-whatsapp/handler.go b/vendor/github.com/Rhymen/go-whatsapp/handler.go index a70d15bf..1188f794 100644 --- a/vendor/github.com/Rhymen/go-whatsapp/handler.go +++ b/vendor/github.com/Rhymen/go-whatsapp/handler.go @@ -82,7 +82,7 @@ type LocationMessageHandler interface { } /* -The StickerMessageHandler interface needs to be implemented to receive location messages dispatched by the dispatcher. +The StickerMessageHandler interface needs to be implemented to receive sticker messages dispatched by the dispatcher. */ type StickerMessageHandler interface { Handler @@ -90,6 +90,14 @@ type StickerMessageHandler interface { } /* +The ContactMessageHandler interface needs to be implemented to receive contact messages dispatched by the dispatcher. +*/ +type ContactMessageHandler interface { + Handler + HandleContactMessage(message ContactMessage) +} + +/* The JsonMessageHandler interface needs to be implemented to receive json messages dispatched by the dispatcher. These json messages contain status updates of every kind sent by WhatsAppWeb servers. WhatsAppWeb uses these messages to built a Store, which is used to save these "secondary" information. These messages may contain @@ -267,6 +275,17 @@ func (wac *Conn) handleWithCustomHandlers(message interface{}, handlers []Handle } } + case ContactMessage: + for _, h := range handlers { + if x, ok := h.(ContactMessageHandler); ok { + if wac.shouldCallSynchronously(h) { + x.HandleContactMessage(m) + } else { + go x.HandleContactMessage(m) + } + } + } + case *proto.WebMessageInfo: for _, h := range handlers { if x, ok := h.(RawMessageHandler); ok { diff --git a/vendor/github.com/Rhymen/go-whatsapp/message.go b/vendor/github.com/Rhymen/go-whatsapp/message.go index 5f69f83e..77e7e1c3 100644 --- a/vendor/github.com/Rhymen/go-whatsapp/message.go +++ b/vendor/github.com/Rhymen/go-whatsapp/message.go @@ -23,64 +23,53 @@ const ( MediaDocument MediaType = "WhatsApp Document Keys" ) -var msgInfo MessageInfo - func (wac *Conn) Send(msg interface{}) (string, error) { - var err error - var ch <-chan string var msgProto *proto.WebMessageInfo switch m := msg.(type) { case *proto.WebMessageInfo: - ch, err = wac.sendProto(m) + msgProto = m case TextMessage: msgProto = getTextProto(m) - msgInfo = getMessageInfo(msgProto) - ch, err = wac.sendProto(msgProto) case ImageMessage: + var err error m.url, m.mediaKey, m.fileEncSha256, m.fileSha256, m.fileLength, err = wac.Upload(m.Content, MediaImage) if err != nil { return "ERROR", fmt.Errorf("image upload failed: %v", err) } msgProto = getImageProto(m) - msgInfo = getMessageInfo(msgProto) - ch, err = wac.sendProto(msgProto) case VideoMessage: + var err error m.url, m.mediaKey, m.fileEncSha256, m.fileSha256, m.fileLength, err = wac.Upload(m.Content, MediaVideo) if err != nil { return "ERROR", fmt.Errorf("video upload failed: %v", err) } msgProto = getVideoProto(m) - msgInfo = getMessageInfo(msgProto) - ch, err = wac.sendProto(msgProto) case DocumentMessage: + var err error m.url, m.mediaKey, m.fileEncSha256, m.fileSha256, m.fileLength, err = wac.Upload(m.Content, MediaDocument) if err != nil { return "ERROR", fmt.Errorf("document upload failed: %v", err) } msgProto = getDocumentProto(m) - msgInfo = getMessageInfo(msgProto) - ch, err = wac.sendProto(msgProto) case AudioMessage: + var err error m.url, m.mediaKey, m.fileEncSha256, m.fileSha256, m.fileLength, err = wac.Upload(m.Content, MediaAudio) if err != nil { return "ERROR", fmt.Errorf("audio upload failed: %v", err) } msgProto = getAudioProto(m) - msgInfo = getMessageInfo(msgProto) - ch, err = wac.sendProto(msgProto) case LocationMessage: msgProto = GetLocationProto(m) - msgInfo = getMessageInfo(msgProto) - ch, err = wac.sendProto(msgProto) case LiveLocationMessage: msgProto = GetLiveLocationProto(m) - msgInfo = getMessageInfo(msgProto) - ch, err = wac.sendProto(msgProto) + case ContactMessage: + msgProto = getContactMessageProto(m) default: return "ERROR", fmt.Errorf("cannot match type %T, use message types declared in the package", msg) } + ch, err := wac.sendProto(msgProto) if err != nil { return "ERROR", fmt.Errorf("could not send proto: %v", err) } @@ -95,7 +84,7 @@ func (wac *Conn) Send(msg interface{}) (string, error) { return "ERROR", fmt.Errorf("message sending responded with %d", resp["status"]) } if int(resp["status"].(float64)) == 200 { - return msgInfo.Id, nil + return getMessageInfo(msgProto).Id, nil } case <-time.After(wac.msgTimeout): return "ERROR", fmt.Errorf("sending message timed out") @@ -124,15 +113,13 @@ func init() { MessageInfo contains general message information. It is part of every of every message type. */ type MessageInfo struct { - Id string - RemoteJid string - SenderJid string - FromMe bool - Timestamp uint64 - PushName string - Status MessageStatus - QuotedMessageID string - QuotedMessage proto.Message + Id string + RemoteJid string + SenderJid string + FromMe bool + Timestamp uint64 + PushName string + Status MessageStatus Source *proto.WebMessageInfo } @@ -185,14 +172,35 @@ func getInfoProto(info *MessageInfo) *proto.WebMessageInfo { } } -func getContextInfoProto(info *MessageInfo) *proto.ContextInfo { - if len(info.QuotedMessageID) > 0 { +/* +ContextInfo represents contextinfo of every message +*/ +type ContextInfo struct { + QuotedMessageID string //StanzaId + QuotedMessage *proto.Message + Participant string + IsForwarded bool +} + +func getMessageContext(msg *proto.ContextInfo) ContextInfo { + + return ContextInfo{ + QuotedMessageID: msg.GetStanzaId(), //StanzaId + QuotedMessage: msg.GetQuotedMessage(), + Participant: msg.GetParticipant(), + IsForwarded: msg.GetIsForwarded(), + } +} + +func getContextInfoProto(context *ContextInfo) *proto.ContextInfo { + if len(context.QuotedMessageID) > 0 { contextInfo := &proto.ContextInfo{ - StanzaId: &info.QuotedMessageID, + StanzaId: &context.QuotedMessageID, } - if &info.QuotedMessage != nil { - contextInfo.QuotedMessage = &info.QuotedMessage + if &context.QuotedMessage != nil { + contextInfo.QuotedMessage = context.QuotedMessage + contextInfo.Participant = &context.Participant } return contextInfo @@ -205,24 +213,28 @@ func getContextInfoProto(info *MessageInfo) *proto.ContextInfo { TextMessage represents a text message. */ type TextMessage struct { - Info MessageInfo - Text string + Info MessageInfo + Text string + ContextInfo ContextInfo } func getTextMessage(msg *proto.WebMessageInfo) TextMessage { text := TextMessage{Info: getMessageInfo(msg)} if m := msg.GetMessage().GetExtendedTextMessage(); m != nil { text.Text = m.GetText() - text.Info.QuotedMessageID = m.GetContextInfo().GetStanzaId() + + text.ContextInfo = getMessageContext(m.GetContextInfo()) } else { text.Text = msg.GetMessage().GetConversation() + } + return text } func getTextProto(msg TextMessage) *proto.WebMessageInfo { p := getInfoProto(&msg.Info) - contextInfo := getContextInfoProto(&msg.Info) + contextInfo := getContextInfoProto(&msg.ContextInfo) if contextInfo == nil { p.Message = &proto.Message{ @@ -255,6 +267,7 @@ type ImageMessage struct { fileEncSha256 []byte fileSha256 []byte fileLength uint64 + ContextInfo ContextInfo } func getImageMessage(msg *proto.WebMessageInfo) ImageMessage { @@ -270,10 +283,7 @@ func getImageMessage(msg *proto.WebMessageInfo) ImageMessage { fileEncSha256: image.GetFileEncSha256(), fileSha256: image.GetFileSha256(), fileLength: image.GetFileLength(), - } - - if contextInfo := image.GetContextInfo(); contextInfo != nil { - imageMessage.Info.QuotedMessageID = contextInfo.GetStanzaId() + ContextInfo: getMessageContext(image.GetContextInfo()), } return imageMessage @@ -281,7 +291,7 @@ func getImageMessage(msg *proto.WebMessageInfo) ImageMessage { func getImageProto(msg ImageMessage) *proto.WebMessageInfo { p := getInfoProto(&msg.Info) - contextInfo := getContextInfoProto(&msg.Info) + contextInfo := getContextInfoProto(&msg.ContextInfo) p.Message = &proto.Message{ ImageMessage: &proto.ImageMessage{ @@ -323,6 +333,7 @@ type VideoMessage struct { fileEncSha256 []byte fileSha256 []byte fileLength uint64 + ContextInfo ContextInfo } func getVideoMessage(msg *proto.WebMessageInfo) VideoMessage { @@ -340,10 +351,7 @@ func getVideoMessage(msg *proto.WebMessageInfo) VideoMessage { fileEncSha256: vid.GetFileEncSha256(), fileSha256: vid.GetFileSha256(), fileLength: vid.GetFileLength(), - } - - if contextInfo := vid.GetContextInfo(); contextInfo != nil { - videoMessage.Info.QuotedMessageID = contextInfo.GetStanzaId() + ContextInfo: getMessageContext(vid.GetContextInfo()), } return videoMessage @@ -351,7 +359,7 @@ func getVideoMessage(msg *proto.WebMessageInfo) VideoMessage { func getVideoProto(msg VideoMessage) *proto.WebMessageInfo { p := getInfoProto(&msg.Info) - contextInfo := getContextInfoProto(&msg.Info) + contextInfo := getContextInfoProto(&msg.ContextInfo) p.Message = &proto.Message{ VideoMessage: &proto.VideoMessage{ @@ -393,6 +401,7 @@ type AudioMessage struct { fileEncSha256 []byte fileSha256 []byte fileLength uint64 + ContextInfo ContextInfo } func getAudioMessage(msg *proto.WebMessageInfo) AudioMessage { @@ -407,10 +416,7 @@ func getAudioMessage(msg *proto.WebMessageInfo) AudioMessage { fileEncSha256: aud.GetFileEncSha256(), fileSha256: aud.GetFileSha256(), fileLength: aud.GetFileLength(), - } - - if contextInfo := aud.GetContextInfo(); contextInfo != nil { - audioMessage.Info.QuotedMessageID = contextInfo.GetStanzaId() + ContextInfo: getMessageContext(aud.GetContextInfo()), } return audioMessage @@ -418,7 +424,7 @@ func getAudioMessage(msg *proto.WebMessageInfo) AudioMessage { func getAudioProto(msg AudioMessage) *proto.WebMessageInfo { p := getInfoProto(&msg.Info) - contextInfo := getContextInfoProto(&msg.Info) + contextInfo := getContextInfoProto(&msg.ContextInfo) p.Message = &proto.Message{ AudioMessage: &proto.AudioMessage{ Url: &msg.url, @@ -459,6 +465,7 @@ type DocumentMessage struct { fileEncSha256 []byte fileSha256 []byte fileLength uint64 + ContextInfo ContextInfo } func getDocumentMessage(msg *proto.WebMessageInfo) DocumentMessage { @@ -476,10 +483,7 @@ func getDocumentMessage(msg *proto.WebMessageInfo) DocumentMessage { fileEncSha256: doc.GetFileEncSha256(), fileSha256: doc.GetFileSha256(), fileLength: doc.GetFileLength(), - } - - if contextInfo := doc.GetContextInfo(); contextInfo != nil { - documentMessage.Info.QuotedMessageID = contextInfo.GetStanzaId() + ContextInfo: getMessageContext(doc.GetContextInfo()), } return documentMessage @@ -487,7 +491,7 @@ func getDocumentMessage(msg *proto.WebMessageInfo) DocumentMessage { func getDocumentProto(msg DocumentMessage) *proto.WebMessageInfo { p := getInfoProto(&msg.Info) - contextInfo := getContextInfoProto(&msg.Info) + contextInfo := getContextInfoProto(&msg.ContextInfo) p.Message = &proto.Message{ DocumentMessage: &proto.DocumentMessage{ JpegThumbnail: msg.Thumbnail, @@ -523,6 +527,7 @@ type LocationMessage struct { Address string Url string JpegThumbnail []byte + ContextInfo ContextInfo } func GetLocationMessage(msg *proto.WebMessageInfo) LocationMessage { @@ -536,10 +541,7 @@ func GetLocationMessage(msg *proto.WebMessageInfo) LocationMessage { Address: loc.GetAddress(), Url: loc.GetUrl(), JpegThumbnail: loc.GetJpegThumbnail(), - } - - if contextInfo := loc.GetContextInfo(); contextInfo != nil { - locationMessage.Info.QuotedMessageID = contextInfo.GetStanzaId() + ContextInfo: getMessageContext(loc.GetContextInfo()), } return locationMessage @@ -547,7 +549,7 @@ func GetLocationMessage(msg *proto.WebMessageInfo) LocationMessage { func GetLocationProto(msg LocationMessage) *proto.WebMessageInfo { p := getInfoProto(&msg.Info) - contextInfo := getContextInfoProto(&msg.Info) + contextInfo := getContextInfoProto(&msg.ContextInfo) p.Message = &proto.Message{ LocationMessage: &proto.LocationMessage{ @@ -576,6 +578,7 @@ type LiveLocationMessage struct { Caption string SequenceNumber int64 JpegThumbnail []byte + ContextInfo ContextInfo } func GetLiveLocationMessage(msg *proto.WebMessageInfo) LiveLocationMessage { @@ -591,10 +594,7 @@ func GetLiveLocationMessage(msg *proto.WebMessageInfo) LiveLocationMessage { Caption: loc.GetCaption(), SequenceNumber: loc.GetSequenceNumber(), JpegThumbnail: loc.GetJpegThumbnail(), - } - - if contextInfo := loc.GetContextInfo(); contextInfo != nil { - liveLocationMessage.Info.QuotedMessageID = contextInfo.GetStanzaId() + ContextInfo: getMessageContext(loc.GetContextInfo()), } return liveLocationMessage @@ -602,7 +602,7 @@ func GetLiveLocationMessage(msg *proto.WebMessageInfo) LiveLocationMessage { func GetLiveLocationProto(msg LiveLocationMessage) *proto.WebMessageInfo { p := getInfoProto(&msg.Info) - contextInfo := getContextInfoProto(&msg.Info) + contextInfo := getContextInfoProto(&msg.ContextInfo) p.Message = &proto.Message{ LiveLocationMessage: &proto.LiveLocationMessage{ DegreesLatitude: &msg.DegreesLatitude, @@ -625,7 +625,6 @@ StickerMessage represents a sticker message. type StickerMessage struct { Info MessageInfo - Thumbnail []byte Type string Content io.Reader url string @@ -633,30 +632,79 @@ type StickerMessage struct { fileEncSha256 []byte fileSha256 []byte fileLength uint64 + + ContextInfo ContextInfo } func getStickerMessage(msg *proto.WebMessageInfo) StickerMessage { sticker := msg.GetMessage().GetStickerMessage() - StickerMessage := StickerMessage{ + stickerMessage := StickerMessage{ Info: getMessageInfo(msg), - Thumbnail: sticker.GetPngThumbnail(), url: sticker.GetUrl(), mediaKey: sticker.GetMediaKey(), Type: sticker.GetMimetype(), fileEncSha256: sticker.GetFileEncSha256(), fileSha256: sticker.GetFileSha256(), fileLength: sticker.GetFileLength(), + ContextInfo: getMessageContext(sticker.GetContextInfo()), } - if contextInfo := sticker.GetContextInfo(); contextInfo != nil { - StickerMessage.Info.QuotedMessageID = contextInfo.GetStanzaId() + return stickerMessage +} + +/* +Download is the function to retrieve Sticker media data. The media gets downloaded, validated and returned. +*/ + +func (m *StickerMessage) Download() ([]byte, error) { + return Download(m.url, m.mediaKey, MediaImage, int(m.fileLength)) +} + +/* +ContactMessage represents a contact message. +*/ +type ContactMessage struct { + Info MessageInfo + + DisplayName string + Vcard string + + ContextInfo ContextInfo +} + +func getContactMessage(msg *proto.WebMessageInfo) ContactMessage { + contact := msg.GetMessage().GetContactMessage() + + contactMessage := ContactMessage{ + Info: getMessageInfo(msg), + + DisplayName: contact.GetDisplayName(), + Vcard: contact.GetVcard(), + + ContextInfo: getMessageContext(contact.GetContextInfo()), + } + + return contactMessage +} + +func getContactMessageProto(msg ContactMessage) *proto.WebMessageInfo { + p := getInfoProto(&msg.Info) + contextInfo := getContextInfoProto(&msg.ContextInfo) + + p.Message = &proto.Message{ + ContactMessage: &proto.ContactMessage{ + DisplayName: &msg.DisplayName, + Vcard: &msg.Vcard, + ContextInfo: contextInfo, + }, } - return StickerMessage + return p } func ParseProtoMessage(msg *proto.WebMessageInfo) interface{} { + switch { case msg.GetMessage().GetAudioMessage() != nil: @@ -686,8 +734,12 @@ func ParseProtoMessage(msg *proto.WebMessageInfo) interface{} { case msg.GetMessage().GetStickerMessage() != nil: return getStickerMessage(msg) + case msg.GetMessage().GetContactMessage() != nil: + return getContactMessage(msg) + default: //cannot match message + } return nil diff --git a/vendor/github.com/Rhymen/go-whatsapp/profile.go b/vendor/github.com/Rhymen/go-whatsapp/profile.go new file mode 100644 index 00000000..d4af102c --- /dev/null +++ b/vendor/github.com/Rhymen/go-whatsapp/profile.go @@ -0,0 +1,43 @@ +package whatsapp + +import ( + "fmt" + "github.com/Rhymen/go-whatsapp/binary" + "strconv" + "time" +) + +// Pictures must be JPG 640x640 and 96x96, respectively +func (wac *Conn) UploadProfilePic(image, preview []byte) (<-chan string, error) { + tag := fmt.Sprintf("%d.--%d", time.Now().Unix(), wac.msgCount*19) + n := binary.Node{ + Description: "action", + Attributes: map[string]string{ + "type": "set", + "epoch": strconv.Itoa(wac.msgCount), + }, + Content: []interface{}{ + binary.Node{ + Description: "picture", + Attributes: map[string]string{ + "id": tag, + "jid": wac.Info.Wid, + "type": "set", + }, + Content: []binary.Node{ + { + Description: "image", + Attributes: nil, + Content: image, + }, + { + Description: "preview", + Attributes: nil, + Content: preview, + }, + }, + }, + }, + } + return wac.writeBinary(n, profile, 136, tag) +} diff --git a/vendor/github.com/Rhymen/go-whatsapp/write.go b/vendor/github.com/Rhymen/go-whatsapp/write.go index b3704e4a..1a2f4d7b 100644 --- a/vendor/github.com/Rhymen/go-whatsapp/write.go +++ b/vendor/github.com/Rhymen/go-whatsapp/write.go @@ -5,16 +5,22 @@ import ( "crypto/sha256" "encoding/json" "fmt" + "strconv" + + "time" + "github.com/Rhymen/go-whatsapp/binary" "github.com/Rhymen/go-whatsapp/crypto/cbc" "github.com/gorilla/websocket" "github.com/pkg/errors" - "strconv" - "time" ) //writeJson enqueues a json message into the writeChan func (wac *Conn) writeJson(data []interface{}) (<-chan string, error) { + + wac.writerLock.Lock() + defer wac.writerLock.Unlock() + d, err := json.Marshal(data) if err != nil { return nil, err @@ -38,6 +44,9 @@ func (wac *Conn) writeBinary(node binary.Node, metric metric, flag flag, message return nil, ErrMissingMessageTag } + wac.writerLock.Lock() + defer wac.writerLock.Unlock() + data, err := wac.encryptBinaryMessage(node) if err != nil { return nil, errors.Wrap(err, "encryptBinaryMessage(node) failed") diff --git a/vendor/github.com/bwmarrin/discordgo/discord.go b/vendor/github.com/bwmarrin/discordgo/discord.go index 76f1ad94..ac4e5426 100644 --- a/vendor/github.com/bwmarrin/discordgo/discord.go +++ b/vendor/github.com/bwmarrin/discordgo/discord.go @@ -21,7 +21,7 @@ import ( ) // VERSION of DiscordGo, follows Semantic Versioning. (http://semver.org/) -const VERSION = "0.20.1" +const VERSION = "0.20.2" // ErrMFA will be risen by New when the user has 2FA. var ErrMFA = errors.New("account has 2FA enabled") diff --git a/vendor/github.com/bwmarrin/discordgo/restapi.go b/vendor/github.com/bwmarrin/discordgo/restapi.go index 63b4e076..b5fa0fa4 100644 --- a/vendor/github.com/bwmarrin/discordgo/restapi.go +++ b/vendor/github.com/bwmarrin/discordgo/restapi.go @@ -88,7 +88,12 @@ func (s *Session) RequestWithLockedBucket(method, urlStr, contentType string, b req.Header.Set("authorization", s.Token) } - req.Header.Set("Content-Type", contentType) + // Discord's API returns a 400 Bad Request is Content-Type is set, but the + // request body is empty. + if b != nil { + req.Header.Set("Content-Type", contentType) + } + // TODO: Make a configurable static variable. req.Header.Set("User-Agent", s.UserAgent) diff --git a/vendor/github.com/gomarkdown/markdown/.travis.yml b/vendor/github.com/gomarkdown/markdown/.travis.yml deleted file mode 100644 index 4ec5d7b0..00000000 --- a/vendor/github.com/gomarkdown/markdown/.travis.yml +++ /dev/null @@ -1,17 +0,0 @@ -dist: bionic -language: go - -go: - - "1.12.x" - -install: - - go build -v ./... - -script: - - go test -v ./... - - go test -run=^$ -bench=BenchmarkReference -benchmem - - ./s/test_with_codecoverage.sh - - ./s/ci_fuzzit.sh - -after_success: - - bash <(curl -s https://codecov.io/bash) diff --git a/vendor/github.com/gomarkdown/markdown/README.md b/vendor/github.com/gomarkdown/markdown/README.md index 3bca71db..31ebb600 100644 --- a/vendor/github.com/gomarkdown/markdown/README.md +++ b/vendor/github.com/gomarkdown/markdown/README.md @@ -17,6 +17,19 @@ API Docs: - https://godoc.org/github.com/gomarkdown/markdown/parser : parser - https://godoc.org/github.com/gomarkdown/markdown/html : html renderer +## Users + +Some tools using this package: + +- https://github.com/MichaelMure/go-term-markdown : markdown renderer for the terminal +- https://github.com/artyom/mdserver : web server that serves markdown files +- https://github.com/rsdoiel/mkpage : content management system generating static websites +- https://github.com/cugu/dashboard : creates a badge dashboard from a yaml file +- https://github.com/ieyasu/go-bwiki : simple wiki +- https://github.com/romanyx/mdopen : view markdown files in the default browser +- https://github.com/ystyle/sqlmanager : a library for manager sql with markdown like beetsql +- https://gitlab.com/kendellfab/fazer : library for making templates + ## Usage To convert markdown text to HTML using reasonable defaults: @@ -295,7 +308,7 @@ implements the following extensions: Will convert into `<h1 id="id3" class="myclass" fontsize="tiny">Header 1</h1>`. -- **Mmark support**, see <https://mmark.nl/syntax> for all new syntax elements this adds. +- **Mmark support**, see <https://mmark.miek.nl/post/syntax/> for all new syntax elements this adds. ## Todo diff --git a/vendor/github.com/gomarkdown/markdown/ast/print.go b/vendor/github.com/gomarkdown/markdown/ast/print.go index 75daf911..b186ec07 100644 --- a/vendor/github.com/gomarkdown/markdown/ast/print.go +++ b/vendor/github.com/gomarkdown/markdown/ast/print.go @@ -5,6 +5,7 @@ import ( "fmt" "io" "strings" + "unicode/utf8" ) // Print is for debugging. It prints a string representation of parsed @@ -63,11 +64,11 @@ func shortenString(s string, maxLen int) string { if maxLen < 0 { return s } - if len(s) < maxLen { + if utf8.RuneCountInString(s) < maxLen { return s } - // add "..." to indicate truncation - return s[:maxLen-3] + "..." + // add "…" to indicate truncation + return string(append([]rune(s)[:maxLen-3], '…')) } // get a short name of the type of v which excludes package name diff --git a/vendor/github.com/gomarkdown/markdown/doc.go b/vendor/github.com/gomarkdown/markdown/doc.go index 9fb77e02..b623024d 100644 --- a/vendor/github.com/gomarkdown/markdown/doc.go +++ b/vendor/github.com/gomarkdown/markdown/doc.go @@ -21,7 +21,7 @@ You can customize parser and HTML renderer: "github.com/gomarkdown/markdown" ) extensions := parser.CommonExtensions | parser.AutoHeadingIDs - p := parser.NewWithExensions(extensions) + p := parser.NewWithExtensions(extensions) htmlFlags := html.CommonFlags | html.HrefTargetBlank opts := html.RendererOptions{Flags: htmlFlags} diff --git a/vendor/github.com/gomarkdown/markdown/html/renderer.go b/vendor/github.com/gomarkdown/markdown/html/renderer.go index 367f7dfa..f0e10a7f 100644 --- a/vendor/github.com/gomarkdown/markdown/html/renderer.go +++ b/vendor/github.com/gomarkdown/markdown/html/renderer.go @@ -1298,7 +1298,7 @@ func BlockAttrs(node ast.Node) []string { // sort the attributes so it remain stable between runs var keys = []string{} - for k, _ := range attr.Attrs { + for k := range attr.Attrs { keys = append(keys, k) } sort.Strings(keys) diff --git a/vendor/github.com/gomarkdown/markdown/parser/block.go b/vendor/github.com/gomarkdown/markdown/parser/block.go index 18a2dd89..3b0c391a 100644 --- a/vendor/github.com/gomarkdown/markdown/parser/block.go +++ b/vendor/github.com/gomarkdown/markdown/parser/block.go @@ -24,46 +24,46 @@ var ( // blockTags is a set of tags that are recognized as HTML block tags. // Any of these can be included in markdown text without special escaping. blockTags = map[string]struct{}{ - "blockquote": struct{}{}, - "del": struct{}{}, - "div": struct{}{}, - "dl": struct{}{}, - "fieldset": struct{}{}, - "form": struct{}{}, - "h1": struct{}{}, - "h2": struct{}{}, - "h3": struct{}{}, - "h4": struct{}{}, - "h5": struct{}{}, - "h6": struct{}{}, - "iframe": struct{}{}, - "ins": struct{}{}, - "math": struct{}{}, - "noscript": struct{}{}, - "ol": struct{}{}, - "pre": struct{}{}, - "p": struct{}{}, - "script": struct{}{}, - "style": struct{}{}, - "table": struct{}{}, - "ul": struct{}{}, + "blockquote": {}, + "del": {}, + "div": {}, + "dl": {}, + "fieldset": {}, + "form": {}, + "h1": {}, + "h2": {}, + "h3": {}, + "h4": {}, + "h5": {}, + "h6": {}, + "iframe": {}, + "ins": {}, + "math": {}, + "noscript": {}, + "ol": {}, + "pre": {}, + "p": {}, + "script": {}, + "style": {}, + "table": {}, + "ul": {}, // HTML5 - "address": struct{}{}, - "article": struct{}{}, - "aside": struct{}{}, - "canvas": struct{}{}, - "figcaption": struct{}{}, - "figure": struct{}{}, - "footer": struct{}{}, - "header": struct{}{}, - "hgroup": struct{}{}, - "main": struct{}{}, - "nav": struct{}{}, - "output": struct{}{}, - "progress": struct{}{}, - "section": struct{}{}, - "video": struct{}{}, + "address": {}, + "article": {}, + "aside": {}, + "canvas": {}, + "figcaption": {}, + "figure": {}, + "footer": {}, + "header": {}, + "hgroup": {}, + "main": {}, + "nav": {}, + "output": {}, + "progress": {}, + "section": {}, + "video": {}, } ) diff --git a/vendor/github.com/gomarkdown/markdown/parser/inline.go b/vendor/github.com/gomarkdown/markdown/parser/inline.go index 81766b85..23849f3a 100644 --- a/vendor/github.com/gomarkdown/markdown/parser/inline.go +++ b/vendor/github.com/gomarkdown/markdown/parser/inline.go @@ -228,7 +228,7 @@ func maybeInlineFootnoteOrSuper(p *Parser, data []byte, offset int) (int, ast.No } sup := &ast.Superscript{} sup.Literal = data[offset+1 : offset+ret] - return offset + ret, sup + return ret + 1, sup } return 0, nil @@ -536,6 +536,9 @@ func link(p *Parser, data []byte, offset int) (int, ast.Node) { // if inline footnote, title == footnote contents title = lr.title noteID = lr.noteID + if len(lr.text) > 0 { + altContent = lr.text + } } // rewind the whitespace diff --git a/vendor/github.com/jpillora/backoff/backoff.go b/vendor/github.com/jpillora/backoff/backoff.go index b4941b6e..d113e689 100644 --- a/vendor/github.com/jpillora/backoff/backoff.go +++ b/vendor/github.com/jpillora/backoff/backoff.go @@ -4,6 +4,7 @@ package backoff import ( "math" "math/rand" + "sync/atomic" "time" ) @@ -14,19 +15,19 @@ import ( // Backoff is not generally concurrent-safe, but the ForAttempt method can // be used concurrently. type Backoff struct { - //Factor is the multiplying factor for each increment step - attempt, Factor float64 - //Jitter eases contention by randomizing backoff steps + attempt uint64 + // Factor is the multiplying factor for each increment step + Factor float64 + // Jitter eases contention by randomizing backoff steps Jitter bool - //Min and Max are the minimum and maximum values of the counter + // Min and Max are the minimum and maximum values of the counter Min, Max time.Duration } // Duration returns the duration for the current attempt before incrementing // the attempt counter. See ForAttempt. func (b *Backoff) Duration() time.Duration { - d := b.ForAttempt(b.attempt) - b.attempt++ + d := b.ForAttempt(float64(atomic.AddUint64(&b.attempt, 1) - 1)) return d } @@ -80,12 +81,12 @@ func (b *Backoff) ForAttempt(attempt float64) time.Duration { // Reset restarts the current attempt counter at zero. func (b *Backoff) Reset() { - b.attempt = 0 + atomic.StoreUint64(&b.attempt, 0) } // Attempt returns the current attempt counter value. func (b *Backoff) Attempt() float64 { - return b.attempt + return float64(atomic.LoadUint64(&b.attempt)) } // Copy returns a backoff with equals constraints as the original diff --git a/vendor/github.com/jpillora/backoff/go.mod b/vendor/github.com/jpillora/backoff/go.mod new file mode 100644 index 00000000..7c41bc6f --- /dev/null +++ b/vendor/github.com/jpillora/backoff/go.mod @@ -0,0 +1,3 @@ +module github.com/jpillora/backoff + +go 1.13 diff --git a/vendor/github.com/labstack/echo/v4/.travis.yml b/vendor/github.com/labstack/echo/v4/.travis.yml index 3897356d..a1fc8768 100644 --- a/vendor/github.com/labstack/echo/v4/.travis.yml +++ b/vendor/github.com/labstack/echo/v4/.travis.yml @@ -1,7 +1,7 @@ language: go go: - - 1.11.x - 1.12.x + - 1.13.x - tip env: - GO111MODULE=on diff --git a/vendor/github.com/labstack/echo/v4/bind.go b/vendor/github.com/labstack/echo/v4/bind.go index 959a314c..c8c88bb2 100644 --- a/vendor/github.com/labstack/echo/v4/bind.go +++ b/vendor/github.com/labstack/echo/v4/bind.go @@ -43,15 +43,11 @@ func (b *DefaultBinder) Bind(i interface{}, c Context) (err error) { if err := b.bindData(i, params, "param"); err != nil { return NewHTTPError(http.StatusBadRequest, err.Error()).SetInternal(err) } - + if err = b.bindData(i, c.QueryParams(), "query"); err != nil { + return NewHTTPError(http.StatusBadRequest, err.Error()).SetInternal(err) + } if req.ContentLength == 0 { - if req.Method == http.MethodGet || req.Method == http.MethodDelete { - if err = b.bindData(i, c.QueryParams(), "query"); err != nil { - return NewHTTPError(http.StatusBadRequest, err.Error()).SetInternal(err) - } - return - } - return NewHTTPError(http.StatusBadRequest, "Request body can't be empty") + return } ctype := req.Header.Get(HeaderContentType) switch { @@ -94,13 +90,15 @@ func (b *DefaultBinder) bindData(ptr interface{}, data map[string][]string, tag typ := reflect.TypeOf(ptr).Elem() val := reflect.ValueOf(ptr).Elem() - if m, ok := ptr.(*map[string]interface{}); ok { + // Map + if typ.Kind() == reflect.Map { for k, v := range data { - (*m)[k] = v[0] + val.SetMapIndex(reflect.ValueOf(k), reflect.ValueOf(v[0])) } return nil } + // !struct if typ.Kind() != reflect.Struct { return errors.New("binding element must be a struct") } diff --git a/vendor/github.com/labstack/echo/v4/context.go b/vendor/github.com/labstack/echo/v4/context.go index e0f4cc00..27da5ffe 100644 --- a/vendor/github.com/labstack/echo/v4/context.go +++ b/vendor/github.com/labstack/echo/v4/context.go @@ -183,6 +183,9 @@ type ( // Logger returns the `Logger` instance. Logger() Logger + // Set the logger + SetLogger(l Logger) + // Echo returns the `Echo` instance. Echo() *Echo @@ -202,6 +205,7 @@ type ( handler HandlerFunc store Map echo *Echo + logger Logger lock sync.RWMutex } ) @@ -347,7 +351,8 @@ func (c *context) FormParams() (url.Values, error) { } func (c *context) FormFile(name string) (*multipart.FileHeader, error) { - _, fh, err := c.request.FormFile(name) + f, fh, err := c.request.FormFile(name) + defer f.Close() return fh, err } @@ -597,9 +602,17 @@ func (c *context) SetHandler(h HandlerFunc) { } func (c *context) Logger() Logger { + res := c.logger + if res != nil { + return res + } return c.echo.Logger } +func (c *context) SetLogger(l Logger) { + c.logger = l +} + func (c *context) Reset(r *http.Request, w http.ResponseWriter) { c.request = r c.response.reset(w) @@ -608,6 +621,9 @@ func (c *context) Reset(r *http.Request, w http.ResponseWriter) { c.store = nil c.path = "" c.pnames = nil + c.logger = nil // NOTE: Don't reset because it has to have length c.echo.maxParam at all times - // c.pvalues = nil + for i := 0; i < *c.echo.maxParam; i++ { + c.pvalues[i] = "" + } } diff --git a/vendor/github.com/labstack/echo/v4/echo.go b/vendor/github.com/labstack/echo/v4/echo.go index 552c7a78..a6ac0fa8 100644 --- a/vendor/github.com/labstack/echo/v4/echo.go +++ b/vendor/github.com/labstack/echo/v4/echo.go @@ -227,7 +227,7 @@ const ( const ( // Version of Echo - Version = "4.1.10" + Version = "4.1.13" website = "https://echo.labstack.com" // http://patorjk.com/software/taag/#p=display&f=Small%20Slant&t=Echo banner = ` @@ -354,10 +354,14 @@ func (e *Echo) DefaultHTTPErrorHandler(err error, c Context) { Message: http.StatusText(http.StatusInternalServerError), } } + + // Issue #1426 + code := he.Code + message := he.Message if e.Debug { - he.Message = err.Error() - } else if m, ok := he.Message.(string); ok { - he.Message = Map{"message": m} + message = err.Error() + } else if m, ok := message.(string); ok { + message = Map{"message": m} } // Send response @@ -365,7 +369,7 @@ func (e *Echo) DefaultHTTPErrorHandler(err error, c Context) { if c.Request().Method == http.MethodHead { // Issue #608 err = c.NoContent(he.Code) } else { - err = c.JSON(he.Code, he.Message) + err = c.JSON(code, message) } if err != nil { e.Logger.Error(err) diff --git a/vendor/github.com/labstack/echo/v4/go.mod b/vendor/github.com/labstack/echo/v4/go.mod index f088ba6e..c5db2ae1 100644 --- a/vendor/github.com/labstack/echo/v4/go.mod +++ b/vendor/github.com/labstack/echo/v4/go.mod @@ -4,8 +4,14 @@ go 1.12 require ( github.com/dgrijalva/jwt-go v3.2.0+incompatible + github.com/labstack/echo v3.3.10+incompatible // indirect github.com/labstack/gommon v0.3.0 + github.com/mattn/go-colorable v0.1.4 // indirect + github.com/mattn/go-isatty v0.0.11 // indirect github.com/stretchr/testify v1.4.0 - github.com/valyala/fasttemplate v1.0.1 - golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 + github.com/valyala/fasttemplate v1.1.0 + golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876 + golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 // indirect + golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8 // indirect + golang.org/x/text v0.3.2 // indirect ) diff --git a/vendor/github.com/labstack/echo/v4/go.sum b/vendor/github.com/labstack/echo/v4/go.sum index 5aedb2e2..57c79877 100644 --- a/vendor/github.com/labstack/echo/v4/go.sum +++ b/vendor/github.com/labstack/echo/v4/go.sum @@ -2,13 +2,21 @@ github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/labstack/echo v3.3.10+incompatible h1:pGRcYk231ExFAyoAjAfD85kQzRJCRI8bbnE7CX5OEgg= +github.com/labstack/echo v3.3.10+incompatible/go.mod h1:0INS7j/VjnFxD4E2wkz67b8cVwCLbBmJyDaka6Cmk1s= github.com/labstack/gommon v0.3.0 h1:JEeO0bvc78PKdyHxloTKiF8BD5iGrH8T6MSeGvSgob0= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9 h1:d5US/mDsogSGW37IV293h//ZFaeajb69h+EHFsv2xGg= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= +github.com/mattn/go-isatty v0.0.10 h1:qxFzApOv4WsAL965uUPIsXzAKCZxN2p9UqdhFS4ZW10= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= +github.com/mattn/go-isatty v0.0.11 h1:FxPOTFNqGkuDUGi3H/qkUbQO4ZiBa2brKq5r0l8TGeM= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -18,17 +26,37 @@ github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6Kllzaw github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.0.1 h1:tY9CJiPnMXf1ERmG2EyK7gNUd+c6RKGD0IfU8WdUSz8= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/valyala/fasttemplate v1.1.0 h1:RZqt0yGBsps8NGvLSGW804QQqCUYYLsaOjTVHy1Ocw4= +github.com/valyala/fasttemplate v1.1.0/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 h1:HuIa8hRrWRSrqYzx1qI49NNxhdi2PrY7gxVSq1JjLDc= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 h1:ObdrDkeb4kJdCP557AjRjq69pTHfNouLtWZG7j9rPN8= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876 h1:sKJQZMuxjOAR/Uo2LBfU90onWEf1dF4C+0hPJCc9Mpc= +golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20191021144547-ec77196f6094 h1:5O4U9trLjNpuhpynaDsqwCk+Tw6seqJz1EbqbnzHrc8= +golang.org/x/net v0.0.0-20191021144547-ec77196f6094/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 h1:efeOvDhwQ29Dj3SdAV/MJf8oukgn+8D8WgaCaRMchF8= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a h1:aYOabOQFp6Vj6W1F80affTUvO9UxmJRx8K0gsfABByQ= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191024172528-b4ff53e7a1cb h1:ZxSglHghKPYD8WDeRUzRJrUJtDF0PxsTUSxyqr9/5BI= +golang.org/x/sys v0.0.0-20191024172528-b4ff53e7a1cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8 h1:JA8d3MPx/IToSyXZG/RhwYEtfrKO1Fxrqe8KrkiLXKM= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/labstack/echo/v4/middleware/body_dump.go b/vendor/github.com/labstack/echo/v4/middleware/body_dump.go index 418d279d..ebd0d0ab 100644 --- a/vendor/github.com/labstack/echo/v4/middleware/body_dump.go +++ b/vendor/github.com/labstack/echo/v4/middleware/body_dump.go @@ -40,7 +40,7 @@ var ( // BodyDump returns a BodyDump middleware. // -// BodyLimit middleware captures the request and response payload and calls the +// BodyDump middleware captures the request and response payload and calls the // registered handler. func BodyDump(handler BodyDumpHandler) echo.MiddlewareFunc { c := DefaultBodyDumpConfig diff --git a/vendor/github.com/labstack/echo/v4/middleware/proxy.go b/vendor/github.com/labstack/echo/v4/middleware/proxy.go index 532346d5..ef5602bd 100644 --- a/vendor/github.com/labstack/echo/v4/middleware/proxy.go +++ b/vendor/github.com/labstack/echo/v4/middleware/proxy.go @@ -92,15 +92,14 @@ func proxyRaw(t *ProxyTarget, c echo.Context) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { in, _, err := c.Response().Hijack() if err != nil { - c.Error(fmt.Errorf("proxy raw, hijack error=%v, url=%s", t.URL, err)) + c.Set("_error", fmt.Sprintf("proxy raw, hijack error=%v, url=%s", t.URL, err)) return } defer in.Close() out, err := net.Dial("tcp", t.URL.Host) if err != nil { - he := echo.NewHTTPError(http.StatusBadGateway, fmt.Sprintf("proxy raw, dial error=%v, url=%s", t.URL, err)) - c.Error(he) + c.Set("_error", echo.NewHTTPError(http.StatusBadGateway, fmt.Sprintf("proxy raw, dial error=%v, url=%s", t.URL, err))) return } defer out.Close() @@ -108,8 +107,7 @@ func proxyRaw(t *ProxyTarget, c echo.Context) http.Handler { // Write header err = r.Write(out) if err != nil { - he := echo.NewHTTPError(http.StatusBadGateway, fmt.Sprintf("proxy raw, request header copy error=%v, url=%s", t.URL, err)) - c.Error(he) + c.Set("_error", echo.NewHTTPError(http.StatusBadGateway, fmt.Sprintf("proxy raw, request header copy error=%v, url=%s", t.URL, err))) return } @@ -123,7 +121,7 @@ func proxyRaw(t *ProxyTarget, c echo.Context) http.Handler { go cp(in, out) err = <-errCh if err != nil && err != io.EOF { - c.Logger().Errorf("proxy raw, copy body error=%v, url=%s", t.URL, err) + c.Set("_error", fmt.Errorf("proxy raw, copy body error=%v, url=%s", t.URL, err)) } }) } @@ -251,6 +249,9 @@ func ProxyWithConfig(config ProxyConfig) echo.MiddlewareFunc { default: proxyHTTP(tgt, c, config).ServeHTTP(res, req) } + if e, ok := c.Get("_error").(error); ok { + err = e + } return } diff --git a/vendor/github.com/labstack/echo/v4/middleware/proxy_1_11.go b/vendor/github.com/labstack/echo/v4/middleware/proxy_1_11.go index 7784f9c6..12b7568b 100644 --- a/vendor/github.com/labstack/echo/v4/middleware/proxy_1_11.go +++ b/vendor/github.com/labstack/echo/v4/middleware/proxy_1_11.go @@ -17,8 +17,7 @@ func proxyHTTP(tgt *ProxyTarget, c echo.Context, config ProxyConfig) http.Handle if tgt.Name != "" { desc = fmt.Sprintf("%s(%s)", tgt.Name, tgt.URL.String()) } - c.Logger().Errorf("remote %s unreachable, could not forward: %v", desc, err) - c.Error(echo.NewHTTPError(http.StatusServiceUnavailable)) + c.Set("_error", echo.NewHTTPError(http.StatusBadGateway, fmt.Sprintf("remote %s unreachable, could not forward: %v", desc, err))) } proxy.Transport = config.Transport return proxy diff --git a/vendor/github.com/labstack/echo/v4/router.go b/vendor/github.com/labstack/echo/v4/router.go index 70bf409f..08145973 100644 --- a/vendor/github.com/labstack/echo/v4/router.go +++ b/vendor/github.com/labstack/echo/v4/router.go @@ -1,6 +1,9 @@ package echo -import "net/http" +import ( + "net/http" + "strings" +) type ( // Router is the registry of all registered routes for an `Echo` instance for @@ -20,8 +23,8 @@ type ( pnames []string methodHandler *methodHandler } - kind uint8 - children []*node + kind uint8 + children []*node methodHandler struct { connect HandlerFunc delete HandlerFunc @@ -133,6 +136,11 @@ func (r *Router) insert(method, path string, h HandlerFunc, t kind, ppath string // Split node n := newNode(cn.kind, cn.prefix[l:], cn, cn.children, cn.methodHandler, cn.ppath, cn.pnames) + // Update parent path for all children to new node + for _, child := range cn.children { + child.parent = n + } + // Reset parent node cn.kind = skind cn.label = cn.prefix[0] @@ -336,7 +344,6 @@ func (r *Router) Find(method, path string, c Context) { } } - if l == pl { // Continue search search = search[l:] @@ -398,16 +405,33 @@ func (r *Router) Find(method, path string, c Context) { Any: if cn = cn.findChildByKind(akind); cn == nil { if nn != nil { - cn = nn - nn = cn.parent // Next (Issue #954) - if nn != nil { - nk = nn.kind - } + // No next node to go down in routing (issue #954) + // Find nearest "any" route going up the routing tree search = ns - if nk == pkind { - goto Param - } else if nk == akind { - goto Any + np := nn.parent + // Consider param route one level up only + // if no slash is remaining in search string + if cn = nn.findChildByKind(pkind); cn != nil && strings.IndexByte(ns, '/') == -1 { + pvalues[len(cn.pnames)-1] = search + break + } + for { + np = nn.parent + if cn = nn.findChildByKind(akind); cn != nil { + break + } + if np == nil { + break // no further parent nodes in tree, abort + } + var str strings.Builder + str.WriteString(nn.prefix) + str.WriteString(search) + search = str.String() + nn = np + } + if cn != nil { // use the found "any" route and update path + pvalues[len(cn.pnames)-1] = search + break } } return // Not found diff --git a/vendor/github.com/magiconair/properties/.travis.yml b/vendor/github.com/magiconair/properties/.travis.yml index 3e7c3d2c..f07376f9 100644 --- a/vendor/github.com/magiconair/properties/.travis.yml +++ b/vendor/github.com/magiconair/properties/.travis.yml @@ -7,4 +7,6 @@ go: - 1.8.x - 1.9.x - "1.10.x" + - "1.11.x" + - "1.12.x" - tip diff --git a/vendor/github.com/magiconair/properties/CHANGELOG.md b/vendor/github.com/magiconair/properties/CHANGELOG.md index f83adc20..176626a1 100644 --- a/vendor/github.com/magiconair/properties/CHANGELOG.md +++ b/vendor/github.com/magiconair/properties/CHANGELOG.md @@ -1,5 +1,13 @@ ## Changelog +### [1.8.1](https://github.com/magiconair/properties/tree/v1.8.1) - 10 May 2019 + + * [PR #26](https://github.com/magiconair/properties/pull/35): Close body always after request + + This patch ensures that in `LoadURL` the response body is always closed. + + Thanks to [@liubog2008](https://github.com/liubog2008) for the patch. + ### [1.8](https://github.com/magiconair/properties/tree/v1.8) - 15 May 2018 * [PR #26](https://github.com/magiconair/properties/pull/26): Disable expansion during loading diff --git a/vendor/github.com/magiconair/properties/README.md b/vendor/github.com/magiconair/properties/README.md index 2c05f290..42ed5c37 100644 --- a/vendor/github.com/magiconair/properties/README.md +++ b/vendor/github.com/magiconair/properties/README.md @@ -1,6 +1,6 @@ [![](https://img.shields.io/github/tag/magiconair/properties.svg?style=flat-square&label=release)](https://github.com/magiconair/properties/releases) [![Travis CI Status](https://img.shields.io/travis/magiconair/properties.svg?branch=master&style=flat-square&label=travis)](https://travis-ci.org/magiconair/properties) -[![Codeship CI Status](https://img.shields.io/codeship/16aaf660-f615-0135-b8f0-7e33b70920c0/master.svg?label=codeship&style=flat-square)](https://app.codeship.com/projects/274177") +[![CircleCI Status](https://img.shields.io/circleci/project/github/magiconair/properties.svg?label=circle+ci&style=flat-square)](https://circleci.com/gh/magiconair/properties) [![License](https://img.shields.io/badge/License-BSD%202--Clause-orange.svg?style=flat-square)](https://raw.githubusercontent.com/magiconair/properties/master/LICENSE) [![GoDoc](http://img.shields.io/badge/godoc-reference-5272B4.svg?style=flat-square)](http://godoc.org/github.com/magiconair/properties) @@ -30,7 +30,7 @@ changed from `panic` to `log.Fatal` but this is configurable and custom error handling functions can be provided. See the package documentation for details. -Read the full documentation on [GoDoc](https://godoc.org/github.com/magiconair/properties) [![GoDoc](https://godoc.org/github.com/magiconair/properties?status.png)](https://godoc.org/github.com/magiconair/properties) +Read the full documentation on [![GoDoc](http://img.shields.io/badge/godoc-reference-5272B4.svg?style=flat-square)](http://godoc.org/github.com/magiconair/properties) ## Getting Started diff --git a/vendor/github.com/magiconair/properties/go.mod b/vendor/github.com/magiconair/properties/go.mod new file mode 100644 index 00000000..02a6f865 --- /dev/null +++ b/vendor/github.com/magiconair/properties/go.mod @@ -0,0 +1 @@ +module github.com/magiconair/properties diff --git a/vendor/github.com/magiconair/properties/load.go b/vendor/github.com/magiconair/properties/load.go index c8e1b580..ab953253 100644 --- a/vendor/github.com/magiconair/properties/load.go +++ b/vendor/github.com/magiconair/properties/load.go @@ -115,6 +115,7 @@ func (l *Loader) LoadURL(url string) (*Properties, error) { if err != nil { return nil, fmt.Errorf("properties: error fetching %q. %s", url, err) } + defer resp.Body.Close() if resp.StatusCode == 404 && l.IgnoreMissing { LogPrintf("properties: %s returned %d. skipping", url, resp.StatusCode) @@ -129,7 +130,6 @@ func (l *Loader) LoadURL(url string) (*Properties, error) { if err != nil { return nil, fmt.Errorf("properties: %s error reading response. %s", url, err) } - defer resp.Body.Close() ct := resp.Header.Get("Content-Type") var enc Encoding diff --git a/vendor/github.com/mattn/go-colorable/colorable_appengine.go b/vendor/github.com/mattn/go-colorable/colorable_appengine.go index 1f28d773..0b0aef83 100644 --- a/vendor/github.com/mattn/go-colorable/colorable_appengine.go +++ b/vendor/github.com/mattn/go-colorable/colorable_appengine.go @@ -9,7 +9,7 @@ import ( _ "github.com/mattn/go-isatty" ) -// NewColorable return new instance of Writer which handle escape sequence. +// NewColorable returns new instance of Writer which handles escape sequence. func NewColorable(file *os.File) io.Writer { if file == nil { panic("nil passed instead of *os.File to NewColorable()") @@ -18,12 +18,12 @@ func NewColorable(file *os.File) io.Writer { return file } -// NewColorableStdout return new instance of Writer which handle escape sequence for stdout. +// NewColorableStdout returns new instance of Writer which handles escape sequence for stdout. func NewColorableStdout() io.Writer { return os.Stdout } -// NewColorableStderr return new instance of Writer which handle escape sequence for stderr. +// NewColorableStderr returns new instance of Writer which handles escape sequence for stderr. func NewColorableStderr() io.Writer { return os.Stderr } diff --git a/vendor/github.com/mattn/go-colorable/colorable_others.go b/vendor/github.com/mattn/go-colorable/colorable_others.go index 887f203d..3fb771dc 100644 --- a/vendor/github.com/mattn/go-colorable/colorable_others.go +++ b/vendor/github.com/mattn/go-colorable/colorable_others.go @@ -10,7 +10,7 @@ import ( _ "github.com/mattn/go-isatty" ) -// NewColorable return new instance of Writer which handle escape sequence. +// NewColorable returns new instance of Writer which handles escape sequence. func NewColorable(file *os.File) io.Writer { if file == nil { panic("nil passed instead of *os.File to NewColorable()") @@ -19,12 +19,12 @@ func NewColorable(file *os.File) io.Writer { return file } -// NewColorableStdout return new instance of Writer which handle escape sequence for stdout. +// NewColorableStdout returns new instance of Writer which handles escape sequence for stdout. func NewColorableStdout() io.Writer { return os.Stdout } -// NewColorableStderr return new instance of Writer which handle escape sequence for stderr. +// NewColorableStderr returns new instance of Writer which handles escape sequence for stderr. func NewColorableStderr() io.Writer { return os.Stderr } diff --git a/vendor/github.com/mattn/go-colorable/colorable_windows.go b/vendor/github.com/mattn/go-colorable/colorable_windows.go index 404e10ca..1bd628f2 100644 --- a/vendor/github.com/mattn/go-colorable/colorable_windows.go +++ b/vendor/github.com/mattn/go-colorable/colorable_windows.go @@ -81,7 +81,7 @@ var ( procCreateConsoleScreenBuffer = kernel32.NewProc("CreateConsoleScreenBuffer") ) -// Writer provide colorable Writer to the console +// Writer provides colorable Writer to the console type Writer struct { out io.Writer handle syscall.Handle @@ -91,7 +91,7 @@ type Writer struct { rest bytes.Buffer } -// NewColorable return new instance of Writer which handle escape sequence from File. +// NewColorable returns new instance of Writer which handles escape sequence from File. func NewColorable(file *os.File) io.Writer { if file == nil { panic("nil passed instead of *os.File to NewColorable()") @@ -106,12 +106,12 @@ func NewColorable(file *os.File) io.Writer { return file } -// NewColorableStdout return new instance of Writer which handle escape sequence for stdout. +// NewColorableStdout returns new instance of Writer which handles escape sequence for stdout. func NewColorableStdout() io.Writer { return NewColorable(os.Stdout) } -// NewColorableStderr return new instance of Writer which handle escape sequence for stderr. +// NewColorableStderr returns new instance of Writer which handles escape sequence for stderr. func NewColorableStderr() io.Writer { return NewColorable(os.Stderr) } @@ -414,7 +414,15 @@ func doTitleSequence(er *bytes.Reader) error { return nil } -// Write write data on console +// returns Atoi(s) unless s == "" in which case it returns def +func atoiWithDefault(s string, def int) (int, error) { + if s == "" { + return def, nil + } + return strconv.Atoi(s) +} + +// Write writes data on console func (w *Writer) Write(data []byte) (n int, err error) { var csbi consoleScreenBufferInfo procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) @@ -500,7 +508,7 @@ loop: switch m { case 'A': - n, err = strconv.Atoi(buf.String()) + n, err = atoiWithDefault(buf.String(), 1) if err != nil { continue } @@ -508,7 +516,7 @@ loop: csbi.cursorPosition.y -= short(n) procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) case 'B': - n, err = strconv.Atoi(buf.String()) + n, err = atoiWithDefault(buf.String(), 1) if err != nil { continue } @@ -516,7 +524,7 @@ loop: csbi.cursorPosition.y += short(n) procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) case 'C': - n, err = strconv.Atoi(buf.String()) + n, err = atoiWithDefault(buf.String(), 1) if err != nil { continue } @@ -524,7 +532,7 @@ loop: csbi.cursorPosition.x += short(n) procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) case 'D': - n, err = strconv.Atoi(buf.String()) + n, err = atoiWithDefault(buf.String(), 1) if err != nil { continue } @@ -557,6 +565,9 @@ loop: if err != nil { continue } + if n < 1 { + n = 1 + } procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) csbi.cursorPosition.x = short(n - 1) procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) @@ -635,6 +646,20 @@ loop: } procFillConsoleOutputCharacter.Call(uintptr(handle), uintptr(' '), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) procFillConsoleOutputAttribute.Call(uintptr(handle), uintptr(csbi.attributes), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) + case 'X': + n := 0 + if buf.Len() > 0 { + n, err = strconv.Atoi(buf.String()) + if err != nil { + continue + } + } + procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) + var cursor coord + var written dword + cursor = coord{x: csbi.cursorPosition.x, y: csbi.cursorPosition.y} + procFillConsoleOutputCharacter.Call(uintptr(handle), uintptr(' '), uintptr(n), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) + procFillConsoleOutputAttribute.Call(uintptr(handle), uintptr(csbi.attributes), uintptr(n), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) case 'm': procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) attr := csbi.attributes diff --git a/vendor/github.com/mattn/go-colorable/noncolorable.go b/vendor/github.com/mattn/go-colorable/noncolorable.go index 9721e16f..95f2c6be 100644 --- a/vendor/github.com/mattn/go-colorable/noncolorable.go +++ b/vendor/github.com/mattn/go-colorable/noncolorable.go @@ -5,17 +5,17 @@ import ( "io" ) -// NonColorable hold writer but remove escape sequence. +// NonColorable holds writer but removes escape sequence. type NonColorable struct { out io.Writer } -// NewNonColorable return new instance of Writer which remove escape sequence from Writer. +// NewNonColorable returns new instance of Writer which removes escape sequence from Writer. func NewNonColorable(w io.Writer) io.Writer { return &NonColorable{out: w} } -// Write write data on console +// Write writes data on console func (w *NonColorable) Write(data []byte) (n int, err error) { er := bytes.NewReader(data) var bw [1]byte diff --git a/vendor/github.com/mattn/go-isatty/go.mod b/vendor/github.com/mattn/go-isatty/go.mod index 3b9b9abf..53d84a67 100644 --- a/vendor/github.com/mattn/go-isatty/go.mod +++ b/vendor/github.com/mattn/go-isatty/go.mod @@ -1,3 +1,5 @@ module github.com/mattn/go-isatty -require golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a +go 1.12 + +require golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 diff --git a/vendor/github.com/mattn/go-isatty/go.sum b/vendor/github.com/mattn/go-isatty/go.sum index b1bd14d2..5e0752bd 100644 --- a/vendor/github.com/mattn/go-isatty/go.sum +++ b/vendor/github.com/mattn/go-isatty/go.sum @@ -1,2 +1,2 @@ -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a h1:aYOabOQFp6Vj6W1F80affTUvO9UxmJRx8K0gsfABByQ= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 h1:YyJpGZS1sBuBCzLAR1VEpK193GlqGZbnPFnPV/5Rsb4= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/vendor/github.com/mattn/go-isatty/isatty_plan9.go b/vendor/github.com/mattn/go-isatty/isatty_plan9.go new file mode 100644 index 00000000..c5b6e0c0 --- /dev/null +++ b/vendor/github.com/mattn/go-isatty/isatty_plan9.go @@ -0,0 +1,22 @@ +// +build plan9 + +package isatty + +import ( + "syscall" +) + +// IsTerminal returns true if the given file descriptor is a terminal. +func IsTerminal(fd uintptr) bool { + path, err := syscall.Fd2path(int(fd)) + if err != nil { + return false + } + return path == "/dev/cons" || path == "/mnt/term/dev/cons" +} + +// IsCygwinTerminal return true if the file descriptor is a cygwin or msys2 +// terminal. This is also always false on this environment. +func IsCygwinTerminal(fd uintptr) bool { + return false +} diff --git a/vendor/github.com/mattn/go-isatty/isatty_windows.go b/vendor/github.com/mattn/go-isatty/isatty_windows.go index af51cbca..1fa86915 100644 --- a/vendor/github.com/mattn/go-isatty/isatty_windows.go +++ b/vendor/github.com/mattn/go-isatty/isatty_windows.go @@ -4,6 +4,7 @@ package isatty import ( + "errors" "strings" "syscall" "unicode/utf16" @@ -11,15 +12,18 @@ import ( ) const ( - fileNameInfo uintptr = 2 - fileTypePipe = 3 + objectNameInfo uintptr = 1 + fileNameInfo = 2 + fileTypePipe = 3 ) var ( kernel32 = syscall.NewLazyDLL("kernel32.dll") + ntdll = syscall.NewLazyDLL("ntdll.dll") procGetConsoleMode = kernel32.NewProc("GetConsoleMode") procGetFileInformationByHandleEx = kernel32.NewProc("GetFileInformationByHandleEx") procGetFileType = kernel32.NewProc("GetFileType") + procNtQueryObject = ntdll.NewProc("NtQueryObject") ) func init() { @@ -45,7 +49,10 @@ func isCygwinPipeName(name string) bool { return false } - if token[0] != `\msys` && token[0] != `\cygwin` { + if token[0] != `\msys` && + token[0] != `\cygwin` && + token[0] != `\Device\NamedPipe\msys` && + token[0] != `\Device\NamedPipe\cygwin` { return false } @@ -68,11 +75,35 @@ func isCygwinPipeName(name string) bool { return true } +// getFileNameByHandle use the undocomented ntdll NtQueryObject to get file full name from file handler +// since GetFileInformationByHandleEx is not avilable under windows Vista and still some old fashion +// guys are using Windows XP, this is a workaround for those guys, it will also work on system from +// Windows vista to 10 +// see https://stackoverflow.com/a/18792477 for details +func getFileNameByHandle(fd uintptr) (string, error) { + if procNtQueryObject == nil { + return "", errors.New("ntdll.dll: NtQueryObject not supported") + } + + var buf [4 + syscall.MAX_PATH]uint16 + var result int + r, _, e := syscall.Syscall6(procNtQueryObject.Addr(), 5, + fd, objectNameInfo, uintptr(unsafe.Pointer(&buf)), uintptr(2*len(buf)), uintptr(unsafe.Pointer(&result)), 0) + if r != 0 { + return "", e + } + return string(utf16.Decode(buf[4 : 4+buf[0]/2])), nil +} + // IsCygwinTerminal() return true if the file descriptor is a cygwin or msys2 // terminal. func IsCygwinTerminal(fd uintptr) bool { if procGetFileInformationByHandleEx == nil { - return false + name, err := getFileNameByHandle(fd) + if err != nil { + return false + } + return isCygwinPipeName(name) } // Cygwin/msys's pty is a pipe. diff --git a/vendor/github.com/spf13/viper/.gitignore b/vendor/github.com/spf13/viper/.gitignore index 01b5c44b..d6941f32 100644 --- a/vendor/github.com/spf13/viper/.gitignore +++ b/vendor/github.com/spf13/viper/.gitignore @@ -1,29 +1,20 @@ -# Compiled Object files, Static and Dynamic libs (Shared Objects) -*.o -*.a -*.so +/bin/ +/build/ +/var/ +/vendor/ -# Folders -_obj -_test - -# Architecture specific extensions/prefixes -*.[568vq] -[568vq].out - -*.cgo1.go -*.cgo2.c -_cgo_defun.c -_cgo_gotypes.go -_cgo_export.* - -_testmain.go - -*.exe -*.test -*.bench - -.vscode - -# exclude dependencies in the `/vendor` folder -vendor +# IDE integration +/.vscode/* +!/.vscode/launch.json +!/.vscode/tasks.json +/.idea/* +!/.idea/codeStyles/ +!/.idea/copyright/ +!/.idea/dataSources.xml +!/.idea/*.iml +!/.idea/externalDependencies.xml +!/.idea/go.imports.xml +!/.idea/modules.xml +!/.idea/runConfigurations/ +!/.idea/scopes/ +!/.idea/sqldialects.xml diff --git a/vendor/github.com/spf13/viper/.golangci.yml b/vendor/github.com/spf13/viper/.golangci.yml new file mode 100644 index 00000000..0ea9249e --- /dev/null +++ b/vendor/github.com/spf13/viper/.golangci.yml @@ -0,0 +1,24 @@ +linters-settings: + golint: + min-confidence: 0.1 + goimports: + local-prefixes: github.com/spf13/viper + +linters: + enable-all: true + disable: + - funlen + - maligned + + # TODO: fix me + - wsl + - gochecknoinits + - gosimple + - gochecknoglobals + - errcheck + - lll + - godox + - scopelint + - gocyclo + - gocognit + - gocritic
\ No newline at end of file diff --git a/vendor/github.com/spf13/viper/.travis.yml b/vendor/github.com/spf13/viper/.travis.yml index bb83057b..ed677bbb 100644 --- a/vendor/github.com/spf13/viper/.travis.yml +++ b/vendor/github.com/spf13/viper/.travis.yml @@ -4,10 +4,13 @@ language: go env: global: - - GO111MODULE="on" + - GO111MODULE="on" + - GOFLAGS="-mod=readonly" go: - 1.11.x + - 1.12.x + - 1.13.x - tip os: @@ -27,5 +30,3 @@ script: after_success: - go get -u -d github.com/spf13/hugo - cd $GOPATH/src/github.com/spf13/hugo && make && ./hugo -s docs && cd - - -sudo: false diff --git a/vendor/github.com/spf13/viper/Makefile b/vendor/github.com/spf13/viper/Makefile new file mode 100644 index 00000000..e39b8b5e --- /dev/null +++ b/vendor/github.com/spf13/viper/Makefile @@ -0,0 +1,71 @@ +# A Self-Documenting Makefile: http://marmelab.com/blog/2016/02/29/auto-documented-makefile.html + +OS = $(shell uname | tr A-Z a-z) + +# Build variables +BUILD_DIR ?= build +ifeq (${VERBOSE}, 1) +ifeq ($(filter -v,${GOARGS}),) + GOARGS += -v +endif +TEST_FORMAT = short-verbose +endif + +# Dependency versions +GOTESTSUM_VERSION = 0.3.5 +GOLANGCI_VERSION = 1.21.0 + +# Add the ability to override some variables +# Use with care +-include override.mk + +.PHONY: clear +clear: ## Clear the working area and the project + rm -rf bin/ + +.PHONY: check +check: test lint ## Run tests and linters + +bin/gotestsum: bin/gotestsum-${GOTESTSUM_VERSION} + @ln -sf gotestsum-${GOTESTSUM_VERSION} bin/gotestsum +bin/gotestsum-${GOTESTSUM_VERSION}: + @mkdir -p bin + curl -L https://github.com/gotestyourself/gotestsum/releases/download/v${GOTESTSUM_VERSION}/gotestsum_${GOTESTSUM_VERSION}_${OS}_amd64.tar.gz | tar -zOxf - gotestsum > ./bin/gotestsum-${GOTESTSUM_VERSION} && chmod +x ./bin/gotestsum-${GOTESTSUM_VERSION} + +TEST_PKGS ?= ./... +TEST_REPORT_NAME ?= results.xml +.PHONY: test +test: TEST_REPORT ?= main +test: TEST_FORMAT ?= short +test: SHELL = /bin/bash +test: bin/gotestsum ## Run tests + @mkdir -p ${BUILD_DIR}/test_results/${TEST_REPORT} + bin/gotestsum --no-summary=skipped --junitfile ${BUILD_DIR}/test_results/${TEST_REPORT}/${TEST_REPORT_NAME} --format ${TEST_FORMAT} -- $(filter-out -v,${GOARGS}) $(if ${TEST_PKGS},${TEST_PKGS},./...) + +bin/golangci-lint: bin/golangci-lint-${GOLANGCI_VERSION} + @ln -sf golangci-lint-${GOLANGCI_VERSION} bin/golangci-lint +bin/golangci-lint-${GOLANGCI_VERSION}: + @mkdir -p bin + curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | BINARY=golangci-lint bash -s -- v${GOLANGCI_VERSION} + @mv bin/golangci-lint $@ + +.PHONY: lint +lint: bin/golangci-lint ## Run linter + bin/golangci-lint run + +.PHONY: fix +fix: bin/golangci-lint ## Fix lint violations + bin/golangci-lint run --fix + +.PHONY: list +list: ## List all make targets + @${MAKE} -pRrn : -f $(MAKEFILE_LIST) 2>/dev/null | awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' | egrep -v -e '^[^[:alnum:]]' -e '^$@$$' | sort + +.PHONY: help +.DEFAULT_GOAL := help +help: + @grep -h -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' + +# Variable outputting/exporting rules +var-%: ; @echo $($*) +varexport-%: ; @echo $*=$($*) diff --git a/vendor/github.com/spf13/viper/README.md b/vendor/github.com/spf13/viper/README.md index 0208eac8..327308bc 100644 --- a/vendor/github.com/spf13/viper/README.md +++ b/vendor/github.com/spf13/viper/README.md @@ -2,6 +2,10 @@ Go configuration with fangs! +[![Actions](https://github.com/spf13/viper/workflows/CI/badge.svg)](https://github.com/spf13/viper) +[![Join the chat at https://gitter.im/spf13/viper](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/spf13/viper?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) +[![GoDoc](https://godoc.org/github.com/spf13/viper?status.svg)](https://godoc.org/github.com/spf13/viper) + Many Go projects are built using Viper including: * [Hugo](http://gohugo.io) @@ -12,8 +16,14 @@ Many Go projects are built using Viper including: * [BloomApi](https://www.bloomapi.com/) * [doctl](https://github.com/digitalocean/doctl) * [Clairctl](https://github.com/jgsqware/clairctl) +* [Mercure](https://mercure.rocks) + + +## Install -[![Build Status](https://travis-ci.org/spf13/viper.svg)](https://travis-ci.org/spf13/viper) [![Join the chat at https://gitter.im/spf13/viper](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/spf13/viper?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![GoDoc](https://godoc.org/github.com/spf13/viper?status.svg)](https://godoc.org/github.com/spf13/viper) +```console +go get github.com/spf13/viper +``` ## What is Viper? @@ -23,7 +33,7 @@ to work within an application, and can handle all types of configuration needs and formats. It supports: * setting defaults -* reading from JSON, TOML, YAML, HCL, and Java properties config files +* reading from JSON, TOML, YAML, HCL, envfile and Java properties config files * live watching and re-reading of config files (optional) * reading from environment variables * reading from remote config systems (etcd or Consul), and watching changes @@ -31,8 +41,8 @@ and formats. It supports: * reading from buffer * setting explicit values -Viper can be thought of as a registry for all of your applications -configuration needs. +Viper can be thought of as a registry for all of your applications configuration needs. + ## Why Viper? @@ -42,34 +52,31 @@ Viper is here to help with that. Viper does the following for you: -1. Find, load, and unmarshal a configuration file in JSON, TOML, YAML, HCL, or Java properties formats. -2. Provide a mechanism to set default values for your different - configuration options. -3. Provide a mechanism to set override values for options specified through - command line flags. -4. Provide an alias system to easily rename parameters without breaking existing - code. -5. Make it easy to tell the difference between when a user has provided a - command line or config file which is the same as the default. +1. Find, load, and unmarshal a configuration file in JSON, TOML, YAML, HCL, INI, envfile or Java properties formats. +2. Provide a mechanism to set default values for your different configuration options. +3. Provide a mechanism to set override values for options specified through command line flags. +4. Provide an alias system to easily rename parameters without breaking existing code. +5. Make it easy to tell the difference between when a user has provided a command line or config file which is the same as the default. -Viper uses the following precedence order. Each item takes precedence over the -item below it: +Viper uses the following precedence order. Each item takes precedence over the item below it: - * explicit call to Set + * explicit call to `Set` * flag * env * config * key/value store * default -Viper configuration keys are case insensitive. +**Important:** Viper configuration keys are case insensitive. +There are ongoing discussions about making that optional. + ## Putting Values into Viper ### Establishing Defaults A good configuration system will support default values. A default value is not -required for a key, but it’s useful in the event that a key hasn’t been set via +required for a key, but it’s useful in the event that a key hasn't been set via config file, environment variable, remote configuration or flag. Examples: @@ -83,7 +90,7 @@ viper.SetDefault("Taxonomies", map[string]string{"tag": "tags", "category": "cat ### Reading Config Files Viper requires minimal configuration so it knows where to look for config files. -Viper supports JSON, TOML, YAML, HCL, and Java Properties files. Viper can search multiple paths, but +Viper supports JSON, TOML, YAML, HCL, INI, envfile and Java Properties files. Viper can search multiple paths, but currently a single Viper instance only supports a single configuration file. Viper does not default to any configuration search paths leaving defaults decision to an application. @@ -103,6 +110,44 @@ if err != nil { // Handle errors reading the config file } ``` +You can handle the specific case where no config file is found like this: + +```go +if err := viper.ReadInConfig(); err != nil { + if _, ok := err.(viper.ConfigFileNotFoundError); ok { + // Config file not found; ignore error if desired + } else { + // Config file was found but another error was produced + } +} + +// Config file found and successfully parsed +``` + +*NOTE:* You can also have a file without an extension and specify the format programmaticaly. For those configuration files that lie in the home of the user without any extension like `.bashrc` + +### Writing Config Files + +Reading from config files is useful, but at times you want to store all modifications made at run time. +For that, a bunch of commands are available, each with its own purpose: + +* WriteConfig - writes the current viper configuration to the predefined path, if exists. Errors if no predefined path. Will overwrite the current config file, if it exists. +* SafeWriteConfig - writes the current viper configuration to the predefined path. Errors if no predefined path. Will not overwrite the current config file, if it exists. +* WriteConfigAs - writes the current viper configuration to the given filepath. Will overwrite the given file, if it exists. +* SafeWriteConfigAs - writes the current viper configuration to the given filepath. Will not overwrite the given file, if it exists. + +As a rule of the thumb, everything marked with safe won't overwrite any file, but just create if not existent, whilst the default behavior is to create or truncate. + +A small examples section: + +```go +viper.WriteConfig() // writes current config to predefined path set by 'viper.AddConfigPath()' and 'viper.SetConfigName' +viper.SafeWriteConfig() +viper.WriteConfigAs("/path/to/my/.config") +viper.SafeWriteConfigAs("/path/to/my/.config") // will error since it has already been written +viper.SafeWriteConfigAs("/path/to/my/.other_config") +``` + ### Watching and re-reading config files Viper supports the ability to have your application live read a config file while running. @@ -186,7 +231,7 @@ with ENV: * `BindEnv(string...) : error` * `SetEnvPrefix(string)` * `SetEnvKeyReplacer(string...) *strings.Replacer` - * `AllowEmptyEnvVar(bool)` + * `AllowEmptyEnv(bool)` _When working with ENV variables, it’s important to recognize that Viper treats ENV variables as case sensitive._ @@ -199,9 +244,9 @@ prefix. `BindEnv` takes one or two parameters. The first parameter is the key name, the second is the name of the environment variable. The name of the environment variable is case sensitive. If the ENV variable name is not provided, then -Viper will automatically assume that the key name matches the ENV variable name, -but the ENV variable is IN ALL CAPS. When you explicitly provide the ENV -variable name, it **does not** automatically add the prefix. +Viper will automatically assume that the ENV variable matches the following format: prefix + "_" + the key name in ALL CAPS. When you explicitly provide the ENV variable name (the second parameter), +it **does not** automatically add the prefix. For example if the second parameter is "id", +Viper will look for the ENV variable "ID". One important thing to recognize when working with ENV variables is that the value will be read each time it is accessed. Viper does not fix the value when @@ -218,6 +263,9 @@ keys to an extent. This is useful if you want to use `-` or something in your `Get()` calls, but want your environmental variables to use `_` delimiters. An example of using it can be found in `viper_test.go`. +Alternatively, you can use `EnvKeyReplacer` with `NewWithOptions` factory function. +Unlike `SetEnvKeyReplacer`, it accepts a `StringReplacer` interface allowing you to write custom string replacing logic. + By default empty environment variables are considered unset and will fall back to the next configuration source. To treat empty environment variables as set, use the `AllowEmptyEnv` method. @@ -346,7 +394,7 @@ package: `import _ "github.com/spf13/viper/remote"` -Viper will read a config string (as JSON, TOML, YAML or HCL) retrieved from a path +Viper will read a config string (as JSON, TOML, YAML, HCL or envfile) retrieved from a path in a Key/Value store such as etcd or Consul. These values take precedence over default values, but are overridden by configuration values retrieved from disk, flags, or environment variables. @@ -381,7 +429,7 @@ how to use Consul. #### etcd ```go viper.AddRemoteProvider("etcd", "http://127.0.0.1:4001","/config/hugo.json") -viper.SetConfigType("json") // because there is no file extension in a stream of bytes, supported extensions are "json", "toml", "yaml", "yml", "properties", "props", "prop" +viper.SetConfigType("json") // because there is no file extension in a stream of bytes, supported extensions are "json", "toml", "yaml", "yml", "properties", "props", "prop", "env", "dotenv" err := viper.ReadRemoteConfig() ``` @@ -409,7 +457,7 @@ fmt.Println(viper.Get("hostname")) // myhostname.com ```go viper.AddSecureRemoteProvider("etcd","http://127.0.0.1:4001","/config/hugo.json","/etc/secrets/mykeyring.gpg") -viper.SetConfigType("json") // because there is no file extension in a stream of bytes, supported extensions are "json", "toml", "yaml", "yml", "properties", "props", "prop" +viper.SetConfigType("json") // because there is no file extension in a stream of bytes, supported extensions are "json", "toml", "yaml", "yml", "properties", "props", "prop", "env", "dotenv" err := viper.ReadRemoteConfig() ``` @@ -420,7 +468,7 @@ err := viper.ReadRemoteConfig() var runtime_viper = viper.New() runtime_viper.AddRemoteProvider("etcd", "http://127.0.0.1:4001", "/config/hugo.yml") -runtime_viper.SetConfigType("yaml") // because there is no file extension in a stream of bytes, supported extensions are "json", "toml", "yaml", "yml", "properties", "props", "prop" +runtime_viper.SetConfigType("yaml") // because there is no file extension in a stream of bytes, supported extensions are "json", "toml", "yaml", "yml", "properties", "props", "prop", "env", "dotenv" // read from remote config the first time. err := runtime_viper.ReadRemoteConfig() @@ -456,6 +504,7 @@ The following functions and methods exist: * `GetBool(key string) : bool` * `GetFloat64(key string) : float64` * `GetInt(key string) : int` + * `GetIntSlice(key string) : []int` * `GetString(key string) : string` * `GetStringMap(key string) : map[string]interface{}` * `GetStringMapString(key string) : map[string]string` @@ -611,15 +660,43 @@ type config struct { var C config -err := Unmarshal(&C) +err := viper.Unmarshal(&C) if err != nil { t.Fatalf("unable to decode into struct, %v", err) } ``` +If you want to unmarshal configuration where the keys themselves contain dot (the default key delimiter), +you have to change the delimiter: + +```go +v := viper.NewWithOptions(viper.KeyDelimiter("::")) + +v.SetDefault("chart::values", map[string]interface{}{ + "ingress": map[string]interface{}{ + "annotations": map[string]interface{}{ + "traefik.frontend.rule.type": "PathPrefix", + "traefik.ingress.kubernetes.io/ssl-redirect": "true", + }, + }, +}) + +type config struct { + Chart struct{ + Values map[string]interface{} + } +} + +var C config + +v.Unmarshal(&C) +``` + +Viper uses [github.com/mitchellh/mapstructure](https://github.com/mitchellh/mapstructure) under the hood for unmarshaling values which uses `mapstructure` tags by default. + ### Marshalling to string -You may need to marhsal all the settings held in viper into a string rather than write them to a file. +You may need to marshal all the settings held in viper into a string rather than write them to a file. You can use your favorite format's marshaller with the config returned by `AllSettings()`. ```go @@ -630,11 +707,11 @@ import ( func yamlStringSettings() string { c := viper.AllSettings() - bs, err := yaml.Marshal(c) - if err != nil { - t.Fatalf("unable to marshal config to YAML: %v", err) + bs, err := yaml.Marshal(c) + if err != nil { + log.Fatalf("unable to marshal config to YAML: %v", err) } - return string(bs) + return string(bs) } ``` @@ -672,13 +749,6 @@ different vipers. ## Q & A -Q: Why not INI files? - -A: Ini files are pretty awful. There’s no standard format, and they are hard to -validate. Viper is designed to work with JSON, TOML or YAML files. If someone -really wants to add this feature, I’d be happy to merge it. It’s easy to specify -which formats your application will permit. - Q: Why is it called “Viper”? A: Viper is designed to be a [companion](http://en.wikipedia.org/wiki/Viper_(G.I._Joe)) diff --git a/vendor/github.com/spf13/viper/flags.go b/vendor/github.com/spf13/viper/flags.go index dd32f4e1..b5ddbf5d 100644 --- a/vendor/github.com/spf13/viper/flags.go +++ b/vendor/github.com/spf13/viper/flags.go @@ -36,7 +36,7 @@ type pflagValue struct { flag *pflag.Flag } -// HasChanges returns whether the flag has changes or not. +// HasChanged returns whether the flag has changes or not. func (p pflagValue) HasChanged() bool { return p.flag.Changed } diff --git a/vendor/github.com/spf13/viper/go.mod b/vendor/github.com/spf13/viper/go.mod index 27943005..0e358cbe 100644 --- a/vendor/github.com/spf13/viper/go.mod +++ b/vendor/github.com/spf13/viper/go.mod @@ -1,5 +1,7 @@ module github.com/spf13/viper +go 1.12 + require ( github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6 // indirect github.com/coreos/bbolt v1.3.2 // indirect @@ -18,16 +20,18 @@ require ( github.com/grpc-ecosystem/grpc-gateway v1.9.0 // indirect github.com/hashicorp/hcl v1.0.0 github.com/jonboulle/clockwork v0.1.0 // indirect - github.com/magiconair/properties v1.8.0 + github.com/magiconair/properties v1.8.1 github.com/mitchellh/mapstructure v1.1.2 github.com/pelletier/go-toml v1.2.0 github.com/prometheus/client_golang v0.9.3 // indirect + github.com/smartystreets/goconvey v1.6.4 // indirect github.com/soheilhy/cmux v0.1.4 // indirect github.com/spf13/afero v1.1.2 github.com/spf13/cast v1.3.0 github.com/spf13/jwalterweatherman v1.0.0 github.com/spf13/pflag v1.0.3 github.com/stretchr/testify v1.2.2 + github.com/subosito/gotenv v1.2.0 github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 // indirect github.com/ugorji/go v1.1.4 // indirect github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 // indirect @@ -39,5 +43,6 @@ require ( golang.org/x/net v0.0.0-20190522155817-f3200d17e092 // indirect golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 // indirect google.golang.org/grpc v1.21.0 // indirect - gopkg.in/yaml.v2 v2.2.2 + gopkg.in/ini.v1 v1.51.0 + gopkg.in/yaml.v2 v2.2.4 ) diff --git a/vendor/github.com/spf13/viper/go.sum b/vendor/github.com/spf13/viper/go.sum index 97afaffe..d75aee23 100644 --- a/vendor/github.com/spf13/viper/go.sum +++ b/vendor/github.com/spf13/viper/go.sum @@ -48,6 +48,8 @@ github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0 h1:Iju5GlWwrvL6UBg4zJJt3btmonfrMlCDdsejg4CZE7c= @@ -60,6 +62,8 @@ github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= @@ -71,8 +75,8 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= @@ -101,6 +105,10 @@ github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40T github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/sirupsen/logrus v1.2.0 h1:juTguoYk5qI21pwyTXY3B3Y5cOTH3ZUyZCg1v/mihuo= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= @@ -115,6 +123,8 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 h1:LnC5Kc/wtumK+WB441p7ynQJzVuNRJiqddSIE3IlSEQ= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/ugorji/go v1.1.4 h1:j4s+tAvLfL3bZyefP2SEWmhBzmuIlH/eqNuPdFPgngw= @@ -159,6 +169,8 @@ golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384 h1:TFlARGu6Czu1z7q93HTxcP1P+/ZFC/IKythI5RzrnRg= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 h1:Nw54tB0rB7hY/N0NQvRW8DG4Yk3Q6T9cu9RcFQDu1tc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -170,9 +182,11 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/vendor/github.com/spf13/viper/util.go b/vendor/github.com/spf13/viper/util.go index 952cad44..b7889696 100644 --- a/vendor/github.com/spf13/viper/util.go +++ b/vendor/github.com/spf13/viper/util.go @@ -114,11 +114,11 @@ func absPathify(inPath string) string { return "" } -// Check if File / Directory Exists +// Check if file Exists func exists(fs afero.Fs, path string) (bool, error) { - _, err := fs.Stat(path) + stat, err := fs.Stat(path) if err == nil { - return true, nil + return !stat.IsDir(), nil } if os.IsNotExist(err) { return false, nil diff --git a/vendor/github.com/spf13/viper/viper.go b/vendor/github.com/spf13/viper/viper.go index a3d37f8c..eb2f5177 100644 --- a/vendor/github.com/spf13/viper/viper.go +++ b/vendor/github.com/spf13/viper/viper.go @@ -3,7 +3,7 @@ // Use of this source code is governed by an MIT-style // license that can be found in the LICENSE file. -// Viper is a application configuration system. +// Viper is an application configuration system. // It believes that applications can be configured a variety of ways // via flags, ENVIRONMENT variables, configuration files retrieved // from the file system, or a remote key/value store. @@ -23,6 +23,7 @@ import ( "bytes" "encoding/csv" "encoding/json" + "errors" "fmt" "io" "log" @@ -33,18 +34,19 @@ import ( "sync" "time" - yaml "gopkg.in/yaml.v2" - "github.com/fsnotify/fsnotify" "github.com/hashicorp/hcl" "github.com/hashicorp/hcl/hcl/printer" "github.com/magiconair/properties" "github.com/mitchellh/mapstructure" - toml "github.com/pelletier/go-toml" + "github.com/pelletier/go-toml" "github.com/spf13/afero" "github.com/spf13/cast" jww "github.com/spf13/jwalterweatherman" "github.com/spf13/pflag" + "github.com/subosito/gotenv" + "gopkg.in/ini.v1" + "gopkg.in/yaml.v2" ) // ConfigMarshalError happens when failing to marshal the configuration. @@ -114,6 +116,14 @@ func (fnfe ConfigFileNotFoundError) Error() string { return fmt.Sprintf("Config File %q Not Found in %q", fnfe.name, fnfe.locations) } +// ConfigFileAlreadyExistsError denotes failure to write new configuration file. +type ConfigFileAlreadyExistsError string + +// Error returns the formatted error when configuration already exists. +func (faee ConfigFileAlreadyExistsError) Error() string { + return fmt.Sprintf("Config File %q Already Exists", string(faee)) +} + // A DecoderConfigOption can be passed to viper.Unmarshal to configure // mapstructure.DecoderConfig options type DecoderConfigOption func(*mapstructure.DecoderConfig) @@ -187,7 +197,7 @@ type Viper struct { envPrefix string automaticEnvApplied bool - envKeyReplacer *strings.Replacer + envKeyReplacer StringReplacer allowEmptyEnv bool config map[string]interface{} @@ -225,12 +235,58 @@ func New() *Viper { return v } -// Intended for testing, will reset all to default settings. +// Option configures Viper using the functional options paradigm popularized by Rob Pike and Dave Cheney. +// If you're unfamiliar with this style, +// see https://commandcenter.blogspot.com/2014/01/self-referential-functions-and-design.html and +// https://dave.cheney.net/2014/10/17/functional-options-for-friendly-apis. +type Option interface { + apply(v *Viper) +} + +type optionFunc func(v *Viper) + +func (fn optionFunc) apply(v *Viper) { + fn(v) +} + +// KeyDelimiter sets the delimiter used for determining key parts. +// By default it's value is ".". +func KeyDelimiter(d string) Option { + return optionFunc(func(v *Viper) { + v.keyDelim = d + }) +} + +// StringReplacer applies a set of replacements to a string. +type StringReplacer interface { + // Replace returns a copy of s with all replacements performed. + Replace(s string) string +} + +// EnvKeyReplacer sets a replacer used for mapping environment variables to internal keys. +func EnvKeyReplacer(r StringReplacer) Option { + return optionFunc(func(v *Viper) { + v.envKeyReplacer = r + }) +} + +// NewWithOptions creates a new Viper instance. +func NewWithOptions(opts ...Option) *Viper { + v := New() + + for _, opt := range opts { + opt.apply(v) + } + + return v +} + +// Reset is intended for testing, will reset all to default settings. // In the public interface for the viper package so applications // can use it in their testing as well. func Reset() { v = New() - SupportedExts = []string{"json", "toml", "yaml", "yml", "properties", "props", "prop", "hcl"} + SupportedExts = []string{"json", "toml", "yaml", "yml", "properties", "props", "prop", "hcl", "dotenv", "env", "ini"} SupportedRemoteProviders = []string{"etcd", "consul"} } @@ -269,7 +325,7 @@ type RemoteProvider interface { } // SupportedExts are universally supported extensions. -var SupportedExts = []string{"json", "toml", "yaml", "yml", "properties", "props", "prop", "hcl"} +var SupportedExts = []string{"json", "toml", "yaml", "yml", "properties", "props", "prop", "hcl", "dotenv", "env", "ini"} // SupportedRemoteProviders are universally supported remote providers. var SupportedRemoteProviders = []string{"etcd", "consul"} @@ -294,6 +350,7 @@ func (v *Viper) WatchConfig() { filename, err := v.getConfigFile() if err != nil { log.Printf("error: %v\n", err) + initWG.Done() return } @@ -343,7 +400,7 @@ func (v *Viper) WatchConfig() { } }() watcher.Add(configDir) - initWG.Done() // done initalizing the watch in this go routine, so the parent routine can move on... + initWG.Done() // done initializing the watch in this go routine, so the parent routine can move on... eventsWG.Wait() // now, wait for event loop to end in this go-routine... }() initWG.Wait() // make sure that the go routine above fully ended before returning @@ -668,7 +725,7 @@ func GetViper() *Viper { func Get(key string) interface{} { return v.Get(key) } func (v *Viper) Get(key string) interface{} { lcaseKey := strings.ToLower(key) - val := v.find(lcaseKey) + val := v.find(lcaseKey, true) if val == nil { return nil } @@ -705,6 +762,8 @@ func (v *Viper) Get(key string) interface{} { return cast.ToDuration(val) case []string: return cast.ToStringSlice(val) + case []int: + return cast.ToIntSlice(val) } } @@ -794,6 +853,12 @@ func (v *Viper) GetDuration(key string) time.Duration { return cast.ToDuration(v.Get(key)) } +// GetIntSlice returns the value associated with the key as a slice of int values. +func GetIntSlice(key string) []int { return v.GetIntSlice(key) } +func (v *Viper) GetIntSlice(key string) []int { + return cast.ToIntSlice(v.Get(key)) +} + // GetStringSlice returns the value associated with the key as a slice of strings. func GetStringSlice(key string) []string { return v.GetStringSlice(key) } func (v *Viper) GetStringSlice(key string) []string { @@ -884,8 +949,11 @@ func decode(input interface{}, config *mapstructure.DecoderConfig) error { // UnmarshalExact unmarshals the config into a Struct, erroring if a field is nonexistent // in the destination struct. -func (v *Viper) UnmarshalExact(rawVal interface{}) error { - config := defaultDecoderConfig(rawVal) +func UnmarshalExact(rawVal interface{}, opts ...DecoderConfigOption) error { + return v.UnmarshalExact(rawVal, opts...) +} +func (v *Viper) UnmarshalExact(rawVal interface{}, opts ...DecoderConfigOption) error { + config := defaultDecoderConfig(rawVal, opts...) config.ErrorUnused = true err := decode(v.AllSettings(), config) @@ -950,7 +1018,7 @@ func BindEnv(input ...string) error { return v.BindEnv(input...) } func (v *Viper) BindEnv(input ...string) error { var key, envkey string if len(input) == 0 { - return fmt.Errorf("BindEnv missing key to bind to") + return fmt.Errorf("missing key to bind to") } key = strings.ToLower(input[0]) @@ -967,12 +1035,15 @@ func (v *Viper) BindEnv(input ...string) error { } // Given a key, find the value. -// Viper will check in the following order: -// flag, env, config file, key/value store, default. +// // Viper will check to see if an alias exists first. +// Viper will then check in the following order: +// flag, env, config file, key/value store. +// Lastly, if no value was found and flagDefault is true, and if the key +// corresponds to a flag, the flag's default value is returned. +// // Note: this assumes a lower-cased key given. -func (v *Viper) find(lcaseKey string) interface{} { - +func (v *Viper) find(lcaseKey string, flagDefault bool) interface{} { var ( val interface{} exists bool @@ -1012,6 +1083,11 @@ func (v *Viper) find(lcaseKey string) interface{} { s = strings.TrimSuffix(s, "]") res, _ := readAsCSV(s) return res + case "intSlice": + s := strings.TrimPrefix(flag.ValueString(), "[") + s = strings.TrimSuffix(s, "]") + res, _ := readAsCSV(s) + return cast.ToIntSlice(res) default: return flag.ValueString() } @@ -1068,24 +1144,31 @@ func (v *Viper) find(lcaseKey string) interface{} { return nil } - // last chance: if no other value is returned and a flag does exist for the value, - // get the flag's value even if the flag's value has not changed - if flag, exists := v.pflags[lcaseKey]; exists { - switch flag.ValueType() { - case "int", "int8", "int16", "int32", "int64": - return cast.ToInt(flag.ValueString()) - case "bool": - return cast.ToBool(flag.ValueString()) - case "stringSlice": - s := strings.TrimPrefix(flag.ValueString(), "[") - s = strings.TrimSuffix(s, "]") - res, _ := readAsCSV(s) - return res - default: - return flag.ValueString() + if flagDefault { + // last chance: if no value is found and a flag does exist for the key, + // get the flag's default value even if the flag's value has not been set. + if flag, exists := v.pflags[lcaseKey]; exists { + switch flag.ValueType() { + case "int", "int8", "int16", "int32", "int64": + return cast.ToInt(flag.ValueString()) + case "bool": + return cast.ToBool(flag.ValueString()) + case "stringSlice": + s := strings.TrimPrefix(flag.ValueString(), "[") + s = strings.TrimSuffix(s, "]") + res, _ := readAsCSV(s) + return res + case "intSlice": + s := strings.TrimPrefix(flag.ValueString(), "[") + s = strings.TrimSuffix(s, "]") + res, _ := readAsCSV(s) + return cast.ToIntSlice(res) + default: + return flag.ValueString() + } } + // last item, no need to check shadowing } - // last item, no need to check shadowing return nil } @@ -1104,7 +1187,7 @@ func readAsCSV(val string) ([]string, error) { func IsSet(key string) bool { return v.IsSet(key) } func (v *Viper) IsSet(key string) bool { lcaseKey := strings.ToLower(key) - val := v.find(lcaseKey) + val := v.find(lcaseKey, false) return val != nil } @@ -1123,8 +1206,8 @@ func (v *Viper) SetEnvKeyReplacer(r *strings.Replacer) { v.envKeyReplacer = r } -// Aliases provide another accessor for the same key. -// This enables one to change a name without breaking the application +// RegisterAlias creates an alias that provides another accessor for the same key. +// This enables one to change a name without breaking the application. func RegisterAlias(alias string, key string) { v.RegisterAlias(alias, key) } func (v *Viper) RegisterAlias(alias string, key string) { v.registerAlias(alias, strings.ToLower(key)) @@ -1311,11 +1394,10 @@ func (v *Viper) WriteConfig() error { // SafeWriteConfig writes current configuration to file only if the file does not exist. func SafeWriteConfig() error { return v.SafeWriteConfig() } func (v *Viper) SafeWriteConfig() error { - filename, err := v.getConfigFile() - if err != nil { - return err + if len(v.configPaths) < 1 { + return errors.New("missing configuration for 'configPath'") } - return v.writeConfig(filename, false) + return v.SafeWriteConfigAs(filepath.Join(v.configPaths[0], v.configName+"."+v.configType)) } // WriteConfigAs writes current configuration to a given filename. @@ -1327,15 +1409,18 @@ func (v *Viper) WriteConfigAs(filename string) error { // SafeWriteConfigAs writes current configuration to a given filename if it does not exist. func SafeWriteConfigAs(filename string) error { return v.SafeWriteConfigAs(filename) } func (v *Viper) SafeWriteConfigAs(filename string) error { + alreadyExists, err := afero.Exists(v.fs, filename) + if alreadyExists && err == nil { + return ConfigFileAlreadyExistsError(filename) + } return v.writeConfig(filename, false) } -func writeConfig(filename string, force bool) error { return v.writeConfig(filename, force) } func (v *Viper) writeConfig(filename string, force bool) error { jww.INFO.Println("Attempting to write configuration to file.") ext := filepath.Ext(filename) if len(ext) <= 1 { - return fmt.Errorf("Filename: %s requires valid extension.", filename) + return fmt.Errorf("filename: %s requires valid extension", filename) } configType := ext[1:] if !stringInSlice(configType, SupportedExts) { @@ -1344,21 +1429,21 @@ func (v *Viper) writeConfig(filename string, force bool) error { if v.config == nil { v.config = make(map[string]interface{}) } - var flags int - if force == true { - flags = os.O_CREATE | os.O_TRUNC | os.O_WRONLY - } else { - if _, err := os.Stat(filename); os.IsNotExist(err) { - flags = os.O_WRONLY - } else { - return fmt.Errorf("File: %s exists. Use WriteConfig to overwrite.", filename) - } + flags := os.O_CREATE | os.O_TRUNC | os.O_WRONLY + if !force { + flags |= os.O_EXCL } f, err := v.fs.OpenFile(filename, flags, v.configPermissions) if err != nil { return err } - return v.marshalWriter(f, configType) + defer f.Close() + + if err := v.marshalWriter(f, configType); err != nil { + return err + } + + return f.Sync() } // Unmarshal a Reader into a map. @@ -1382,7 +1467,7 @@ func (v *Viper) unmarshalReader(in io.Reader, c map[string]interface{}) error { } case "hcl": - obj, err := hcl.Parse(string(buf.Bytes())) + obj, err := hcl.Parse(buf.String()) if err != nil { return ConfigParseError{err} } @@ -1400,6 +1485,15 @@ func (v *Viper) unmarshalReader(in io.Reader, c map[string]interface{}) error { c[k] = v } + case "dotenv", "env": + env, err := gotenv.StrictParse(buf) + if err != nil { + return ConfigParseError{err} + } + for k, v := range env { + c[k] = v + } + case "properties", "props", "prop": v.properties = properties.NewProperties() var err error @@ -1415,6 +1509,23 @@ func (v *Viper) unmarshalReader(in io.Reader, c map[string]interface{}) error { // set innermost value deepestMap[lastKey] = value } + + case "ini": + cfg := ini.Empty() + err := cfg.Append(buf.Bytes()) + if err != nil { + return ConfigParseError{err} + } + sections := cfg.Sections() + for i := 0; i < len(sections); i++ { + section := sections[i] + keys := section.Keys() + for j := 0; j < len(keys); j++ { + key := keys[j] + value := cfg.Section(section.Name()).Key(key.Name()).String() + c[section.Name()+"."+key.Name()] = value + } + } } insensitiviseMap(c) @@ -1422,9 +1533,6 @@ func (v *Viper) unmarshalReader(in io.Reader, c map[string]interface{}) error { } // Marshal a map into Writer. -func marshalWriter(f afero.File, configType string) error { - return v.marshalWriter(f, configType) -} func (v *Viper) marshalWriter(f afero.File, configType string) error { c := v.AllSettings() switch configType { @@ -1440,6 +1548,9 @@ func (v *Viper) marshalWriter(f afero.File, configType string) error { case "hcl": b, err := json.Marshal(c) + if err != nil { + return ConfigMarshalError{err} + } ast, err := hcl.Parse(string(b)) if err != nil { return ConfigMarshalError{err} @@ -1465,6 +1576,18 @@ func (v *Viper) marshalWriter(f afero.File, configType string) error { return ConfigMarshalError{err} } + case "dotenv", "env": + lines := []string{} + for _, key := range v.AllKeys() { + envName := strings.ToUpper(strings.Replace(key, ".", "_", -1)) + val := v.Get(key) + lines = append(lines, fmt.Sprintf("%v=%v", envName, val)) + } + s := strings.Join(lines, "\n") + if _, err := f.WriteString(s); err != nil { + return ConfigMarshalError{err} + } + case "toml": t, err := toml.TreeFromMap(c) if err != nil { @@ -1483,6 +1606,22 @@ func (v *Viper) marshalWriter(f afero.File, configType string) error { if _, err = f.WriteString(string(b)); err != nil { return ConfigMarshalError{err} } + + case "ini": + keys := v.AllKeys() + cfg := ini.Empty() + ini.PrettyFormat = false + for i := 0; i < len(keys); i++ { + key := keys[i] + lastSep := strings.LastIndex(key, ".") + sectionName := key[:(lastSep)] + keyName := key[(lastSep + 1):] + if sectionName == "default" { + sectionName = "" + } + cfg.Section(sectionName).Key(keyName).SetValue(Get(key).(string)) + } + cfg.WriteTo(f) } return nil } @@ -1629,7 +1768,7 @@ func (v *Viper) getRemoteConfig(provider RemoteProvider) (map[string]interface{} func (v *Viper) watchKeyValueConfigOnChannel() error { for _, rp := range v.remoteProviders { respc, _ := RemoteConfig.WatchChannel(rp) - //Todo: Add quit channel + // Todo: Add quit channel go func(rc <-chan *RemoteResponse) { for { b := <-rc @@ -1665,7 +1804,7 @@ func (v *Viper) watchRemoteConfig(provider RemoteProvider) (map[string]interface } // AllKeys returns all keys holding a value, regardless of where they are set. -// Nested keys are returned with a v.keyDelim (= ".") separator +// Nested keys are returned with a v.keyDelim separator func AllKeys() []string { return v.AllKeys() } func (v *Viper) AllKeys() []string { m := map[string]bool{} @@ -1679,7 +1818,7 @@ func (v *Viper) AllKeys() []string { m = v.flattenAndMergeMap(m, v.defaults, "") // convert set of paths to list - a := []string{} + a := make([]string, 0, len(m)) for x := range m { a = append(a, x) } @@ -1688,7 +1827,7 @@ func (v *Viper) AllKeys() []string { // flattenAndMergeMap recursively flattens the given map into a map[string]bool // of key paths (used as a set, easier to manipulate than a []string): -// - each path is merged into a single key string, delimited with v.keyDelim (= ".") +// - each path is merged into a single key string, delimited with v.keyDelim // - if a path is shadowed by an earlier value in the initial shadow map, // it is skipped. // The resulting set of paths is merged to the given shadow set at the same time. @@ -1728,7 +1867,7 @@ func (v *Viper) flattenAndMergeMap(shadow map[string]bool, m map[string]interfac func (v *Viper) mergeFlatMap(shadow map[string]bool, m map[string]interface{}) map[string]bool { // scan keys outer: - for k, _ := range m { + for k := range m { path := strings.Split(k, v.keyDelim) // scan intermediate paths var parentKey string @@ -1837,6 +1976,10 @@ func (v *Viper) searchInPath(in string) (filename string) { } } + if b, _ := exists(v.fs, filepath.Join(in, v.configName)); b { + return filepath.Join(in, v.configName) + } + return "" } diff --git a/vendor/github.com/subosito/gotenv/.env b/vendor/github.com/subosito/gotenv/.env new file mode 100644 index 00000000..6405eca7 --- /dev/null +++ b/vendor/github.com/subosito/gotenv/.env @@ -0,0 +1 @@ +HELLO=world diff --git a/vendor/github.com/subosito/gotenv/.env.invalid b/vendor/github.com/subosito/gotenv/.env.invalid new file mode 100644 index 00000000..016d5e0c --- /dev/null +++ b/vendor/github.com/subosito/gotenv/.env.invalid @@ -0,0 +1 @@ +lol$wut diff --git a/vendor/github.com/subosito/gotenv/.gitignore b/vendor/github.com/subosito/gotenv/.gitignore new file mode 100644 index 00000000..2b8d4561 --- /dev/null +++ b/vendor/github.com/subosito/gotenv/.gitignore @@ -0,0 +1,3 @@ +*.test +*.out +annotate.json diff --git a/vendor/github.com/subosito/gotenv/.travis.yml b/vendor/github.com/subosito/gotenv/.travis.yml new file mode 100644 index 00000000..3370d5f4 --- /dev/null +++ b/vendor/github.com/subosito/gotenv/.travis.yml @@ -0,0 +1,10 @@ +language: go +go: + - 1.x +os: + - linux + - osx +script: + - go test -test.v -coverprofile=coverage.out -covermode=count +after_success: + - bash <(curl -s https://codecov.io/bash) diff --git a/vendor/github.com/subosito/gotenv/CHANGELOG.md b/vendor/github.com/subosito/gotenv/CHANGELOG.md new file mode 100644 index 00000000..67f68738 --- /dev/null +++ b/vendor/github.com/subosito/gotenv/CHANGELOG.md @@ -0,0 +1,47 @@ +# Changelog + +## [1.2.0] - 2019-08-03 + +### Added + +- Add `Must` helper to raise an error as panic. It can be used with `Load` and `OverLoad`. +- Add more tests to be 100% coverage. +- Add CHANGELOG +- Add more OS for the test: OSX and Windows + +### Changed + +- Reduce complexity and improve source code for having `A+` score in [goreportcard](https://goreportcard.com/report/github.com/subosito/gotenv). +- Updated README with mentions to all available functions + +### Removed + +- Remove `ErrFormat` +- Remove `MustLoad` and `MustOverload`, replaced with `Must` helper. + +## [1.1.1] - 2018-06-05 + +### Changed + +- Replace `os.Getenv` with `os.LookupEnv` to ensure that the environment variable is not set, by [radding](https://github.com/radding) + +## [1.1.0] - 2017-03-20 + +### Added + +- Supports carriage return in env +- Handle files with UTF-8 BOM + +### Changed + +- Whitespace handling + +### Fixed + +- Incorrect variable expansion +- Handling escaped '$' characters + +## [1.0.0] - 2014-10-05 + +First stable release. + diff --git a/vendor/github.com/subosito/gotenv/LICENSE b/vendor/github.com/subosito/gotenv/LICENSE new file mode 100644 index 00000000..f64ccaed --- /dev/null +++ b/vendor/github.com/subosito/gotenv/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013 Alif Rachmawadi + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/github.com/subosito/gotenv/README.md b/vendor/github.com/subosito/gotenv/README.md new file mode 100644 index 00000000..d610cdf0 --- /dev/null +++ b/vendor/github.com/subosito/gotenv/README.md @@ -0,0 +1,131 @@ +# gotenv + +[![Build Status](https://travis-ci.org/subosito/gotenv.svg?branch=master)](https://travis-ci.org/subosito/gotenv) +[![Build status](https://ci.appveyor.com/api/projects/status/wb2e075xkfl0m0v2/branch/master?svg=true)](https://ci.appveyor.com/project/subosito/gotenv/branch/master) +[![Coverage Status](https://badgen.net/codecov/c/github/subosito/gotenv)](https://codecov.io/gh/subosito/gotenv) +[![Go Report Card](https://goreportcard.com/badge/github.com/subosito/gotenv)](https://goreportcard.com/report/github.com/subosito/gotenv) +[![GoDoc](https://godoc.org/github.com/subosito/gotenv?status.svg)](https://godoc.org/github.com/subosito/gotenv) + +Load environment variables dynamically in Go. + +## Usage + +Put the gotenv package on your `import` statement: + +```go +import "github.com/subosito/gotenv" +``` + +To modify your app environment variables, `gotenv` expose 2 main functions: + +- `gotenv.Load` +- `gotenv.Apply` + +By default, `gotenv.Load` will look for a file called `.env` in the current working directory. + +Behind the scene, it will then load `.env` file and export the valid variables to the environment variables. Make sure you call the method as soon as possible to ensure it loads all variables, say, put it on `init()` function. + +Once loaded you can use `os.Getenv()` to get the value of the variable. + +Let's say you have `.env` file: + +``` +APP_ID=1234567 +APP_SECRET=abcdef +``` + +Here's the example of your app: + +```go +package main + +import ( + "github.com/subosito/gotenv" + "log" + "os" +) + +func init() { + gotenv.Load() +} + +func main() { + log.Println(os.Getenv("APP_ID")) // "1234567" + log.Println(os.Getenv("APP_SECRET")) // "abcdef" +} +``` + +You can also load other than `.env` file if you wish. Just supply filenames when calling `Load()`. It will load them in order and the first value set for a variable will win.: + +```go +gotenv.Load(".env.production", "credentials") +``` + +While `gotenv.Load` loads entries from `.env` file, `gotenv.Apply` allows you to use any `io.Reader`: + +```go +gotenv.Apply(strings.NewReader("APP_ID=1234567")) + +log.Println(os.Getenv("APP_ID")) +// Output: "1234567" +``` + +Both `gotenv.Load` and `gotenv.Apply` **DO NOT** overrides existing environment variables. If you want to override existing ones, you can see section below. + +### Environment Overrides + +Besides above functions, `gotenv` also provides another functions that overrides existing: + +- `gotenv.OverLoad` +- `gotenv.OverApply` + + +Here's the example of this overrides behavior: + +```go +os.Setenv("HELLO", "world") + +// NOTE: using Apply existing value will be reserved +gotenv.Apply(strings.NewReader("HELLO=universe")) +fmt.Println(os.Getenv("HELLO")) +// Output: "world" + +// NOTE: using OverApply existing value will be overridden +gotenv.OverApply(strings.NewReader("HELLO=universe")) +fmt.Println(os.Getenv("HELLO")) +// Output: "universe" +``` + +### Throw a Panic + +Both `gotenv.Load` and `gotenv.OverLoad` returns an error on something wrong occurred, like your env file is not exist, and so on. To make it easier to use, `gotenv` also provides `gotenv.Must` helper, to let it panic when an error returned. + +```go +err := gotenv.Load(".env-is-not-exist") +fmt.Println("error", err) +// error: open .env-is-not-exist: no such file or directory + +gotenv.Must(gotenv.Load, ".env-is-not-exist") +// it will throw a panic +// panic: open .env-is-not-exist: no such file or directory +``` + +### Another Scenario + +Just in case you want to parse environment variables from any `io.Reader`, gotenv keeps its `Parse` and `StrictParse` function as public API so you can use that. + +```go +// import "strings" + +pairs := gotenv.Parse(strings.NewReader("FOO=test\nBAR=$FOO")) +// gotenv.Env{"FOO": "test", "BAR": "test"} + +err, pairs = gotenv.StrictParse(strings.NewReader(`FOO="bar"`)) +// gotenv.Env{"FOO": "bar"} +``` + +`Parse` ignores invalid lines and returns `Env` of valid environment variables, while `StrictParse` returns an error for invalid lines. + +## Notes + +The gotenv package is a Go port of [`dotenv`](https://github.com/bkeepers/dotenv) project with some additions made for Go. For general features, it aims to be compatible as close as possible. diff --git a/vendor/github.com/subosito/gotenv/appveyor.yml b/vendor/github.com/subosito/gotenv/appveyor.yml new file mode 100644 index 00000000..33b4c404 --- /dev/null +++ b/vendor/github.com/subosito/gotenv/appveyor.yml @@ -0,0 +1,9 @@ +build: off +clone_folder: c:\gopath\src\github.com\subosito\gotenv +environment: + GOPATH: c:\gopath +stack: go 1.10 +before_test: + - go get -t +test_script: + - go test -v -cover -race diff --git a/vendor/github.com/subosito/gotenv/gotenv.go b/vendor/github.com/subosito/gotenv/gotenv.go new file mode 100644 index 00000000..745a3448 --- /dev/null +++ b/vendor/github.com/subosito/gotenv/gotenv.go @@ -0,0 +1,265 @@ +// Package gotenv provides functionality to dynamically load the environment variables +package gotenv + +import ( + "bufio" + "fmt" + "io" + "os" + "regexp" + "strings" +) + +const ( + // Pattern for detecting valid line format + linePattern = `\A\s*(?:export\s+)?([\w\.]+)(?:\s*=\s*|:\s+?)('(?:\'|[^'])*'|"(?:\"|[^"])*"|[^#\n]+)?\s*(?:\s*\#.*)?\z` + + // Pattern for detecting valid variable within a value + variablePattern = `(\\)?(\$)(\{?([A-Z0-9_]+)?\}?)` +) + +// Env holds key/value pair of valid environment variable +type Env map[string]string + +/* +Load is a function to load a file or multiple files and then export the valid variables into environment variables if they do not exist. +When it's called with no argument, it will load `.env` file on the current path and set the environment variables. +Otherwise, it will loop over the filenames parameter and set the proper environment variables. +*/ +func Load(filenames ...string) error { + return loadenv(false, filenames...) +} + +/* +OverLoad is a function to load a file or multiple files and then export and override the valid variables into environment variables. +*/ +func OverLoad(filenames ...string) error { + return loadenv(true, filenames...) +} + +/* +Must is wrapper function that will panic when supplied function returns an error. +*/ +func Must(fn func(filenames ...string) error, filenames ...string) { + if err := fn(filenames...); err != nil { + panic(err.Error()) + } +} + +/* +Apply is a function to load an io Reader then export the valid variables into environment variables if they do not exist. +*/ +func Apply(r io.Reader) error { + return parset(r, false) +} + +/* +OverApply is a function to load an io Reader then export and override the valid variables into environment variables. +*/ +func OverApply(r io.Reader) error { + return parset(r, true) +} + +func loadenv(override bool, filenames ...string) error { + if len(filenames) == 0 { + filenames = []string{".env"} + } + + for _, filename := range filenames { + f, err := os.Open(filename) + if err != nil { + return err + } + + err = parset(f, override) + if err != nil { + return err + } + + f.Close() + } + + return nil +} + +// parse and set :) +func parset(r io.Reader, override bool) error { + env, err := StrictParse(r) + if err != nil { + return err + } + + for key, val := range env { + setenv(key, val, override) + } + + return nil +} + +func setenv(key, val string, override bool) { + if override { + os.Setenv(key, val) + } else { + if _, present := os.LookupEnv(key); !present { + os.Setenv(key, val) + } + } +} + +// Parse is a function to parse line by line any io.Reader supplied and returns the valid Env key/value pair of valid variables. +// It expands the value of a variable from the environment variable but does not set the value to the environment itself. +// This function is skipping any invalid lines and only processing the valid one. +func Parse(r io.Reader) Env { + env, _ := StrictParse(r) + return env +} + +// StrictParse is a function to parse line by line any io.Reader supplied and returns the valid Env key/value pair of valid variables. +// It expands the value of a variable from the environment variable but does not set the value to the environment itself. +// This function is returning an error if there are any invalid lines. +func StrictParse(r io.Reader) (Env, error) { + env := make(Env) + scanner := bufio.NewScanner(r) + + i := 1 + bom := string([]byte{239, 187, 191}) + + for scanner.Scan() { + line := scanner.Text() + + if i == 1 { + line = strings.TrimPrefix(line, bom) + } + + i++ + + err := parseLine(line, env) + if err != nil { + return env, err + } + } + + return env, nil +} + +func parseLine(s string, env Env) error { + rl := regexp.MustCompile(linePattern) + rm := rl.FindStringSubmatch(s) + + if len(rm) == 0 { + return checkFormat(s, env) + } + + key := rm[1] + val := rm[2] + + // determine if string has quote prefix + hdq := strings.HasPrefix(val, `"`) + + // determine if string has single quote prefix + hsq := strings.HasPrefix(val, `'`) + + // trim whitespace + val = strings.Trim(val, " ") + + // remove quotes '' or "" + rq := regexp.MustCompile(`\A(['"])(.*)(['"])\z`) + val = rq.ReplaceAllString(val, "$2") + + if hdq { + val = strings.Replace(val, `\n`, "\n", -1) + val = strings.Replace(val, `\r`, "\r", -1) + + // Unescape all characters except $ so variables can be escaped properly + re := regexp.MustCompile(`\\([^$])`) + val = re.ReplaceAllString(val, "$1") + } + + rv := regexp.MustCompile(variablePattern) + fv := func(s string) string { + return varReplacement(s, hsq, env) + } + + val = rv.ReplaceAllStringFunc(val, fv) + val = parseVal(val, env) + + env[key] = val + return nil +} + +func parseExport(st string, env Env) error { + if strings.HasPrefix(st, "export") { + vs := strings.SplitN(st, " ", 2) + + if len(vs) > 1 { + if _, ok := env[vs[1]]; !ok { + return fmt.Errorf("line `%s` has an unset variable", st) + } + } + } + + return nil +} + +func varReplacement(s string, hsq bool, env Env) string { + if strings.HasPrefix(s, "\\") { + return strings.TrimPrefix(s, "\\") + } + + if hsq { + return s + } + + sn := `(\$)(\{?([A-Z0-9_]+)\}?)` + rn := regexp.MustCompile(sn) + mn := rn.FindStringSubmatch(s) + + if len(mn) == 0 { + return s + } + + v := mn[3] + + replace, ok := env[v] + if !ok { + replace = os.Getenv(v) + } + + return replace +} + +func checkFormat(s string, env Env) error { + st := strings.TrimSpace(s) + + if (st == "") || strings.HasPrefix(st, "#") { + return nil + } + + if err := parseExport(st, env); err != nil { + return err + } + + return fmt.Errorf("line `%s` doesn't match format", s) +} + +func parseVal(val string, env Env) string { + if strings.Contains(val, "=") { + if !(val == "\n" || val == "\r") { + kv := strings.Split(val, "\n") + + if len(kv) == 1 { + kv = strings.Split(val, "\r") + } + + if len(kv) > 1 { + val = kv[0] + + for i := 1; i < len(kv); i++ { + parseLine(kv[i], env) + } + } + } + } + + return val +} diff --git a/vendor/github.com/valyala/fasttemplate/README.md b/vendor/github.com/valyala/fasttemplate/README.md index 3a4d56ce..2839ed0f 100644 --- a/vendor/github.com/valyala/fasttemplate/README.md +++ b/vendor/github.com/valyala/fasttemplate/README.md @@ -3,7 +3,7 @@ fasttemplate Simple and fast template engine for Go. -Fasttemplate peforms only a single task - it substitutes template placeholders +Fasttemplate performs only a single task - it substitutes template placeholders with user-defined values. At high speed :) Take a look at [quicktemplate](https://github.com/valyala/quicktemplate) if you need fast yet powerful html template engine. |