la5nta / pat

A cross-platform Winlink client written in Go
https://getpat.io
MIT License
500 stars 86 forks source link

[ARDOP/P2P] Message transfer fails with specific payloads #259

Open ggramaize opened 3 years ago

ggramaize commented 3 years ago

Hi again,

I've encountered a weird issue with P2P message transfers using ARDOP: for an unexplainable reason, some messages fail to transfer. I don't reproduce this issue with a telnet connection. For some reason, the receiving side seems not to accept the last frame, since the log shows the transfer failing before reaching 100%.

GZIP_EXPERIMENT doesn't seem to be involved because I've both tested with and without it, and the issue is reproducible in the same way.

Tested version

Pat v0.10.0 (601f6d3) linux/amd64 - go1.15.1 ARDOPC Version 1.0.4.1j-BPQ

Reproduction path

Set callsign to F4HOF on sending station. Set callsign to F4HOF-2 on receiving station. Setup receiving station to accept incoming ardop connections. Compose a new e-mail on sending station. Set To: field to F4HOF-2. Set Subject: field to Message de test. Tick P2P Only. Set the body as following:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam interdum neque hendrerit, cursus eros dapibus, cursus augue. Donec a imperdiet massa. Duis pharetra luctus libero, a suscipit tellus porta id. Integer nec commodo dui. Quisque imperdiet nulla at lorem rhoncus, euismod sollicitudin erat congue. Cras sollicitudin non nisl et aliquam. Nunc posuere dolor a tortor auctor, ac facilisis nisl laoreet. Pellentesque nec laoreet lorem.

Etiam eget velit a eros porttitor ullamcorper. Duis rutrum odio et accumsan placerat. Nam ligula lacus, luctus quis porta non, malesuada at turpis. Ut metus nulla, mattis at ultricies at, dictum eget leo. Vivamus vitae urna a est consequat blandit vel vitae mi. Curabitur cursus ultrices efficitur. Etiam tristique molestie nunc, ut lobortis quam congue eu. Cras sapien nisi, elementum et risus quis, feugiat sodales mi. Curabitur laoreet lorem eget massa vehicula porttitor. Suspendisse urna nulla, venenatis ac gravida eu, sodales nec orci.

Mauris et ex fermentum, vestibulum ex in, ultrices odio. Suspendisse odio mi, fringilla eu est eget, vestibulum rhoncus leo. Mauris in ultricies justo. Fusce at augue maximus, lobortis odio sit amet, sagittis urna. Nunc vel aliquet quam. Vivamus velit ligula, vehicula at auctor quis, facilisis nec felis. Sed ligula ipsum, sagittis ac ex nec, pharetra cursus sapien. Aliquam erat volutpat. Integer facilisis, ex sit amet venenatis ullamcorper, lorem nunc convallis lectus, sodales tempus arcu elit et urna. Maecenas maximus, ipsum at eleifend gravida, nisi justo tempor diam, sed tincidunt purus risus et odio. Sed eget ipsum ut est ultrices lobortis. Pellentesque lobortis turpis nec nulla bibendum, quis sagittis nulla accumsan. Duis molestie quam turpis. Donec feugiat diam dapibus tortor sodales fringilla. Sed libero felis, ornare eu sapien et, pharetra iaculis augue.

Ut at diam ut nunc fringilla dapibus ac non urna. In leo nunc, cursus id maximus nec, congue nec ligula. Fusce blandit consequat sem sit amet consectetur. Nam dolor leo, finibus eget lectus et, condimentum luctus nunc. Curabitur placerat laoreet risus at imperdiet. Aliquam eleifend nunc semper, lacinia ante quis, iaculis massa. Ut at volutpat nibh. Sed commodo, urna sit amet vulputate dignissim, tortor lorem ultrices elit, et volutpat dolor mi nec tellus. Nam vehicula arcu eget feugiat lacinia. In pulvinar, augue in feugiat laoreet, est libero scelerisque urna, eget eleifend mauris ante id augue. Morbi faucibus vulputate sapien.

Cras pellentesque elementum nisi vitae mattis. Nam a nisi in arcu placerat aliquet sit amet nec ligula. Morbi molestie pellentesque urna ut cursus. Nulla eu posuere ex. Etiam efficitur nulla nec luctus laoreet. Ut blandit et dui in feugiat. Nullam et auctor ligula. Nam et lorem eu erat finibus bibendum. Suspendisse et porta odio. Nunc vel lorem varius, faucibus justo eu, molestie sem. Ut ullamcorper condimentum semper. Curabitur vel dapibus ante, sed congue magna. Nam eget mi et nisl efficitur pulvinar a eu erat. Vestibulum pretium varius eleifend. Cras augue nisl, volutpat quis augue non, cursus sollicitudin enim. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.

Sed ac enim vitae neque ullamcorper accumsan. Quisque laoreet, justo pulvinar consectetur elementum, ipsum sem hendrerit massa, vitae tristique urna erat ac nibh. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nulla sit amet luctus quam, id convallis ante. Sed consequat lacus gravida elit luctus, et iaculis massa pretium. Mauris pharetra ipsum id eros convallis, sit amet suscipit magna tincidunt. Maecenas non hendrerit arcu, pulvinar malesuada enim. Aenean porttitor turpis vitae luctus hendrerit. Donec quis massa enim. Nulla eu velit ultrices massa tincidunt suscipit. Proin ut tortor luctus, suscipit arcu mollis, lacinia lectus. Integer posuere eu nunc id volutpat. Duis ligula libero, consequat pharetra hendrerit sit amet, eleifend molestie purus.

Maecenas porta cursus sem quis maximus. Nulla facilisi. Vivamus consectetur viverra feugiat. Ut porttitor ipsum ut orci dapibus, ac auctor mauris lobortis. Aliquam pharetra nulla et tortor posuere mattis. Etiam et turpis est. Maecenas et porta diam. Mauris et commodo mauris. Integer finibus enim at faucibus imperdiet. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec lorem augue, iaculis quis metus non, dignissim commodo augue. Ut laoreet turpis efficitur velit vestibulum ullamcorper. Pellentesque blandit sem id nibh auctor tempus. Pellentesque a purus eu tortor iaculis fringilla et non est.

Curabitur vitae lorem fermentum, varius nisi vitae, venenatis mauris. Cras consequat, turpis quis cursus placerat, arcu sapien maximus justo, ac posuere purus tellus nec lacus. Mauris sit amet bibendum nibh. Morbi quis sollicitudin arcu, a ornare felis. Praesent sed dolor efficitur erat auctor sagittis. Nam ut sagittis lorem, eget feugiat mauris. Suspendisse ultricies blandit aliquam. Curabitur vulputate vitae elit et pharetra. Curabitur rutrum ex iaculis commodo blandit. Ut nec purus sed nisi ornare blandit. Aliquam eu sapien et augue elementum fermentum. Duis eu arcu feugiat, placerat enim non, auctor arcu. Nunc semper, nunc eget ullamcorper tristique, magna turpis blandit eros, id consectetur diam nisi sed ligula. Aenean et aliquam nisl.

Integer sed porttitor tellus. Duis arcu risus, accumsan et euismod eget, feugiat a enim. Morbi sed nunc pharetra, tempor leo ut, congue augue. Aliquam sollicitudin augue ut erat convallis, ac feugiat nunc efficitur. Fusce iaculis metus in egestas tristique. Donec metus libero, vulputate ut vestibulum ut, volutpat ut purus. Vestibulum et mauris vel nibh aliquet interdum. Cras ullamcorper lacus a eros euismod, et iaculis nisi posuere. Nam feugiat nibh id libero aliquet fringilla. Suspendisse mi nibh, scelerisque quis nisi nec, dignissim condimentum ante. Etiam non purus erat. Aliquam rhoncus, enim eget lacinia aliquet, leo libero condimentum elit, et pretium dolor metus ut lacus. Donec facilisis justo nibh, sed tristique urna auctor et.

Ut placerat a ex vitae posuere. Proin velit erat, hendrerit bibendum elementum quis, viverra quis est. Curabitur sapien orci, vestibulum dapibus arcu vitae, accumsan molestie dui. In maximus ipsum ut odio consectetur ornare faucibus at libero. Praesent rutrum diam at tellus fringilla porta. Ut cursus tortor sit amet commodo malesuada. Sed sit amet velit non neque rhoncus maximus. Cras tempus mi ut fringilla vulputate. Donec egestas sapien velit, in accumsan orci vestibulum feugiat. Sed vel massa nibh. Mauris volutpat quam quis libero porta, vitae lacinia enim mollis. Curabitur bibendum aliquam mi, eget ultricies arcu finibus nec.

Proin eu neque leo. Donec sollicitudin turpis metus, eu varius leo eleifend tempor. Curabitur sit amet velit ut ex tristique efficitur nec quis orci. Donec at ornare urna, sed suscipit dui. In ac nisl ante. Nullam at convallis metus. Donec eget semper urna. Morbi vitae scelerisque justo. Morbi euismod commodo sapien, ac dignissim nibh ullamcorper et. Aliquam hendrerit maximus sapien. Donec tempor magna porttitor dictum bibendum. Cras nec ultricies lectus. Duis eu elit lacus. Ut placerat, leo vitae porttitor feugiat, magna nulla imperdiet erat, vitae dictum arcu enim et urna. Aliquam accumsan magna vel libero congue, non cursus sapien pulvinar.

Cras iaculis dolor sed sem dictum imperdiet vel ac nibh. Fusce egestas mollis tempor. Mauris eget augue sit amet quam lobortis tempor. Donec at sodales felis. Curabitur facilisis magna in scelerisque fermentum. Morbi at ullamcorper justo, congue rutrum velit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur risus sem, iaculis ut turpis ut, eleifend faucibus velit. Nullam vitae fermentum ligula. Donec at dapibus massa. Cras egestas malesuada vehicula. Mauris ac urna sit amet lacus aliquam sodales.

Donec sit amet vehicula sem. Aenean tempor magna id posuere egestas. Nunc in finibus augue. Nulla luctus magna in augue mollis pharetra. Mauris vulputate, justo eu hendrerit tincidunt, ante justo finibus mi, id ultrices est ligula molestie mi. Fusce vel metus vel sapien sodales iaculis. Quisque euismod nisl quis fringilla faucibus. Quisque ac fringilla elit. In hac habitasse platea dictumst. In aliquet dignissim enim id accumsan.

Morbi a diam felis. Suspendisse venenatis mauris lacinia, vulputate magna et, ultrices nunc. Cras dignissim iaculis neque sed venenatis. Maecenas et mattis augue. Aliquam erat volutpat. Nunc lacinia sit amet sem in molestie. Curabitur consectetur vulputate massa vitae porttitor.

Morbi consequat odio elit, ac fermentum purus elementum lobortis. Maecenas pretium, sem eu vehicula pharetra, purus tellus efficitur nulla, vitae volutpat velit sem quis sem. Duis non tincidunt eros. Integer feugiat ultrices ex. Interdum et malesuada fames ac ante ipsum primis in faucibus. Fusce posuere gravida tristique. Nam consequat vel lacus in porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Vivamus egestas, tellus nec cursus imperdiet, tellus dui elementum odio, suscipit elementum enim nisi at lectus. Nunc ut facilisis elit. Phasellus dictum vel nisl ac tempus. Duis purus justo, iaculis id consequat id, dignissim ut diam.

Etiam id pellentesque sem. Cras vel feugiat elit. Etiam finibus, magna sit amet sagittis ultrices, ipsum purus auctor tortor, a tristique mauris mi a lorem. Ut dictum lobortis elit, quis congue massa rhoncus eget. Fusce ut laoreet sem. Mauris dignissim porta varius. Aenean id nisl blandit, feugiat nisl sit amet, varius leo. Aliquam erat volutpat. Proin a congue augue. Aliquam quis varius tortor, eget tempus nibh. Maecenas interdum, lorem sed iaculis posuere, ipsum justo volutpat leo, accumsan ultrices sapien mauris vitae nunc.

Nunc nec sem non nunc dictum egestas nec id nunc. Vestibulum sit amet magna eros. Fusce quis gravida lectus. Nullam nibh libero, volutpat ut pretium quis, dignissim non sapien. Etiam sodales id purus in auctor. Nullam malesuada metus eget nulla convallis porta. Integer at sapien rhoncus, elementum nisl eget, euismod nibh. Maecenas interdum nisl at nibh fermentum varius. Pellentesque ultricies ipsum nec leo accumsan pellentesque. Quisque fringilla, mi vel fringilla iaculis, ipsum lorem accumsan diam, eget porta metus neque eu nulla. Nam efficitur ornare viverra. Fusce sed velit ullamcorper, interdum sapien eget, gravida augue. Nam diam augue, convallis ac diam a, consequat rhoncus purus. Fusce sed ex hendrerit, commodo ipsum id, vulputate nulla. Nam tincidunt, tortor sed fermentum commodo, est urna feugiat turpis, id pellentesque sapien urna gravida nibh. Donec id imperdiet odio.

Ut et lobortis leo. In rhoncus tellus ut laoreet auctor. Integer varius ac libero nec condimentum. Proin velit ante, hendrerit nec tortor non, congue placerat urna. Mauris elit dolor, sagittis id euismod quis, blandit id enim. Nunc dolor nibh, hendrerit sit amet nunc vel, mollis mattis justo. Vestibulum finibus urna magna, non vehicula felis auctor eget. Praesent finibus elementum mi eu sollicitudin. Proin eget ornare turpis. Nam consequat enim at tellus dictum sollicitudin.

Aenean quis sagittis arcu. Ut fringilla tellus ut odio ultricies tempus. Fusce consequat purus in tempus pharetra. Interdum et malesuada fames ac ante ipsum primis in faucibus. Suspendisse felis arcu, eleifend sed massa sit amet, semper gravida lorem. Mauris scelerisque, ante eget malesuada dapibus, nibh lorem vulputate felis, id scelerisque neque elit quis nisl. Suspendisse eu blandit nulla. In eu sem odio. Quisque quam metus, vulputate nec magna eget, varius volutpat est. Cras libero neque, rhoncus nec efficitur nec, efficitur non tortor.

Sed id accumsan enim, quis varius enim. Cras eros diam, sodales eu arcu eget, consequat elementum enim. Curabitur ut laoreet lorem. Fusce vitae hendrerit mauris. Fusce vestibulum mauris non ligula pharetra faucibus. Aliquam erat volutpat. In hac habitasse platea dictumst. Vivamus diam tortor, rutrum at purus in, imperdiet accumsan arcu. Donec vitae mollis massa.

Duis venenatis enim odio, quis placerat ipsum condimentum venenatis. Sed consectetur sem id augue mollis laoreet. Curabitur cursus fringilla est ac sollicitudin. In sit amet odio et diam egestas eleifend vitae in eros. Suspendisse potenti. Curabitur vel diam non risus luctus ornare. Duis molestie enim in arcu feugiat lacinia. Aliquam iaculis felis nec viverra fermentum. Nulla egestas justo turpis, nec commodo arcu tincidunt vulputate. Praesent id molestie dui. Pellentesque euismod felis lorem, sed vulputate est lobortis ac. Nulla facilisi.

Donec eget mauris sodales, euismod ipsum eu, mollis risus. Vestibulum quis dignissim lacus. Aliquam porttitor tristique lobortis. Ut cursus nibh sed turpis hendrerit, nec luctus lacus cursus. Mauris iaculis viverra dapibus. Sed at lorem non ex dictum convallis ut bibendum nisl. Mauris odio augue, suscipit in augue ac, tristique consequat quam. Proin nec tellus mauris. Sed id mollis quam, elementum lobortis lectus. Suspendisse et luctus nisi, a ornare mauris. Mauris bibendum, nulla vel mollis condimentum, enim mauris cursus eros, a finibus felis ex id eros. Curabitur bibendum turpis ut diam fringilla, vitae dictum augue luctus. Fusce purus orci, rutrum id blandit ut, sodales id felis. Donec non laoreet ipsum. Curabitur tortor nisi, vulputate id vestibulum eu, suscipit et purus.

Proin venenatis sodales sem, eget iaculis elit pharetra commodo. Aliquam eget ligula tempor, sagittis urna a, porttitor diam. Suspendisse potenti. Nunc pulvinar felis eget vulputate feugiat. Vestibulum mattis ultricies viverra. Integer tincidunt maximus faucibus. Donec sodales vel tellus nec pulvinar. Aenean imperdiet gravida lacus sed efficitur. Ut faucibus, quam ac lobortis ullamcorper, libero magna dignissim ipsum, vel molestie massa tortor et erat. Proin quis commodo est. Nulla tortor augue, ullamcorper tempus aliquam scelerisque, hendrerit non massa. Ut eu hendrerit lorem, a convallis justo. Nunc quam mauris, sollicitudin at diam non, mollis rutrum augue.

Morbi vulputate erat volutpat mollis rutrum. Aliquam euismod neque consequat sem pellentesque tempus. Proin molestie ipsum et pharetra mollis. Morbi bibendum, enim eu imperdiet aliquam, purus lectus lacinia magna, nec rhoncus nibh urna ac sem. Vivamus elit est, consequat quis venenatis a, pellentesque quis enim. Pellentesque vestibulum arcu eu iaculis fermentum. Proin id lacinia leo, nec mollis magna. Donec pretium rhoncus bibendum. Sed orci nibh, blandit vel risus a, ultricies blandit libero. Aenean quis aliquam nisi, vel aliquam leo. Nunc non turpis lobortis, venenatis sem ut, fermentum ante. Vestibulum id nunc aliquam, consequat massa et, dapibus massa.

Cras consectetur porta massa et vehicula. Nullam vitae neque ex. Morbi ac purus libero. Integer et purus vitae libero mollis tempor vitae nec quam. Maecenas non convallis libero. Vestibulum feugiat quam vitae suscipit blandit. Nunc molestie lectus a ex efficitur dapibus. Suspendisse commodo nisi sem, in mattis massa fringilla eu. Integer dolor metus, ultricies a diam non, vulputate posuere diam. Donec euismod tellus in sagittis tempus. Vestibulum pellentesque leo ac vestibulum vestibulum. Donec condimentum diam ut enim ultricies venenatis.

Suspendisse eget lacus metus. Vestibulum ut arcu et ligula viverra ullamcorper. Nunc blandit molestie lorem, vel hendrerit nulla elementum eu. Ut in mauris erat. Duis magna nisi, pharetra sed interdum et, tincidunt et nulla. Etiam id lacus tincidunt, viverra risus eget, mollis dolor. Vestibulum sed odio venenatis, accumsan velit accumsan, ultrices ex. Maecenas quis mattis odio. Sed at elit magna. Donec quis libero nec lacus vestibulum porta. Etiam bibendum sodales lectus, id faucibus justo semper a. Duis rhoncus ac urna nec blandit. Duis accumsan egestas sapien, sit amet feugiat tellus maximus ac. Duis ac faucibus nulla, at ultricies velit. Morbi id felis id mauris vehicula tincidunt. Vestibulum sit amet sapien velit.

Sed eu lectus mauris. Proin egestas, ante id rhoncus malesuada, ipsum ante bibendum lorem, id convallis odio urna posuere nunc. Vestibulum cursus porta odio quis dapibus. Quisque eu tellus hendrerit, vestibulum neque sed, dapibus tortor. Sed vulputate augue sed mi malesuada, id aliquam ipsum gravida. Duis mollis ante sed nisl porttitor, sit amet cursus mauris condimentum. Maecenas pulvinar nisi ut odio eleifend, quis viverra risus viverra. Donec viverra lectus nec purus ullamcorper tincidunt. Sed a leo aliquam, ultrices sapien eget, vestibulum est. Vivamus in massa quis nisi placerat malesuada sit amet nec lacus. Nunc pellentesque ante dolor, et mollis lectus cursus eu. Aenean risus ante, tincidunt eget scelerisque ut, auctor et lacus.

Phasellus vitae ante eget dolor semper maximus sit amet at lectus. Etiam dictum, mauris non ullamcorper efficitur, mi massa rhoncus nunc, nec accumsan lectus massa vel purus. Sed dapibus ante in tortor varius vehicula. Duis tempor augue ut leo bibendum sollicitudin. Nulla sagittis placerat dui eget aliquet. Mauris justo massa, fermentum interdum molestie vel, consectetur sed libero. Donec nec mauris et odio mollis tempor. Vivamus a libero nec risus fermentum efficitur. Etiam quis lacus feugiat nisl pulvinar accumsan. Nullam ac lacinia sapien. Phasellus vel fringilla purus. Duis hendrerit blandit suscipit. Mauris eu dapibus ipsum.

Integer sagittis, purus sit amet semper ultrices, urna arcu dignissim elit, id varius nisl nisi at dolor. Donec eget nunc nec ligula vulputate scelerisque. Duis mollis ipsum arcu, a dignissim odio tincidunt quis. Sed suscipit dui ac metus euismod sodales. Aliquam malesuada ante vitae tortor lacinia, nec tempus augue cursus. In hac habitasse platea dictumst. Duis convallis accumsan auctor. Integer cursus turpis eu sapien ultrices sagittis. Pellentesque quis lacus posuere, finibus quam tempus, sodales massa. Maecenas nec tincidunt orci, tempus aliquam nisi.

Sed at neque ut risus dictum hendrerit. Quisque in elit sollicitudin, tempor urna vitae, dapibus lorem. Nam volutpat est purus, ut placerat nisi mattis non. In vehicula aliquet purus, sed sagittis est placerat a. Etiam consectetur odio orci, eget tincidunt est iaculis id. In elit mauris, euismod ac nulla non, vehicula condimentum dui. Pellentesque eget ligula ipsum. Etiam volutpat elementum aliquam. Interdum et malesuada fames ac ante ipsum primis in faucibus. Nullam vel lectus lacus. Maecenas blandit ex ut iaculis molestie. Cras lacus mi, auctor sit amet dolor vel, posuere blandit ipsum. Aenean malesuada, augue ac pretium feugiat, purus mi imperdiet mi, in volutpat massa metus nec massa. Integer eu nisl dui. Donec a mauris sit amet mauris aliquet feugiat. 

Launch message transfer by connecting with the following parameters:

Here is the transfer log on the sending side, as indicated by pat:

2021/07/04 21:48:45 Connecting to F4HOF-2 (ardop)...
2021/07/04 21:48:54 Connected to F4HOF-2 (ardop)
Open source Winlink client - getpat.io
;FW: F4HOF-2
[Pat-0.10.0-B2FHM$]
; F4HOF DE F4HOF-2 (JN25EJ)>
>FC EM XDPFBO64XYW5 19235 7319 0
Sending checksum C6
FS +
Remote accepted XDPFBO64XYW5
Transmitting [Message de test] [offset 0]
Message de test: 100%
*** Bad checksum
2021/07/04 21:51:28 Exchange failed: Bad checksum

Here is the transfer log on the receiving side, as indicated by pat:

2021/07/04 21:48:53 Got connect (ardop:F4HOF)
2021/07/04 21:48:53 Connected to F4HOF (ardop)
;FW: F4HOF
[Pat-0.10.0-B2FHM$]
; F4HOF-2 DE F4HOF (JN25EK)
FC EM XDPFBO64XYW5 19235 7319 0
F> C6
1 proposal(s) received
Accepting XDPFBO64XYW5
Receiving [Message de test] [offset 0]
Message de test:  91%
2021/07/04 21:51:29 Exchange failed: Bad checksum

The following file regroups the network traces between pat and the modem for the transmitting and the receiving sides: ardopfail_traces.zip

The following file regroups the config files for both pat instances (Winlink password has been redacted): configs.zip

Kind regards,

martinhpedersen commented 3 years ago

Thanks for the detailed bug report @ggramaize šŸ™‚

Can you please confirm that both peers ran the same versions? Also, it would very helpful to know if this bug can be reproduced with arq_bandwidth set to 500 and/or with different hardware.

martinhpedersen commented 3 years ago

I haven't read through the network traces yet, but I believe it will be very useful to determine the root cause šŸ‘ So again, thank you! šŸ„‡

ggramaize commented 3 years ago

Hi Martin,

Can you please confirm that both peers ran the same versions?

Yes.

Also, it would very helpful to know if this bug can be reproduced with arq_bandwidth set to 500 and/or with different hardware.

Ok, I'll try with arq_bandwidth set to 500. As for the hardware, I've reproduced that issue with a direct audio path (sound cards connected back-to-back).

martinhpedersen commented 2 years ago

@ggramaize Were you able to reproduce with bw set to 500? Thanks šŸ™‚