@adminide-stack/yantra-mobile 12.0.69-alpha.20 โ†’ 12.0.69-alpha.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emojiKeywords.js","sources":["../../../src/features/messaging/emojiKeywords.ts"],"sourcesContent":["/**\n * Emoji search index for the Tapback picker: one emoji per line, then its words.\n * GENERATED by tools/gen-emoji-keywords.mjs from emojilib - do not edit by hand.\n */\n// prettier-ignore\nexport const EMOJI_KEYWORDS_SOURCE = `\n๐Ÿ˜€ grinning face smile happy joy grin\n๐Ÿ˜ƒ smiley face happy joy haha smile funny\n๐Ÿ˜„ smile face happy joy funny haha laugh like\n๐Ÿ˜ grin face happy smile joy kawaii\n๐Ÿ˜† laughing happy joy lol satisfied haha face glad xd laugh\n๐Ÿ˜… sweat smile face hot happy laugh relief\n๐Ÿ˜‚ joy face cry tears weep happy happytears haha\n๐Ÿคฃ rofl face rolling floor laughing lol haha\nโ˜บ๏ธ relaxed face blush massage happiness\n๐Ÿ˜Š blush face smile happy flushed crush embarrassed shy joy\n๐Ÿ˜‡ innocent face angel heaven halo\n๐Ÿ™‚ slightly smiling face smile\n๐Ÿ™ƒ upside down face flipped silly smile\n๐Ÿ˜‰ wink face happy mischievous secret smile eye\n๐Ÿ˜Œ relieved face relaxed phew massage happiness\n๐Ÿ˜ heart eyes face love like affection valentines infatuation crush\n๐Ÿฅฐ smiling face with three hearts love like affection valentines infatuation crush adore\n๐Ÿ˜˜ kissing heart face love like affection valentines infatuation kiss\n๐Ÿ˜— kissing love like face 3 valentines infatuation kiss\n๐Ÿ˜™ kissing smiling eyes face affection valentines infatuation kiss\n๐Ÿ˜š kissing closed eyes face love like affection valentines infatuation kiss\n๐Ÿ˜‹ yum happy joy tongue smile face silly yummy nom delicious savouring\n๐Ÿ˜› stuck out tongue face prank childish playful mischievous smile\n๐Ÿ˜ stuck out tongue closed eyes face prank playful mischievous smile\n๐Ÿ˜œ stuck out tongue winking eye face prank childish playful mischievous smile wink\n๐Ÿคช zany face goofy crazy\n๐Ÿคจ raised eyebrow face distrust scepticism disapproval disbelief surprise\n๐Ÿง monocle face stuffy wealthy\n๐Ÿค“ nerd face nerdy geek dork\n๐Ÿ˜Ž sunglasses face cool smile summer beach sunglass\n๐Ÿคฉ star struck face smile starry eyes grinning\n๐Ÿฅณ partying face celebration woohoo\n๐Ÿ˜ smirk face smile mean prank smug sarcasm\n๐Ÿ˜’ unamused indifference bored serious sarcasm unimpressed skeptical dubious\n๐Ÿ˜ž disappointed face sad upset depressed\n๐Ÿ˜” pensive face sad depressed upset\n๐Ÿ˜Ÿ worried face concern nervous\n๐Ÿ˜• confused face indifference huh weird hmmm\n๐Ÿ™ slightly frowning face disappointed sad upset\nโ˜น frowning face sad upset frown\n๐Ÿ˜ฃ persevere face sick no upset oops\n๐Ÿ˜– confounded face confused sick unwell oops\n๐Ÿ˜ซ tired face sick whine upset frustrated\n๐Ÿ˜ฉ weary face tired sleepy sad frustrated upset\n๐Ÿฅบ pleading face begging mercy\n๐Ÿ˜ข cry face tears sad depressed upset\n๐Ÿ˜ญ sob face cry tears sad upset depressed\n๐Ÿ˜ค triumph face gas phew proud pride\n๐Ÿ˜  angry mad face annoyed frustrated\n๐Ÿ˜ก rage angry mad hate despise\n๐Ÿคฌ symbols over mouth face swearing cursing cussing profanity expletive\n๐Ÿคฏ exploding head face shocked mind blown\n๐Ÿ˜ณ flushed face blush shy flattered\n๐Ÿฅต hot face feverish heat red sweating\n๐Ÿฅถ cold face blue freezing frozen frostbite icicles\n๐Ÿ˜ฑ scream face munch scared omg\n๐Ÿ˜จ fearful face scared terrified nervous oops huh\n๐Ÿ˜ฐ cold sweat face nervous\n๐Ÿ˜ฅ disappointed relieved face phew sweat nervous\n๐Ÿ˜“ sweat face hot sad tired exercise\n๐Ÿค— hugs face smile hug\n๐Ÿค” thinking face hmmm think consider\n๐Ÿคญ hand over mouth face whoops shock surprise\n๐Ÿคซ shushing face quiet shhh\n๐Ÿคฅ lying face lie pinocchio\n๐Ÿ˜ถ no mouth face hellokitty\n๐Ÿ˜ neutral face indifference meh\n๐Ÿ˜‘ expressionless face indifferent meh deadpan\n๐Ÿ˜ฌ grimacing face grimace teeth\n๐Ÿ™„ roll eyes face eyeroll frustrated\n๐Ÿ˜ฏ hushed face woo shh\n๐Ÿ˜ฆ frowning face aw what\n๐Ÿ˜ง anguished face stunned nervous\n๐Ÿ˜ฎ open mouth face surprise impressed wow whoa\n๐Ÿ˜ฒ astonished face xox surprised poisoned\n๐Ÿ˜ด sleeping face tired sleepy night zzz\n๐Ÿคค drooling face\n๐Ÿ˜ช sleepy face tired rest nap\n๐Ÿ˜ต dizzy face spent unconscious xox\n๐Ÿค zipper mouth face sealed secret\n๐Ÿฅด woozy face dizzy intoxicated tipsy wavy\n๐Ÿคข nauseated face vomit gross green sick ill\n๐Ÿคฎ vomiting face sick\n๐Ÿคง sneezing face gesundheit sneeze sick allergy\n๐Ÿ˜ท mask face sick ill disease\n๐Ÿค’ face with thermometer sick temperature cold fever\n๐Ÿค• face with head bandage injured clumsy hurt\n๐Ÿค‘ money mouth face rich dollar\n๐Ÿค  cowboy hat face cowgirl\n๐Ÿ˜ˆ smiling imp devil horns\n๐Ÿ‘ฟ imp devil angry horns\n๐Ÿ‘น japanese ogre monster red mask halloween scary creepy devil demon\n๐Ÿ‘บ japanese goblin red evil mask monster scary creepy\n๐Ÿคก clown face\n๐Ÿ’ฉ poop hankey shitface fail turd shit\n๐Ÿ‘ป ghost halloween spooky scary\n๐Ÿ’€ skull dead skeleton creepy death\nโ˜  skull and crossbones poison danger deadly scary death pirate evil\n๐Ÿ‘ฝ alien ufo paul weird\n๐Ÿ‘พ space invader game arcade play\n๐Ÿค– robot computer machine bot\n๐ŸŽƒ jack o lantern halloween light pumpkin creepy fall\n๐Ÿ˜บ smiley cat animal cats happy smile\n๐Ÿ˜ธ smile cat animal cats\n๐Ÿ˜น joy cat animal cats haha happy tears\n๐Ÿ˜ป heart eyes cat animal love like affection cats valentines\n๐Ÿ˜ผ smirk cat animal cats\n๐Ÿ˜ฝ kissing cat animal cats kiss\n๐Ÿ™€ scream cat animal cats munch scared\n๐Ÿ˜ฟ crying cat face animal tears weep sad cats upset cry\n๐Ÿ˜พ pouting cat animal cats\n๐Ÿคฒ palms up hands gesture cupped prayer\n๐Ÿ‘ open hands fingers butterfly\n๐Ÿ™Œ raised hands gesture hooray yea celebration\n๐Ÿ‘ clap hands praise applause congrats yay\n๐Ÿค handshake agreement shake\n๐Ÿ‘ thumbsup yes awesome good agree accept cool hand like\n๐Ÿ‘Ž 1 thumbsdown no dislike hand\n๐Ÿ‘Š facepunch angry violence fist hit attack hand\nโœŠ fist fingers hand grasp\n๐Ÿค› fist left hand fistbump\n๐Ÿคœ fist right hand fistbump\n๐Ÿคž crossed fingers good lucky\nโœŒ v fingers ohyeah hand peace victory two\n๐ŸคŸ love you hand fingers gesture\n๐Ÿค˜ metal hand fingers\n๐Ÿ‘Œ ok hand fingers limbs perfect okay\n๐Ÿ‘ˆ point left direction fingers hand\n๐Ÿ‘‰ point right fingers hand direction\nโ˜ point up hand fingers direction\n๐Ÿ‘‡ point down fingers hand direction\n๐Ÿ‘† point up 2 fingers hand direction\nโœ‹ raised hand fingers stop highfive palm ban\n๐Ÿคš raised back of hand fingers backhand\n๐Ÿ– raised hand with fingers splayed palm\n๐Ÿ–– vulcan salute hand fingers spock\n๐Ÿ‘‹ wave hands gesture goodbye solong farewell hello hi palm\n๐Ÿค™ call me hand hands gesture\n๐Ÿ’ช muscle arm flex hand summer strong biceps\n๐Ÿ–• fu hand fingers rude middle flipping\nโœ writing hand stationery write compose\n๐Ÿ™ pray please hope wish namaste highfive\n๐Ÿฆถ foot kick stomp\n๐Ÿฆต leg kick limb\n๐Ÿ’ ring wedding propose marriage valentines diamond fashion jewelry gem engagement\n๐Ÿ’„ lipstick female girl fashion woman\n๐Ÿ’‹ kiss face lips love like affection valentines\n๐Ÿ‘„ lips mouth kiss\n๐Ÿฆท tooth teeth dentist\n๐Ÿ‘… tongue mouth playful\n๐Ÿ‘‚ ear face hear sound listen\n๐Ÿ‘ƒ nose smell sniff\n๐Ÿ‘ฃ footprints feet tracking walking beach\n๐Ÿ‘ eye face look see watch stare\n๐Ÿ‘€ eyes look watch stalk peek see\n๐Ÿง  brain smart intelligent\n๐Ÿ—ฃ speaking head user person human sing say talk\n๐Ÿ‘ค bust in silhouette user person human\n๐Ÿ‘ฅ busts in silhouette user person human group team\n๐Ÿ‘ถ baby child boy girl toddler\n๐Ÿ‘ง girl female woman teenager\n๐Ÿง’ child young\n๐Ÿ‘ฆ boy man male guy teenager\n๐Ÿ‘ฉ woman female girls lady\n๐Ÿง‘ adult person\n๐Ÿ‘จ man mustache father dad guy classy sir moustache\n๐Ÿ‘ฑโ€โ™€๏ธ blonde woman female girl person\n๐Ÿ‘ฑ blonde man male boy guy person\n๐Ÿง” bearded person bewhiskered\n๐Ÿ‘ต older woman human female women lady old elder senior\n๐Ÿง“ older adult human elder senior\n๐Ÿ‘ด older man human male men old elder senior\n๐Ÿ‘ฒ man with gua pi mao male boy chinese\n๐Ÿง• woman with headscarf female hijab mantilla tichel\n๐Ÿ‘ณโ€โ™€๏ธ woman with turban female indian hinduism arabs\n๐Ÿ‘ณ man with turban male indian hinduism arabs\n๐Ÿ‘ฎโ€โ™€๏ธ policewoman woman police law legal enforcement arrest 911 female\n๐Ÿ‘ฎ policeman man police law legal enforcement arrest 911\n๐Ÿ‘ทโ€โ™€๏ธ construction worker woman female human wip build labor\n๐Ÿ‘ท construction worker man male human wip guy build labor\n๐Ÿ’‚โ€โ™€๏ธ guardswoman uk gb british female royal woman\n๐Ÿ’‚ guardsman uk gb british male guy royal\n๐Ÿ•ต๏ธโ€โ™€๏ธ female detective human spy woman\n๐Ÿ•ต male detective human spy\n๐Ÿ‘ฉโ€โš•๏ธ woman health worker doctor nurse therapist healthcare human\n๐Ÿ‘จโ€โš•๏ธ man health worker doctor nurse therapist healthcare human\n๐Ÿ‘ฉโ€๐ŸŒพ woman farmer rancher gardener human\n๐Ÿ‘จโ€๐ŸŒพ man farmer rancher gardener human\n๐Ÿ‘ฉโ€๐Ÿณ woman cook chef human\n๐Ÿ‘จโ€๐Ÿณ man cook chef human\n๐Ÿ‘ฉโ€๐ŸŽ“ woman student graduate human\n๐Ÿ‘จโ€๐ŸŽ“ man student graduate human\n๐Ÿ‘ฉโ€๐ŸŽค woman singer rockstar entertainer human\n๐Ÿ‘จโ€๐ŸŽค man singer rockstar entertainer human\n๐Ÿ‘ฉโ€๐Ÿซ woman teacher instructor professor human\n๐Ÿ‘จโ€๐Ÿซ man teacher instructor professor human\n๐Ÿ‘ฉโ€๐Ÿญ woman factory worker assembly industrial human\n๐Ÿ‘จโ€๐Ÿญ man factory worker assembly industrial human\n๐Ÿ‘ฉโ€๐Ÿ’ป woman technologist coder developer engineer programmer software human laptop computer\n๐Ÿ‘จโ€๐Ÿ’ป man technologist coder developer engineer programmer software human laptop computer\n๐Ÿ‘ฉโ€๐Ÿ’ผ woman office worker business manager human\n๐Ÿ‘จโ€๐Ÿ’ผ man office worker business manager human\n๐Ÿ‘ฉโ€๐Ÿ”ง woman mechanic plumber human wrench\n๐Ÿ‘จโ€๐Ÿ”ง man mechanic plumber human wrench\n๐Ÿ‘ฉโ€๐Ÿ”ฌ woman scientist biologist chemist engineer physicist human\n๐Ÿ‘จโ€๐Ÿ”ฌ man scientist biologist chemist engineer physicist human\n๐Ÿ‘ฉโ€๐ŸŽจ woman artist painter human\n๐Ÿ‘จโ€๐ŸŽจ man artist painter human\n๐Ÿ‘ฉโ€๐Ÿš’ woman firefighter fireman human\n๐Ÿ‘จโ€๐Ÿš’ man firefighter fireman human\n๐Ÿ‘ฉโ€โœˆ๏ธ woman pilot aviator plane human\n๐Ÿ‘จโ€โœˆ๏ธ man pilot aviator plane human\n๐Ÿ‘ฉโ€๐Ÿš€ woman astronaut space rocket human\n๐Ÿ‘จโ€๐Ÿš€ man astronaut space rocket human\n๐Ÿ‘ฉโ€โš–๏ธ woman judge justice court human\n๐Ÿ‘จโ€โš–๏ธ man judge justice court human\n๐Ÿ‘ฐ bride with veil couple marriage wedding woman\n๐Ÿคต man in tuxedo couple marriage wedding groom\n๐Ÿ‘ธ princess girl woman female blond crown royal queen\n๐Ÿคด prince boy man male crown royal king\n๐Ÿฆธโ€โ™€๏ธ woman superhero female good heroine superpowers\n๐Ÿฆธโ€โ™‚๏ธ man superhero male good hero superpowers\n๐Ÿฆนโ€โ™€๏ธ woman supervillain female evil bad criminal heroine superpowers\n๐Ÿฆนโ€โ™‚๏ธ man supervillain male evil bad criminal hero superpowers\n๐Ÿคถ mrs claus woman female xmas\n๐ŸŽ… santa festival man male xmas\n๐Ÿง™โ€โ™€๏ธ sorceress woman female mage witch\n๐Ÿง™โ€โ™‚๏ธ wizard man male mage sorcerer\n๐Ÿงโ€โ™€๏ธ woman elf female\n๐Ÿงโ€โ™‚๏ธ man elf male\n๐Ÿง›โ€โ™€๏ธ woman vampire female\n๐Ÿง›โ€โ™‚๏ธ man vampire male dracula\n๐ŸงŸโ€โ™€๏ธ woman zombie female undead\n๐ŸงŸโ€โ™‚๏ธ man zombie male dracula undead\n๐Ÿงžโ€โ™€๏ธ woman genie female\n๐Ÿงžโ€โ™‚๏ธ man genie male\n๐Ÿงœโ€โ™€๏ธ mermaid woman female merwoman ariel\n๐Ÿงœโ€โ™‚๏ธ merman man male triton\n๐Ÿงšโ€โ™€๏ธ woman fairy female\n๐Ÿงšโ€โ™‚๏ธ man fairy male\n๐Ÿ‘ผ angel heaven wings halo\n๐Ÿคฐ pregnant woman baby\n๐Ÿคฑ breastfeeding nursing baby\n๐Ÿ™‡โ€โ™€๏ธ bowing woman female girl\n๐Ÿ™‡ bowing man male boy\n๐Ÿ’ tipping hand woman female girl human information\n๐Ÿ’โ€โ™‚๏ธ tipping hand man male boy human information\n๐Ÿ™… no good woman female girl nope\n๐Ÿ™…โ€โ™‚๏ธ no good man male boy nope\n๐Ÿ™† ok woman women girl female pink human\n๐Ÿ™†โ€โ™‚๏ธ ok man men boy male blue human\n๐Ÿ™‹ raising hand woman female girl\n๐Ÿ™‹โ€โ™‚๏ธ raising hand man male boy\n๐Ÿคฆโ€โ™€๏ธ woman facepalming female girl disbelief\n๐Ÿคฆโ€โ™‚๏ธ man facepalming male boy disbelief\n๐Ÿคท woman shrugging female girl confused indifferent doubt\n๐Ÿคทโ€โ™‚๏ธ man shrugging male boy confused indifferent doubt\n๐Ÿ™Ž pouting woman female girl\n๐Ÿ™Žโ€โ™‚๏ธ pouting man male boy\n๐Ÿ™ frowning woman female girl sad depressed discouraged unhappy\n๐Ÿ™โ€โ™‚๏ธ frowning man male boy sad depressed discouraged unhappy\n๐Ÿ’‡ haircut woman female girl\n๐Ÿ’‡โ€โ™‚๏ธ haircut man male boy\n๐Ÿ’† massage woman female girl head\n๐Ÿ’†โ€โ™‚๏ธ massage man male boy head\n๐Ÿง–โ€โ™€๏ธ woman in steamy room female spa steamroom sauna\n๐Ÿง–โ€โ™‚๏ธ man in steamy room male spa steamroom sauna\n๐Ÿ’… nail care beauty manicure finger fashion\n๐Ÿคณ selfie camera phone\n๐Ÿ’ƒ dancer female girl woman fun\n๐Ÿ•บ man dancing male boy fun dancer\n๐Ÿ‘ฏ dancing women female bunny girls\n๐Ÿ‘ฏโ€โ™‚๏ธ dancing men male bunny boys\n๐Ÿ•ด business suit levitating levitate hover jump\n๐Ÿšถโ€โ™€๏ธ walking woman human feet steps female\n๐Ÿšถ walking man human feet steps\n๐Ÿƒโ€โ™€๏ธ running woman walking exercise race female\n๐Ÿƒ running man walking exercise race\n๐Ÿ‘ซ couple pair people human love date dating like affection valentines marriage\n๐Ÿ‘ญ two women holding hands pair friendship couple love like female people human\n๐Ÿ‘ฌ two men holding hands pair couple love like bromance friendship people human\n๐Ÿ’‘ couple with heart woman man pair love like affection human dating valentines marriage\n๐Ÿ‘ฉโ€โค๏ธโ€๐Ÿ‘ฉ couple with heart woman pair love like affection human dating valentines marriage\n๐Ÿ‘จโ€โค๏ธโ€๐Ÿ‘จ couple with heart man pair love like affection human dating valentines marriage\n๐Ÿ’ couplekiss man woman pair valentines love like dating marriage\n๐Ÿ‘ฉโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ couplekiss woman pair valentines love like dating marriage\n๐Ÿ‘จโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ couplekiss man pair valentines love like dating marriage\n๐Ÿ‘ช family man woman boy home parents child mom dad father mother people human\n๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ง family man woman girl home parents people human child\n๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ family man woman girl boy home parents people human children\n๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ family man woman boy home parents people human children\n๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง family man woman girl home parents people human children\n๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆ family woman boy home parents people human children\n๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ง family woman girl home parents people human children\n๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ family woman girl boy home parents people human children\n๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ family woman boy home parents people human children\n๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง family woman girl home parents people human children\n๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ฆ family man boy home parents people human children\n๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ง family man girl home parents people human children\n๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ฆ family man girl boy home parents people human children\n๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ family man boy home parents people human children\n๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ง family man girl home parents people human children\n๐Ÿ‘ฉโ€๐Ÿ‘ฆ family woman boy home parent people human child\n๐Ÿ‘ฉโ€๐Ÿ‘ง family woman girl home parent people human child\n๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ family woman girl boy home parent people human children\n๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ family woman boy home parent people human children\n๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง family woman girl home parent people human children\n๐Ÿ‘จโ€๐Ÿ‘ฆ family man boy home parent people human child\n๐Ÿ‘จโ€๐Ÿ‘ง family man girl home parent people human child\n๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ฆ family man girl boy home parent people human children\n๐Ÿ‘จโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ family man boy home parent people human children\n๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ง family man girl home parent people human children\n๐Ÿงถ yarn ball crochet knit\n๐Ÿงต thread needle sewing spool string\n๐Ÿงฅ coat jacket\n๐Ÿฅผ labcoat doctor experiment scientist chemist\n๐Ÿ‘š womans clothes fashion female\n๐Ÿ‘• tshirt fashion cloth casual shirt tee\n๐Ÿ‘– jeans fashion shopping\n๐Ÿ‘” necktie shirt suitup formal fashion cloth business\n๐Ÿ‘— dress clothes fashion shopping\n๐Ÿ‘™ bikini swimming female woman girl fashion beach summer\n๐Ÿ‘˜ kimono dress fashion women female japanese\n๐Ÿฅฟ flat shoe ballet slipper\n๐Ÿ‘  high heel fashion shoes female pumps stiletto\n๐Ÿ‘ก sandal shoes fashion\n๐Ÿ‘ข boot shoes fashion\n๐Ÿ‘ž mans shoe fashion male\n๐Ÿ‘Ÿ athletic shoe shoes sports sneakers\n๐Ÿฅพ hiking boot backpacking camping\n๐Ÿงฆ socks stockings clothes\n๐Ÿงค gloves hands winter clothes\n๐Ÿงฃ scarf neck winter clothes\n๐ŸŽฉ tophat magic gentleman classy circus\n๐Ÿงข billed hat cap baseball\n๐Ÿ‘’ womans hat fashion accessories female lady spring\n๐ŸŽ“ mortar board school college degree university graduation cap hat legal learn education\nโ›‘ rescue worker helmet construction build\n๐Ÿ‘‘ crown king kod leader royalty lord\n๐Ÿ‘ pouch bag accessories shopping\n๐Ÿ‘› purse fashion accessories money sales shopping\n๐Ÿ‘œ handbag fashion accessory accessories shopping\n๐Ÿ’ผ briefcase business documents work law legal job career\n๐ŸŽ’ school satchel student education bag backpack\n๐Ÿงณ luggage packing travel\n๐Ÿ‘“ eyeglasses fashion accessories eyesight nerdy dork geek\n๐Ÿ•ถ dark sunglasses face cool accessories\n๐Ÿฅฝ goggles eyes protection safety\n๐ŸŒ‚ closed umbrella weather rain drizzle\n๐Ÿถ dog animal friend nature woof puppy pet faithful\n๐Ÿฑ cat animal meow nature pet kitten\n๐Ÿญ mouse animal nature rodent\n๐Ÿน hamster animal nature\n๐Ÿฐ rabbit animal nature pet spring magic bunny\n๐ŸฆŠ fox face animal nature\n๐Ÿป bear animal nature wild\n๐Ÿผ panda face animal nature\n๐Ÿจ koala animal nature\n๐Ÿฏ tiger animal cat danger wild nature roar\n๐Ÿฆ lion animal nature\n๐Ÿฎ cow beef ox animal nature moo milk\n๐Ÿท pig animal oink nature\n๐Ÿฝ pig nose animal oink\n๐Ÿธ frog animal nature croak toad\n๐Ÿต monkey face animal nature circus\n๐Ÿ™ˆ see no evil monkey animal nature haha\n๐Ÿ™‰ hear no evil animal monkey nature\n๐Ÿ™Š speak no evil monkey animal nature omg\n๐Ÿ’ monkey animal nature banana circus\n๐Ÿ” chicken animal cluck nature bird\n๐Ÿง penguin animal nature\n๐Ÿฆ bird animal nature fly tweet spring\n๐Ÿค baby chick animal chicken bird\n๐Ÿฃ hatching chick animal chicken egg born baby bird\n๐Ÿฅ hatched chick animal chicken baby bird\n๐Ÿฆ† duck animal nature bird mallard\n๐Ÿฆ… eagle animal nature bird\n๐Ÿฆ‰ owl animal nature bird hoot\n๐Ÿฆ‡ bat animal nature blind vampire\n๐Ÿบ wolf animal nature wild\n๐Ÿ— boar animal nature\n๐Ÿด horse animal brown nature\n๐Ÿฆ„ unicorn animal nature mystical\n๐Ÿ honeybee animal insect nature bug spring honey\n๐Ÿ› bug animal insect nature worm\n๐Ÿฆ‹ butterfly animal insect nature caterpillar\n๐ŸŒ snail slow animal shell\n๐Ÿš shell nature sea beach\n๐Ÿž beetle animal insect nature ladybug\n๐Ÿœ ant animal insect nature bug\n๐ŸฆŸ mosquito animal nature insect malaria\n๐Ÿฆ— grasshopper animal cricket chirp\n๐Ÿ•ท spider animal arachnid\n๐Ÿ•ธ spider web animal insect arachnid silk\n๐Ÿฆ‚ scorpion animal arachnid\n๐Ÿข turtle animal slow nature tortoise\n๐Ÿ snake animal evil nature hiss python\n๐ŸฆŽ lizard animal nature reptile\n๐Ÿฆ– t rex animal nature dinosaur tyrannosaurus extinct\n๐Ÿฆ• sauropod animal nature dinosaur brachiosaurus brontosaurus diplodocus extinct\n๐Ÿ™ octopus animal creature ocean sea nature beach\n๐Ÿฆ‘ squid animal nature ocean sea\n๐Ÿฆ shrimp animal ocean nature seafood\n๐Ÿฆž lobster animal nature bisque claws seafood\n๐Ÿฆ€ crab animal crustacean\n๐Ÿก blowfish animal nature food sea ocean\n๐Ÿ  tropical fish animal swim ocean beach nemo\n๐ŸŸ fish animal food nature\n๐Ÿฌ dolphin animal nature fish sea ocean flipper fins beach\n๐Ÿณ whale animal nature sea ocean\n๐Ÿ‹ whale2 animal nature sea ocean\n๐Ÿฆˆ shark animal nature fish sea ocean jaws fins beach\n๐ŸŠ crocodile animal nature reptile lizard alligator\n๐Ÿ… tiger2 animal nature roar\n๐Ÿ† leopard animal nature\n๐Ÿฆ“ zebra animal nature stripes safari\n๐Ÿฆ gorilla animal nature circus\n๐Ÿ˜ elephant animal nature nose th circus\n๐Ÿฆ› hippopotamus animal nature\n๐Ÿฆ rhinoceros animal nature horn\n๐Ÿช dromedary camel animal hot desert hump\n๐Ÿฆ’ giraffe animal nature spots safari\n๐Ÿฆ˜ kangaroo animal nature australia joey hop marsupial\n๐Ÿซ camel animal nature hot desert hump\n๐Ÿƒ water buffalo animal nature ox cow\n๐Ÿ‚ ox animal cow beef\n๐Ÿ„ cow2 beef ox animal nature moo milk\n๐ŸŽ racehorse animal gamble luck\n๐Ÿ– pig2 animal nature\n๐Ÿ ram animal sheep nature\n๐Ÿ‘ sheep animal nature wool shipit\n๐Ÿฆ™ llama animal nature alpaca\n๐Ÿ goat animal nature\n๐ŸฆŒ deer animal nature horns venison\n๐Ÿ• dog2 animal nature friend doge pet faithful\n๐Ÿฉ poodle dog animal 101 nature pet\n๐Ÿˆ cat2 animal meow pet cats\n๐Ÿ“ rooster animal nature chicken\n๐Ÿฆƒ turkey animal bird\n๐Ÿฆš peacock animal nature peahen bird\n๐Ÿฆœ parrot animal nature bird pirate talk\n๐Ÿฆข swan animal nature bird\n๐Ÿ•Š dove animal bird\n๐Ÿ‡ rabbit2 animal nature pet magic spring\n๐Ÿฆ raccoon animal nature\n๐Ÿฆก badger animal nature honey\n๐Ÿ€ rat animal mouse rodent\n๐Ÿ mouse2 animal nature rodent\n๐Ÿฟ chipmunk animal nature rodent squirrel\n๐Ÿฆ” hedgehog animal nature spiny\n๐Ÿพ paw prints animal tracking footprints dog cat pet feet\n๐Ÿ‰ dragon animal myth nature chinese green\n๐Ÿฒ dragon face animal myth nature chinese green\n๐ŸŒต cactus vegetable plant nature\n๐ŸŽ„ christmas tree festival vacation december xmas celebration\n๐ŸŒฒ evergreen tree plant nature\n๐ŸŒณ deciduous tree plant nature\n๐ŸŒด palm tree plant vegetable nature summer beach mojito tropical\n๐ŸŒฑ seedling plant nature grass lawn spring\n๐ŸŒฟ herb vegetable plant medicine weed grass lawn\nโ˜˜ shamrock vegetable plant nature irish clover\n๐Ÿ€ four leaf clover vegetable plant nature lucky irish\n๐ŸŽ bamboo plant nature vegetable panda\n๐ŸŽ‹ tanabata tree plant nature branch summer\n๐Ÿƒ leaves nature plant tree vegetable grass lawn spring\n๐Ÿ‚ fallen leaf nature plant vegetable leaves\n๐Ÿ maple leaf nature plant vegetable ca fall\n๐ŸŒพ ear of rice nature plant\n๐ŸŒบ hibiscus plant vegetable flowers beach\n๐ŸŒป sunflower nature plant fall\n๐ŸŒน rose flowers valentines love spring\n๐Ÿฅ€ wilted flower plant nature\n๐ŸŒท tulip flowers plant nature summer spring\n๐ŸŒผ blossom nature flowers yellow\n๐ŸŒธ cherry blossom nature plant spring flower\n๐Ÿ’ bouquet flowers nature spring\n๐Ÿ„ mushroom plant vegetable\n๐ŸŒŽ earth americas globe world usa international\n๐ŸŒ earth africa globe world international\n๐ŸŒ earth asia globe world east international\n๐ŸŒ• full moon nature yellow twilight planet space night evening sleep\n๐ŸŒ– waning gibbous moon nature twilight planet space night evening sleep\n๐ŸŒ— last quarter moon nature twilight planet space night evening sleep\n๐ŸŒ˜ waning crescent moon nature twilight planet space night evening sleep\n๐ŸŒ‘ new moon nature twilight planet space night evening sleep\n๐ŸŒ’ waxing crescent moon nature twilight planet space night evening sleep\n๐ŸŒ“ first quarter moon nature twilight planet space night evening sleep\n๐ŸŒ” waxing gibbous moon nature night sky gray twilight planet space evening sleep\n๐ŸŒš new moon with face nature twilight planet space night evening sleep\n๐ŸŒ full moon with face nature twilight planet space night evening sleep\n๐ŸŒ› first quarter moon with face nature twilight planet space night evening sleep\n๐ŸŒœ last quarter moon with face nature twilight planet space night evening sleep\n๐ŸŒž sun with face nature morning sky\n๐ŸŒ™ crescent moon night sleep sky evening magic\nโญ star night yellow\n๐ŸŒŸ star2 night sparkle awesome good magic\n๐Ÿ’ซ dizzy star sparkle shoot magic\nโœจ sparkles stars shine shiny cool awesome good magic\nโ˜„ comet space\nโ˜€๏ธ sunny weather nature brightness summer beach spring\n๐ŸŒค sun behind small cloud weather\nโ›… partly sunny weather nature cloudy morning fall spring\n๐ŸŒฅ sun behind large cloud weather\n๐ŸŒฆ sun behind rain cloud weather\nโ˜๏ธ cloud weather sky\n๐ŸŒง cloud with rain weather\nโ›ˆ cloud with lightning and rain weather\n๐ŸŒฉ cloud with lightning weather thunder\nโšก zap thunder weather fast\n๐Ÿ”ฅ fire hot cook flame\n๐Ÿ’ฅ boom bomb explode explosion collision blown\nโ„๏ธ snowflake winter season cold weather christmas xmas\n๐ŸŒจ cloud with snow weather\nโ›„ snowman winter season cold weather christmas xmas frozen\nโ˜ƒ snowman with snow winter season cold weather christmas xmas frozen\n๐ŸŒฌ wind face gust air\n๐Ÿ’จ dash wind air fast shoo fart smoke puff\n๐ŸŒช tornado weather cyclone twister\n๐ŸŒซ fog weather\nโ˜‚ open umbrella weather spring\nโ˜” umbrella rainy weather spring\n๐Ÿ’ง droplet water drip faucet spring\n๐Ÿ’ฆ sweat drops water drip oops\n๐ŸŒŠ ocean sea water wave nature tsunami disaster\n๐Ÿ green apple fruit nature\n๐ŸŽ apple fruit mac school\n๐Ÿ pear fruit nature food\n๐ŸŠ tangerine food fruit nature orange\n๐Ÿ‹ lemon fruit nature\n๐ŸŒ banana fruit food monkey\n๐Ÿ‰ watermelon fruit food picnic summer\n๐Ÿ‡ grapes fruit food wine\n๐Ÿ“ strawberry fruit food nature\n๐Ÿˆ melon fruit nature food\n๐Ÿ’ cherries food fruit\n๐Ÿ‘ peach fruit nature food\n๐Ÿฅญ mango fruit food tropical\n๐Ÿ pineapple fruit nature food\n๐Ÿฅฅ coconut fruit nature food palm\n๐Ÿฅ kiwi fruit food\n๐Ÿ… tomato fruit vegetable nature food\n๐Ÿ† eggplant vegetable nature food aubergine\n๐Ÿฅ‘ avocado fruit food\n๐Ÿฅฆ broccoli fruit food vegetable\n๐Ÿฅฌ leafy greens food vegetable plant cabbage kale lettuce\n๐Ÿฅ’ cucumber fruit food pickle\n๐ŸŒถ hot pepper food spicy chilli chili\n๐ŸŒฝ corn food vegetable plant\n๐Ÿฅ• carrot vegetable food orange\n๐Ÿฅ” potato food tuber vegatable starch\n๐Ÿ  sweet potato food nature\n๐Ÿฅ croissant food bread french\n๐Ÿฅฏ bagel food bread bakery schmear\n๐Ÿž bread food wheat breakfast toast\n๐Ÿฅ– baguette bread food french\n๐Ÿฅจ pretzel food bread twisted\n๐Ÿง€ cheese food chadder\n๐Ÿฅš egg food chicken breakfast\n๐Ÿณ fried egg food breakfast kitchen\n๐Ÿฅž pancakes food breakfast flapjacks hotcakes\n๐Ÿฅ“ bacon food breakfast pork pig meat\n๐Ÿฅฉ steak food cow meat cut chop lambchop porkchop\n๐Ÿ— poultry leg food meat drumstick bird chicken turkey\n๐Ÿ– meat on bone good food drumstick\n๐Ÿฆด bone skeleton\n๐ŸŒญ hotdog food frankfurter\n๐Ÿ” hamburger meat beef cheeseburger mcdonalds\n๐ŸŸ fries chips snack\n๐Ÿ• pizza food party\n๐Ÿฅช sandwich food lunch bread\n๐Ÿฅ™ stuffed flatbread food gyro\n๐ŸŒฎ taco food mexican\n๐ŸŒฏ burrito food mexican\n๐Ÿฅ— green salad food healthy lettuce\n๐Ÿฅ˜ shallow pan of food cooking casserole paella\n๐Ÿฅซ canned food soup\n๐Ÿ spaghetti food italian noodle\n๐Ÿœ ramen food japanese noodle chopsticks\n๐Ÿฒ stew food meat soup\n๐Ÿ› curry food spicy hot indian\n๐Ÿฃ sushi food fish japanese rice\n๐Ÿฑ bento food japanese box\n๐Ÿค fried shrimp food animal appetizer summer\n๐Ÿ™ rice ball food japanese\n๐Ÿš rice food china asian\n๐Ÿ˜ rice cracker food japanese\n๐Ÿฅ fish cake food japan sea beach narutomaki pink swirl kamaboko surimi ramen\n๐Ÿฅ  fortune cookie food prophecy\n๐Ÿฅฎ moon cake food autumn\n๐Ÿข oden food japanese\n๐Ÿก dango food dessert sweet japanese barbecue meat\n๐Ÿง shaved ice hot dessert summer\n๐Ÿจ ice cream food hot dessert\n๐Ÿฆ icecream food hot dessert summer\n๐Ÿฅง pie food dessert pastry\n๐Ÿง cupcake food dessert bakery sweet\n๐Ÿฐ cake food dessert\n๐ŸŽ‚ birthday food dessert cake\n๐Ÿฎ custard dessert food\n๐Ÿญ lollipop food snack candy sweet\n๐Ÿฌ candy snack dessert sweet lolly\n๐Ÿซ chocolate bar food snack dessert sweet\n๐Ÿฟ popcorn food films snack\n๐Ÿฉ doughnut food dessert snack sweet donut\n๐ŸฅŸ dumpling food empanada pierogi potsticker\n๐Ÿช cookie food snack oreo chocolate sweet dessert\n๐ŸŒฐ chestnut food squirrel\n๐Ÿฅœ peanuts food nut\n๐Ÿฏ honey pot bees sweet kitchen\n๐Ÿฅ› milk glass beverage drink cow\n๐Ÿผ baby bottle food container milk\nโ˜• coffee beverage caffeine latte espresso\n๐Ÿต tea drink bowl breakfast green british\n๐Ÿฅค cup with straw drink soda\n๐Ÿถ sake wine drink drunk beverage japanese alcohol booze\n๐Ÿบ beer relax beverage drink drunk party pub summer alcohol booze\n๐Ÿป beers relax beverage drink drunk party pub summer alcohol booze\n๐Ÿฅ‚ clinking glasses beverage drink party alcohol celebrate cheers wine champagne toast\n๐Ÿท wine glass drink beverage drunk alcohol booze\n๐Ÿฅƒ tumbler glass drink beverage drunk alcohol liquor booze bourbon scotch whisky shot\n๐Ÿธ cocktail drink drunk alcohol beverage booze mojito\n๐Ÿน tropical drink beverage cocktail summer beach alcohol booze mojito\n๐Ÿพ champagne drink wine bottle celebration\n๐Ÿฅ„ spoon cutlery kitchen tableware\n๐Ÿด fork and knife cutlery kitchen\n๐Ÿฝ plate with cutlery food eat meal lunch dinner restaurant\n๐Ÿฅฃ bowl with spoon food breakfast cereal oatmeal porridge\n๐Ÿฅก takeout box food leftovers\n๐Ÿฅข chopsticks food\n๐Ÿง‚ salt condiment shaker\nโšฝ soccer sports football\n๐Ÿ€ basketball sports balls nba\n๐Ÿˆ football sports balls nfl\nโšพ baseball sports balls\n๐ŸฅŽ softball sports balls\n๐ŸŽพ tennis sports balls green\n๐Ÿ volleyball sports balls\n๐Ÿ‰ rugby football sports team\n๐Ÿฅ flying disc sports frisbee ultimate\n๐ŸŽฑ 8ball pool hobby game luck magic\nโ›ณ golf sports business flag hole summer\n๐ŸŒ๏ธโ€โ™€๏ธ golfing woman sports business female\n๐ŸŒ golfing man sports business\n๐Ÿ“ ping pong sports pingpong\n๐Ÿธ badminton sports\n๐Ÿฅ… goal net sports\n๐Ÿ’ ice hockey sports\n๐Ÿ‘ field hockey sports\n๐Ÿฅ lacrosse sports ball stick\n๐Ÿ cricket sports\n๐ŸŽฟ ski sports winter cold snow\nโ›ท skier sports winter snow\n๐Ÿ‚ snowboarder sports winter\n๐Ÿคบ person fencing sports sword\n๐Ÿคผโ€โ™€๏ธ women wrestling sports wrestlers\n๐Ÿคผโ€โ™‚๏ธ men wrestling sports wrestlers\n๐Ÿคธโ€โ™€๏ธ woman cartwheeling gymnastics\n๐Ÿคธโ€โ™‚๏ธ man cartwheeling gymnastics\n๐Ÿคพโ€โ™€๏ธ woman playing handball sports\n๐Ÿคพโ€โ™‚๏ธ man playing handball sports\nโ›ธ ice skate sports\n๐ŸฅŒ curling stone sports\n๐Ÿ›น skateboard board\n๐Ÿ›ท sled sleigh luge toboggan\n๐Ÿน bow and arrow sports\n๐ŸŽฃ fishing pole and fish food hobby summer\n๐ŸฅŠ boxing glove sports fighting\n๐Ÿฅ‹ martial arts uniform judo karate taekwondo\n๐Ÿšฃโ€โ™€๏ธ rowing woman sports hobby water ship female\n๐Ÿšฃ rowing man sports hobby water ship\n๐Ÿง—โ€โ™€๏ธ climbing woman sports hobby female rock\n๐Ÿง—โ€โ™‚๏ธ climbing man sports hobby male rock\n๐ŸŠโ€โ™€๏ธ swimming woman sports exercise human athlete water summer female\n๐ŸŠ swimming man sports exercise human athlete water summer\n๐Ÿคฝโ€โ™€๏ธ woman playing water polo sports pool\n๐Ÿคฝโ€โ™‚๏ธ man playing water polo sports pool\n๐Ÿง˜โ€โ™€๏ธ woman in lotus position female meditation yoga serenity zen mindfulness\n๐Ÿง˜โ€โ™‚๏ธ man in lotus position male meditation yoga serenity zen mindfulness\n๐Ÿ„โ€โ™€๏ธ surfing woman sports ocean sea summer beach female\n๐Ÿ„ surfing man sports ocean sea summer beach\nโ›น๏ธโ€โ™€๏ธ basketball woman sports human female\nโ›น basketball man sports human\n๐Ÿ‹๏ธโ€โ™€๏ธ weight lifting woman sports training exercise female\n๐Ÿ‹ weight lifting man sports training exercise\n๐Ÿšดโ€โ™€๏ธ biking woman sports bike exercise hipster female\n๐Ÿšด biking man sports bike exercise hipster\n๐Ÿšตโ€โ™€๏ธ mountain biking woman transportation sports human race bike female\n๐Ÿšต mountain biking man transportation sports human race bike\n๐Ÿ‡ horse racing animal betting competition gambling luck\n๐Ÿ† trophy win award contest place ftw ceremony\n๐ŸŽฝ running shirt with sash play pageant\n๐Ÿ… medal sports award winning\n๐ŸŽ– medal military award winning army\n๐Ÿฅ‡ 1st place medal award winning first\n๐Ÿฅˆ 2nd place medal award second\n๐Ÿฅ‰ 3rd place medal award third\n๐ŸŽ— reminder ribbon sports cause support awareness\n๐Ÿต rosette flower decoration military\n๐ŸŽซ ticket event concert pass\n๐ŸŽŸ tickets sports concert entrance\n๐ŸŽญ performing arts acting theater drama\n๐ŸŽจ art design paint draw colors\n๐ŸŽช circus tent festival carnival party\n๐Ÿคนโ€โ™€๏ธ woman juggling juggle balance skill multitask\n๐Ÿคนโ€โ™‚๏ธ man juggling juggle balance skill multitask\n๐ŸŽค microphone sound music pa sing talkshow\n๐ŸŽง headphones music score gadgets\n๐ŸŽผ musical score treble clef compose\n๐ŸŽน musical keyboard piano instrument compose\n๐Ÿฅ drum music instrument drumsticks snare\n๐ŸŽท saxophone music instrument jazz blues\n๐ŸŽบ trumpet music brass\n๐ŸŽธ guitar music instrument\n๐ŸŽป violin music instrument orchestra symphony\n๐ŸŽฌ clapper movie film record\n๐ŸŽฎ video game play console ps4 controller\n๐ŸŽฏ dart game play bar target bullseye\n๐ŸŽฒ game die dice random tabletop play luck\nโ™Ÿ chess pawn expendable\n๐ŸŽฐ slot machine bet gamble vegas luck casino\n๐Ÿงฉ jigsaw interlocking puzzle piece\n๐ŸŽณ bowling sports fun play\n๐Ÿš— red car transportation vehicle\n๐Ÿš• taxi uber vehicle cars transportation\n๐Ÿš™ blue car transportation vehicle\n๐ŸšŒ bus car vehicle transportation\n๐ŸšŽ trolleybus bart transportation vehicle\n๐ŸŽ racing car sports race fast formula f1\n๐Ÿš“ police car vehicle cars transportation law legal enforcement\n๐Ÿš‘ ambulance health 911 hospital\n๐Ÿš’ fire engine transportation cars vehicle\n๐Ÿš minibus vehicle car transportation\n๐Ÿšš truck cars transportation\n๐Ÿš› articulated lorry vehicle cars transportation express\n๐Ÿšœ tractor vehicle car farming agriculture\n๐Ÿ›ด kick scooter vehicle razor\n๐Ÿ motorcycle race sports fast\n๐Ÿšฒ bike sports bicycle exercise hipster\n๐Ÿ›ต motor scooter vehicle vespa sasha\n๐Ÿšจ rotating light police ambulance 911 emergency alert error pinged law legal\n๐Ÿš” oncoming police car vehicle law legal enforcement 911\n๐Ÿš oncoming bus vehicle transportation\n๐Ÿš˜ oncoming automobile car vehicle transportation\n๐Ÿš– oncoming taxi vehicle cars uber\n๐Ÿšก aerial tramway transportation vehicle ski\n๐Ÿš  mountain cableway transportation vehicle ski\n๐ŸšŸ suspension railway vehicle transportation\n๐Ÿšƒ railway car transportation vehicle\n๐Ÿš‹ train transportation vehicle carriage public travel\n๐Ÿš monorail transportation vehicle\n๐Ÿš„ bullettrain side transportation vehicle\n๐Ÿš… bullettrain front transportation vehicle speed fast public travel\n๐Ÿšˆ light rail transportation vehicle\n๐Ÿšž mountain railway transportation vehicle\n๐Ÿš‚ steam locomotive transportation vehicle train\n๐Ÿš† train2 transportation vehicle\n๐Ÿš‡ metro transportation mrt underground tube\n๐ŸšŠ tram transportation vehicle\n๐Ÿš‰ station transportation vehicle public\n๐Ÿ›ธ flying saucer transportation vehicle ufo\n๐Ÿš helicopter transportation vehicle fly\n๐Ÿ›ฉ small airplane flight transportation fly vehicle\nโœˆ๏ธ airplane vehicle transportation flight fly\n๐Ÿ›ซ flight departure airport landing\n๐Ÿ›ฌ flight arrival airport boarding\nโ›ต sailboat ship summer transportation water sailing\n๐Ÿ›ฅ motor boat ship\n๐Ÿšค speedboat ship transportation vehicle summer\nโ›ด ferry boat ship yacht\n๐Ÿ›ณ passenger ship yacht cruise ferry\n๐Ÿš€ rocket launch ship staffmode nasa fly\n๐Ÿ›ฐ artificial satellite communication gps orbit spaceflight nasa iss\n๐Ÿ’บ seat sit airplane transport bus flight fly\n๐Ÿ›ถ canoe boat paddle water ship\nโš“ anchor ship ferry sea boat\n๐Ÿšง construction wip progress caution warning\nโ›ฝ fuelpump petroleum\n๐Ÿš busstop transportation wait\n๐Ÿšฆ vertical traffic light transportation driving\n๐Ÿšฅ traffic light transportation signal\n๐Ÿšข ship transportation titanic deploy\n๐ŸŽก ferris wheel photo carnival londoneye\n๐ŸŽข roller coaster carnival playground photo fun\n๐ŸŽ  carousel horse photo carnival\n๐Ÿ— building construction wip working progress\n๐ŸŒ foggy photo mountain\n๐Ÿ—ผ tokyo tower photo japanese\n๐Ÿญ factory building industry pollution smoke\nโ›ฒ fountain photo summer water fresh\n๐ŸŽ‘ rice scene photo japan asia tsukimi\nโ›ฐ mountain photo nature environment\n๐Ÿ” mountain snow photo nature environment winter cold\n๐Ÿ—ป mount fuji photo mountain nature japanese\n๐ŸŒ‹ volcano photo nature disaster\n๐Ÿ—พ japan nation country japanese asia\n๐Ÿ• camping photo outdoors tent\nโ›บ tent photo camping outdoors\n๐Ÿž national park photo environment nature\n๐Ÿ›ฃ motorway road cupertino interstate highway\n๐Ÿ›ค railway track train transportation\n๐ŸŒ… sunrise morning view vacation photo\n๐ŸŒ„ sunrise over mountains view vacation photo\n๐Ÿœ desert photo warm saharah\n๐Ÿ– beach umbrella weather summer sunny sand mojito\n๐Ÿ desert island photo tropical mojito\n๐ŸŒ‡ city sunrise photo dawn\n๐ŸŒ† city sunset photo evening sky buildings\n๐Ÿ™ cityscape photo urban\n๐ŸŒƒ night with stars evening city downtown\n๐ŸŒ‰ bridge at night photo sanfrancisco\n๐ŸŒŒ milky way photo space stars\n๐ŸŒ  stars night photo\n๐ŸŽ‡ sparkler stars night shine\n๐ŸŽ† fireworks photo festival carnival congratulations\n๐ŸŒˆ rainbow nature happy photo sky spring\n๐Ÿ˜ houses buildings photo\n๐Ÿฐ european castle building royalty history\n๐Ÿฏ japanese castle photo building\n๐ŸŸ stadium photo place sports concert venue\n๐Ÿ—ฝ statue of liberty american newyork\n๐Ÿ  house building home\n๐Ÿก house with garden home plant nature\n๐Ÿš derelict house abandon evict broken building\n๐Ÿข office building bureau work\n๐Ÿฌ department store building shopping mall\n๐Ÿฃ post office building envelope communication\n๐Ÿค european post office building email\n๐Ÿฅ hospital building health surgery doctor\n๐Ÿฆ bank building money sales cash business enterprise\n๐Ÿจ hotel building accomodation checkin\n๐Ÿช convenience store building shopping groceries\n๐Ÿซ school building student education learn teach\n๐Ÿฉ love hotel like affection dating\n๐Ÿ’’ wedding love like affection couple marriage bride groom\n๐Ÿ› classical building art culture history\nโ›ช church building religion christ\n๐Ÿ•Œ mosque islam worship minaret\n๐Ÿ• synagogue judaism worship temple jewish\n๐Ÿ•‹ kaaba mecca mosque islam\nโ›ฉ shinto shrine temple japan kyoto\nโŒš watch time accessories\n๐Ÿ“ฑ iphone technology apple gadgets dial\n๐Ÿ“ฒ calling iphone incoming\n๐Ÿ’ป computer technology laptop screen display monitor\nโŒจ keyboard technology computer type input text\n๐Ÿ–ฅ desktop computer technology computing screen\n๐Ÿ–จ printer paper ink\n๐Ÿ–ฑ computer mouse click\n๐Ÿ–ฒ trackball technology trackpad\n๐Ÿ•น joystick game play\n๐Ÿ—œ clamp tool\n๐Ÿ’ฝ minidisc technology record data disk 90s\n๐Ÿ’พ floppy disk oldschool technology save 90s 80s\n๐Ÿ’ฟ cd technology dvd disk disc 90s\n๐Ÿ“€ dvd cd disk disc\n๐Ÿ“ผ vhs record video oldschool 90s 80s\n๐Ÿ“ท camera gadgets photography\n๐Ÿ“ธ camera flash photography gadgets\n๐Ÿ“น video camera film record\n๐ŸŽฅ movie camera film record\n๐Ÿ“ฝ film projector video tape record movie\n๐ŸŽž film strip movie\n๐Ÿ“ž telephone receiver technology communication dial\nโ˜Ž๏ธ phone technology communication dial telephone\n๐Ÿ“Ÿ pager bbcall oldschool 90s\n๐Ÿ“  fax communication technology\n๐Ÿ“บ tv technology program oldschool show television\n๐Ÿ“ป radio communication music podcast program\n๐ŸŽ™ studio microphone sing recording artist talkshow\n๐ŸŽš level slider scale\n๐ŸŽ› control knobs dial\n๐Ÿงญ compass magnetic navigation orienteering\nโฑ stopwatch time deadline\nโฒ timer clock alarm\nโฐ alarm clock time wake\n๐Ÿ•ฐ mantelpiece clock time\nโณ hourglass flowing sand oldschool time countdown\nโŒ› hourglass time clock oldschool limit exam quiz test\n๐Ÿ“ก satellite communication future radio space\n๐Ÿ”‹ battery power energy sustain\n๐Ÿ”Œ electric plug charger power\n๐Ÿ’ก bulb light electricity idea\n๐Ÿ”ฆ flashlight dark camping sight night\n๐Ÿ•ฏ candle fire wax\n๐Ÿงฏ fire extinguisher quench\n๐Ÿ—‘ wastebasket bin trash rubbish garbage toss\n๐Ÿ›ข oil drum barrell\n๐Ÿ’ธ money with wings dollar bills payment sale\n๐Ÿ’ต dollar money sales bill currency\n๐Ÿ’ด yen money sales japanese dollar currency\n๐Ÿ’ถ euro money sales dollar currency\n๐Ÿ’ท pound british sterling money sales bills uk england currency\n๐Ÿ’ฐ moneybag dollar payment coins sale\n๐Ÿ’ณ credit card money sales dollar bill payment shopping\n๐Ÿ’Ž gem blue ruby diamond jewelry\nโš– balance scale law fairness weight\n๐Ÿงฐ toolbox tools diy fix maintainer mechanic\n๐Ÿ”ง wrench tools diy ikea fix maintainer\n๐Ÿ”จ hammer tools build create\nโš’ hammer and pick tools build create\n๐Ÿ›  hammer and wrench tools build create\nโ› pick tools dig\n๐Ÿ”ฉ nut and bolt handy tools fix\nโš™ gear cog\n๐Ÿงฑ brick bricks\nโ›“ chains lock arrest\n๐Ÿงฒ magnet attraction magnetic\n๐Ÿ”ซ gun violence weapon pistol revolver\n๐Ÿ’ฃ bomb boom explode explosion terrorism\n๐Ÿงจ firecracker dynamite boom explode explosion explosive\n๐Ÿ”ช hocho knife blade cutlery kitchen weapon\n๐Ÿ—ก dagger weapon\nโš” crossed swords weapon\n๐Ÿ›ก shield protection security\n๐Ÿšฌ smoking kills tobacco cigarette joint smoke\nโšฐ coffin vampire dead die death rip graveyard cemetery casket funeral box\nโšฑ funeral urn dead die death rip ashes\n๐Ÿบ amphora vase jar\n๐Ÿ”ฎ crystal ball disco party magic circus\n๐Ÿ“ฟ prayer beads dhikr religious\n๐Ÿงฟ nazar amulet bead charm\n๐Ÿ’ˆ barber hair salon style\nโš— alembic distilling science experiment chemistry\n๐Ÿ”ญ telescope stars space zoom science astronomy\n๐Ÿ”ฌ microscope laboratory experiment zoomin science study\n๐Ÿ•ณ hole embarrassing\n๐Ÿ’Š pill health medicine doctor pharmacy drug\n๐Ÿ’‰ syringe health hospital drugs blood medicine needle doctor nurse\n๐Ÿงฌ dna biologist genetics life\n๐Ÿฆ  microbe amoeba bacteria germs\n๐Ÿงซ petri dish bacteria biology culture lab\n๐Ÿงช test tube chemistry experiment lab science\n๐ŸŒก thermometer weather temperature hot cold\n๐Ÿงน broom cleaning sweeping witch\n๐Ÿงบ basket laundry\n๐Ÿงป toilet paper roll\n๐Ÿท label sale tag\n๐Ÿ”– bookmark favorite label save\n๐Ÿšฝ toilet restroom wc washroom bathroom potty\n๐Ÿšฟ shower clean water bathroom\n๐Ÿ› bathtub clean shower bathroom\n๐Ÿ›€ bath clean shower bathroom\n๐Ÿงผ soap bar bathing cleaning lather\n๐Ÿงฝ sponge absorbing cleaning porous\n๐Ÿงด lotion bottle moisturizer sunscreen\n๐Ÿ”‘ key lock door password\n๐Ÿ— old key lock door password\n๐Ÿ›‹ couch and lamp read chill\n๐Ÿ›Œ sleeping bed rest\n๐Ÿ› bed sleep rest\n๐Ÿšช door house entry exit\n๐Ÿ›Ž bellhop bell service\n๐Ÿงธ teddy bear plush stuffed\n๐Ÿ–ผ framed picture photography\n๐Ÿ—บ world map location direction\nโ›ฑ parasol on ground weather summer\n๐Ÿ—ฟ moyai rock moai\n๐Ÿ› shopping mall buy purchase\n๐Ÿ›’ shopping cart trolley\n๐ŸŽˆ balloon party celebration birthday circus\n๐ŸŽ flags fish japanese koinobori carp banner\n๐ŸŽ€ ribbon decoration pink girl bowtie\n๐ŸŽ gift present birthday christmas xmas\n๐ŸŽŠ confetti ball festival party birthday circus\n๐ŸŽ‰ tada party congratulations birthday magic circus celebration\n๐ŸŽŽ dolls japanese toy kimono\n๐ŸŽ wind chime nature ding spring bell\n๐ŸŽŒ crossed flags japanese nation country border\n๐Ÿฎ izakaya lantern light paper halloween spooky\n๐Ÿงง red envelope gift\nโœ‰๏ธ email letter postal inbox communication\n๐Ÿ“ฉ envelope with arrow email communication\n๐Ÿ“จ incoming envelope email inbox\n๐Ÿ“ง e mail communication inbox\n๐Ÿ’Œ love letter email like affection envelope valentines\n๐Ÿ“ฎ postbox email letter envelope\n๐Ÿ“ช mailbox closed email communication inbox\n๐Ÿ“ซ mailbox email inbox communication\n๐Ÿ“ฌ mailbox with mail email inbox communication\n๐Ÿ“ญ mailbox with no mail email inbox\n๐Ÿ“ฆ package mail gift cardboard box moving\n๐Ÿ“ฏ postal horn instrument music\n๐Ÿ“ฅ inbox tray email documents\n๐Ÿ“ค outbox tray inbox email\n๐Ÿ“œ scroll documents ancient history paper\n๐Ÿ“ƒ page with curl documents office paper\n๐Ÿ“‘ bookmark tabs favorite save order tidy\n๐Ÿงพ receipt accounting expenses\n๐Ÿ“Š bar chart graph presentation stats\n๐Ÿ“ˆ chart with upwards trend graph presentation stats recovery business economics money sales good success\n๐Ÿ“‰ chart with downwards trend graph presentation stats recession business economics money sales bad failure\n๐Ÿ“„ page facing up documents office paper information\n๐Ÿ“… date calendar schedule\n๐Ÿ“† calendar schedule date planning\n๐Ÿ—“ spiral calendar date schedule planning\n๐Ÿ“‡ card index business stationery\n๐Ÿ—ƒ card file box business stationery\n๐Ÿ—ณ ballot box election vote\n๐Ÿ—„ file cabinet filing organizing\n๐Ÿ“‹ clipboard stationery documents\n๐Ÿ—’ spiral notepad memo stationery\n๐Ÿ“ file folder documents business office\n๐Ÿ“‚ open file folder documents load\n๐Ÿ—‚ card index dividers organizing business stationery\n๐Ÿ—ž newspaper roll press headline\n๐Ÿ“ฐ newspaper press headline\n๐Ÿ““ notebook stationery record notes paper study\n๐Ÿ“• closed book read library knowledge textbook learn\n๐Ÿ“— green book read library knowledge study\n๐Ÿ“˜ blue book read library knowledge learn study\n๐Ÿ“™ orange book read library knowledge textbook study\n๐Ÿ“” notebook with decorative cover classroom notes record paper study\n๐Ÿ“’ ledger notes paper\n๐Ÿ“š books literature library study\n๐Ÿ“– open book read library knowledge literature learn study\n๐Ÿงท safety pin diaper\n๐Ÿ”— link rings url\n๐Ÿ“Ž paperclip documents stationery\n๐Ÿ–‡ paperclips documents stationery\nโœ‚๏ธ scissors stationery cut\n๐Ÿ“ triangular ruler stationery math architect sketch\n๐Ÿ“ straight ruler stationery calculate length math school drawing architect sketch\n๐Ÿงฎ abacus calculation\n๐Ÿ“Œ pushpin stationery mark here\n๐Ÿ“ round pushpin stationery location map here\n๐Ÿ” closed lock with key security privacy\n๐Ÿ”’ lock security password padlock\n๐Ÿ”“ unlock privacy security\n๐Ÿ” lock with ink pen security secret\n๐Ÿ–Š pen stationery writing write\n๐Ÿ–‹ fountain pen stationery writing write\nโœ’๏ธ black nib pen stationery writing write\n๐Ÿ“ memo write documents stationery pencil paper writing legal exam quiz test study compose\nโœ๏ธ pencil2 stationery write paper writing school study\n๐Ÿ– crayon drawing creativity\n๐Ÿ–Œ paintbrush drawing creativity art\n๐Ÿ” mag search zoom find detective\n๐Ÿ”Ž mag right search zoom find detective\nโค๏ธ heart love like valentines\n๐Ÿงก orange heart love like affection valentines\n๐Ÿ’› yellow heart love like affection valentines\n๐Ÿ’š green heart love like affection valentines\n๐Ÿ’™ blue heart love like affection valentines\n๐Ÿ’œ purple heart love like affection valentines\n๐Ÿ–ค black heart evil\n๐Ÿ’” broken heart sad sorry break heartbreak\nโฃ heavy heart exclamation decoration love\n๐Ÿ’• two hearts love like affection valentines heart\n๐Ÿ’ž revolving hearts love like affection valentines\n๐Ÿ’“ heartbeat love like affection valentines pink heart\n๐Ÿ’— heartpulse like love affection valentines pink\n๐Ÿ’– sparkling heart love like affection valentines\n๐Ÿ’˜ cupid love like heart affection valentines\n๐Ÿ’ gift heart love valentines\n๐Ÿ’Ÿ heart decoration love like\nโ˜ฎ peace symbol hippie\nโœ latin cross christianity\nโ˜ช star and crescent islam\n๐Ÿ•‰ om hinduism buddhism sikhism jainism\nโ˜ธ wheel of dharma hinduism buddhism sikhism jainism\nโœก star of david judaism\n๐Ÿ”ฏ six pointed star religion jewish hexagram\n๐Ÿ•Ž menorah hanukkah candles jewish\nโ˜ฏ yin yang balance\nโ˜ฆ orthodox cross suppedaneum religion\n๐Ÿ› place of worship religion church temple prayer\nโ›Ž ophiuchus sign constellation astrology\nโ™ˆ aries sign zodiac astrology\nโ™‰ taurus sign zodiac astrology\nโ™Š gemini sign zodiac astrology\nโ™‹ cancer sign zodiac astrology\nโ™Œ leo sign zodiac astrology\nโ™ virgo sign zodiac astrology\nโ™Ž libra sign zodiac astrology\nโ™ scorpius sign zodiac astrology scorpio\nโ™ sagittarius sign zodiac astrology\nโ™‘ capricorn sign zodiac astrology\nโ™’ aquarius sign zodiac astrology\nโ™“ pisces sign zodiac astrology\n๐Ÿ†” id words\nโš› atom symbol science physics chemistry\n๐Ÿˆณ u7a7a kanji japanese chinese empty sky\n๐Ÿˆน u5272 cut divide chinese kanji\nโ˜ข radioactive nuclear danger\nโ˜ฃ biohazard danger\n๐Ÿ“ด mobile phone off mute silence quiet\n๐Ÿ“ณ vibration mode phone\n๐Ÿˆถ u6709 chinese have kanji\n๐Ÿˆš u7121 nothing chinese kanji japanese\n๐Ÿˆธ u7533 chinese japanese kanji\n๐Ÿˆบ u55b6 japanese\n๐Ÿˆท๏ธ u6708 chinese month moon japanese kanji\nโœด๏ธ eight pointed black star shape polygon\n๐Ÿ†š vs words\n๐Ÿ‰‘ accept ok good chinese kanji agree yes\n๐Ÿ’ฎ white flower japanese spring\n๐Ÿ‰ ideograph advantage chinese kanji obtain get circle\nใŠ™๏ธ secret privacy chinese sshh kanji\nใŠ—๏ธ congratulations chinese kanji japanese\n๐Ÿˆด u5408 japanese chinese join kanji\n๐Ÿˆต u6e80 full chinese japanese kanji\n๐Ÿˆฒ u7981 kanji japanese chinese forbidden limit restricted\n๐Ÿ…ฐ๏ธ a alphabet letter\n๐Ÿ…ฑ๏ธ b alphabet letter\n๐Ÿ†Ž ab alphabet\n๐Ÿ†‘ cl alphabet words\n๐Ÿ…พ๏ธ o2 alphabet letter\n๐Ÿ†˜ sos help words emergency 911\nโ›” no entry limit security privacy bad denied stop circle\n๐Ÿ“› name badge fire forbid\n๐Ÿšซ no entry sign forbid stop limit denied disallow circle\nโŒ x no delete remove cancel red\nโญ• o circle round\n๐Ÿ›‘ stop sign\n๐Ÿ’ข anger angry mad\nโ™จ๏ธ hotsprings bath warm relax\n๐Ÿšท no pedestrians rules crossing walking circle\n๐Ÿšฏ do not litter trash bin garbage circle\n๐Ÿšณ no bicycles cyclist prohibited circle\n๐Ÿšฑ non potable water drink faucet tap circle\n๐Ÿ”ž underage 18 drink pub night minor circle\n๐Ÿ“ต no mobile phones iphone mute circle\nโ— exclamation danger surprise punctuation wow warning\nโ• grey exclamation surprise punctuation gray wow warning\nโ“ question doubt confused\nโ” grey question doubts gray huh confused\nโ€ผ๏ธ bangbang exclamation surprise\nโ‰๏ธ interrobang wat punctuation surprise\n๐Ÿ’ฏ 100 score perfect numbers century exam quiz test pass hundred\n๐Ÿ”… low brightness sun afternoon warm summer\n๐Ÿ”† high brightness sun light\n๐Ÿ”ฑ trident weapon spear\nโšœ fleur de lis decorative scout\nใ€ฝ๏ธ part alternation mark graph presentation stats business economics bad\nโš ๏ธ warning exclamation wip alert error problem issue\n๐Ÿšธ children crossing school warning danger sign driving\n๐Ÿ”ฐ beginner badge shield\nโ™ป๏ธ recycle arrow environment garbage trash\n๐Ÿˆฏ u6307 chinese point kanji\n๐Ÿ’น chart graph presentation stats\nโ‡๏ธ sparkle stars awesome good fireworks\nโœณ๏ธ eight spoked asterisk star sparkle\nโŽ negative squared cross mark x no deny\nโœ… white check mark ok agree vote election answer tick\n๐Ÿ’  diamond shape with a dot inside jewel blue gem crystal fancy\n๐ŸŒ€ cyclone weather swirl blue cloud vortex spiral whirlpool spin tornado hurricane typhoon\nโžฟ loop tape cassette\n๐ŸŒ globe with meridians earth international world internet interweb i18n\nโ“‚๏ธ m alphabet letter\n๐Ÿง atm money sales cash payment bank\n๐Ÿ’ค zzz sleepy tired dream\n๐Ÿˆ‚๏ธ sa japanese katakana\n๐Ÿ›‚ passport control custom\n๐Ÿ›ƒ customs passport border\n๐Ÿ›„ baggage claim airport transport\n๐Ÿ›… left luggage travel\nโ™ฟ wheelchair disabled a11y accessibility\n๐Ÿšญ no smoking cigarette smell smoke\n๐Ÿšพ wc toilet restroom\n๐Ÿ…ฟ๏ธ parking cars alphabet letter\n๐Ÿšฐ potable water liquid restroom cleaning faucet\n๐Ÿšน mens toilet restroom wc gender male\n๐Ÿšบ womens woman female toilet loo restroom gender\n๐Ÿšผ baby symbol child\n๐Ÿšป restroom toilet refresh wc gender\n๐Ÿšฎ put litter in its place sign human info\n๐ŸŽฆ cinema record film movie curtain stage theater\n๐Ÿ“ถ signal strength reception phone internet connection wifi bluetooth bars\n๐Ÿˆ koko here katakana japanese destination\n๐Ÿ†– ng words shape icon\n๐Ÿ†— ok good agree yes\n๐Ÿ†™ up above high\n๐Ÿ†’ cool words\n๐Ÿ†• new words start\n๐Ÿ†“ free words\n0๏ธโƒฃ zero 0 numbers null\n1๏ธโƒฃ one numbers 1\n2๏ธโƒฃ two numbers 2 prime\n3๏ธโƒฃ three 3 numbers prime\n4๏ธโƒฃ four 4 numbers\n5๏ธโƒฃ five 5 numbers prime\n6๏ธโƒฃ six 6 numbers\n7๏ธโƒฃ seven 7 numbers prime\n8๏ธโƒฃ eight 8 numbers\n9๏ธโƒฃ nine numbers 9\n๐Ÿ”Ÿ keycap ten numbers 10\n*โƒฃ asterisk star keycap\n๐Ÿ”ข 1234 numbers\nโ๏ธ eject button\nโ–ถ๏ธ arrow forward right direction play\nโธ pause button\nโญ next track button forward\nโน stop button\nโบ record button\nโฏ play or pause button\nโฎ previous track button backward\nโฉ fast forward play speed continue\nโช rewind play\n๐Ÿ”€ twisted rightwards arrows shuffle music random\n๐Ÿ” repeat loop record\n๐Ÿ”‚ repeat one loop\nโ—€๏ธ arrow backward left direction\n๐Ÿ”ผ arrow up small triangle direction point forward top\n๐Ÿ”ฝ arrow down small direction bottom\nโซ arrow double up direction top\nโฌ arrow double down direction bottom\nโžก๏ธ arrow right next\nโฌ…๏ธ arrow left previous back\nโฌ†๏ธ arrow up continue top direction\nโฌ‡๏ธ arrow down direction bottom\nโ†—๏ธ arrow upper right point direction diagonal northeast\nโ†˜๏ธ arrow lower right direction diagonal southeast\nโ†™๏ธ arrow lower left direction diagonal southwest\nโ†–๏ธ arrow upper left point direction diagonal northwest\nโ†•๏ธ arrow up down direction way vertical\nโ†”๏ธ left right arrow shape direction horizontal sideways\n๐Ÿ”„ arrows counterclockwise sync cycle\nโ†ช๏ธ arrow right hook return rotate direction\nโ†ฉ๏ธ leftwards arrow with hook back return undo enter\nโคด๏ธ arrow heading up direction top\nโคต๏ธ arrow heading down direction bottom\n#๏ธโƒฃ hash symbol twitter\nโ„น๏ธ information source alphabet letter\n๐Ÿ”ค abc alphabet\n๐Ÿ”ก abcd alphabet\n๐Ÿ”  capital abcd alphabet words\n๐Ÿ”ฃ symbols music note ampersand percent glyphs characters\n๐ŸŽต musical note score tone sound\n๐ŸŽถ notes music score\nใ€ฐ๏ธ wavy dash draw line moustache mustache squiggle scribble\nโžฐ curly loop scribble draw shape squiggle\nโœ”๏ธ heavy check mark ok nike answer yes tick\n๐Ÿ”ƒ arrows clockwise sync cycle round repeat\nโž• heavy plus sign math calculation addition more increase\nโž– heavy minus sign math calculation subtract less\nโž— heavy division sign divide math calculation\nโœ–๏ธ heavy multiplication x math calculation\nโ™พ infinity forever\n๐Ÿ’ฒ heavy dollar sign money sales payment currency buck\n๐Ÿ’ฑ currency exchange money sales dollar travel\nยฉ๏ธ copyright ip license circle law legal\nยฎ๏ธ registered alphabet circle\nโ„ข๏ธ tm trademark brand law legal\n๐Ÿ”š end words arrow\n๐Ÿ”™ back arrow words return\n๐Ÿ”› on arrow words\n๐Ÿ” top words\n๐Ÿ”œ soon arrow words\nโ˜‘๏ธ ballot box with check ok agree confirm vote election yes tick\n๐Ÿ”˜ radio button input old music circle\nโšช white circle shape round\nโšซ black circle shape button round\n๐Ÿ”ด red circle shape error danger\n๐Ÿ”ต large blue circle shape icon button\n๐Ÿ”ธ small orange diamond shape jewel gem\n๐Ÿ”น small blue diamond shape jewel gem\n๐Ÿ”ถ large orange diamond shape jewel gem\n๐Ÿ”ท large blue diamond shape jewel gem\n๐Ÿ”บ small red triangle shape direction up top\nโ–ช๏ธ black small square shape icon\nโ–ซ๏ธ white small square shape icon\nโฌ› black large square shape icon button\nโฌœ white large square shape icon stone button\n๐Ÿ”ป small red triangle down shape direction bottom\nโ—ผ๏ธ black medium square shape button icon\nโ—ป๏ธ white medium square shape stone icon\nโ—พ black medium small square icon shape button\nโ—ฝ white medium small square shape stone icon button\n๐Ÿ”ฒ black square button shape input frame\n๐Ÿ”ณ white square button shape input\n๐Ÿ”ˆ speaker sound volume silence broadcast\n๐Ÿ”‰ sound volume speaker broadcast\n๐Ÿ”Š loud sound volume noise noisy speaker broadcast\n๐Ÿ”‡ mute sound volume silence quiet\n๐Ÿ“ฃ mega sound speaker volume\n๐Ÿ“ข loudspeaker volume sound\n๐Ÿ”” bell sound notification christmas xmas chime\n๐Ÿ”• no bell sound volume mute quiet silent\n๐Ÿƒ black joker poker cards game play magic\n๐Ÿ€„ mahjong game play chinese kanji\nโ™ ๏ธ spades poker cards suits magic\nโ™ฃ๏ธ clubs poker cards magic suits\nโ™ฅ๏ธ hearts poker cards magic suits\nโ™ฆ๏ธ diamonds poker cards magic suits\n๐ŸŽด flower playing cards game sunset red\n๐Ÿ’ญ thought balloon bubble cloud speech thinking dream\n๐Ÿ—ฏ right anger bubble caption speech thinking mad\n๐Ÿ’ฌ speech balloon bubble words message talk chatting\n๐Ÿ—จ left speech bubble words message talk chatting\n๐Ÿ• clock1 time late early schedule\n๐Ÿ•‘ clock2 time late early schedule\n๐Ÿ•’ clock3 time late early schedule\n๐Ÿ•“ clock4 time late early schedule\n๐Ÿ•” clock5 time late early schedule\n๐Ÿ•• clock6 time late early schedule dawn dusk\n๐Ÿ•– clock7 time late early schedule\n๐Ÿ•— clock8 time late early schedule\n๐Ÿ•˜ clock9 time late early schedule\n๐Ÿ•™ clock10 time late early schedule\n๐Ÿ•š clock11 time late early schedule\n๐Ÿ•› clock12 time noon midnight midday late early schedule\n๐Ÿ•œ clock130 time late early schedule\n๐Ÿ• clock230 time late early schedule\n๐Ÿ•ž clock330 time late early schedule\n๐Ÿ•Ÿ clock430 time late early schedule\n๐Ÿ•  clock530 time late early schedule\n๐Ÿ•ก clock630 time late early schedule\n๐Ÿ•ข clock730 time late early schedule\n๐Ÿ•ฃ clock830 time late early schedule\n๐Ÿ•ค clock930 time late early schedule\n๐Ÿ•ฅ clock1030 time late early schedule\n๐Ÿ•ฆ clock1130 time late early schedule\n๐Ÿ•ง clock1230 time late early schedule\n๐Ÿณ white flag losing loser lost surrender fail\n๐Ÿด black flag pirate\n๐Ÿดโ€โ˜ ๏ธ pirate flag skull crossbones banner\n๐Ÿ checkered flag contest finishline race gokart\n๐Ÿšฉ triangular flag on post mark milestone place\n๐Ÿณ๏ธโ€๐ŸŒˆ rainbow flag pride gay lgbt glbt queer homosexual lesbian bisexual transgender\n๐Ÿ‡บ๐Ÿ‡ณ united nations un flag banner\n๐Ÿ‡ฆ๐Ÿ‡ซ afghanistan af flag nation country banner\n๐Ÿ‡ฆ๐Ÿ‡ฝ aland islands flag nation country banner\n๐Ÿ‡ฆ๐Ÿ‡ฑ albania al flag nation country banner\n๐Ÿ‡ฉ๐Ÿ‡ฟ algeria dz flag nation country banner\n๐Ÿ‡ฆ๐Ÿ‡ธ american samoa ws flag nation country banner\n๐Ÿ‡ฆ๐Ÿ‡ฉ andorra ad flag nation country banner\n๐Ÿ‡ฆ๐Ÿ‡ด angola ao flag nation country banner\n๐Ÿ‡ฆ๐Ÿ‡ฎ anguilla ai flag nation country banner\n๐Ÿ‡ฆ๐Ÿ‡ถ antarctica aq flag nation country banner\n๐Ÿ‡ฆ๐Ÿ‡ฌ antigua barbuda flag nation country banner\n๐Ÿ‡ฆ๐Ÿ‡ท argentina ar flag nation country banner\n๐Ÿ‡ฆ๐Ÿ‡ฒ armenia am flag nation country banner\n๐Ÿ‡ฆ๐Ÿ‡ผ aruba aw flag nation country banner\n๐Ÿ‡ฆ๐Ÿ‡บ australia au flag nation country banner\n๐Ÿ‡ฆ๐Ÿ‡น austria at flag nation country banner\n๐Ÿ‡ฆ๐Ÿ‡ฟ azerbaijan az flag nation country banner\n๐Ÿ‡ง๐Ÿ‡ธ bahamas bs flag nation country banner\n๐Ÿ‡ง๐Ÿ‡ญ bahrain bh flag nation country banner\n๐Ÿ‡ง๐Ÿ‡ฉ bangladesh bd flag nation country banner\n๐Ÿ‡ง๐Ÿ‡ง barbados bb flag nation country banner\n๐Ÿ‡ง๐Ÿ‡พ belarus by flag nation country banner\n๐Ÿ‡ง๐Ÿ‡ช belgium be flag nation country banner\n๐Ÿ‡ง๐Ÿ‡ฟ belize bz flag nation country banner\n๐Ÿ‡ง๐Ÿ‡ฏ benin bj flag nation country banner\n๐Ÿ‡ง๐Ÿ‡ฒ bermuda bm flag nation country banner\n๐Ÿ‡ง๐Ÿ‡น bhutan bt flag nation country banner\n๐Ÿ‡ง๐Ÿ‡ด bolivia bo flag nation country banner\n๐Ÿ‡ง๐Ÿ‡ถ caribbean netherlands bonaire flag nation country banner\n๐Ÿ‡ง๐Ÿ‡ฆ bosnia herzegovina flag nation country banner\n๐Ÿ‡ง๐Ÿ‡ผ botswana bw flag nation country banner\n๐Ÿ‡ง๐Ÿ‡ท brazil br flag nation country banner\n๐Ÿ‡ฎ๐Ÿ‡ด british indian ocean territory flag nation country banner\n๐Ÿ‡ป๐Ÿ‡ฌ british virgin islands bvi flag nation country banner\n๐Ÿ‡ง๐Ÿ‡ณ brunei bn darussalam flag nation country banner\n๐Ÿ‡ง๐Ÿ‡ฌ bulgaria bg flag nation country banner\n๐Ÿ‡ง๐Ÿ‡ซ burkina faso flag nation country banner\n๐Ÿ‡ง๐Ÿ‡ฎ burundi bi flag nation country banner\n๐Ÿ‡จ๐Ÿ‡ป cape verde cabo flag nation country banner\n๐Ÿ‡ฐ๐Ÿ‡ญ cambodia kh flag nation country banner\n๐Ÿ‡จ๐Ÿ‡ฒ cameroon cm flag nation country banner\n๐Ÿ‡จ๐Ÿ‡ฆ canada ca flag nation country banner\n๐Ÿ‡ฎ๐Ÿ‡จ canary islands flag nation country banner\n๐Ÿ‡ฐ๐Ÿ‡พ cayman islands flag nation country banner\n๐Ÿ‡จ๐Ÿ‡ซ central african republic flag nation country banner\n๐Ÿ‡น๐Ÿ‡ฉ chad td flag nation country banner\n๐Ÿ‡จ๐Ÿ‡ฑ chile flag nation country banner\n๐Ÿ‡จ๐Ÿ‡ณ cn china chinese prc flag country nation banner\n๐Ÿ‡จ๐Ÿ‡ฝ christmas island flag nation country banner\n๐Ÿ‡จ๐Ÿ‡จ cocos islands keeling flag nation country banner\n๐Ÿ‡จ๐Ÿ‡ด colombia co flag nation country banner\n๐Ÿ‡ฐ๐Ÿ‡ฒ comoros km flag nation country banner\n๐Ÿ‡จ๐Ÿ‡ฌ congo brazzaville flag nation country banner\n๐Ÿ‡จ๐Ÿ‡ฉ congo kinshasa democratic republic flag nation country banner\n๐Ÿ‡จ๐Ÿ‡ฐ cook islands flag nation country banner\n๐Ÿ‡จ๐Ÿ‡ท costa rica flag nation country banner\n๐Ÿ‡ญ๐Ÿ‡ท croatia hr flag nation country banner\n๐Ÿ‡จ๐Ÿ‡บ cuba cu flag nation country banner\n๐Ÿ‡จ๐Ÿ‡ผ curacao flag nation country banner\n๐Ÿ‡จ๐Ÿ‡พ cyprus cy flag nation country banner\n๐Ÿ‡จ๐Ÿ‡ฟ czech republic cz flag nation country banner\n๐Ÿ‡ฉ๐Ÿ‡ฐ denmark dk flag nation country banner\n๐Ÿ‡ฉ๐Ÿ‡ฏ djibouti dj flag nation country banner\n๐Ÿ‡ฉ๐Ÿ‡ฒ dominica dm flag nation country banner\n๐Ÿ‡ฉ๐Ÿ‡ด dominican republic flag nation country banner\n๐Ÿ‡ช๐Ÿ‡จ ecuador ec flag nation country banner\n๐Ÿ‡ช๐Ÿ‡ฌ egypt eg flag nation country banner\n๐Ÿ‡ธ๐Ÿ‡ป el salvador flag nation country banner\n๐Ÿ‡ฌ๐Ÿ‡ถ equatorial guinea gn flag nation country banner\n๐Ÿ‡ช๐Ÿ‡ท eritrea er flag nation country banner\n๐Ÿ‡ช๐Ÿ‡ช estonia ee flag nation country banner\n๐Ÿ‡ช๐Ÿ‡น ethiopia et flag nation country banner\n๐Ÿ‡ช๐Ÿ‡บ eu european union flag banner\n๐Ÿ‡ซ๐Ÿ‡ฐ falkland islands malvinas flag nation country banner\n๐Ÿ‡ซ๐Ÿ‡ด faroe islands flag nation country banner\n๐Ÿ‡ซ๐Ÿ‡ฏ fiji fj flag nation country banner\n๐Ÿ‡ซ๐Ÿ‡ฎ finland fi flag nation country banner\n๐Ÿ‡ซ๐Ÿ‡ท fr banner flag nation france french country\n๐Ÿ‡ฌ๐Ÿ‡ซ french guiana flag nation country banner\n๐Ÿ‡ต๐Ÿ‡ซ french polynesia flag nation country banner\n๐Ÿ‡น๐Ÿ‡ซ french southern territories flag nation country banner\n๐Ÿ‡ฌ๐Ÿ‡ฆ gabon ga flag nation country banner\n๐Ÿ‡ฌ๐Ÿ‡ฒ gambia gm flag nation country banner\n๐Ÿ‡ฌ๐Ÿ‡ช georgia ge flag nation country banner\n๐Ÿ‡ฉ๐Ÿ‡ช de german nation flag country banner\n๐Ÿ‡ฌ๐Ÿ‡ญ ghana gh flag nation country banner\n๐Ÿ‡ฌ๐Ÿ‡ฎ gibraltar gi flag nation country banner\n๐Ÿ‡ฌ๐Ÿ‡ท greece gr flag nation country banner\n๐Ÿ‡ฌ๐Ÿ‡ฑ greenland gl flag nation country banner\n๐Ÿ‡ฌ๐Ÿ‡ฉ grenada gd flag nation country banner\n๐Ÿ‡ฌ๐Ÿ‡ต guadeloupe gp flag nation country banner\n๐Ÿ‡ฌ๐Ÿ‡บ guam gu flag nation country banner\n๐Ÿ‡ฌ๐Ÿ‡น guatemala gt flag nation country banner\n๐Ÿ‡ฌ๐Ÿ‡ฌ guernsey gg flag nation country banner\n๐Ÿ‡ฌ๐Ÿ‡ณ guinea gn flag nation country banner\n๐Ÿ‡ฌ๐Ÿ‡ผ guinea bissau gw flag nation country banner\n๐Ÿ‡ฌ๐Ÿ‡พ guyana gy flag nation country banner\n๐Ÿ‡ญ๐Ÿ‡น haiti ht flag nation country banner\n๐Ÿ‡ญ๐Ÿ‡ณ honduras hn flag nation country banner\n๐Ÿ‡ญ๐Ÿ‡ฐ hong kong flag nation country banner\n๐Ÿ‡ญ๐Ÿ‡บ hungary hu flag nation country banner\n๐Ÿ‡ฎ๐Ÿ‡ธ iceland is flag nation country banner\n๐Ÿ‡ฎ๐Ÿ‡ณ india in flag nation country banner\n๐Ÿ‡ฎ๐Ÿ‡ฉ indonesia flag nation country banner\n๐Ÿ‡ฎ๐Ÿ‡ท iran islamic republic flag nation country banner\n๐Ÿ‡ฎ๐Ÿ‡ถ iraq iq flag nation country banner\n๐Ÿ‡ฎ๐Ÿ‡ช ireland ie flag nation country banner\n๐Ÿ‡ฎ๐Ÿ‡ฒ isle of man flag nation country banner\n๐Ÿ‡ฎ๐Ÿ‡ฑ israel il flag nation country banner\n๐Ÿ‡ฎ๐Ÿ‡น it italy flag nation country banner\n๐Ÿ‡จ๐Ÿ‡ฎ cote divoire ivory coast flag nation country banner\n๐Ÿ‡ฏ๐Ÿ‡ฒ jamaica jm flag nation country banner\n๐Ÿ‡ฏ๐Ÿ‡ต jp japanese nation flag country banner\n๐Ÿ‡ฏ๐Ÿ‡ช jersey je flag nation country banner\n๐Ÿ‡ฏ๐Ÿ‡ด jordan jo flag nation country banner\n๐Ÿ‡ฐ๐Ÿ‡ฟ kazakhstan kz flag nation country banner\n๐Ÿ‡ฐ๐Ÿ‡ช kenya ke flag nation country banner\n๐Ÿ‡ฐ๐Ÿ‡ฎ kiribati ki flag nation country banner\n๐Ÿ‡ฝ๐Ÿ‡ฐ kosovo xk flag nation country banner\n๐Ÿ‡ฐ๐Ÿ‡ผ kuwait kw flag nation country banner\n๐Ÿ‡ฐ๐Ÿ‡ฌ kyrgyzstan kg flag nation country banner\n๐Ÿ‡ฑ๐Ÿ‡ฆ laos lao democratic republic flag nation country banner\n๐Ÿ‡ฑ๐Ÿ‡ป latvia lv flag nation country banner\n๐Ÿ‡ฑ๐Ÿ‡ง lebanon lb flag nation country banner\n๐Ÿ‡ฑ๐Ÿ‡ธ lesotho ls flag nation country banner\n๐Ÿ‡ฑ๐Ÿ‡ท liberia lr flag nation country banner\n๐Ÿ‡ฑ๐Ÿ‡พ libya ly flag nation country banner\n๐Ÿ‡ฑ๐Ÿ‡ฎ liechtenstein li flag nation country banner\n๐Ÿ‡ฑ๐Ÿ‡น lithuania lt flag nation country banner\n๐Ÿ‡ฑ๐Ÿ‡บ luxembourg lu flag nation country banner\n๐Ÿ‡ฒ๐Ÿ‡ด macau macao flag nation country banner\n๐Ÿ‡ฒ๐Ÿ‡ฐ macedonia flag nation country banner\n๐Ÿ‡ฒ๐Ÿ‡ฌ madagascar mg flag nation country banner\n๐Ÿ‡ฒ๐Ÿ‡ผ malawi mw flag nation country banner\n๐Ÿ‡ฒ๐Ÿ‡พ malaysia my flag nation country banner\n๐Ÿ‡ฒ๐Ÿ‡ป maldives mv flag nation country banner\n๐Ÿ‡ฒ๐Ÿ‡ฑ mali ml flag nation country banner\n๐Ÿ‡ฒ๐Ÿ‡น malta mt flag nation country banner\n๐Ÿ‡ฒ๐Ÿ‡ญ marshall islands flag nation country banner\n๐Ÿ‡ฒ๐Ÿ‡ถ martinique mq flag nation country banner\n๐Ÿ‡ฒ๐Ÿ‡ท mauritania mr flag nation country banner\n๐Ÿ‡ฒ๐Ÿ‡บ mauritius mu flag nation country banner\n๐Ÿ‡พ๐Ÿ‡น mayotte yt flag nation country banner\n๐Ÿ‡ฒ๐Ÿ‡ฝ mexico mx flag nation country banner\n๐Ÿ‡ซ๐Ÿ‡ฒ micronesia federated states flag nation country banner\n๐Ÿ‡ฒ๐Ÿ‡ฉ moldova republic flag nation country banner\n๐Ÿ‡ฒ๐Ÿ‡จ monaco mc flag nation country banner\n๐Ÿ‡ฒ๐Ÿ‡ณ mongolia mn flag nation country banner\n๐Ÿ‡ฒ๐Ÿ‡ช montenegro me flag nation country banner\n๐Ÿ‡ฒ๐Ÿ‡ธ montserrat ms flag nation country banner\n๐Ÿ‡ฒ๐Ÿ‡ฆ morocco ma flag nation country banner\n๐Ÿ‡ฒ๐Ÿ‡ฟ mozambique mz flag nation country banner\n๐Ÿ‡ฒ๐Ÿ‡ฒ myanmar mm flag nation country banner\n๐Ÿ‡ณ๐Ÿ‡ฆ namibia na flag nation country banner\n๐Ÿ‡ณ๐Ÿ‡ท nauru nr flag nation country banner\n๐Ÿ‡ณ๐Ÿ‡ต nepal np flag nation country banner\n๐Ÿ‡ณ๐Ÿ‡ฑ netherlands nl flag nation country banner\n๐Ÿ‡ณ๐Ÿ‡จ new caledonia flag nation country banner\n๐Ÿ‡ณ๐Ÿ‡ฟ new zealand flag nation country banner\n๐Ÿ‡ณ๐Ÿ‡ฎ nicaragua ni flag nation country banner\n๐Ÿ‡ณ๐Ÿ‡ช niger ne flag nation country banner\n๐Ÿ‡ณ๐Ÿ‡ฌ nigeria flag nation country banner\n๐Ÿ‡ณ๐Ÿ‡บ niue nu flag nation country banner\n๐Ÿ‡ณ๐Ÿ‡ซ norfolk island flag nation country banner\n๐Ÿ‡ฒ๐Ÿ‡ต northern mariana islands flag nation country banner\n๐Ÿ‡ฐ๐Ÿ‡ต north korea nation flag country banner\n๐Ÿ‡ณ๐Ÿ‡ด norway no flag nation country banner\n๐Ÿ‡ด๐Ÿ‡ฒ oman flag nation country banner\n๐Ÿ‡ต๐Ÿ‡ฐ pakistan pk flag nation country banner\n๐Ÿ‡ต๐Ÿ‡ผ palau pw flag nation country banner\n๐Ÿ‡ต๐Ÿ‡ธ palestinian territories palestine flag nation country banner\n๐Ÿ‡ต๐Ÿ‡ฆ panama pa flag nation country banner\n๐Ÿ‡ต๐Ÿ‡ฌ papua new guinea flag nation country banner\n๐Ÿ‡ต๐Ÿ‡พ paraguay py flag nation country banner\n๐Ÿ‡ต๐Ÿ‡ช peru pe flag nation country banner\n๐Ÿ‡ต๐Ÿ‡ญ philippines ph flag nation country banner\n๐Ÿ‡ต๐Ÿ‡ณ pitcairn islands flag nation country banner\n๐Ÿ‡ต๐Ÿ‡ฑ poland pl flag nation country banner\n๐Ÿ‡ต๐Ÿ‡น portugal pt flag nation country banner\n๐Ÿ‡ต๐Ÿ‡ท puerto rico flag nation country banner\n๐Ÿ‡ถ๐Ÿ‡ฆ qatar qa flag nation country banner\n๐Ÿ‡ท๐Ÿ‡ช reunion flag nation country banner\n๐Ÿ‡ท๐Ÿ‡ด romania ro flag nation country banner\n๐Ÿ‡ท๐Ÿ‡บ ru russian federation flag nation country banner\n๐Ÿ‡ท๐Ÿ‡ผ rwanda rw flag nation country banner\n๐Ÿ‡ง๐Ÿ‡ฑ st barthelemy saint flag nation country banner\n๐Ÿ‡ธ๐Ÿ‡ญ st helena saint ascension tristan cunha flag nation country banner\n๐Ÿ‡ฐ๐Ÿ‡ณ st kitts nevis saint flag nation country banner\n๐Ÿ‡ฑ๐Ÿ‡จ st lucia saint flag nation country banner\n๐Ÿ‡ต๐Ÿ‡ฒ st pierre miquelon saint flag nation country banner\n๐Ÿ‡ป๐Ÿ‡จ st vincent grenadines saint flag nation country banner\n๐Ÿ‡ผ๐Ÿ‡ธ samoa ws flag nation country banner\n๐Ÿ‡ธ๐Ÿ‡ฒ san marino flag nation country banner\n๐Ÿ‡ธ๐Ÿ‡น sao tome principe flag nation country banner\n๐Ÿ‡ธ๐Ÿ‡ฆ saudi arabia flag nation country banner\n๐Ÿ‡ธ๐Ÿ‡ณ senegal sn flag nation country banner\n๐Ÿ‡ท๐Ÿ‡ธ serbia rs flag nation country banner\n๐Ÿ‡ธ๐Ÿ‡จ seychelles sc flag nation country banner\n๐Ÿ‡ธ๐Ÿ‡ฑ sierra leone flag nation country banner\n๐Ÿ‡ธ๐Ÿ‡ฌ singapore sg flag nation country banner\n๐Ÿ‡ธ๐Ÿ‡ฝ sint maarten dutch flag nation country banner\n๐Ÿ‡ธ๐Ÿ‡ฐ slovakia sk flag nation country banner\n๐Ÿ‡ธ๐Ÿ‡ฎ slovenia si flag nation country banner\n๐Ÿ‡ธ๐Ÿ‡ง solomon islands flag nation country banner\n๐Ÿ‡ธ๐Ÿ‡ด somalia so flag nation country banner\n๐Ÿ‡ฟ๐Ÿ‡ฆ south africa flag nation country banner\n๐Ÿ‡ฌ๐Ÿ‡ธ south georgia sandwich islands flag nation country banner\n๐Ÿ‡ฐ๐Ÿ‡ท kr south korea nation flag country banner\n๐Ÿ‡ธ๐Ÿ‡ธ south sudan sd flag nation country banner\n๐Ÿ‡ช๐Ÿ‡ธ es spain flag nation country banner\n๐Ÿ‡ฑ๐Ÿ‡ฐ sri lanka flag nation country banner\n๐Ÿ‡ธ๐Ÿ‡ฉ sudan sd flag nation country banner\n๐Ÿ‡ธ๐Ÿ‡ท suriname sr flag nation country banner\n๐Ÿ‡ธ๐Ÿ‡ฟ swaziland sz flag nation country banner\n๐Ÿ‡ธ๐Ÿ‡ช sweden se flag nation country banner\n๐Ÿ‡จ๐Ÿ‡ญ switzerland ch flag nation country banner\n๐Ÿ‡ธ๐Ÿ‡พ syria syrian arab republic flag nation country banner\n๐Ÿ‡น๐Ÿ‡ผ taiwan tw flag nation country banner\n๐Ÿ‡น๐Ÿ‡ฏ tajikistan tj flag nation country banner\n๐Ÿ‡น๐Ÿ‡ฟ tanzania united republic flag nation country banner\n๐Ÿ‡น๐Ÿ‡ญ thailand th flag nation country banner\n๐Ÿ‡น๐Ÿ‡ฑ timor leste flag nation country banner\n๐Ÿ‡น๐Ÿ‡ฌ togo tg flag nation country banner\n๐Ÿ‡น๐Ÿ‡ฐ tokelau tk flag nation country banner\n๐Ÿ‡น๐Ÿ‡ด tonga to flag nation country banner\n๐Ÿ‡น๐Ÿ‡น trinidad tobago flag nation country banner\n๐Ÿ‡น๐Ÿ‡ณ tunisia tn flag nation country banner\n๐Ÿ‡น๐Ÿ‡ท tr turkey flag nation country banner\n๐Ÿ‡น๐Ÿ‡ฒ turkmenistan flag nation country banner\n๐Ÿ‡น๐Ÿ‡จ turks caicos islands flag nation country banner\n๐Ÿ‡น๐Ÿ‡ป tuvalu flag nation country banner\n๐Ÿ‡บ๐Ÿ‡ฌ uganda ug flag nation country banner\n๐Ÿ‡บ๐Ÿ‡ฆ ukraine ua flag nation country banner\n๐Ÿ‡ฆ๐Ÿ‡ช united arab emirates flag nation country banner\n๐Ÿ‡ฌ๐Ÿ‡ง uk united kingdom great britain northern ireland flag nation country banner british english england\n๐Ÿด๓ ง๓ ข๓ ฅ๓ ฎ๓ ง๓ ฟ england flag english\n๐Ÿด๓ ง๓ ข๓ ณ๓ ฃ๓ ด๓ ฟ scotland flag scottish\n๐Ÿด๓ ง๓ ข๓ ท๓ ฌ๓ ณ๓ ฟ wales flag welsh\n๐Ÿ‡บ๐Ÿ‡ธ us united states america flag nation country banner\n๐Ÿ‡ป๐Ÿ‡ฎ us virgin islands flag nation country banner\n๐Ÿ‡บ๐Ÿ‡พ uruguay uy flag nation country banner\n๐Ÿ‡บ๐Ÿ‡ฟ uzbekistan uz flag nation country banner\n๐Ÿ‡ป๐Ÿ‡บ vanuatu vu flag nation country banner\n๐Ÿ‡ป๐Ÿ‡ฆ vatican city flag nation country banner\n๐Ÿ‡ป๐Ÿ‡ช venezuela ve bolivarian republic flag nation country banner\n๐Ÿ‡ป๐Ÿ‡ณ vietnam viet nam flag nation country banner\n๐Ÿ‡ผ๐Ÿ‡ซ wallis futuna flag nation country banner\n๐Ÿ‡ช๐Ÿ‡ญ western sahara flag nation country banner\n๐Ÿ‡พ๐Ÿ‡ช yemen ye flag nation country banner\n๐Ÿ‡ฟ๐Ÿ‡ฒ zambia zm flag nation country banner\n๐Ÿ‡ฟ๐Ÿ‡ผ zimbabwe zw flag nation country banner\n๐Ÿฅฒ smiling face with tear happy sad grateful touched\n๐Ÿ˜ฎโ€๐Ÿ’จ face exhaling sigh relief tired exhale\n๐Ÿฅธ disguised face disguise glasses mustache incognito\n๐Ÿฅฑ yawning face yawn tired sleepy bored\n๐ŸคŒ pinched fingers italian what gesture\n๐Ÿค pinching hand small tiny little\n๐Ÿฆพ mechanical arm robot strong prosthetic\n๐Ÿซถ heart hands love support\n๐Ÿซก saluting face salute respect yes\n๐Ÿซ  melting face melt hot embarrassed\n๐Ÿซข face with open eyes and hand over mouth shock surprise gasp\n๐Ÿซฃ face with peeking eye peek shy scared\n๐Ÿซฅ dotted line face invisible hidden\n๐Ÿค white heart love pure\n๐ŸคŽ brown heart love\nโค๏ธโ€๐Ÿ”ฅ heart on fire love passion burning\nโค๏ธโ€๐Ÿฉน mending heart healing recovery love\n๐Ÿซ blueberries fruit berry\n๐Ÿงƒ beverage box juice drink\n๐Ÿง‹ bubble tea boba drink milk\n`;\n"],"names":[],"mappings":"AAKO,MAAM,qBAAwB,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA"}
@@ -64,6 +64,7 @@ function readMatches(data) {
64
64
  }
65
65
  function useContactMatches(gql, contacts, viewer, phone) {
66
66
  const [permission, setPermission] = React.useState(contacts ? "undetermined" : "unsupported");
67
+ const [limited, setLimited] = React.useState(false);
67
68
  const [loading, setLoading] = React.useState(true);
68
69
  const [error, setError] = React.useState(null);
69
70
  const [peers, setPeers] = React.useState([]);
@@ -119,6 +120,10 @@ function useContactMatches(gql, contacts, viewer, phone) {
119
120
  setError(null);
120
121
  try {
121
122
  await loadPeers();
123
+ if (contacts.isLimited) {
124
+ const isLimited = await contacts.isLimited().catch(() => false);
125
+ if (mounted.current) setLimited(isLimited);
126
+ }
122
127
  const raw = await contacts.read();
123
128
  const regions = [contacts.defaultRegion, regionFromE164(viewer == null ? void 0 : viewer.phoneE164)];
124
129
  const normalized = normalizeContacts(raw, regions, (_a = viewer == null ? void 0 : viewer.phoneE164) != null ? _a : null);
@@ -217,15 +222,22 @@ function useContactMatches(gql, contacts, viewer, phone) {
217
222
  setPermission(status);
218
223
  if (status === "granted") await sync();
219
224
  }, [contacts, sync]);
225
+ const chooseMoreContacts = React.useMemo(() => (contacts == null ? void 0 : contacts.chooseMoreContacts) ? async () => {
226
+ var _a;
227
+ await ((_a = contacts.chooseMoreContacts) == null ? void 0 : _a.call(contacts));
228
+ await sync();
229
+ } : void 0, [contacts, sync]);
220
230
  const onYantra = React.useMemo(() => mergeOnYantra(peers, fromBook, viewer == null ? void 0 : viewer.userId), [peers, fromBook, viewer == null ? void 0 : viewer.userId]);
221
231
  return {
222
232
  permission,
233
+ limited,
223
234
  loading,
224
235
  error,
225
236
  onYantra,
226
237
  invitable,
227
238
  requestAccess,
228
239
  refresh: sync,
229
- openSettings: async () => contacts == null ? void 0 : contacts.openSettings()
240
+ openSettings: async () => contacts == null ? void 0 : contacts.openSettings(),
241
+ chooseMoreContacts
230
242
  };
231
243
  }export{useContactMatches};//# sourceMappingURL=useContactMatches.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useContactMatches.js","sources":["../../../src/features/messaging/useContactMatches.ts"],"sourcesContent":["/**\n * The contact sync: read the address book, work out who is already here.\n *\n * The whole pipeline runs in the remote, so all of it is fixable by a surface\n * deploy: normalise -> hash -> ask the server -> split into \"on Yantra\" and\n * \"invite\". Only the address-book read itself is a host seam, because that is\n * the one part needing a native module.\n *\n * With phone-based membership (issue #1312), contact matching delegates to\n * the ChatPhoneSeam, which calls the `yantra-messenger` connector to match\n * E.164 phone numbers against chat members.\n *\n * NOTHING LEAVES THE DEVICE IN PLAINTEXT (legacy mode). Numbers are hashed\n * before the query. See sha256.ts and the server's chat-contact-directory.ts\n * for what that does and does not buy - it is not anonymity, but it does mean\n * we never upload or store the address book of someone who never signed up.\n *\n * If a ChatPhoneSeam is available, it takes precedence for matching.\n */\nimport * as React from 'react';\nimport { CONTACT_MATCHES_QUERY, YANTRA_CHAT_MEMBERS_QUERY } from './chatOperations';\nimport { collectLookupNumbers, normalizeContacts, regionFromE164, type NormalizedContact } from './phoneNumbers';\nimport { sha256 } from './sha256';\nimport type { ChatContactsSeam, ChatGraphQLSeam, ChatPermissionStatus, ChatViewer, ChatPhoneSeam } from './chatHost';\n\nexport interface MatchedContact extends NormalizedContact {\n /** Present when this contact already has an account. */\n match?: { userId: string; displayName: string; picture?: string | null };\n}\n\nexport interface ContactMatchesState {\n permission: ChatPermissionStatus | 'unsupported';\n loading: boolean;\n error: string | null;\n /** Contacts already on Yantra - tap to open a DM. */\n onYantra: MatchedContact[];\n /** Everyone else - tap to invite. */\n invitable: MatchedContact[];\n /** Prompts, then syncs on success. */\n requestAccess: () => Promise<void>;\n /** Re-read the address book and re-match. */\n refresh: () => Promise<void>;\n openSettings: () => Promise<void>;\n}\n\ninterface DirectoryMember {\n phoneE164: string;\n userId: string;\n displayName: string;\n avatarUrl?: string | null;\n}\n\nfunction memberToContact(row: DirectoryMember): MatchedContact {\n return {\n id: `member:${row.userId}`,\n displayName: row.displayName,\n imageUri: row.avatarUrl ?? null,\n e164: row.phoneE164 ? [row.phoneE164] : [],\n match: {\n userId: String(row.userId),\n displayName: row.displayName,\n picture: row.avatarUrl ?? null,\n },\n };\n}\n\nfunction mergeOnYantra(\n peers: MatchedContact[],\n fromBook: MatchedContact[],\n viewerUserId?: string | null,\n): MatchedContact[] {\n const byUser = new Map<string, MatchedContact>();\n for (const row of [...peers, ...fromBook]) {\n const uid = row.match?.userId;\n if (!uid || uid === viewerUserId || !/^[a-f0-9]{24}$/i.test(uid)) continue;\n const existing = byUser.get(uid);\n if (!existing) {\n byUser.set(uid, row);\n continue;\n }\n byUser.set(uid, {\n ...existing,\n displayName: existing.displayName || row.displayName,\n imageUri: existing.imageUri || row.imageUri,\n e164: Array.from(new Set([...existing.e164, ...row.e164])),\n match: {\n ...existing.match!,\n displayName: existing.match?.displayName || row.match?.displayName || existing.displayName,\n picture: existing.match?.picture || row.match?.picture,\n },\n });\n }\n return Array.from(byUser.values()).sort((a, b) => a.displayName.localeCompare(b.displayName));\n}\n\ninterface WireMatch {\n phoneHash?: string;\n userId?: string;\n displayName?: string | null;\n username?: string | null;\n picture?: string | null;\n}\n\n/**\n * The server returns AnyObject, so the payload arrives untyped and possibly as\n * a bare array or wrapped. Normalising defensively here beats trusting a shape\n * the schema does not enforce.\n */\nfunction readMatches(data: unknown): WireMatch[] {\n const raw = (data as { chatContactMatches?: unknown })?.chatContactMatches;\n if (Array.isArray(raw)) return raw as WireMatch[];\n if (raw && typeof raw === 'object' && Array.isArray((raw as { matches?: unknown }).matches)) {\n return (raw as { matches: WireMatch[] }).matches;\n }\n return [];\n}\n\nexport function useContactMatches(\n gql: ChatGraphQLSeam,\n contacts: ChatContactsSeam | undefined,\n viewer: ChatViewer | null,\n phone?: ChatPhoneSeam,\n): ContactMatchesState {\n const [permission, setPermission] = React.useState<ChatPermissionStatus | 'unsupported'>(\n contacts ? 'undetermined' : 'unsupported',\n );\n const [loading, setLoading] = React.useState(true);\n const [error, setError] = React.useState<string | null>(null);\n const [peers, setPeers] = React.useState<MatchedContact[]>([]);\n const [fromBook, setFromBook] = React.useState<MatchedContact[]>([]);\n const [invitable, setInvitable] = React.useState<MatchedContact[]>([]);\n const mounted = React.useRef(true);\n\n React.useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n\n const loadPeers = React.useCallback(async () => {\n try {\n let rows: DirectoryMember[] = [];\n if (phone?.listMembers) {\n const matches = await phone.listMembers();\n rows = Object.values(matches).map((m) => ({\n phoneE164: m.phoneE164,\n userId: m.userId,\n displayName: m.displayName,\n avatarUrl: m.avatarUrl ?? null,\n }));\n } else {\n const res = await gql.query<{ yantraChatMembers?: DirectoryMember[] | null }>(\n YANTRA_CHAT_MEMBERS_QUERY,\n );\n if (res.errors?.length) {\n if (!mounted.current) return;\n setError(res.errors[0].message);\n return;\n }\n rows = res.data?.yantraChatMembers ?? [];\n }\n if (!mounted.current) return;\n const viewerId = viewer?.userId;\n setPeers(\n rows\n .filter((r) => Boolean(r.userId) && r.userId !== viewerId && /^[a-f0-9]{24}$/i.test(r.userId))\n .map(memberToContact),\n );\n } catch (e) {\n if (!mounted.current) return;\n setError(e instanceof Error ? e.message : 'Could not load Yantra Chat members');\n }\n }, [gql, phone, viewer?.userId]);\n\n const sync = React.useCallback(async () => {\n if (!contacts) {\n await loadPeers();\n if (mounted.current) setLoading(false);\n return;\n }\n setLoading(true);\n setError(null);\n try {\n await loadPeers();\n const raw = await contacts.read();\n // Normalisation drops unmatchable numbers and the viewer's own\n // card, which almost everyone has saved.\n // Numbers saved without a country code are read against the device region AND the\n // viewer's verified country: the device may report US for a user whose contacts are Indian.\n const regions = [contacts.defaultRegion, regionFromE164(viewer?.phoneE164)];\n const normalized = normalizeContacts(raw, regions, viewer?.phoneE164 ?? null);\n const numbers = collectLookupNumbers(normalized);\n\n if (!numbers.length) {\n if (!mounted.current) return;\n setFromBook([]);\n setInvitable(normalized);\n setLoading(false);\n return;\n }\n\n let matchedNumbers: Map<string, any>;\n\n if (phone?.matchContacts) {\n // New phone-based membership: use connector to match by E.164 phone number\n try {\n const matches = await phone.matchContacts(numbers);\n matchedNumbers = new Map(Object.entries(matches).map(([phoneE164, match]) => [phoneE164, match]));\n } catch (err) {\n if (!mounted.current) return;\n setError(err instanceof Error ? err.message : 'Could not match contacts');\n setFromBook([]);\n setInvitable(normalized);\n setLoading(false);\n return;\n }\n } else {\n // Legacy hashed directory approach\n const byHash = new Map<string, string>();\n for (const n of numbers) byHash.set(sha256(n), n);\n\n const res = await gql.query(CONTACT_MATCHES_QUERY, { phoneHashes: Array.from(byHash.keys()) });\n if (!mounted.current) return;\n\n matchedNumbers = new Map<string, any>();\n for (const m of readMatches(res.data)) {\n const number = m?.phoneHash ? byHash.get(m.phoneHash) : undefined;\n if (number && m?.userId) matchedNumbers.set(number, m);\n }\n\n if (res.errors?.length) {\n setError(res.errors[0].message);\n }\n }\n\n const here: MatchedContact[] = [];\n const rest: MatchedContact[] = [];\n for (const c of normalized) {\n const hit = c.e164.map((n) => matchedNumbers.get(n)).find(Boolean);\n if (hit?.userId) {\n here.push({\n ...c,\n match: {\n userId: String(hit.userId),\n // Prefer the name from THEIR account over the one in\n // your address book only when yours is missing -\n // you called them \"Mum\" for a reason.\n displayName: c.displayName || hit.displayName || hit.username || 'Unknown',\n picture: hit.avatarUrl ?? hit.picture ?? null,\n },\n });\n } else {\n rest.push(c);\n }\n }\n\n here.sort((a, b) => a.displayName.localeCompare(b.displayName));\n rest.sort((a, b) => a.displayName.localeCompare(b.displayName));\n setFromBook(here);\n setInvitable(rest);\n } catch (e) {\n if (!mounted.current) return;\n setError(e instanceof Error ? e.message : 'Could not read your contacts.');\n } finally {\n if (mounted.current) setLoading(false);\n }\n }, [contacts, gql, viewer, phone, loadPeers]);\n\n React.useEffect(() => {\n void loadPeers().finally(() => {\n if (mounted.current) setLoading(false);\n });\n }, [loadPeers]);\n\n // Check the CURRENT status without prompting, so the screen can offer the\n // right action - ask, or deep-link to Settings after a previous denial.\n React.useEffect(() => {\n let cancelled = false;\n if (!contacts) {\n setPermission('unsupported');\n return () => undefined;\n }\n void (async () => {\n const status = await contacts.getPermission();\n if (cancelled || !mounted.current) return;\n setPermission(status);\n if (status === 'granted') void sync();\n })();\n return () => {\n cancelled = true;\n };\n }, [contacts, sync]);\n\n const requestAccess = React.useCallback(async () => {\n if (!contacts) return;\n const status = await contacts.requestPermission();\n if (!mounted.current) return;\n setPermission(status);\n if (status === 'granted') await sync();\n }, [contacts, sync]);\n\n const onYantra = React.useMemo(\n () => mergeOnYantra(peers, fromBook, viewer?.userId),\n [peers, fromBook, viewer?.userId],\n );\n\n return {\n permission,\n loading,\n error,\n onYantra,\n invitable,\n requestAccess,\n refresh: sync,\n openSettings: async () => contacts?.openSettings(),\n };\n}\n"],"names":["_a"],"mappings":";;;;;;;;;;;;;;;;;;;AAoDA,SAAS,gBAAgB,GAAsC,EAAA;AApD/D,EAAA,IAAA,EAAA,EAAA,EAAA;AAqDE,EAAO,OAAA;AAAA,IACL,EAAA,EAAI,CAAU,OAAA,EAAA,GAAA,CAAI,MAAM,CAAA,CAAA;AAAA,IACxB,aAAa,GAAI,CAAA,WAAA;AAAA,IACjB,QAAA,EAAA,CAAU,EAAI,GAAA,GAAA,CAAA,SAAA,KAAJ,IAAiB,GAAA,EAAA,GAAA,IAAA;AAAA,IAC3B,MAAM,GAAI,CAAA,SAAA,GAAY,CAAC,GAAI,CAAA,SAAS,IAAI,EAAC;AAAA,IACzC,KAAO,EAAA;AAAA,MACL,MAAA,EAAQ,MAAO,CAAA,GAAA,CAAI,MAAM,CAAA;AAAA,MACzB,aAAa,GAAI,CAAA,WAAA;AAAA,MACjB,OAAA,EAAA,CAAS,EAAI,GAAA,GAAA,CAAA,SAAA,KAAJ,IAAiB,GAAA,EAAA,GAAA;AAAA;AAC5B,GACF;AACF;AACA,SAAS,aAAA,CAAc,KAAyB,EAAA,QAAA,EAA4B,YAAgD,EAAA;AAjE5H,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAkEE,EAAM,MAAA,MAAA,uBAAa,GAA4B,EAAA;AAC/C,EAAA,KAAA,MAAW,OAAO,CAAC,GAAG,KAAO,EAAA,GAAG,QAAQ,CAAG,EAAA;AACzC,IAAM,MAAA,GAAA,GAAA,CAAM,EAAI,GAAA,GAAA,CAAA,KAAA,KAAJ,IAAW,GAAA,MAAA,GAAA,EAAA,CAAA,MAAA;AACvB,IAAI,IAAA,CAAC,OAAO,GAAQ,KAAA,YAAA,IAAgB,CAAC,iBAAkB,CAAA,IAAA,CAAK,GAAG,CAAG,EAAA;AAClE,IAAM,MAAA,QAAA,GAAW,MAAO,CAAA,GAAA,CAAI,GAAG,CAAA;AAC/B,IAAA,IAAI,CAAC,QAAU,EAAA;AACb,MAAO,MAAA,CAAA,GAAA,CAAI,KAAK,GAAG,CAAA;AACnB,MAAA;AAAA;AAEF,IAAO,MAAA,CAAA,GAAA,CAAI,GAAK,EAAA,aAAA,CAAA,cAAA,CAAA,EAAA,EACX,QADW,CAAA,EAAA;AAAA,MAEd,WAAA,EAAa,QAAS,CAAA,WAAA,IAAe,GAAI,CAAA,WAAA;AAAA,MACzC,QAAA,EAAU,QAAS,CAAA,QAAA,IAAY,GAAI,CAAA,QAAA;AAAA,MACnC,IAAM,EAAA,KAAA,CAAM,IAAK,iBAAA,IAAI,GAAI,CAAA,CAAC,GAAG,QAAA,CAAS,IAAM,EAAA,GAAG,GAAI,CAAA,IAAI,CAAC,CAAC,CAAA;AAAA,MACzD,KAAA,EAAO,aACF,CAAA,cAAA,CAAA,EAAA,EAAA,QAAA,CAAS,KADP,CAAA,EAAA;AAAA,QAEL,WAAA,EAAA,CAAA,CAAa,cAAS,KAAT,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAgB,kBAAe,EAAI,GAAA,GAAA,CAAA,KAAA,KAAJ,IAAW,GAAA,MAAA,GAAA,EAAA,CAAA,WAAA,CAAA,IAAe,QAAS,CAAA,WAAA;AAAA,QAC/E,WAAS,EAAS,GAAA,QAAA,CAAA,KAAA,KAAT,mBAAgB,OAAW,MAAA,CAAA,EAAA,GAAA,GAAA,CAAI,UAAJ,IAAW,GAAA,MAAA,GAAA,EAAA,CAAA,OAAA;AAAA,OACjD;AAAA,KACD,CAAA,CAAA;AAAA;AAEH,EAAA,OAAO,KAAM,CAAA,IAAA,CAAK,MAAO,CAAA,MAAA,EAAQ,CAAE,CAAA,IAAA,CAAK,CAAC,CAAA,EAAG,MAAM,CAAE,CAAA,WAAA,CAAY,aAAc,CAAA,CAAA,CAAE,WAAW,CAAC,CAAA;AAC9F;AAcA,SAAS,YAAY,IAA4B,EAAA;AAC/C,EAAA,MAAM,MAAO,IAET,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAA,kBAAA;AACJ,EAAA,IAAI,KAAM,CAAA,OAAA,CAAQ,GAAG,CAAA,EAAU,OAAA,GAAA;AAC/B,EAAI,IAAA,GAAA,IAAO,OAAO,GAAQ,KAAA,QAAA,IAAY,MAAM,OAAS,CAAA,GAAA,CAElD,OAAO,CAAG,EAAA;AACX,IAAA,OAAQ,GAEL,CAAA,OAAA;AAAA;AAEL,EAAA,OAAO,EAAC;AACV;AACO,SAAS,iBAAkB,CAAA,GAAA,EAAsB,QAAwC,EAAA,MAAA,EAA2B,KAA4C,EAAA;AACrK,EAAM,MAAA,CAAC,YAAY,aAAa,CAAA,GAAI,MAAM,QAA+C,CAAA,QAAA,GAAW,iBAAiB,aAAa,CAAA;AAClI,EAAA,MAAM,CAAC,OAAS,EAAA,UAAU,CAAI,GAAA,KAAA,CAAM,SAAS,IAAI,CAAA;AACjD,EAAA,MAAM,CAAC,KAAO,EAAA,QAAQ,CAAI,GAAA,KAAA,CAAM,SAAwB,IAAI,CAAA;AAC5D,EAAA,MAAM,CAAC,KAAO,EAAA,QAAQ,IAAI,KAAM,CAAA,QAAA,CAA2B,EAAE,CAAA;AAC7D,EAAA,MAAM,CAAC,QAAU,EAAA,WAAW,IAAI,KAAM,CAAA,QAAA,CAA2B,EAAE,CAAA;AACnE,EAAA,MAAM,CAAC,SAAW,EAAA,YAAY,IAAI,KAAM,CAAA,QAAA,CAA2B,EAAE,CAAA;AACrE,EAAM,MAAA,OAAA,GAAU,KAAM,CAAA,MAAA,CAAO,IAAI,CAAA;AACjC,EAAA,KAAA,CAAM,UAAU,MAAM;AACpB,IAAA,OAAA,CAAQ,OAAU,GAAA,IAAA;AAClB,IAAA,OAAO,MAAM;AACX,MAAA,OAAA,CAAQ,OAAU,GAAA,KAAA;AAAA,KACpB;AAAA,GACF,EAAG,EAAE,CAAA;AACL,EAAM,MAAA,SAAA,GAAY,KAAM,CAAA,WAAA,CAAY,YAAY;AAlIlD,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAmII,IAAI,IAAA;AACF,MAAA,IAAI,OAA0B,EAAC;AAC/B,MAAA,IAAI,+BAAO,WAAa,EAAA;AACtB,QAAM,MAAA,OAAA,GAAU,MAAM,KAAA,CAAM,WAAY,EAAA;AACxC,QAAA,IAAA,GAAO,MAAO,CAAA,MAAA,CAAO,OAAO,CAAA,CAAE,IAAI,CAAE,CAAA,KAAA;AAvI5C,UAAAA,IAAAA,GAAAA;AAuIgD,UAAA,OAAA;AAAA,YACtC,WAAW,CAAE,CAAA,SAAA;AAAA,YACb,QAAQ,CAAE,CAAA,MAAA;AAAA,YACV,aAAa,CAAE,CAAA,WAAA;AAAA,YACf,SAAWA,EAAAA,CAAAA,GAAAA,GAAA,CAAE,CAAA,SAAA,KAAF,OAAAA,GAAe,GAAA;AAAA,WAC5B;AAAA,SAAE,CAAA;AAAA,OACG,MAAA;AACL,QAAA,MAAM,GAAM,GAAA,MAAM,GAAI,CAAA,KAAA,CAEnB,yBAAyB,CAAA;AAC5B,QAAI,IAAA,CAAA,EAAA,GAAA,GAAA,CAAI,MAAJ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAY,MAAQ,EAAA;AACtB,UAAI,IAAA,CAAC,QAAQ,OAAS,EAAA;AACtB,UAAA,QAAA,CAAS,GAAI,CAAA,MAAA,CAAO,CAAC,CAAA,CAAE,OAAO,CAAA;AAC9B,UAAA;AAAA;AAEF,QAAA,IAAA,GAAA,CAAO,EAAI,GAAA,CAAA,EAAA,GAAA,GAAA,CAAA,IAAA,KAAJ,IAAU,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,iBAAA,KAAV,YAA+B,EAAC;AAAA;AAEzC,MAAI,IAAA,CAAC,QAAQ,OAAS,EAAA;AACtB,MAAA,MAAM,WAAW,MAAQ,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,MAAA,CAAA,MAAA;AACzB,MAAA,QAAA,CAAS,KAAK,MAAO,CAAA,CAAA,CAAA,KAAK,QAAQ,CAAE,CAAA,MAAM,KAAK,CAAE,CAAA,MAAA,KAAW,QAAY,IAAA,iBAAA,CAAkB,KAAK,CAAE,CAAA,MAAM,CAAC,CAAE,CAAA,GAAA,CAAI,eAAe,CAAC,CAAA;AAAA,aACvH,CAAG,EAAA;AACV,MAAI,IAAA,CAAC,QAAQ,OAAS,EAAA;AACtB,MAAA,QAAA,CAAS,CAAa,YAAA,KAAA,GAAQ,CAAE,CAAA,OAAA,GAAU,oCAAoC,CAAA;AAAA;AAChF,KACC,CAAC,GAAA,EAAK,KAAO,EAAA,MAAA,IAAA,IAAA,GAAA,MAAA,GAAA,MAAA,CAAQ,MAAM,CAAC,CAAA;AAC/B,EAAM,MAAA,IAAA,GAAO,KAAM,CAAA,WAAA,CAAY,YAAY;AAhK7C,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAiKI,IAAA,IAAI,CAAC,QAAU,EAAA;AACb,MAAA,MAAM,SAAU,EAAA;AAChB,MAAI,IAAA,OAAA,CAAQ,OAAS,EAAA,UAAA,CAAW,KAAK,CAAA;AACrC,MAAA;AAAA;AAEF,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAI,IAAA;AACF,MAAA,MAAM,SAAU,EAAA;AAChB,MAAM,MAAA,GAAA,GAAM,MAAM,QAAA,CAAS,IAAK,EAAA;AAKhC,MAAA,MAAM,UAAU,CAAC,QAAA,CAAS,eAAe,cAAe,CAAA,MAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,MAAA,CAAQ,SAAS,CAAC,CAAA;AAC1E,MAAA,MAAM,aAAa,iBAAkB,CAAA,GAAA,EAAK,UAAS,EAAQ,GAAA,MAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,MAAA,CAAA,SAAA,KAAR,YAAqB,IAAI,CAAA;AAC5E,MAAM,MAAA,OAAA,GAAU,qBAAqB,UAAU,CAAA;AAC/C,MAAI,IAAA,CAAC,QAAQ,MAAQ,EAAA;AACnB,QAAI,IAAA,CAAC,QAAQ,OAAS,EAAA;AACtB,QAAA,WAAA,CAAY,EAAE,CAAA;AACd,QAAA,YAAA,CAAa,UAAU,CAAA;AACvB,QAAA,UAAA,CAAW,KAAK,CAAA;AAChB,QAAA;AAAA;AAEF,MAAI,IAAA,cAAA;AACJ,MAAA,IAAI,+BAAO,aAAe,EAAA;AAExB,QAAI,IAAA;AACF,UAAA,MAAM,OAAU,GAAA,MAAM,KAAM,CAAA,aAAA,CAAc,OAAO,CAAA;AACjD,UAAA,cAAA,GAAiB,IAAI,GAAI,CAAA,MAAA,CAAO,OAAQ,CAAA,OAAO,EAAE,GAAI,CAAA,CAAC,CAAC,SAAA,EAAW,KAAK,CAAM,KAAA,CAAC,SAAW,EAAA,KAAK,CAAC,CAAC,CAAA;AAAA,iBACzF,GAAK,EAAA;AACZ,UAAI,IAAA,CAAC,QAAQ,OAAS,EAAA;AACtB,UAAA,QAAA,CAAS,GAAe,YAAA,KAAA,GAAQ,GAAI,CAAA,OAAA,GAAU,0BAA0B,CAAA;AACxE,UAAA,WAAA,CAAY,EAAE,CAAA;AACd,UAAA,YAAA,CAAa,UAAU,CAAA;AACvB,UAAA,UAAA,CAAW,KAAK,CAAA;AAChB,UAAA;AAAA;AACF,OACK,MAAA;AAEL,QAAM,MAAA,MAAA,uBAAa,GAAoB,EAAA;AACvC,QAAA,KAAA,MAAW,KAAK,OAAS,EAAA,MAAA,CAAO,IAAI,MAAO,CAAA,CAAC,GAAG,CAAC,CAAA;AAChD,QAAA,MAAM,GAAM,GAAA,MAAM,GAAI,CAAA,KAAA,CAAM,qBAAuB,EAAA;AAAA,UACjD,WAAa,EAAA,KAAA,CAAM,IAAK,CAAA,MAAA,CAAO,MAAM;AAAA,SACtC,CAAA;AACD,QAAI,IAAA,CAAC,QAAQ,OAAS,EAAA;AACtB,QAAA,cAAA,uBAAqB,GAAiB,EAAA;AACtC,QAAA,KAAA,MAAW,CAAK,IAAA,WAAA,CAAY,GAAI,CAAA,IAAI,CAAG,EAAA;AACrC,UAAA,MAAM,UAAS,CAAG,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,CAAA,CAAA,SAAA,IAAY,OAAO,GAAI,CAAA,CAAA,CAAE,SAAS,CAAI,GAAA,KAAA,CAAA;AACxD,UAAA,IAAI,WAAU,CAAG,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,CAAA,CAAA,MAAA,CAAA,EAAuB,cAAA,CAAA,GAAA,CAAI,QAAQ,CAAC,CAAA;AAAA;AAEvD,QAAI,IAAA,CAAA,EAAA,GAAA,GAAA,CAAI,MAAJ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAY,MAAQ,EAAA;AACtB,UAAA,QAAA,CAAS,GAAI,CAAA,MAAA,CAAO,CAAC,CAAA,CAAE,OAAO,CAAA;AAAA;AAChC;AAEF,MAAA,MAAM,OAAyB,EAAC;AAChC,MAAA,MAAM,OAAyB,EAAC;AAChC,MAAA,KAAA,MAAW,KAAK,UAAY,EAAA;AAC1B,QAAM,MAAA,GAAA,GAAM,CAAE,CAAA,IAAA,CAAK,GAAI,CAAA,CAAA,CAAA,KAAK,cAAe,CAAA,GAAA,CAAI,CAAC,CAAC,CAAE,CAAA,IAAA,CAAK,OAAO,CAAA;AAC/D,QAAA,IAAI,2BAAK,MAAQ,EAAA;AACf,UAAK,IAAA,CAAA,IAAA,CAAK,iCACL,CADK,CAAA,EAAA;AAAA,YAER,KAAO,EAAA;AAAA,cACL,MAAA,EAAQ,MAAO,CAAA,GAAA,CAAI,MAAM,CAAA;AAAA;AAAA;AAAA;AAAA,cAIzB,aAAa,CAAE,CAAA,WAAA,IAAe,GAAI,CAAA,WAAA,IAAe,IAAI,QAAY,IAAA,SAAA;AAAA,cACjE,UAAS,EAAI,GAAA,CAAA,EAAA,GAAA,GAAA,CAAA,SAAA,KAAJ,IAAiB,GAAA,EAAA,GAAA,GAAA,CAAI,YAArB,IAAgC,GAAA,EAAA,GAAA;AAAA;AAC3C,WACD,CAAA,CAAA;AAAA,SACI,MAAA;AACL,UAAA,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA;AACb;AAEF,MAAK,IAAA,CAAA,IAAA,CAAK,CAAC,CAAG,EAAA,CAAA,KAAM,EAAE,WAAY,CAAA,aAAA,CAAc,CAAE,CAAA,WAAW,CAAC,CAAA;AAC9D,MAAK,IAAA,CAAA,IAAA,CAAK,CAAC,CAAG,EAAA,CAAA,KAAM,EAAE,WAAY,CAAA,aAAA,CAAc,CAAE,CAAA,WAAW,CAAC,CAAA;AAC9D,MAAA,WAAA,CAAY,IAAI,CAAA;AAChB,MAAA,YAAA,CAAa,IAAI,CAAA;AAAA,aACV,CAAG,EAAA;AACV,MAAI,IAAA,CAAC,QAAQ,OAAS,EAAA;AACtB,MAAA,QAAA,CAAS,CAAa,YAAA,KAAA,GAAQ,CAAE,CAAA,OAAA,GAAU,+BAA+B,CAAA;AAAA,KACzE,SAAA;AACA,MAAI,IAAA,OAAA,CAAQ,OAAS,EAAA,UAAA,CAAW,KAAK,CAAA;AAAA;AACvC,KACC,CAAC,QAAA,EAAU,KAAK,MAAQ,EAAA,KAAA,EAAO,SAAS,CAAC,CAAA;AAC5C,EAAA,KAAA,CAAM,UAAU,MAAM;AACpB,IAAK,KAAA,SAAA,EAAY,CAAA,OAAA,CAAQ,MAAM;AAC7B,MAAI,IAAA,OAAA,CAAQ,OAAS,EAAA,UAAA,CAAW,KAAK,CAAA;AAAA,KACtC,CAAA;AAAA,GACH,EAAG,CAAC,SAAS,CAAC,CAAA;AAId,EAAA,KAAA,CAAM,UAAU,MAAM;AACpB,IAAA,IAAI,SAAY,GAAA,KAAA;AAChB,IAAA,IAAI,CAAC,QAAU,EAAA;AACb,MAAA,aAAA,CAAc,aAAa,CAAA;AAC3B,MAAA,OAAO,MAAM,MAAA;AAAA;AAEf,IAAA,KAAA,CAAM,YAAY;AAChB,MAAM,MAAA,MAAA,GAAS,MAAM,QAAA,CAAS,aAAc,EAAA;AAC5C,MAAI,IAAA,SAAA,IAAa,CAAC,OAAA,CAAQ,OAAS,EAAA;AACnC,MAAA,aAAA,CAAc,MAAM,CAAA;AACpB,MAAI,IAAA,MAAA,KAAW,SAAW,EAAA,KAAK,IAAK,EAAA;AAAA,KACnC,GAAA;AACH,IAAA,OAAO,MAAM;AACX,MAAY,SAAA,GAAA,IAAA;AAAA,KACd;AAAA,GACC,EAAA,CAAC,QAAU,EAAA,IAAI,CAAC,CAAA;AACnB,EAAM,MAAA,aAAA,GAAgB,KAAM,CAAA,WAAA,CAAY,YAAY;AAClD,IAAA,IAAI,CAAC,QAAU,EAAA;AACf,IAAM,MAAA,MAAA,GAAS,MAAM,QAAA,CAAS,iBAAkB,EAAA;AAChD,IAAI,IAAA,CAAC,QAAQ,OAAS,EAAA;AACtB,IAAA,aAAA,CAAc,MAAM,CAAA;AACpB,IAAI,IAAA,MAAA,KAAW,SAAW,EAAA,MAAM,IAAK,EAAA;AAAA,GACpC,EAAA,CAAC,QAAU,EAAA,IAAI,CAAC,CAAA;AACnB,EAAA,MAAM,QAAW,GAAA,KAAA,CAAM,OAAQ,CAAA,MAAM,cAAc,KAAO,EAAA,QAAA,EAAU,MAAQ,IAAA,IAAA,GAAA,MAAA,GAAA,MAAA,CAAA,MAAM,GAAG,CAAC,KAAA,EAAO,QAAU,EAAA,MAAA,IAAA,IAAA,GAAA,MAAA,GAAA,MAAA,CAAQ,MAAM,CAAC,CAAA;AACtH,EAAO,OAAA;AAAA,IACL,UAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,aAAA;AAAA,IACA,OAAS,EAAA,IAAA;AAAA,IACT,YAAA,EAAc,YAAY,QAAU,IAAA,IAAA,GAAA,MAAA,GAAA,QAAA,CAAA,YAAA;AAAA,GACtC;AACF"}
1
+ {"version":3,"file":"useContactMatches.js","sources":["../../../src/features/messaging/useContactMatches.ts"],"sourcesContent":["/**\n * The contact sync: read the address book, work out who is already here.\n *\n * The whole pipeline runs in the remote, so all of it is fixable by a surface\n * deploy: normalise -> hash -> ask the server -> split into \"on Yantra\" and\n * \"invite\". Only the address-book read itself is a host seam, because that is\n * the one part needing a native module.\n *\n * With phone-based membership (issue #1312), contact matching delegates to\n * the ChatPhoneSeam, which calls the `yantra-messenger` connector to match\n * E.164 phone numbers against chat members.\n *\n * NOTHING LEAVES THE DEVICE IN PLAINTEXT (legacy mode). Numbers are hashed\n * before the query. See sha256.ts and the server's chat-contact-directory.ts\n * for what that does and does not buy - it is not anonymity, but it does mean\n * we never upload or store the address book of someone who never signed up.\n *\n * If a ChatPhoneSeam is available, it takes precedence for matching.\n */\nimport * as React from 'react';\nimport { CONTACT_MATCHES_QUERY, YANTRA_CHAT_MEMBERS_QUERY } from './chatOperations';\nimport { collectLookupNumbers, normalizeContacts, regionFromE164, type NormalizedContact } from './phoneNumbers';\nimport { sha256 } from './sha256';\nimport type { ChatContactsSeam, ChatGraphQLSeam, ChatPermissionStatus, ChatViewer, ChatPhoneSeam } from './chatHost';\n\nexport interface MatchedContact extends NormalizedContact {\n /** Present when this contact already has an account. */\n match?: { userId: string; displayName: string; picture?: string | null };\n}\n\nexport interface ContactMatchesState {\n permission: ChatPermissionStatus | 'unsupported';\n /** Granted for selected contacts only (iOS 18 Limited Access). */\n limited: boolean;\n loading: boolean;\n error: string | null;\n /** Contacts already on Yantra - tap to open a DM. */\n onYantra: MatchedContact[];\n /** Everyone else - tap to invite. */\n invitable: MatchedContact[];\n /** Prompts, then syncs on success. */\n requestAccess: () => Promise<void>;\n /** Re-read the address book and re-match. */\n refresh: () => Promise<void>;\n openSettings: () => Promise<void>;\n /** Present when the host can show the iOS contact access picker. */\n chooseMoreContacts?: () => Promise<void>;\n}\n\ninterface DirectoryMember {\n phoneE164: string;\n userId: string;\n displayName: string;\n avatarUrl?: string | null;\n}\n\nfunction memberToContact(row: DirectoryMember): MatchedContact {\n return {\n id: `member:${row.userId}`,\n displayName: row.displayName,\n imageUri: row.avatarUrl ?? null,\n e164: row.phoneE164 ? [row.phoneE164] : [],\n match: {\n userId: String(row.userId),\n displayName: row.displayName,\n picture: row.avatarUrl ?? null,\n },\n };\n}\n\nfunction mergeOnYantra(\n peers: MatchedContact[],\n fromBook: MatchedContact[],\n viewerUserId?: string | null,\n): MatchedContact[] {\n const byUser = new Map<string, MatchedContact>();\n for (const row of [...peers, ...fromBook]) {\n const uid = row.match?.userId;\n if (!uid || uid === viewerUserId || !/^[a-f0-9]{24}$/i.test(uid)) continue;\n const existing = byUser.get(uid);\n if (!existing) {\n byUser.set(uid, row);\n continue;\n }\n byUser.set(uid, {\n ...existing,\n displayName: existing.displayName || row.displayName,\n imageUri: existing.imageUri || row.imageUri,\n e164: Array.from(new Set([...existing.e164, ...row.e164])),\n match: {\n ...existing.match!,\n displayName: existing.match?.displayName || row.match?.displayName || existing.displayName,\n picture: existing.match?.picture || row.match?.picture,\n },\n });\n }\n return Array.from(byUser.values()).sort((a, b) => a.displayName.localeCompare(b.displayName));\n}\n\ninterface WireMatch {\n phoneHash?: string;\n userId?: string;\n displayName?: string | null;\n username?: string | null;\n picture?: string | null;\n}\n\n/**\n * The server returns AnyObject, so the payload arrives untyped and possibly as\n * a bare array or wrapped. Normalising defensively here beats trusting a shape\n * the schema does not enforce.\n */\nfunction readMatches(data: unknown): WireMatch[] {\n const raw = (data as { chatContactMatches?: unknown })?.chatContactMatches;\n if (Array.isArray(raw)) return raw as WireMatch[];\n if (raw && typeof raw === 'object' && Array.isArray((raw as { matches?: unknown }).matches)) {\n return (raw as { matches: WireMatch[] }).matches;\n }\n return [];\n}\n\nexport function useContactMatches(\n gql: ChatGraphQLSeam,\n contacts: ChatContactsSeam | undefined,\n viewer: ChatViewer | null,\n phone?: ChatPhoneSeam,\n): ContactMatchesState {\n const [permission, setPermission] = React.useState<ChatPermissionStatus | 'unsupported'>(\n contacts ? 'undetermined' : 'unsupported',\n );\n const [limited, setLimited] = React.useState(false);\n const [loading, setLoading] = React.useState(true);\n const [error, setError] = React.useState<string | null>(null);\n const [peers, setPeers] = React.useState<MatchedContact[]>([]);\n const [fromBook, setFromBook] = React.useState<MatchedContact[]>([]);\n const [invitable, setInvitable] = React.useState<MatchedContact[]>([]);\n const mounted = React.useRef(true);\n\n React.useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n\n const loadPeers = React.useCallback(async () => {\n try {\n let rows: DirectoryMember[] = [];\n if (phone?.listMembers) {\n const matches = await phone.listMembers();\n rows = Object.values(matches).map((m) => ({\n phoneE164: m.phoneE164,\n userId: m.userId,\n displayName: m.displayName,\n avatarUrl: m.avatarUrl ?? null,\n }));\n } else {\n const res = await gql.query<{ yantraChatMembers?: DirectoryMember[] | null }>(\n YANTRA_CHAT_MEMBERS_QUERY,\n );\n if (res.errors?.length) {\n if (!mounted.current) return;\n setError(res.errors[0].message);\n return;\n }\n rows = res.data?.yantraChatMembers ?? [];\n }\n if (!mounted.current) return;\n const viewerId = viewer?.userId;\n setPeers(\n rows\n .filter((r) => Boolean(r.userId) && r.userId !== viewerId && /^[a-f0-9]{24}$/i.test(r.userId))\n .map(memberToContact),\n );\n } catch (e) {\n if (!mounted.current) return;\n setError(e instanceof Error ? e.message : 'Could not load Yantra Chat members');\n }\n }, [gql, phone, viewer?.userId]);\n\n const sync = React.useCallback(async () => {\n if (!contacts) {\n await loadPeers();\n if (mounted.current) setLoading(false);\n return;\n }\n setLoading(true);\n setError(null);\n try {\n await loadPeers();\n // Re-checked on every sync: the user can widen or narrow access in Settings at any time.\n if (contacts.isLimited) {\n const isLimited = await contacts.isLimited().catch(() => false);\n if (mounted.current) setLimited(isLimited);\n }\n const raw = await contacts.read();\n // Normalisation drops unmatchable numbers and the viewer's own\n // card, which almost everyone has saved.\n // Numbers saved without a country code are read against the device region AND the\n // viewer's verified country: the device may report US for a user whose contacts are Indian.\n const regions = [contacts.defaultRegion, regionFromE164(viewer?.phoneE164)];\n const normalized = normalizeContacts(raw, regions, viewer?.phoneE164 ?? null);\n const numbers = collectLookupNumbers(normalized);\n\n if (!numbers.length) {\n if (!mounted.current) return;\n setFromBook([]);\n setInvitable(normalized);\n setLoading(false);\n return;\n }\n\n let matchedNumbers: Map<string, any>;\n\n if (phone?.matchContacts) {\n // New phone-based membership: use connector to match by E.164 phone number\n try {\n const matches = await phone.matchContacts(numbers);\n matchedNumbers = new Map(Object.entries(matches).map(([phoneE164, match]) => [phoneE164, match]));\n } catch (err) {\n if (!mounted.current) return;\n setError(err instanceof Error ? err.message : 'Could not match contacts');\n setFromBook([]);\n setInvitable(normalized);\n setLoading(false);\n return;\n }\n } else {\n // Legacy hashed directory approach\n const byHash = new Map<string, string>();\n for (const n of numbers) byHash.set(sha256(n), n);\n\n const res = await gql.query(CONTACT_MATCHES_QUERY, { phoneHashes: Array.from(byHash.keys()) });\n if (!mounted.current) return;\n\n matchedNumbers = new Map<string, any>();\n for (const m of readMatches(res.data)) {\n const number = m?.phoneHash ? byHash.get(m.phoneHash) : undefined;\n if (number && m?.userId) matchedNumbers.set(number, m);\n }\n\n if (res.errors?.length) {\n setError(res.errors[0].message);\n }\n }\n\n const here: MatchedContact[] = [];\n const rest: MatchedContact[] = [];\n for (const c of normalized) {\n const hit = c.e164.map((n) => matchedNumbers.get(n)).find(Boolean);\n if (hit?.userId) {\n here.push({\n ...c,\n match: {\n userId: String(hit.userId),\n // Prefer the name from THEIR account over the one in\n // your address book only when yours is missing -\n // you called them \"Mum\" for a reason.\n displayName: c.displayName || hit.displayName || hit.username || 'Unknown',\n picture: hit.avatarUrl ?? hit.picture ?? null,\n },\n });\n } else {\n rest.push(c);\n }\n }\n\n here.sort((a, b) => a.displayName.localeCompare(b.displayName));\n rest.sort((a, b) => a.displayName.localeCompare(b.displayName));\n setFromBook(here);\n setInvitable(rest);\n } catch (e) {\n if (!mounted.current) return;\n setError(e instanceof Error ? e.message : 'Could not read your contacts.');\n } finally {\n if (mounted.current) setLoading(false);\n }\n }, [contacts, gql, viewer, phone, loadPeers]);\n\n React.useEffect(() => {\n void loadPeers().finally(() => {\n if (mounted.current) setLoading(false);\n });\n }, [loadPeers]);\n\n // Check the CURRENT status without prompting, so the screen can offer the\n // right action - ask, or deep-link to Settings after a previous denial.\n React.useEffect(() => {\n let cancelled = false;\n if (!contacts) {\n setPermission('unsupported');\n return () => undefined;\n }\n void (async () => {\n const status = await contacts.getPermission();\n if (cancelled || !mounted.current) return;\n setPermission(status);\n if (status === 'granted') void sync();\n })();\n return () => {\n cancelled = true;\n };\n }, [contacts, sync]);\n\n const requestAccess = React.useCallback(async () => {\n if (!contacts) return;\n const status = await contacts.requestPermission();\n if (!mounted.current) return;\n setPermission(status);\n if (status === 'granted') await sync();\n }, [contacts, sync]);\n\n // Reopens the address book afterwards: the user may have just shared more people.\n const chooseMoreContacts = React.useMemo(\n () =>\n contacts?.chooseMoreContacts\n ? async () => {\n await contacts.chooseMoreContacts?.();\n await sync();\n }\n : undefined,\n [contacts, sync],\n );\n\n const onYantra = React.useMemo(\n () => mergeOnYantra(peers, fromBook, viewer?.userId),\n [peers, fromBook, viewer?.userId],\n );\n\n return {\n permission,\n limited,\n loading,\n error,\n onYantra,\n invitable,\n requestAccess,\n refresh: sync,\n openSettings: async () => contacts?.openSettings(),\n chooseMoreContacts,\n };\n}\n"],"names":["_a"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import {jsx}from'react/jsx-runtime';import {useMemo,useCallback}from'react';import {PendingConnectorConnectCard}from'../features/chat/ConnectorConnectPrompt.js';import {displayConnectorConnectMessages,displayConnectorConnectText}from'../features/chat/connectorConnect.js';function displayStreaming(text) {
1
+ import {jsx}from'react/jsx-runtime';import {useMemo,useCallback}from'react';import {PendingConnectorConnectCard}from'../features/chat/ConnectorConnectPrompt.js';import {displayConnectorConnectMessages,displayConnectorConnectText}from'common';function displayStreaming(text) {
2
2
  return text ? displayConnectorConnectText(text, true) || null : null;
3
3
  }
4
4
  function useHostConnectorCard(chat, channelId) {
@@ -1 +1 @@
1
- {"version":3,"file":"useHostConnectorCard.js","sources":["../../src/hooks/useHostConnectorCard.tsx"],"sourcesContent":["/**\n * The `[CONNECTOR_CONNECT]` card for a native surface chat (shop, travel, jobs,\n * resume), built on the surface's HOST screen.\n *\n * The surface UI ships as a federated remote that must not bundle the host's data\n * stack (Apollo, redux, `common`, expo-web-browser) - see useShoppingHostChat. So\n * the host does everything protocol-shaped: it cleans the thread before the remote\n * sees it (the markers and the card's replies are not shown as text) and hands the\n * remote a render function for the card, which the remote only places above its\n * composer. The card is a host component; rendered inside the remote's tree it\n * still reads the host's providers, which wrap that tree.\n *\n * The reply goes to the host channel directly - not through the surface's own\n * `onSend`, which may route text to a local lane or wrap it in context - and only\n * counts as sent when the channel took it (sent, or parked in the durable outbox,\n * whose row then settles the request).\n */\nimport React, { useCallback, useMemo, type ReactNode } from 'react';\nimport { PendingConnectorConnectCard } from '../features/chat/ConnectorConnectPrompt';\nimport { displayConnectorConnectMessages, displayConnectorConnectText } from '../features/chat/connectorConnect';\nimport type { useChatStream } from './useChatStream';\n\ntype HostChatStream = Pick<ReturnType<typeof useChatStream>, 'messages' | 'queuedMessages' | 'sendMessage'>;\n\nexport interface HostConnectorCard {\n /** The card for the request still waiting in the thread (renders nothing when none is). */\n renderConnectorCard: (isDark: boolean) => ReactNode;\n /** A thread as the remote's transcript should show it: markers and card replies out. */\n displayMessages: <T extends { role: string; content: string }>(messages: ReadonlyArray<T>) => T[];\n /** The streaming reply as the remote should show it: a half-written marker never flashes. */\n displayStreaming: (text: string | null | undefined) => string | null;\n}\n\n/** The streaming reply as a remote shows it; module-level so its identity never changes. */\nfunction displayStreaming(text: string | null | undefined): string | null {\n return text ? displayConnectorConnectText(text, true) || null : null;\n}\n\nexport function useHostConnectorCard(chat: HostChatStream, channelId: string): HostConnectorCard {\n const { messages, queuedMessages, sendMessage } = chat;\n\n // The thread plus the outbox: a reply parked while the gateway is down is the\n // newest user row, so the request reads as answered and the card stays gone.\n const rows = useMemo(\n () => [\n ...messages.map((m) => ({ role: m.role, content: m.content })),\n ...queuedMessages.map((q) => ({ role: 'user', content: q.text })),\n ],\n [messages, queuedMessages],\n );\n\n const send = useCallback(\n async (text: string) => (await sendMessage(text, undefined, channelId)) !== 'failed',\n [sendMessage, channelId],\n );\n\n const renderConnectorCard = useCallback(\n (isDark: boolean) => <PendingConnectorConnectCard messages={rows} send={send} isDark={isDark} />,\n [rows, send],\n );\n\n return useMemo(\n () => ({ renderConnectorCard, displayMessages: displayConnectorConnectMessages, displayStreaming }),\n [renderConnectorCard],\n );\n}\n"],"names":[],"mappings":"gRAmCA,SAAS,iBAAiB,IAAgD,EAAA;AACxE,EAAA,OAAO,IAAO,GAAA,2BAAA,CAA4B,IAAM,EAAA,IAAI,KAAK,IAAO,GAAA,IAAA;AAClE;AACgB,SAAA,oBAAA,CAAqB,MAAsB,SAAsC,EAAA;AAC/F,EAAM,MAAA;AAAA,IACJ,QAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACE,GAAA,IAAA;AAIJ,EAAA,MAAM,OAAO,OAAQ,CAAA,MAAM,CAAC,GAAG,QAAA,CAAS,IAAI,CAAM,CAAA,MAAA;AAAA,IAChD,MAAM,CAAE,CAAA,IAAA;AAAA,IACR,SAAS,CAAE,CAAA;AAAA,GACX,CAAA,CAAA,EAAG,GAAG,cAAA,CAAe,IAAI,CAAM,CAAA,MAAA;AAAA,IAC/B,IAAM,EAAA,MAAA;AAAA,IACN,SAAS,CAAE,CAAA;AAAA,IACX,CAAC,CAAA,EAAG,CAAC,QAAA,EAAU,cAAc,CAAC,CAAA;AAChC,EAAA,MAAM,IAAO,GAAA,WAAA,CAAY,OAAO,IAAA,KAAkB,MAAM,WAAY,CAAA,IAAA,EAAM,MAAW,EAAA,SAAS,CAAO,KAAA,QAAA,EAAU,CAAC,WAAA,EAAa,SAAS,CAAC,CAAA;AACvI,EAAA,MAAM,mBAAsB,GAAA,WAAA,CAAY,CAAC,MAAA,yBAAqB,2BAA4B,EAAA,EAAA,QAAA,EAAU,IAAM,EAAA,IAAA,EAAY,MAAgB,EAAA,CAAA,EAAI,CAAC,IAAA,EAAM,IAAI,CAAC,CAAA;AACtJ,EAAA,OAAO,QAAQ,OAAO;AAAA,IACpB,mBAAA;AAAA,IACA,eAAiB,EAAA,+BAAA;AAAA,IACjB;AAAA,GACF,CAAA,EAAI,CAAC,mBAAmB,CAAC,CAAA;AAC3B"}
1
+ {"version":3,"file":"useHostConnectorCard.js","sources":["../../src/hooks/useHostConnectorCard.tsx"],"sourcesContent":["/**\n * The `[CONNECTOR_CONNECT]` card for a native surface chat (shop, travel, jobs,\n * resume), built on the surface's HOST screen.\n *\n * The surface UI ships as a federated remote that must not bundle the host's data\n * stack (Apollo, redux, `common`, expo-web-browser) - see useShoppingHostChat. So\n * the host does everything protocol-shaped: it cleans the thread before the remote\n * sees it (the markers and the card's replies are not shown as text) and hands the\n * remote a render function for the card, which the remote only places above its\n * composer. The card is a host component; rendered inside the remote's tree it\n * still reads the host's providers, which wrap that tree.\n *\n * The reply goes to the host channel directly - not through the surface's own\n * `onSend`, which may route text to a local lane or wrap it in context - and only\n * counts as sent when the channel took it (sent, or parked in the durable outbox,\n * whose row then settles the request).\n */\nimport React, { useCallback, useMemo, type ReactNode } from 'react';\nimport { PendingConnectorConnectCard } from '../features/chat/ConnectorConnectPrompt';\nimport { displayConnectorConnectMessages, displayConnectorConnectText } from '../features/chat/connectorConnect';\nimport type { useChatStream } from './useChatStream';\n\ntype HostChatStream = Pick<ReturnType<typeof useChatStream>, 'messages' | 'queuedMessages' | 'sendMessage'>;\n\nexport interface HostConnectorCard {\n /** The card for the request still waiting in the thread (renders nothing when none is). */\n renderConnectorCard: (isDark: boolean) => ReactNode;\n /** A thread as the remote's transcript should show it: markers and card replies out. */\n displayMessages: <T extends { role: string; content: string }>(messages: ReadonlyArray<T>) => T[];\n /** The streaming reply as the remote should show it: a half-written marker never flashes. */\n displayStreaming: (text: string | null | undefined) => string | null;\n}\n\n/** The streaming reply as a remote shows it; module-level so its identity never changes. */\nfunction displayStreaming(text: string | null | undefined): string | null {\n return text ? displayConnectorConnectText(text, true) || null : null;\n}\n\nexport function useHostConnectorCard(chat: HostChatStream, channelId: string): HostConnectorCard {\n const { messages, queuedMessages, sendMessage } = chat;\n\n // The thread plus the outbox: a reply parked while the gateway is down is the\n // newest user row, so the request reads as answered and the card stays gone.\n const rows = useMemo(\n () => [\n ...messages.map((m) => ({ role: m.role, content: m.content })),\n ...queuedMessages.map((q) => ({ role: 'user', content: q.text })),\n ],\n [messages, queuedMessages],\n );\n\n const send = useCallback(\n async (text: string) => (await sendMessage(text, undefined, channelId)) !== 'failed',\n [sendMessage, channelId],\n );\n\n const renderConnectorCard = useCallback(\n (isDark: boolean) => <PendingConnectorConnectCard messages={rows} send={send} isDark={isDark} />,\n [rows, send],\n );\n\n return useMemo(\n () => ({ renderConnectorCard, displayMessages: displayConnectorConnectMessages, displayStreaming }),\n [renderConnectorCard],\n );\n}\n"],"names":[],"mappings":"kPAmCA,SAAS,iBAAiB,IAAgD,EAAA;AACxE,EAAA,OAAO,IAAO,GAAA,2BAAA,CAA4B,IAAM,EAAA,IAAI,KAAK,IAAO,GAAA,IAAA;AAClE;AACgB,SAAA,oBAAA,CAAqB,MAAsB,SAAsC,EAAA;AAC/F,EAAM,MAAA;AAAA,IACJ,QAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACE,GAAA,IAAA;AAIJ,EAAA,MAAM,OAAO,OAAQ,CAAA,MAAM,CAAC,GAAG,QAAA,CAAS,IAAI,CAAM,CAAA,MAAA;AAAA,IAChD,MAAM,CAAE,CAAA,IAAA;AAAA,IACR,SAAS,CAAE,CAAA;AAAA,GACX,CAAA,CAAA,EAAG,GAAG,cAAA,CAAe,IAAI,CAAM,CAAA,MAAA;AAAA,IAC/B,IAAM,EAAA,MAAA;AAAA,IACN,SAAS,CAAE,CAAA;AAAA,IACX,CAAC,CAAA,EAAG,CAAC,QAAA,EAAU,cAAc,CAAC,CAAA;AAChC,EAAA,MAAM,IAAO,GAAA,WAAA,CAAY,OAAO,IAAA,KAAkB,MAAM,WAAY,CAAA,IAAA,EAAM,MAAW,EAAA,SAAS,CAAO,KAAA,QAAA,EAAU,CAAC,WAAA,EAAa,SAAS,CAAC,CAAA;AACvI,EAAA,MAAM,mBAAsB,GAAA,WAAA,CAAY,CAAC,MAAA,yBAAqB,2BAA4B,EAAA,EAAA,QAAA,EAAU,IAAM,EAAA,IAAA,EAAY,MAAgB,EAAA,CAAA,EAAI,CAAC,IAAA,EAAM,IAAI,CAAC,CAAA;AACtJ,EAAA,OAAO,QAAQ,OAAO;AAAA,IACpB,mBAAA;AAAA,IACA,eAAiB,EAAA,+BAAA;AAAA,IACjB;AAAA,GACF,CAAA,EAAI,CAAC,mBAAmB,CAAC,CAAA;AAC3B"}
@@ -1,4 +1,4 @@
1
- import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {useMemo,useLayoutEffect,useCallback,useState,useRef,useEffect}from'react';import {useWindowDimensions,Keyboard,View,StyleSheet,Pressable}from'react-native';import {getDefaultLeftItems,Box,Text,InputToolBar}from'@admin-layout/gluestack-ui-mobile';import {useSafeAreaInsets,SafeAreaView}from'react-native-safe-area-context';import {useNavigation,useRoute,CommonActions}from'@react-navigation/native';import {MessageActionBar}from'../../features/chat/MessageActionBar.js';import {ChatTranscript}from'../../features/chat/ChatTranscript.js';import {AskUserCard}from'../../features/chat/AskUserCard.js';import {pendingAskUser}from'../../features/chat/askUser.js';import {PendingConnectorConnectCard}from'../../features/chat/ConnectorConnectPrompt.js';import {QueuedFollowUps}from'../../features/chat/QueuedFollowUps.js';import {displayConnectorConnectMessages,displayConnectorConnectText}from'../../features/chat/connectorConnect.js';import {useCdecliConnection}from'../../contexts/CdecliConnectionContext.js';import {useChatLiveStream}from'../../contexts/ChatLiveStreamContext.js';import {KeyboardAwareScreen,KeyboardComposerDock}from'../../components/KeyboardComposerDock.js';import {YantraBrandLoader,YANTRA_LOADER_SIZE_COMPACT}from'../../components/YantraBrandLoader.js';import ThinkingIndicator from'../../components/ThinkingIndicator.js';import {mobileTokens}from'../../theme/mobileTokens.js';import {useAppTheme}from'../../theme/AppThemeProvider.js';import DeepSearchModal from'../Home/components/DeepSearchModal.js';import {normalizeSummaryText,extractDeepSearchSources}from'../Home/deepSearchUtils.js';import {AudioRecorderPanel}from'../../features/audio-input/AudioRecorderPanel.js';import {NativeDictationBar}from'../../features/audio-input/NativeDictationBar.js';import {isNativeDictationAvailable}from'../../features/audio-input/nativeDictation.js';import {useImageAttachments}from'../../features/attachments/useImageAttachments.js';import {ComposerAttachmentBar}from'../../features/attachments/ComposerAttachmentBar.js';import {useComposerAttachMenu}from'../../features/attachments/ComposerAttachMenu.js';import {hasComposerAttachments,takeComposerAttachments}from'../../features/attachments/composerAttachmentHandoff.js';import {MicErrorBoundary}from'../../features/audio-input/MicErrorBoundary.js';import {requestMicPermission}from'../../features/audio-input/useAudioPermission.js';import {shouldRedirectToShop}from'../../features/shopping/chat/homeShoppingIntent.js';import {replaceWithShopNative,shopHandoffParams,pushShopNative}from'../../features/shopping/chat/openShopNative.js';var __defProp = Object.defineProperty;
1
+ import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {useMemo,useLayoutEffect,useCallback,useState,useRef,useEffect}from'react';import {useWindowDimensions,Keyboard,View,StyleSheet,Pressable}from'react-native';import {getDefaultLeftItems,Box,Text,InputToolBar}from'@admin-layout/gluestack-ui-mobile';import {useSafeAreaInsets,SafeAreaView}from'react-native-safe-area-context';import {useNavigation,useRoute,CommonActions}from'@react-navigation/native';import {MessageActionBar}from'../../features/chat/MessageActionBar.js';import {ChatTranscript}from'../../features/chat/ChatTranscript.js';import {AskUserCard}from'../../features/chat/AskUserCard.js';import {pendingAskUser}from'../../features/chat/askUser.js';import {PendingConnectorConnectCard}from'../../features/chat/ConnectorConnectPrompt.js';import {QueuedFollowUps}from'../../features/chat/QueuedFollowUps.js';import {displayConnectorConnectMessages,displayConnectorConnectText}from'common';import {useCdecliConnection}from'../../contexts/CdecliConnectionContext.js';import {useChatLiveStream}from'../../contexts/ChatLiveStreamContext.js';import {KeyboardAwareScreen,KeyboardComposerDock}from'../../components/KeyboardComposerDock.js';import {YantraBrandLoader,YANTRA_LOADER_SIZE_COMPACT}from'../../components/YantraBrandLoader.js';import ThinkingIndicator from'../../components/ThinkingIndicator.js';import {mobileTokens}from'../../theme/mobileTokens.js';import {useAppTheme}from'../../theme/AppThemeProvider.js';import DeepSearchModal from'../Home/components/DeepSearchModal.js';import {normalizeSummaryText,extractDeepSearchSources}from'../Home/deepSearchUtils.js';import {AudioRecorderPanel}from'../../features/audio-input/AudioRecorderPanel.js';import {NativeDictationBar}from'../../features/audio-input/NativeDictationBar.js';import {isNativeDictationAvailable}from'../../features/audio-input/nativeDictation.js';import {useImageAttachments}from'../../features/attachments/useImageAttachments.js';import {ComposerAttachmentBar}from'../../features/attachments/ComposerAttachmentBar.js';import {useComposerAttachMenu}from'../../features/attachments/ComposerAttachMenu.js';import {hasComposerAttachments,takeComposerAttachments}from'../../features/attachments/composerAttachmentHandoff.js';import {MicErrorBoundary}from'../../features/audio-input/MicErrorBoundary.js';import {requestMicPermission}from'../../features/audio-input/useAudioPermission.js';import {shouldRedirectToShop}from'../../features/shopping/chat/homeShoppingIntent.js';import {replaceWithShopNative,shopHandoffParams,pushShopNative}from'../../features/shopping/chat/openShopNative.js';var __defProp = Object.defineProperty;
2
2
  var __defProps = Object.defineProperties;
3
3
  var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
4
  var __getOwnPropSymbols = Object.getOwnPropertySymbols;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adminide-stack/yantra-mobile",
3
- "version": "12.0.69-alpha.20",
3
+ "version": "12.0.69-alpha.22",
4
4
  "description": "Sample core for higher packages to depend on",
5
5
  "license": "ISC",
6
6
  "author": "CDMBase LLC",
@@ -13,6 +13,7 @@
13
13
  "build:clean": "rimraf lib",
14
14
  "build:lib": "rollup -c rollup.config.mjs",
15
15
  "build:lib:watch": "yarn build:lib -- --watch",
16
+ "gen:emoji-keywords": "node tools/gen-emoji-keywords.mjs",
16
17
  "jest": "./node_modules/.bin/jest",
17
18
  "prepublish": "yarn build",
18
19
  "test": "jest",
@@ -25,7 +26,7 @@
25
26
  "uuid": "^9.0.0"
26
27
  },
27
28
  "devDependencies": {
28
- "common": "12.0.69-alpha.20"
29
+ "common": "12.0.69-alpha.22"
29
30
  },
30
31
  "peerDependencies": {
31
32
  "@admin-layout/gluestack-ui-mobile": "*",
@@ -41,7 +42,7 @@
41
42
  "@messenger-box/platform-mobile": "*",
42
43
  "@react-native-async-storage/async-storage": "*",
43
44
  "@react-navigation/native": "*",
44
- "common": "12.0.69-alpha.19",
45
+ "common": "12.0.69-alpha.20",
45
46
  "expo-constants": "*",
46
47
  "expo-secure-store": "*",
47
48
  "expo-web-browser": "*",
@@ -58,5 +59,5 @@
58
59
  "typescript": {
59
60
  "definition": "lib/index.d.ts"
60
61
  },
61
- "gitHead": "efa32a1500f4e5695518657ab48e3ba60a474a0b"
62
+ "gitHead": "4dbcd3ab1cf3d76ada56146666fdf3d151cdd62a"
62
63
  }