diff --git a/Core/Package.swift b/Core/Package.swift index 4ca3a5ff..14c2e185 100644 --- a/Core/Package.swift +++ b/Core/Package.swift @@ -42,6 +42,9 @@ let package = Package( .product(name: "Crypto", package: "swift-crypto"), .product(name: "ZIPFoundation", package: "ZIPFoundation") ], + resources: [ + .process("Resources") + ], swiftSettings: [.interoperabilityMode(.Cxx)], plugins: [ .plugin(name: "GitInfoPlugin") diff --git a/Core/Sources/Core/Configs/BoolConfigItem.swift b/Core/Sources/Core/Configs/BoolConfigItem.swift index 3c0b7b20..22127ba2 100644 --- a/Core/Sources/Core/Configs/BoolConfigItem.swift +++ b/Core/Sources/Core/Configs/BoolConfigItem.swift @@ -68,4 +68,10 @@ extension Config { static let `default` = true public static let key: String = "dev.ensan.inputmethod.azooKeyMac.preference.includeContextInAITransform" } + /// 絵文字入力モード(":"などで起動)を有効化する設定 + public struct EmojiInputEnabled: BoolConfigItem { + public init() {} + static let `default` = true + public static let key: String = "dev.ensan.inputmethod.azooKeyMac.preference.emojiInputEnabled" + } } diff --git a/Core/Sources/Core/Configs/StringConfigItem.swift b/Core/Sources/Core/Configs/StringConfigItem.swift index 1c235aff..ccdc9d05 100644 --- a/Core/Sources/Core/Configs/StringConfigItem.swift +++ b/Core/Sources/Core/Configs/StringConfigItem.swift @@ -59,4 +59,22 @@ extension Config { public struct PromptHistory: StringConfigItem { public static let key: String = "dev.ensan.inputmethod.azooKeyMac.preference.PromptHistory" } + + /// 絵文字入力モードを起動するトリガー文字(デフォルト: 全角コロン ":") + public struct EmojiInputTrigger: StringConfigItem { + public init() {} + + public static let `default`: String = ":" + public static let key: String = "dev.ensan.inputmethod.azooKeyMac.preference.emojiInputTrigger" + + public var value: String { + get { + let stored = UserDefaults.standard.string(forKey: Self.key) ?? "" + return stored.isEmpty ? Self.default : stored + } + nonmutating set { + UserDefaults.standard.set(newValue, forKey: Self.key) + } + } + } } diff --git a/Core/Sources/Core/InputUtils/Actions/ClientAction.swift b/Core/Sources/Core/InputUtils/Actions/ClientAction.swift index cbe6f14a..fb637e28 100644 --- a/Core/Sources/Core/InputUtils/Actions/ClientAction.swift +++ b/Core/Sources/Core/InputUtils/Actions/ClientAction.swift @@ -70,6 +70,15 @@ public enum ClientAction { case cancelUnicodeInput case submitSelectedCandidateAndEnterUnicodeInputMode + // Emoji Input (`:` in Japanese mode) + case enterEmojiInputMode + case appendToEmojiInput(String) + case removeLastEmojiInput + case submitSelectedEmojiCandidate + case cancelEmojiInput + case selectNextEmojiCandidate + case selectPrevEmojiCandidate + case stopComposition } diff --git a/Core/Sources/Core/InputUtils/EmojiDictionary.swift b/Core/Sources/Core/InputUtils/EmojiDictionary.swift new file mode 100644 index 00000000..30325903 --- /dev/null +++ b/Core/Sources/Core/InputUtils/EmojiDictionary.swift @@ -0,0 +1,95 @@ +import Foundation + +public struct EmojiEntry: Sendable, Hashable { + public let emoji: String + public let shortnames: [String] + + public init(emoji: String, shortnames: [String]) { + self.emoji = emoji + self.shortnames = shortnames + } +} + +public enum EmojiDictionary { + public static func search(query: String, limit: Int = 30) -> [EmojiEntry] { + let q = query.lowercased() + if q.isEmpty { + return [] + } + var prefixMatches: [EmojiEntry] = [] + var substringMatches: [EmojiEntry] = [] + for entry in entries { + var matched: Match = .none + for key in entry.shortnames { + let lk = key.lowercased() + if lk.hasPrefix(q) { + matched = .prefix + break + } else if lk.contains(q) { + matched = max(matched, .substring) + } + } + switch matched { + case .prefix: + prefixMatches.append(entry) + case .substring: + substringMatches.append(entry) + case .none: + break + } + if prefixMatches.count >= limit { + break + } + } + let combined = prefixMatches + substringMatches + return Array(combined.prefix(limit)) + } + + private enum Match: Int, Comparable { + case none = 0, substring = 1, prefix = 2 + static func < (lhs: Match, rhs: Match) -> Bool { lhs.rawValue < rhs.rawValue } + } + + // iamcal/emoji-data の emoji.json をバンドルから読み込む。 + public static let entries: [EmojiEntry] = loadEntries() + + private struct RawEmoji: Decodable { + let unified: String + let shortNames: [String] + let sortOrder: Int? + + enum CodingKeys: String, CodingKey { + case unified + case shortNames = "short_names" + case sortOrder = "sort_order" + } + } + + private static func loadEntries() -> [EmojiEntry] { + guard let url = Bundle.module.url(forResource: "emoji", withExtension: "json"), + let data = try? Data(contentsOf: url), + let raws = try? JSONDecoder().decode([RawEmoji].self, from: data) else { + return [] + } + let sorted = raws.sorted { ($0.sortOrder ?? Int.max) < ($1.sortOrder ?? Int.max) } + return sorted.compactMap { raw in + guard let emoji = emojiString(fromUnified: raw.unified) else { + return nil + } + return EmojiEntry(emoji: emoji, shortnames: raw.shortNames) + } + } + + private static func emojiString(fromUnified unified: String) -> String? { + let scalars = unified.split(separator: "-").compactMap { seg -> Unicode.Scalar? in + guard let code = UInt32(seg, radix: 16) else { + return nil + } + return Unicode.Scalar(code) + } + guard !scalars.isEmpty else { + return nil + } + return String(String.UnicodeScalarView(scalars)) + } +} diff --git a/Core/Sources/Core/InputUtils/InputState.swift b/Core/Sources/Core/InputUtils/InputState.swift index 76638638..805f13e6 100644 --- a/Core/Sources/Core/InputUtils/InputState.swift +++ b/Core/Sources/Core/InputUtils/InputState.swift @@ -9,6 +9,9 @@ public enum InputState: Sendable, Hashable { case selecting case replaceSuggestion case unicodeInput(String) + case emojiInput(String) + /// composing 中から入った絵文字モード。composing を保持したまま絵文字を合流させる。 + case emojiInputNested(String) // この種のコードは複雑にしかならないので、lintを無効にする // swiftlint:disable:next cyclomatic_complexity @@ -18,7 +21,13 @@ public enum InputState: Sendable, Hashable { inputLanguage: InputLanguage, liveConversionEnabled: Bool, enableDebugWindow: Bool, - enableSuggestion: Bool + enableSuggestion: Bool, + // 絵文字モード関連のデフォルトは「無効」。 + // 呼び出し元 (InputController) が Config から値を読んで明示的に渡す想定で、 + // InputController 以外の経路 (言語切替時の内部 event 呼び出し等) で誤発動しないようにするため。 + // Config.EmojiInputEnabled().default は `true` だが、それは UI 経由のデフォルト値なので別問題。 + emojiInputEnabled: Bool = false, + emojiInputTrigger: String = ":" ) -> (ClientAction, ClientActionCallback) { if event.modifierFlags.contains(.command) { return (.fallthrough, .fallthrough) @@ -52,6 +61,10 @@ public enum InputState: Sendable, Hashable { case .input(let string): switch inputLanguage { case .japanese: + // 設定で有効かつ、インテンション文字列がトリガーに一致したら絵文字入力モードへ + if emojiInputEnabled && string.inputString(preferIntention: true) == emojiInputTrigger { + return (.enterEmojiInputMode, .transition(.emojiInput(""))) + } return (.appendPieceToMarkedText(string), .transition(.composing)) case .english: // 連結する @@ -122,6 +135,10 @@ public enum InputState: Sendable, Hashable { case .composing: switch userAction { case .input(let string): + // 日本語モードで設定のトリガー文字を押すと、composingを保持したまま入れ子の絵文字入力モードに入る + if emojiInputEnabled && inputLanguage == .japanese && string.inputString(preferIntention: true) == emojiInputTrigger { + return (.enterEmojiInputMode, .transition(.emojiInputNested(""))) + } return (.appendPieceToMarkedText(string), .fallthrough) case .number(let number): return (.appendPieceToMarkedText([number.inputPiece]), .fallthrough) @@ -197,6 +214,10 @@ public enum InputState: Sendable, Hashable { case .previewing: switch userAction { case .input(let string): + // 日本語モードでトリガー文字を押すと composing を保持して入れ子の絵文字入力モードへ + if emojiInputEnabled && inputLanguage == .japanese && string.inputString(preferIntention: true) == emojiInputTrigger { + return (.enterEmojiInputMode, .transition(.emojiInputNested(""))) + } return (.commitMarkedTextAndAppendPieceToMarkedText(string), .transition(.composing)) case .number(let number): return (.commitMarkedTextAndAppendPieceToMarkedText([number.inputPiece]), .transition(.composing)) @@ -258,6 +279,10 @@ public enum InputState: Sendable, Hashable { } else if s == "D" && enableDebugWindow { return (.disableDebugWindow, .fallthrough) } + // 日本語モードでトリガー文字を押すと composing を保持して入れ子の絵文字入力モードへ + if emojiInputEnabled && inputLanguage == .japanese && s == emojiInputTrigger { + return (.enterEmojiInputMode, .transition(.emojiInputNested(""))) + } // FIXME: ここの動作はmacOSの標準と異なる。具体的には、macOSの標準ではselectingをcomposingに戻して入力を継続する動きになる。 return (.commitMarkedTextAndAppendPieceToMarkedText(string), .transition(.composing)) case .enter: @@ -399,6 +424,77 @@ public enum InputState: Sendable, Hashable { case .英数, .かな, .tab, .forget, .function, .navigation, .editSegment, .suggest, .transformSelectedText, .deadKey, .startUnicodeInput, .unknown: return (.consume, .fallthrough) } + case .emojiInput(let query): + // トップレベルの絵文字モード: 確定時に .none に戻る (composing なし) + return Self.handleEmojiInputEvent( + query: query, + userAction: userAction, + emojiInputTrigger: emojiInputTrigger, + exitState: .none, + stayInState: { .emojiInput($0) } + ) + case .emojiInputNested(let query): + // 入れ子の絵文字モード: 確定時に .composing に戻る (composing 保持) + return Self.handleEmojiInputEvent( + query: query, + userAction: userAction, + emojiInputTrigger: emojiInputTrigger, + exitState: .composing, + stayInState: { .emojiInputNested($0) } + ) + } + } + + // この種のコードは複雑にしかならないので、lintを無効にする + // swiftlint:disable:next cyclomatic_complexity + private static func handleEmojiInputEvent( + query: String, + userAction: UserAction, + emojiInputTrigger: String, + exitState: InputState, + stayInState: (String) -> InputState + ) -> (ClientAction, ClientActionCallback) { + switch userAction { + case .input(let pieces): + // もう一度 トリガー文字を打ったら選択中の候補を確定 + if pieces.inputString(preferIntention: true) == emojiInputTrigger { + if query.isEmpty { + return (.cancelEmojiInput, .transition(exitState)) + } + return (.submitSelectedEmojiCandidate, .transition(exitState)) + } + // ASCII英数・アンダースコア・ハイフン・プラスのみ受け付ける + let input = pieces.inputString(preferIntention: false) + let allowed = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-+") + let filtered = input.unicodeScalars.filter { allowed.contains($0) }.map { String($0) }.joined() + if !filtered.isEmpty { + return (.appendToEmojiInput(filtered), .transition(stayInState(query + filtered))) + } + return (.consume, .fallthrough) + case .number(let number): + let digit = number.inputString + return (.appendToEmojiInput(digit), .transition(stayInState(query + digit))) + case .backspace: + if query.isEmpty { + return (.cancelEmojiInput, .transition(exitState)) + } + return (.removeLastEmojiInput, .transition(stayInState(String(query.dropLast())))) + case .enter, .space: + // query 空でも submit を通す (InputController側で "" を残す/破棄判定) + return (.submitSelectedEmojiCandidate, .transition(exitState)) + case .escape: + return (.cancelEmojiInput, .transition(exitState)) + case .navigation(let direction): + switch direction { + case .down: + return (.selectNextEmojiCandidate, .fallthrough) + case .up: + return (.selectPrevEmojiCandidate, .fallthrough) + case .left, .right: + return (.consume, .fallthrough) + } + case .英数, .かな, .function, .editSegment, .tab, .forget, .suggest, .transformSelectedText, .deadKey, .startUnicodeInput, .unknown: + return (.consume, .fallthrough) } } } diff --git a/Core/Sources/Core/InputUtils/SegmentsManager.swift b/Core/Sources/Core/InputUtils/SegmentsManager.swift index 098d09da..3c718631 100644 --- a/Core/Sources/Core/InputUtils/SegmentsManager.swift +++ b/Core/Sources/Core/InputUtils/SegmentsManager.swift @@ -65,6 +65,12 @@ public final class SegmentsManager { private var backspaceAdjustedPredictionCandidate: PredictionCandidate? private var backspaceTypoCorrectionLock: BackspaceTypoCorrectionLock? + // 絵文字入力モードの状態 + private var emojiCandidateEntries: [EmojiEntry] = [] + private var emojiCandidates: [Candidate] = [] + private var emojiSelectionIndex: Int? + private var lastEmojiQuery: String? + public struct PredictionCandidate: Sendable, Equatable { public var displayText: String public var appendText: String @@ -640,6 +646,11 @@ public final class SegmentsManager { switch inputState { case .none, .previewing, .replaceSuggestion, .attachDiacritic, .unicodeInput: return .hidden + case .emojiInput, .emojiInputNested: + if self.emojiCandidates.isEmpty { + return .hidden + } + return .selecting(self.emojiCandidates, selectionIndex: self.emojiSelectionIndex) case .composing: if !self.liveConversionEnabled, let firstCandidate = self.rawCandidates?.mainResults.first { return .composing([firstCandidate], selectionIndex: 0) @@ -694,7 +705,7 @@ public final class SegmentsManager { // 選択範囲なしの場合はconvertTargetを返す (self.convertTarget, .inputCount(self.composingText.input.count)) } - case .composing, .previewing, .none, .replaceSuggestion, .attachDiacritic, .unicodeInput: + case .composing, .previewing, .none, .replaceSuggestion, .attachDiacritic, .unicodeInput, .emojiInput, .emojiInputNested: (self.convertTarget, .inputCount(self.composingText.input.count)) } let candidateText = transform(ruby) @@ -719,7 +730,7 @@ public final class SegmentsManager { switch inputState { case .selecting: targetComposingText = self.composingText.prefixToCursorPosition() - case .composing, .previewing, .none, .replaceSuggestion, .attachDiacritic, .unicodeInput: + case .composing, .previewing, .none, .replaceSuggestion, .attachDiacritic, .unicodeInput, .emojiInput, .emojiInputNested: targetComposingText = self.composingText } let inputString = targetComposingText.input.map(\.piece).inputString(preferIntention: false) @@ -795,6 +806,67 @@ public final class SegmentsManager { return text } + // MARK: - 絵文字入力モード + public func updateEmojiCandidates(query: String) { + // クエリが変わっていない場合は selectionIndex を保持するため何もしない + if self.lastEmojiQuery == query { + return + } + self.lastEmojiQuery = query + let entries = EmojiDictionary.search(query: query) + self.emojiCandidateEntries = entries + self.emojiCandidates = entries.map { entry in + Candidate( + text: entry.emoji, + value: 0, + composingCount: .surfaceCount(1), + lastMid: 0, + data: [] + ) + } + self.emojiSelectionIndex = entries.isEmpty ? nil : 0 + } + + public func selectNextEmojiCandidate() { + guard !self.emojiCandidates.isEmpty else { + return + } + let current = self.emojiSelectionIndex ?? -1 + self.emojiSelectionIndex = (current + 1) % self.emojiCandidates.count + } + + public func selectPrevEmojiCandidate() { + guard !self.emojiCandidates.isEmpty else { + return + } + let current = self.emojiSelectionIndex ?? 0 + self.emojiSelectionIndex = (current - 1 + self.emojiCandidates.count) % self.emojiCandidates.count + } + + public var selectedEmojiCandidate: Candidate? { + guard let index = self.emojiSelectionIndex, self.emojiCandidates.indices.contains(index) else { + return nil + } + return self.emojiCandidates[index] + } + + public func clearEmojiInput() { + self.emojiCandidateEntries = [] + self.emojiCandidates = [] + self.emojiSelectionIndex = nil + self.lastEmojiQuery = nil + } + + public func makeEmojiCandidatePresentations() -> [CandidatePresentation] { + zip(self.emojiCandidates, self.emojiCandidateEntries).map { candidate, entry in + let annotation = entry.shortnames.first.map { ":\($0):" } + return CandidatePresentation( + candidate: candidate, + displayContext: .init(annotationText: annotation) + ) + } + } + // サジェスト候補を設定するメソッド public func setReplaceSuggestions(_ candidates: [Candidate]) { self.replaceSuggestions = candidates @@ -1010,6 +1082,27 @@ public final class SegmentsManager { switch inputState { case .none, .attachDiacritic: return MarkedText(text: [], selectionRange: .notFound) + case .emojiInput(let query): + // 絵文字入力モード: "query" を表示 + let trigger = Config.EmojiInputTrigger().value + let displayText = trigger + query + return MarkedText( + text: [.init(content: displayText, focus: .none)], + selectionRange: NSRange(location: displayText.count, length: 0) + ) + case .emojiInputNested(let query): + // 入れ子絵文字入力: 既存のcomposingテキスト + "query" を並べて表示 + // composing 部分は確定と誤解されないよう .unfocused (薄い下線) にする + let trigger = Config.EmojiInputTrigger().value + let composingPart = self.composingText.convertTarget + let emojiPart = trigger + query + return MarkedText( + text: [ + .init(content: composingPart, focus: .unfocused), + .init(content: emojiPart, focus: .focused) + ], + selectionRange: NSRange(location: composingPart.count + emojiPart.count, length: 0) + ) case .composing: let text = if self.lastOperation == .delete { // 削除のあとは常にひらがなを示す diff --git a/Core/Sources/Core/Resources/emoji.json b/Core/Sources/Core/Resources/emoji.json new file mode 100644 index 00000000..ff3a26b7 --- /dev/null +++ b/Core/Sources/Core/Resources/emoji.json @@ -0,0 +1 @@ +[{"unified":"0023-FE0F-20E3","short_names":["hash"],"sort_order":1556},{"unified":"002A-FE0F-20E3","short_names":["keycap_star"],"sort_order":1557},{"unified":"0030-FE0F-20E3","short_names":["zero"],"sort_order":1558},{"unified":"0031-FE0F-20E3","short_names":["one"],"sort_order":1559},{"unified":"0032-FE0F-20E3","short_names":["two"],"sort_order":1560},{"unified":"0033-FE0F-20E3","short_names":["three"],"sort_order":1561},{"unified":"0034-FE0F-20E3","short_names":["four"],"sort_order":1562},{"unified":"0035-FE0F-20E3","short_names":["five"],"sort_order":1563},{"unified":"0036-FE0F-20E3","short_names":["six"],"sort_order":1564},{"unified":"0037-FE0F-20E3","short_names":["seven"],"sort_order":1565},{"unified":"0038-FE0F-20E3","short_names":["eight"],"sort_order":1566},{"unified":"0039-FE0F-20E3","short_names":["nine"],"sort_order":1567},{"unified":"00A9-FE0F","short_names":["copyright"],"sort_order":1552},{"unified":"00AE-FE0F","short_names":["registered"],"sort_order":1553},{"unified":"1F004","short_names":["mahjong"],"sort_order":1145},{"unified":"1F0CF","short_names":["black_joker"],"sort_order":1144},{"unified":"1F170-FE0F","short_names":["a"],"sort_order":1574},{"unified":"1F171-FE0F","short_names":["b"],"sort_order":1576},{"unified":"1F17E-FE0F","short_names":["o2"],"sort_order":1585},{"unified":"1F17F-FE0F","short_names":["parking"],"sort_order":1587},{"unified":"1F18E","short_names":["ab"],"sort_order":1575},{"unified":"1F191","short_names":["cl"],"sort_order":1577},{"unified":"1F192","short_names":["cool"],"sort_order":1578},{"unified":"1F193","short_names":["free"],"sort_order":1579},{"unified":"1F194","short_names":["id"],"sort_order":1581},{"unified":"1F195","short_names":["new"],"sort_order":1583},{"unified":"1F196","short_names":["ng"],"sort_order":1584},{"unified":"1F197","short_names":["ok"],"sort_order":1586},{"unified":"1F198","short_names":["sos"],"sort_order":1588},{"unified":"1F199","short_names":["up"],"sort_order":1589},{"unified":"1F19A","short_names":["vs"],"sort_order":1590},{"unified":"1F1E6-1F1E8","short_names":["flag-ac"],"sort_order":1650},{"unified":"1F1E6-1F1E9","short_names":["flag-ad"],"sort_order":1651},{"unified":"1F1E6-1F1EA","short_names":["flag-ae"],"sort_order":1652},{"unified":"1F1E6-1F1EB","short_names":["flag-af"],"sort_order":1653},{"unified":"1F1E6-1F1EC","short_names":["flag-ag"],"sort_order":1654},{"unified":"1F1E6-1F1EE","short_names":["flag-ai"],"sort_order":1655},{"unified":"1F1E6-1F1F1","short_names":["flag-al"],"sort_order":1656},{"unified":"1F1E6-1F1F2","short_names":["flag-am"],"sort_order":1657},{"unified":"1F1E6-1F1F4","short_names":["flag-ao"],"sort_order":1658},{"unified":"1F1E6-1F1F6","short_names":["flag-aq"],"sort_order":1659},{"unified":"1F1E6-1F1F7","short_names":["flag-ar"],"sort_order":1660},{"unified":"1F1E6-1F1F8","short_names":["flag-as"],"sort_order":1661},{"unified":"1F1E6-1F1F9","short_names":["flag-at"],"sort_order":1662},{"unified":"1F1E6-1F1FA","short_names":["flag-au"],"sort_order":1663},{"unified":"1F1E6-1F1FC","short_names":["flag-aw"],"sort_order":1664},{"unified":"1F1E6-1F1FD","short_names":["flag-ax"],"sort_order":1665},{"unified":"1F1E6-1F1FF","short_names":["flag-az"],"sort_order":1666},{"unified":"1F1E7-1F1E6","short_names":["flag-ba"],"sort_order":1667},{"unified":"1F1E7-1F1E7","short_names":["flag-bb"],"sort_order":1668},{"unified":"1F1E7-1F1E9","short_names":["flag-bd"],"sort_order":1669},{"unified":"1F1E7-1F1EA","short_names":["flag-be"],"sort_order":1670},{"unified":"1F1E7-1F1EB","short_names":["flag-bf"],"sort_order":1671},{"unified":"1F1E7-1F1EC","short_names":["flag-bg"],"sort_order":1672},{"unified":"1F1E7-1F1ED","short_names":["flag-bh"],"sort_order":1673},{"unified":"1F1E7-1F1EE","short_names":["flag-bi"],"sort_order":1674},{"unified":"1F1E7-1F1EF","short_names":["flag-bj"],"sort_order":1675},{"unified":"1F1E7-1F1F1","short_names":["flag-bl"],"sort_order":1676},{"unified":"1F1E7-1F1F2","short_names":["flag-bm"],"sort_order":1677},{"unified":"1F1E7-1F1F3","short_names":["flag-bn"],"sort_order":1678},{"unified":"1F1E7-1F1F4","short_names":["flag-bo"],"sort_order":1679},{"unified":"1F1E7-1F1F6","short_names":["flag-bq"],"sort_order":1680},{"unified":"1F1E7-1F1F7","short_names":["flag-br"],"sort_order":1681},{"unified":"1F1E7-1F1F8","short_names":["flag-bs"],"sort_order":1682},{"unified":"1F1E7-1F1F9","short_names":["flag-bt"],"sort_order":1683},{"unified":"1F1E7-1F1FB","short_names":["flag-bv"],"sort_order":1684},{"unified":"1F1E7-1F1FC","short_names":["flag-bw"],"sort_order":1685},{"unified":"1F1E7-1F1FE","short_names":["flag-by"],"sort_order":1686},{"unified":"1F1E7-1F1FF","short_names":["flag-bz"],"sort_order":1687},{"unified":"1F1E8-1F1E6","short_names":["flag-ca"],"sort_order":1688},{"unified":"1F1E8-1F1E8","short_names":["flag-cc"],"sort_order":1689},{"unified":"1F1E8-1F1E9","short_names":["flag-cd"],"sort_order":1690},{"unified":"1F1E8-1F1EB","short_names":["flag-cf"],"sort_order":1691},{"unified":"1F1E8-1F1EC","short_names":["flag-cg"],"sort_order":1692},{"unified":"1F1E8-1F1ED","short_names":["flag-ch"],"sort_order":1693},{"unified":"1F1E8-1F1EE","short_names":["flag-ci"],"sort_order":1694},{"unified":"1F1E8-1F1F0","short_names":["flag-ck"],"sort_order":1695},{"unified":"1F1E8-1F1F1","short_names":["flag-cl"],"sort_order":1696},{"unified":"1F1E8-1F1F2","short_names":["flag-cm"],"sort_order":1697},{"unified":"1F1E8-1F1F3","short_names":["cn","flag-cn"],"sort_order":1698},{"unified":"1F1E8-1F1F4","short_names":["flag-co"],"sort_order":1699},{"unified":"1F1E8-1F1F5","short_names":["flag-cp"],"sort_order":1700},{"unified":"1F1E8-1F1F6","short_names":["flag-sark"],"sort_order":1701},{"unified":"1F1E8-1F1F7","short_names":["flag-cr"],"sort_order":1702},{"unified":"1F1E8-1F1FA","short_names":["flag-cu"],"sort_order":1703},{"unified":"1F1E8-1F1FB","short_names":["flag-cv"],"sort_order":1704},{"unified":"1F1E8-1F1FC","short_names":["flag-cw"],"sort_order":1705},{"unified":"1F1E8-1F1FD","short_names":["flag-cx"],"sort_order":1706},{"unified":"1F1E8-1F1FE","short_names":["flag-cy"],"sort_order":1707},{"unified":"1F1E8-1F1FF","short_names":["flag-cz"],"sort_order":1708},{"unified":"1F1E9-1F1EA","short_names":["de","flag-de"],"sort_order":1709},{"unified":"1F1E9-1F1EC","short_names":["flag-dg"],"sort_order":1710},{"unified":"1F1E9-1F1EF","short_names":["flag-dj"],"sort_order":1711},{"unified":"1F1E9-1F1F0","short_names":["flag-dk"],"sort_order":1712},{"unified":"1F1E9-1F1F2","short_names":["flag-dm"],"sort_order":1713},{"unified":"1F1E9-1F1F4","short_names":["flag-do"],"sort_order":1714},{"unified":"1F1E9-1F1FF","short_names":["flag-dz"],"sort_order":1715},{"unified":"1F1EA-1F1E6","short_names":["flag-ea"],"sort_order":1716},{"unified":"1F1EA-1F1E8","short_names":["flag-ec"],"sort_order":1717},{"unified":"1F1EA-1F1EA","short_names":["flag-ee"],"sort_order":1718},{"unified":"1F1EA-1F1EC","short_names":["flag-eg"],"sort_order":1719},{"unified":"1F1EA-1F1ED","short_names":["flag-eh"],"sort_order":1720},{"unified":"1F1EA-1F1F7","short_names":["flag-er"],"sort_order":1721},{"unified":"1F1EA-1F1F8","short_names":["es","flag-es"],"sort_order":1722},{"unified":"1F1EA-1F1F9","short_names":["flag-et"],"sort_order":1723},{"unified":"1F1EA-1F1FA","short_names":["flag-eu"],"sort_order":1724},{"unified":"1F1EB-1F1EE","short_names":["flag-fi"],"sort_order":1725},{"unified":"1F1EB-1F1EF","short_names":["flag-fj"],"sort_order":1726},{"unified":"1F1EB-1F1F0","short_names":["flag-fk"],"sort_order":1727},{"unified":"1F1EB-1F1F2","short_names":["flag-fm"],"sort_order":1728},{"unified":"1F1EB-1F1F4","short_names":["flag-fo"],"sort_order":1729},{"unified":"1F1EB-1F1F7","short_names":["fr","flag-fr"],"sort_order":1730},{"unified":"1F1EC-1F1E6","short_names":["flag-ga"],"sort_order":1731},{"unified":"1F1EC-1F1E7","short_names":["gb","uk","flag-gb"],"sort_order":1732},{"unified":"1F1EC-1F1E9","short_names":["flag-gd"],"sort_order":1733},{"unified":"1F1EC-1F1EA","short_names":["flag-ge"],"sort_order":1734},{"unified":"1F1EC-1F1EB","short_names":["flag-gf"],"sort_order":1735},{"unified":"1F1EC-1F1EC","short_names":["flag-gg"],"sort_order":1736},{"unified":"1F1EC-1F1ED","short_names":["flag-gh"],"sort_order":1737},{"unified":"1F1EC-1F1EE","short_names":["flag-gi"],"sort_order":1738},{"unified":"1F1EC-1F1F1","short_names":["flag-gl"],"sort_order":1739},{"unified":"1F1EC-1F1F2","short_names":["flag-gm"],"sort_order":1740},{"unified":"1F1EC-1F1F3","short_names":["flag-gn"],"sort_order":1741},{"unified":"1F1EC-1F1F5","short_names":["flag-gp"],"sort_order":1742},{"unified":"1F1EC-1F1F6","short_names":["flag-gq"],"sort_order":1743},{"unified":"1F1EC-1F1F7","short_names":["flag-gr"],"sort_order":1744},{"unified":"1F1EC-1F1F8","short_names":["flag-gs"],"sort_order":1745},{"unified":"1F1EC-1F1F9","short_names":["flag-gt"],"sort_order":1746},{"unified":"1F1EC-1F1FA","short_names":["flag-gu"],"sort_order":1747},{"unified":"1F1EC-1F1FC","short_names":["flag-gw"],"sort_order":1748},{"unified":"1F1EC-1F1FE","short_names":["flag-gy"],"sort_order":1749},{"unified":"1F1ED-1F1F0","short_names":["flag-hk"],"sort_order":1750},{"unified":"1F1ED-1F1F2","short_names":["flag-hm"],"sort_order":1751},{"unified":"1F1ED-1F1F3","short_names":["flag-hn"],"sort_order":1752},{"unified":"1F1ED-1F1F7","short_names":["flag-hr"],"sort_order":1753},{"unified":"1F1ED-1F1F9","short_names":["flag-ht"],"sort_order":1754},{"unified":"1F1ED-1F1FA","short_names":["flag-hu"],"sort_order":1755},{"unified":"1F1EE-1F1E8","short_names":["flag-ic"],"sort_order":1756},{"unified":"1F1EE-1F1E9","short_names":["flag-id"],"sort_order":1757},{"unified":"1F1EE-1F1EA","short_names":["flag-ie"],"sort_order":1758},{"unified":"1F1EE-1F1F1","short_names":["flag-il"],"sort_order":1759},{"unified":"1F1EE-1F1F2","short_names":["flag-im"],"sort_order":1760},{"unified":"1F1EE-1F1F3","short_names":["flag-in"],"sort_order":1761},{"unified":"1F1EE-1F1F4","short_names":["flag-io"],"sort_order":1762},{"unified":"1F1EE-1F1F6","short_names":["flag-iq"],"sort_order":1763},{"unified":"1F1EE-1F1F7","short_names":["flag-ir"],"sort_order":1764},{"unified":"1F1EE-1F1F8","short_names":["flag-is"],"sort_order":1765},{"unified":"1F1EE-1F1F9","short_names":["it","flag-it"],"sort_order":1766},{"unified":"1F1EF-1F1EA","short_names":["flag-je"],"sort_order":1767},{"unified":"1F1EF-1F1F2","short_names":["flag-jm"],"sort_order":1768},{"unified":"1F1EF-1F1F4","short_names":["flag-jo"],"sort_order":1769},{"unified":"1F1EF-1F1F5","short_names":["jp","flag-jp"],"sort_order":1770},{"unified":"1F1F0-1F1EA","short_names":["flag-ke"],"sort_order":1771},{"unified":"1F1F0-1F1EC","short_names":["flag-kg"],"sort_order":1772},{"unified":"1F1F0-1F1ED","short_names":["flag-kh"],"sort_order":1773},{"unified":"1F1F0-1F1EE","short_names":["flag-ki"],"sort_order":1774},{"unified":"1F1F0-1F1F2","short_names":["flag-km"],"sort_order":1775},{"unified":"1F1F0-1F1F3","short_names":["flag-kn"],"sort_order":1776},{"unified":"1F1F0-1F1F5","short_names":["flag-kp"],"sort_order":1777},{"unified":"1F1F0-1F1F7","short_names":["kr","flag-kr"],"sort_order":1778},{"unified":"1F1F0-1F1FC","short_names":["flag-kw"],"sort_order":1779},{"unified":"1F1F0-1F1FE","short_names":["flag-ky"],"sort_order":1780},{"unified":"1F1F0-1F1FF","short_names":["flag-kz"],"sort_order":1781},{"unified":"1F1F1-1F1E6","short_names":["flag-la"],"sort_order":1782},{"unified":"1F1F1-1F1E7","short_names":["flag-lb"],"sort_order":1783},{"unified":"1F1F1-1F1E8","short_names":["flag-lc"],"sort_order":1784},{"unified":"1F1F1-1F1EE","short_names":["flag-li"],"sort_order":1785},{"unified":"1F1F1-1F1F0","short_names":["flag-lk"],"sort_order":1786},{"unified":"1F1F1-1F1F7","short_names":["flag-lr"],"sort_order":1787},{"unified":"1F1F1-1F1F8","short_names":["flag-ls"],"sort_order":1788},{"unified":"1F1F1-1F1F9","short_names":["flag-lt"],"sort_order":1789},{"unified":"1F1F1-1F1FA","short_names":["flag-lu"],"sort_order":1790},{"unified":"1F1F1-1F1FB","short_names":["flag-lv"],"sort_order":1791},{"unified":"1F1F1-1F1FE","short_names":["flag-ly"],"sort_order":1792},{"unified":"1F1F2-1F1E6","short_names":["flag-ma"],"sort_order":1793},{"unified":"1F1F2-1F1E8","short_names":["flag-mc"],"sort_order":1794},{"unified":"1F1F2-1F1E9","short_names":["flag-md"],"sort_order":1795},{"unified":"1F1F2-1F1EA","short_names":["flag-me"],"sort_order":1796},{"unified":"1F1F2-1F1EB","short_names":["flag-mf"],"sort_order":1797},{"unified":"1F1F2-1F1EC","short_names":["flag-mg"],"sort_order":1798},{"unified":"1F1F2-1F1ED","short_names":["flag-mh"],"sort_order":1799},{"unified":"1F1F2-1F1F0","short_names":["flag-mk"],"sort_order":1800},{"unified":"1F1F2-1F1F1","short_names":["flag-ml"],"sort_order":1801},{"unified":"1F1F2-1F1F2","short_names":["flag-mm"],"sort_order":1802},{"unified":"1F1F2-1F1F3","short_names":["flag-mn"],"sort_order":1803},{"unified":"1F1F2-1F1F4","short_names":["flag-mo"],"sort_order":1804},{"unified":"1F1F2-1F1F5","short_names":["flag-mp"],"sort_order":1805},{"unified":"1F1F2-1F1F6","short_names":["flag-mq"],"sort_order":1806},{"unified":"1F1F2-1F1F7","short_names":["flag-mr"],"sort_order":1807},{"unified":"1F1F2-1F1F8","short_names":["flag-ms"],"sort_order":1808},{"unified":"1F1F2-1F1F9","short_names":["flag-mt"],"sort_order":1809},{"unified":"1F1F2-1F1FA","short_names":["flag-mu"],"sort_order":1810},{"unified":"1F1F2-1F1FB","short_names":["flag-mv"],"sort_order":1811},{"unified":"1F1F2-1F1FC","short_names":["flag-mw"],"sort_order":1812},{"unified":"1F1F2-1F1FD","short_names":["flag-mx"],"sort_order":1813},{"unified":"1F1F2-1F1FE","short_names":["flag-my"],"sort_order":1814},{"unified":"1F1F2-1F1FF","short_names":["flag-mz"],"sort_order":1815},{"unified":"1F1F3-1F1E6","short_names":["flag-na"],"sort_order":1816},{"unified":"1F1F3-1F1E8","short_names":["flag-nc"],"sort_order":1817},{"unified":"1F1F3-1F1EA","short_names":["flag-ne"],"sort_order":1818},{"unified":"1F1F3-1F1EB","short_names":["flag-nf"],"sort_order":1819},{"unified":"1F1F3-1F1EC","short_names":["flag-ng"],"sort_order":1820},{"unified":"1F1F3-1F1EE","short_names":["flag-ni"],"sort_order":1821},{"unified":"1F1F3-1F1F1","short_names":["flag-nl"],"sort_order":1822},{"unified":"1F1F3-1F1F4","short_names":["flag-no"],"sort_order":1823},{"unified":"1F1F3-1F1F5","short_names":["flag-np"],"sort_order":1824},{"unified":"1F1F3-1F1F7","short_names":["flag-nr"],"sort_order":1825},{"unified":"1F1F3-1F1FA","short_names":["flag-nu"],"sort_order":1826},{"unified":"1F1F3-1F1FF","short_names":["flag-nz"],"sort_order":1827},{"unified":"1F1F4-1F1F2","short_names":["flag-om"],"sort_order":1828},{"unified":"1F1F5-1F1E6","short_names":["flag-pa"],"sort_order":1829},{"unified":"1F1F5-1F1EA","short_names":["flag-pe"],"sort_order":1830},{"unified":"1F1F5-1F1EB","short_names":["flag-pf"],"sort_order":1831},{"unified":"1F1F5-1F1EC","short_names":["flag-pg"],"sort_order":1832},{"unified":"1F1F5-1F1ED","short_names":["flag-ph"],"sort_order":1833},{"unified":"1F1F5-1F1F0","short_names":["flag-pk"],"sort_order":1834},{"unified":"1F1F5-1F1F1","short_names":["flag-pl"],"sort_order":1835},{"unified":"1F1F5-1F1F2","short_names":["flag-pm"],"sort_order":1836},{"unified":"1F1F5-1F1F3","short_names":["flag-pn"],"sort_order":1837},{"unified":"1F1F5-1F1F7","short_names":["flag-pr"],"sort_order":1838},{"unified":"1F1F5-1F1F8","short_names":["flag-ps"],"sort_order":1839},{"unified":"1F1F5-1F1F9","short_names":["flag-pt"],"sort_order":1840},{"unified":"1F1F5-1F1FC","short_names":["flag-pw"],"sort_order":1841},{"unified":"1F1F5-1F1FE","short_names":["flag-py"],"sort_order":1842},{"unified":"1F1F6-1F1E6","short_names":["flag-qa"],"sort_order":1843},{"unified":"1F1F7-1F1EA","short_names":["flag-re"],"sort_order":1844},{"unified":"1F1F7-1F1F4","short_names":["flag-ro"],"sort_order":1845},{"unified":"1F1F7-1F1F8","short_names":["flag-rs"],"sort_order":1846},{"unified":"1F1F7-1F1FA","short_names":["ru","flag-ru"],"sort_order":1847},{"unified":"1F1F7-1F1FC","short_names":["flag-rw"],"sort_order":1848},{"unified":"1F1F8-1F1E6","short_names":["flag-sa"],"sort_order":1849},{"unified":"1F1F8-1F1E7","short_names":["flag-sb"],"sort_order":1850},{"unified":"1F1F8-1F1E8","short_names":["flag-sc"],"sort_order":1851},{"unified":"1F1F8-1F1E9","short_names":["flag-sd"],"sort_order":1852},{"unified":"1F1F8-1F1EA","short_names":["flag-se"],"sort_order":1853},{"unified":"1F1F8-1F1EC","short_names":["flag-sg"],"sort_order":1854},{"unified":"1F1F8-1F1ED","short_names":["flag-sh"],"sort_order":1855},{"unified":"1F1F8-1F1EE","short_names":["flag-si"],"sort_order":1856},{"unified":"1F1F8-1F1EF","short_names":["flag-sj"],"sort_order":1857},{"unified":"1F1F8-1F1F0","short_names":["flag-sk"],"sort_order":1858},{"unified":"1F1F8-1F1F1","short_names":["flag-sl"],"sort_order":1859},{"unified":"1F1F8-1F1F2","short_names":["flag-sm"],"sort_order":1860},{"unified":"1F1F8-1F1F3","short_names":["flag-sn"],"sort_order":1861},{"unified":"1F1F8-1F1F4","short_names":["flag-so"],"sort_order":1862},{"unified":"1F1F8-1F1F7","short_names":["flag-sr"],"sort_order":1863},{"unified":"1F1F8-1F1F8","short_names":["flag-ss"],"sort_order":1864},{"unified":"1F1F8-1F1F9","short_names":["flag-st"],"sort_order":1865},{"unified":"1F1F8-1F1FB","short_names":["flag-sv"],"sort_order":1866},{"unified":"1F1F8-1F1FD","short_names":["flag-sx"],"sort_order":1867},{"unified":"1F1F8-1F1FE","short_names":["flag-sy"],"sort_order":1868},{"unified":"1F1F8-1F1FF","short_names":["flag-sz"],"sort_order":1869},{"unified":"1F1F9-1F1E6","short_names":["flag-ta"],"sort_order":1870},{"unified":"1F1F9-1F1E8","short_names":["flag-tc"],"sort_order":1871},{"unified":"1F1F9-1F1E9","short_names":["flag-td"],"sort_order":1872},{"unified":"1F1F9-1F1EB","short_names":["flag-tf"],"sort_order":1873},{"unified":"1F1F9-1F1EC","short_names":["flag-tg"],"sort_order":1874},{"unified":"1F1F9-1F1ED","short_names":["flag-th"],"sort_order":1875},{"unified":"1F1F9-1F1EF","short_names":["flag-tj"],"sort_order":1876},{"unified":"1F1F9-1F1F0","short_names":["flag-tk"],"sort_order":1877},{"unified":"1F1F9-1F1F1","short_names":["flag-tl"],"sort_order":1878},{"unified":"1F1F9-1F1F2","short_names":["flag-tm"],"sort_order":1879},{"unified":"1F1F9-1F1F3","short_names":["flag-tn"],"sort_order":1880},{"unified":"1F1F9-1F1F4","short_names":["flag-to"],"sort_order":1881},{"unified":"1F1F9-1F1F7","short_names":["flag-tr"],"sort_order":1882},{"unified":"1F1F9-1F1F9","short_names":["flag-tt"],"sort_order":1883},{"unified":"1F1F9-1F1FB","short_names":["flag-tv"],"sort_order":1884},{"unified":"1F1F9-1F1FC","short_names":["flag-tw"],"sort_order":1885},{"unified":"1F1F9-1F1FF","short_names":["flag-tz"],"sort_order":1886},{"unified":"1F1FA-1F1E6","short_names":["flag-ua"],"sort_order":1887},{"unified":"1F1FA-1F1EC","short_names":["flag-ug"],"sort_order":1888},{"unified":"1F1FA-1F1F2","short_names":["flag-um"],"sort_order":1889},{"unified":"1F1FA-1F1F3","short_names":["flag-un"],"sort_order":1890},{"unified":"1F1FA-1F1F8","short_names":["us","flag-us"],"sort_order":1891},{"unified":"1F1FA-1F1FE","short_names":["flag-uy"],"sort_order":1892},{"unified":"1F1FA-1F1FF","short_names":["flag-uz"],"sort_order":1893},{"unified":"1F1FB-1F1E6","short_names":["flag-va"],"sort_order":1894},{"unified":"1F1FB-1F1E8","short_names":["flag-vc"],"sort_order":1895},{"unified":"1F1FB-1F1EA","short_names":["flag-ve"],"sort_order":1896},{"unified":"1F1FB-1F1EC","short_names":["flag-vg"],"sort_order":1897},{"unified":"1F1FB-1F1EE","short_names":["flag-vi"],"sort_order":1898},{"unified":"1F1FB-1F1F3","short_names":["flag-vn"],"sort_order":1899},{"unified":"1F1FB-1F1FA","short_names":["flag-vu"],"sort_order":1900},{"unified":"1F1FC-1F1EB","short_names":["flag-wf"],"sort_order":1901},{"unified":"1F1FC-1F1F8","short_names":["flag-ws"],"sort_order":1902},{"unified":"1F1FD-1F1F0","short_names":["flag-xk"],"sort_order":1903},{"unified":"1F1FE-1F1EA","short_names":["flag-ye"],"sort_order":1904},{"unified":"1F1FE-1F1F9","short_names":["flag-yt"],"sort_order":1905},{"unified":"1F1FF-1F1E6","short_names":["flag-za"],"sort_order":1906},{"unified":"1F1FF-1F1F2","short_names":["flag-zm"],"sort_order":1907},{"unified":"1F1FF-1F1FC","short_names":["flag-zw"],"sort_order":1908},{"unified":"1F201","short_names":["koko"],"sort_order":1591},{"unified":"1F202-FE0F","short_names":["sa"],"sort_order":1592},{"unified":"1F21A","short_names":["u7121"],"sort_order":1598},{"unified":"1F22F","short_names":["u6307"],"sort_order":1595},{"unified":"1F232","short_names":["u7981"],"sort_order":1599},{"unified":"1F233","short_names":["u7a7a"],"sort_order":1603},{"unified":"1F234","short_names":["u5408"],"sort_order":1602},{"unified":"1F235","short_names":["u6e80"],"sort_order":1607},{"unified":"1F236","short_names":["u6709"],"sort_order":1594},{"unified":"1F237-FE0F","short_names":["u6708"],"sort_order":1593},{"unified":"1F238","short_names":["u7533"],"sort_order":1601},{"unified":"1F239","short_names":["u5272"],"sort_order":1597},{"unified":"1F23A","short_names":["u55b6"],"sort_order":1606},{"unified":"1F250","short_names":["ideograph_advantage"],"sort_order":1596},{"unified":"1F251","short_names":["accept"],"sort_order":1600},{"unified":"1F300","short_names":["cyclone"],"sort_order":1055},{"unified":"1F301","short_names":["foggy"],"sort_order":902},{"unified":"1F302","short_names":["closed_umbrella"],"sort_order":1057},{"unified":"1F303","short_names":["night_with_stars"],"sort_order":903},{"unified":"1F304","short_names":["sunrise_over_mountains"],"sort_order":905},{"unified":"1F305","short_names":["sunrise"],"sort_order":906},{"unified":"1F306","short_names":["city_sunset"],"sort_order":907},{"unified":"1F307","short_names":["city_sunrise"],"sort_order":908},{"unified":"1F308","short_names":["rainbow"],"sort_order":1056},{"unified":"1F309","short_names":["bridge_at_night"],"sort_order":909},{"unified":"1F30A","short_names":["ocean"],"sort_order":1068},{"unified":"1F30B","short_names":["volcano"],"sort_order":860},{"unified":"1F30C","short_names":["milky_way"],"sort_order":1042},{"unified":"1F30D","short_names":["earth_africa"],"sort_order":851},{"unified":"1F30E","short_names":["earth_americas"],"sort_order":852},{"unified":"1F30F","short_names":["earth_asia"],"sort_order":853},{"unified":"1F310","short_names":["globe_with_meridians"],"sort_order":854},{"unified":"1F311","short_names":["new_moon"],"sort_order":1022},{"unified":"1F312","short_names":["waxing_crescent_moon"],"sort_order":1023},{"unified":"1F313","short_names":["first_quarter_moon"],"sort_order":1024},{"unified":"1F314","short_names":["moon","waxing_gibbous_moon"],"sort_order":1025},{"unified":"1F315","short_names":["full_moon"],"sort_order":1026},{"unified":"1F316","short_names":["waning_gibbous_moon"],"sort_order":1027},{"unified":"1F317","short_names":["last_quarter_moon"],"sort_order":1028},{"unified":"1F318","short_names":["waning_crescent_moon"],"sort_order":1029},{"unified":"1F319","short_names":["crescent_moon"],"sort_order":1030},{"unified":"1F31A","short_names":["new_moon_with_face"],"sort_order":1031},{"unified":"1F31B","short_names":["first_quarter_moon_with_face"],"sort_order":1032},{"unified":"1F31C","short_names":["last_quarter_moon_with_face"],"sort_order":1033},{"unified":"1F31D","short_names":["full_moon_with_face"],"sort_order":1036},{"unified":"1F31E","short_names":["sun_with_face"],"sort_order":1037},{"unified":"1F31F","short_names":["star2"],"sort_order":1040},{"unified":"1F320","short_names":["stars"],"sort_order":1041},{"unified":"1F321-FE0F","short_names":["thermometer"],"sort_order":1034},{"unified":"1F324-FE0F","short_names":["mostly_sunny","sun_small_cloud"],"sort_order":1046},{"unified":"1F325-FE0F","short_names":["barely_sunny","sun_behind_cloud"],"sort_order":1047},{"unified":"1F326-FE0F","short_names":["partly_sunny_rain","sun_behind_rain_cloud"],"sort_order":1048},{"unified":"1F327-FE0F","short_names":["rain_cloud"],"sort_order":1049},{"unified":"1F328-FE0F","short_names":["snow_cloud"],"sort_order":1050},{"unified":"1F329-FE0F","short_names":["lightning","lightning_cloud"],"sort_order":1051},{"unified":"1F32A-FE0F","short_names":["tornado","tornado_cloud"],"sort_order":1052},{"unified":"1F32B-FE0F","short_names":["fog"],"sort_order":1053},{"unified":"1F32C-FE0F","short_names":["wind_blowing_face"],"sort_order":1054},{"unified":"1F32D","short_names":["hotdog"],"sort_order":775},{"unified":"1F32E","short_names":["taco"],"sort_order":777},{"unified":"1F32F","short_names":["burrito"],"sort_order":778},{"unified":"1F330","short_names":["chestnut"],"sort_order":754},{"unified":"1F331","short_names":["seedling"],"sort_order":703},{"unified":"1F332","short_names":["evergreen_tree"],"sort_order":705},{"unified":"1F333","short_names":["deciduous_tree"],"sort_order":706},{"unified":"1F334","short_names":["palm_tree"],"sort_order":707},{"unified":"1F335","short_names":["cactus"],"sort_order":708},{"unified":"1F336-FE0F","short_names":["hot_pepper"],"sort_order":745},{"unified":"1F337","short_names":["tulip"],"sort_order":701},{"unified":"1F338","short_names":["cherry_blossom"],"sort_order":692},{"unified":"1F339","short_names":["rose"],"sort_order":696},{"unified":"1F33A","short_names":["hibiscus"],"sort_order":698},{"unified":"1F33B","short_names":["sunflower"],"sort_order":699},{"unified":"1F33C","short_names":["blossom"],"sort_order":700},{"unified":"1F33D","short_names":["corn"],"sort_order":744},{"unified":"1F33E","short_names":["ear_of_rice"],"sort_order":709},{"unified":"1F33F","short_names":["herb"],"sort_order":710},{"unified":"1F340","short_names":["four_leaf_clover"],"sort_order":712},{"unified":"1F341","short_names":["maple_leaf"],"sort_order":713},{"unified":"1F342","short_names":["fallen_leaf"],"sort_order":714},{"unified":"1F343","short_names":["leaves"],"sort_order":715},{"unified":"1F344-200D-1F7EB","short_names":["brown_mushroom"],"sort_order":757},{"unified":"1F344","short_names":["mushroom"],"sort_order":718},{"unified":"1F345","short_names":["tomato"],"sort_order":737},{"unified":"1F346","short_names":["eggplant"],"sort_order":741},{"unified":"1F347","short_names":["grapes"],"sort_order":720},{"unified":"1F348","short_names":["melon"],"sort_order":721},{"unified":"1F349","short_names":["watermelon"],"sort_order":722},{"unified":"1F34A","short_names":["tangerine"],"sort_order":723},{"unified":"1F34B-200D-1F7E9","short_names":["lime"],"sort_order":725},{"unified":"1F34B","short_names":["lemon"],"sort_order":724},{"unified":"1F34C","short_names":["banana"],"sort_order":726},{"unified":"1F34D","short_names":["pineapple"],"sort_order":727},{"unified":"1F34E","short_names":["apple"],"sort_order":729},{"unified":"1F34F","short_names":["green_apple"],"sort_order":730},{"unified":"1F350","short_names":["pear"],"sort_order":731},{"unified":"1F351","short_names":["peach"],"sort_order":732},{"unified":"1F352","short_names":["cherries"],"sort_order":733},{"unified":"1F353","short_names":["strawberry"],"sort_order":734},{"unified":"1F354","short_names":["hamburger"],"sort_order":772},{"unified":"1F355","short_names":["pizza"],"sort_order":774},{"unified":"1F356","short_names":["meat_on_bone"],"sort_order":768},{"unified":"1F357","short_names":["poultry_leg"],"sort_order":769},{"unified":"1F358","short_names":["rice_cracker"],"sort_order":794},{"unified":"1F359","short_names":["rice_ball"],"sort_order":795},{"unified":"1F35A","short_names":["rice"],"sort_order":796},{"unified":"1F35B","short_names":["curry"],"sort_order":797},{"unified":"1F35C","short_names":["ramen"],"sort_order":798},{"unified":"1F35D","short_names":["spaghetti"],"sort_order":799},{"unified":"1F35E","short_names":["bread"],"sort_order":759},{"unified":"1F35F","short_names":["fries"],"sort_order":773},{"unified":"1F360","short_names":["sweet_potato"],"sort_order":800},{"unified":"1F361","short_names":["dango"],"sort_order":806},{"unified":"1F362","short_names":["oden"],"sort_order":801},{"unified":"1F363","short_names":["sushi"],"sort_order":802},{"unified":"1F364","short_names":["fried_shrimp"],"sort_order":803},{"unified":"1F365","short_names":["fish_cake"],"sort_order":804},{"unified":"1F366","short_names":["icecream"],"sort_order":810},{"unified":"1F367","short_names":["shaved_ice"],"sort_order":811},{"unified":"1F368","short_names":["ice_cream"],"sort_order":812},{"unified":"1F369","short_names":["doughnut"],"sort_order":813},{"unified":"1F36A","short_names":["cookie"],"sort_order":814},{"unified":"1F36B","short_names":["chocolate_bar"],"sort_order":819},{"unified":"1F36C","short_names":["candy"],"sort_order":820},{"unified":"1F36D","short_names":["lollipop"],"sort_order":821},{"unified":"1F36E","short_names":["custard"],"sort_order":822},{"unified":"1F36F","short_names":["honey_pot"],"sort_order":823},{"unified":"1F370","short_names":["cake"],"sort_order":816},{"unified":"1F371","short_names":["bento"],"sort_order":793},{"unified":"1F372","short_names":["stew"],"sort_order":785},{"unified":"1F373","short_names":["fried_egg","cooking"],"sort_order":783},{"unified":"1F374","short_names":["fork_and_knife"],"sort_order":846},{"unified":"1F375","short_names":["tea"],"sort_order":828},{"unified":"1F376","short_names":["sake"],"sort_order":829},{"unified":"1F377","short_names":["wine_glass"],"sort_order":831},{"unified":"1F378","short_names":["cocktail"],"sort_order":832},{"unified":"1F379","short_names":["tropical_drink"],"sort_order":833},{"unified":"1F37A","short_names":["beer"],"sort_order":834},{"unified":"1F37B","short_names":["beers"],"sort_order":835},{"unified":"1F37C","short_names":["baby_bottle"],"sort_order":824},{"unified":"1F37D-FE0F","short_names":["knife_fork_plate"],"sort_order":845},{"unified":"1F37E","short_names":["champagne"],"sort_order":830},{"unified":"1F37F","short_names":["popcorn"],"sort_order":789},{"unified":"1F380","short_names":["ribbon"],"sort_order":1085},{"unified":"1F381","short_names":["gift"],"sort_order":1086},{"unified":"1F382","short_names":["birthday"],"sort_order":815},{"unified":"1F383","short_names":["jack_o_lantern"],"sort_order":1069},{"unified":"1F384","short_names":["christmas_tree"],"sort_order":1070},{"unified":"1F385","short_names":["santa"],"sort_order":372},{"unified":"1F386","short_names":["fireworks"],"sort_order":1071},{"unified":"1F387","short_names":["sparkler"],"sort_order":1072},{"unified":"1F388","short_names":["balloon"],"sort_order":1075},{"unified":"1F389","short_names":["tada"],"sort_order":1076},{"unified":"1F38A","short_names":["confetti_ball"],"sort_order":1077},{"unified":"1F38B","short_names":["tanabata_tree"],"sort_order":1078},{"unified":"1F38C","short_names":["crossed_flags"],"sort_order":1644},{"unified":"1F38D","short_names":["bamboo"],"sort_order":1079},{"unified":"1F38E","short_names":["dolls"],"sort_order":1080},{"unified":"1F38F","short_names":["flags"],"sort_order":1081},{"unified":"1F390","short_names":["wind_chime"],"sort_order":1082},{"unified":"1F391","short_names":["rice_scene"],"sort_order":1083},{"unified":"1F392","short_names":["school_satchel"],"sort_order":1179},{"unified":"1F393","short_names":["mortar_board"],"sort_order":1193},{"unified":"1F396-FE0F","short_names":["medal"],"sort_order":1090},{"unified":"1F397-FE0F","short_names":["reminder_ribbon"],"sort_order":1087},{"unified":"1F399-FE0F","short_names":["studio_microphone"],"sort_order":1213},{"unified":"1F39A-FE0F","short_names":["level_slider"],"sort_order":1214},{"unified":"1F39B-FE0F","short_names":["control_knobs"],"sort_order":1215},{"unified":"1F39E-FE0F","short_names":["film_frames"],"sort_order":1252},{"unified":"1F39F-FE0F","short_names":["admission_tickets"],"sort_order":1088},{"unified":"1F3A0","short_names":["carousel_horse"],"sort_order":911},{"unified":"1F3A1","short_names":["ferris_wheel"],"sort_order":913},{"unified":"1F3A2","short_names":["roller_coaster"],"sort_order":914},{"unified":"1F3A3","short_names":["fishing_pole_and_fish"],"sort_order":1117},{"unified":"1F3A4","short_names":["microphone"],"sort_order":1216},{"unified":"1F3A5","short_names":["movie_camera"],"sort_order":1251},{"unified":"1F3A6","short_names":["cinema"],"sort_order":1509},{"unified":"1F3A7","short_names":["headphones"],"sort_order":1217},{"unified":"1F3A8","short_names":["art"],"sort_order":1149},{"unified":"1F3A9","short_names":["tophat"],"sort_order":1192},{"unified":"1F3AA","short_names":["circus_tent"],"sort_order":916},{"unified":"1F3AB","short_names":["ticket"],"sort_order":1089},{"unified":"1F3AC","short_names":["clapper"],"sort_order":1254},{"unified":"1F3AD","short_names":["performing_arts"],"sort_order":1147},{"unified":"1F3AE","short_names":["video_game"],"sort_order":1130},{"unified":"1F3AF","short_names":["dart"],"sort_order":1123},{"unified":"1F3B0","short_names":["slot_machine"],"sort_order":1132},{"unified":"1F3B1","short_names":["8ball"],"sort_order":1127},{"unified":"1F3B2","short_names":["game_die"],"sort_order":1133},{"unified":"1F3B3","short_names":["bowling"],"sort_order":1105},{"unified":"1F3B4","short_names":["flower_playing_cards"],"sort_order":1146},{"unified":"1F3B5","short_names":["musical_note"],"sort_order":1211},{"unified":"1F3B6","short_names":["notes"],"sort_order":1212},{"unified":"1F3B7","short_names":["saxophone"],"sort_order":1219},{"unified":"1F3B8","short_names":["guitar"],"sort_order":1221},{"unified":"1F3B9","short_names":["musical_keyboard"],"sort_order":1222},{"unified":"1F3BA","short_names":["trumpet"],"sort_order":1223},{"unified":"1F3BB","short_names":["violin"],"sort_order":1224},{"unified":"1F3BC","short_names":["musical_score"],"sort_order":1210},{"unified":"1F3BD","short_names":["running_shirt_with_sash"],"sort_order":1119},{"unified":"1F3BE","short_names":["tennis"],"sort_order":1103},{"unified":"1F3BF","short_names":["ski"],"sort_order":1120},{"unified":"1F3C0","short_names":["basketball"],"sort_order":1099},{"unified":"1F3C1","short_names":["checkered_flag"],"sort_order":1642},{"unified":"1F3C2","short_names":["snowboarder"],"sort_order":463},{"unified":"1F3C3-200D-2640-FE0F","short_names":["woman-running"],"sort_order":444},{"unified":"1F3C3-200D-2640-FE0F-200D-27A1-FE0F","short_names":["woman_running_facing_right"],"sort_order":446},{"unified":"1F3C3-200D-2642-FE0F","short_names":["man-running"],"sort_order":443},{"unified":"1F3C3-200D-2642-FE0F-200D-27A1-FE0F","short_names":["man_running_facing_right"],"sort_order":447},{"unified":"1F3C3-200D-27A1-FE0F","short_names":["person_running_facing_right"],"sort_order":445},{"unified":"1F3C3","short_names":["runner","running"],"sort_order":442},{"unified":"1F3C4-200D-2640-FE0F","short_names":["woman-surfing"],"sort_order":469},{"unified":"1F3C4-200D-2642-FE0F","short_names":["man-surfing"],"sort_order":468},{"unified":"1F3C4","short_names":["surfer"],"sort_order":467},{"unified":"1F3C5","short_names":["sports_medal"],"sort_order":1092},{"unified":"1F3C6","short_names":["trophy"],"sort_order":1091},{"unified":"1F3C7","short_names":["horse_racing"],"sort_order":461},{"unified":"1F3C8","short_names":["football"],"sort_order":1101},{"unified":"1F3C9","short_names":["rugby_football"],"sort_order":1102},{"unified":"1F3CA-200D-2640-FE0F","short_names":["woman-swimming"],"sort_order":475},{"unified":"1F3CA-200D-2642-FE0F","short_names":["man-swimming"],"sort_order":474},{"unified":"1F3CA","short_names":["swimmer"],"sort_order":473},{"unified":"1F3CB-FE0F-200D-2640-FE0F","short_names":["woman-lifting-weights"],"sort_order":481},{"unified":"1F3CB-FE0F-200D-2642-FE0F","short_names":["man-lifting-weights"],"sort_order":480},{"unified":"1F3CB-FE0F","short_names":["weight_lifter"],"sort_order":479},{"unified":"1F3CC-FE0F-200D-2640-FE0F","short_names":["woman-golfing"],"sort_order":466},{"unified":"1F3CC-FE0F-200D-2642-FE0F","short_names":["man-golfing"],"sort_order":465},{"unified":"1F3CC-FE0F","short_names":["golfer"],"sort_order":464},{"unified":"1F3CD-FE0F","short_names":["racing_motorcycle"],"sort_order":947},{"unified":"1F3CE-FE0F","short_names":["racing_car"],"sort_order":946},{"unified":"1F3CF","short_names":["cricket_bat_and_ball"],"sort_order":1106},{"unified":"1F3D0","short_names":["volleyball"],"sort_order":1100},{"unified":"1F3D1","short_names":["field_hockey_stick_and_ball"],"sort_order":1107},{"unified":"1F3D2","short_names":["ice_hockey_stick_and_puck"],"sort_order":1108},{"unified":"1F3D3","short_names":["table_tennis_paddle_and_ball"],"sort_order":1110},{"unified":"1F3D4-FE0F","short_names":["snow_capped_mountain"],"sort_order":858},{"unified":"1F3D5-FE0F","short_names":["camping"],"sort_order":862},{"unified":"1F3D6-FE0F","short_names":["beach_with_umbrella"],"sort_order":863},{"unified":"1F3D7-FE0F","short_names":["building_construction"],"sort_order":869},{"unified":"1F3D8-FE0F","short_names":["house_buildings"],"sort_order":874},{"unified":"1F3D9-FE0F","short_names":["cityscape"],"sort_order":904},{"unified":"1F3DA-FE0F","short_names":["derelict_house_building"],"sort_order":875},{"unified":"1F3DB-FE0F","short_names":["classical_building"],"sort_order":868},{"unified":"1F3DC-FE0F","short_names":["desert"],"sort_order":864},{"unified":"1F3DD-FE0F","short_names":["desert_island"],"sort_order":865},{"unified":"1F3DE-FE0F","short_names":["national_park"],"sort_order":866},{"unified":"1F3DF-FE0F","short_names":["stadium"],"sort_order":867},{"unified":"1F3E0","short_names":["house"],"sort_order":876},{"unified":"1F3E1","short_names":["house_with_garden"],"sort_order":877},{"unified":"1F3E2","short_names":["office"],"sort_order":878},{"unified":"1F3E3","short_names":["post_office"],"sort_order":879},{"unified":"1F3E4","short_names":["european_post_office"],"sort_order":880},{"unified":"1F3E5","short_names":["hospital"],"sort_order":881},{"unified":"1F3E6","short_names":["bank"],"sort_order":882},{"unified":"1F3E7","short_names":["atm"],"sort_order":1418},{"unified":"1F3E8","short_names":["hotel"],"sort_order":883},{"unified":"1F3E9","short_names":["love_hotel"],"sort_order":884},{"unified":"1F3EA","short_names":["convenience_store"],"sort_order":885},{"unified":"1F3EB","short_names":["school"],"sort_order":886},{"unified":"1F3EC","short_names":["department_store"],"sort_order":887},{"unified":"1F3ED","short_names":["factory"],"sort_order":888},{"unified":"1F3EE","short_names":["izakaya_lantern","lantern"],"sort_order":1265},{"unified":"1F3EF","short_names":["japanese_castle"],"sort_order":889},{"unified":"1F3F0","short_names":["european_castle"],"sort_order":890},{"unified":"1F3F3-FE0F-200D-1F308","short_names":["rainbow-flag"],"sort_order":1647},{"unified":"1F3F3-FE0F-200D-26A7-FE0F","short_names":["transgender_flag"],"sort_order":1648},{"unified":"1F3F3-FE0F","short_names":["waving_white_flag"],"sort_order":1646},{"unified":"1F3F4-200D-2620-FE0F","short_names":["pirate_flag"],"sort_order":1649},{"unified":"1F3F4-E0067-E0062-E0065-E006E-E0067-E007F","short_names":["flag-england"],"sort_order":1909},{"unified":"1F3F4-E0067-E0062-E0073-E0063-E0074-E007F","short_names":["flag-scotland"],"sort_order":1910},{"unified":"1F3F4-E0067-E0062-E0077-E006C-E0073-E007F","short_names":["flag-wales"],"sort_order":1911},{"unified":"1F3F4","short_names":["waving_black_flag"],"sort_order":1645},{"unified":"1F3F5-FE0F","short_names":["rosette"],"sort_order":695},{"unified":"1F3F7-FE0F","short_names":["label"],"sort_order":1283},{"unified":"1F3F8","short_names":["badminton_racquet_and_shuttlecock"],"sort_order":1111},{"unified":"1F3F9","short_names":["bow_and_arrow"],"sort_order":1352},{"unified":"1F3FA","short_names":["amphora"],"sort_order":850},{"unified":"1F3FB","short_names":["skin-tone-2"],"sort_order":556},{"unified":"1F3FC","short_names":["skin-tone-3"],"sort_order":557},{"unified":"1F3FD","short_names":["skin-tone-4"],"sort_order":558},{"unified":"1F3FE","short_names":["skin-tone-5"],"sort_order":559},{"unified":"1F3FF","short_names":["skin-tone-6"],"sort_order":560},{"unified":"1F400","short_names":["rat"],"sort_order":609},{"unified":"1F401","short_names":["mouse2"],"sort_order":608},{"unified":"1F402","short_names":["ox"],"sort_order":589},{"unified":"1F403","short_names":["water_buffalo"],"sort_order":590},{"unified":"1F404","short_names":["cow2"],"sort_order":591},{"unified":"1F405","short_names":["tiger2"],"sort_order":578},{"unified":"1F406","short_names":["leopard"],"sort_order":579},{"unified":"1F407","short_names":["rabbit2"],"sort_order":612},{"unified":"1F408-200D-2B1B","short_names":["black_cat"],"sort_order":575},{"unified":"1F408","short_names":["cat2"],"sort_order":574},{"unified":"1F409","short_names":["dragon"],"sort_order":655},{"unified":"1F40A","short_names":["crocodile"],"sort_order":650},{"unified":"1F40B","short_names":["whale2"],"sort_order":659},{"unified":"1F40C","short_names":["snail"],"sort_order":675},{"unified":"1F40D","short_names":["snake"],"sort_order":653},{"unified":"1F40E","short_names":["racehorse"],"sort_order":583},{"unified":"1F40F","short_names":["ram"],"sort_order":596},{"unified":"1F410","short_names":["goat"],"sort_order":598},{"unified":"1F411","short_names":["sheep"],"sort_order":597},{"unified":"1F412","short_names":["monkey"],"sort_order":562},{"unified":"1F413","short_names":["rooster"],"sort_order":629},{"unified":"1F414","short_names":["chicken"],"sort_order":628},{"unified":"1F415-200D-1F9BA","short_names":["service_dog"],"sort_order":568},{"unified":"1F415","short_names":["dog2"],"sort_order":566},{"unified":"1F416","short_names":["pig2"],"sort_order":593},{"unified":"1F417","short_names":["boar"],"sort_order":594},{"unified":"1F418","short_names":["elephant"],"sort_order":603},{"unified":"1F419","short_names":["octopus"],"sort_order":666},{"unified":"1F41A","short_names":["shell"],"sort_order":667},{"unified":"1F41B","short_names":["bug"],"sort_order":677},{"unified":"1F41C","short_names":["ant"],"sort_order":678},{"unified":"1F41D","short_names":["bee","honeybee"],"sort_order":679},{"unified":"1F41E","short_names":["ladybug","lady_beetle"],"sort_order":681},{"unified":"1F41F","short_names":["fish"],"sort_order":662},{"unified":"1F420","short_names":["tropical_fish"],"sort_order":663},{"unified":"1F421","short_names":["blowfish"],"sort_order":664},{"unified":"1F422","short_names":["turtle"],"sort_order":651},{"unified":"1F423","short_names":["hatching_chick"],"sort_order":630},{"unified":"1F424","short_names":["baby_chick"],"sort_order":631},{"unified":"1F425","short_names":["hatched_chick"],"sort_order":632},{"unified":"1F426-200D-1F525","short_names":["phoenix"],"sort_order":648},{"unified":"1F426-200D-2B1B","short_names":["black_bird"],"sort_order":646},{"unified":"1F426","short_names":["bird"],"sort_order":633},{"unified":"1F427","short_names":["penguin"],"sort_order":634},{"unified":"1F428","short_names":["koala"],"sort_order":619},{"unified":"1F429","short_names":["poodle"],"sort_order":569},{"unified":"1F42A","short_names":["dromedary_camel"],"sort_order":599},{"unified":"1F42B","short_names":["camel"],"sort_order":600},{"unified":"1F42C","short_names":["dolphin","flipper"],"sort_order":660},{"unified":"1F42D","short_names":["mouse"],"sort_order":607},{"unified":"1F42E","short_names":["cow"],"sort_order":588},{"unified":"1F42F","short_names":["tiger"],"sort_order":577},{"unified":"1F430","short_names":["rabbit"],"sort_order":611},{"unified":"1F431","short_names":["cat"],"sort_order":573},{"unified":"1F432","short_names":["dragon_face"],"sort_order":654},{"unified":"1F433","short_names":["whale"],"sort_order":658},{"unified":"1F434","short_names":["horse"],"sort_order":580},{"unified":"1F435","short_names":["monkey_face"],"sort_order":561},{"unified":"1F436","short_names":["dog"],"sort_order":565},{"unified":"1F437","short_names":["pig"],"sort_order":592},{"unified":"1F438","short_names":["frog"],"sort_order":649},{"unified":"1F439","short_names":["hamster"],"sort_order":610},{"unified":"1F43A","short_names":["wolf"],"sort_order":570},{"unified":"1F43B-200D-2744-FE0F","short_names":["polar_bear"],"sort_order":618},{"unified":"1F43B","short_names":["bear"],"sort_order":617},{"unified":"1F43C","short_names":["panda_face"],"sort_order":620},{"unified":"1F43D","short_names":["pig_nose"],"sort_order":595},{"unified":"1F43E","short_names":["feet","paw_prints"],"sort_order":626},{"unified":"1F43F-FE0F","short_names":["chipmunk"],"sort_order":613},{"unified":"1F440","short_names":["eyes"],"sort_order":226},{"unified":"1F441-FE0F-200D-1F5E8-FE0F","short_names":["eye-in-speech-bubble"],"sort_order":165},{"unified":"1F441-FE0F","short_names":["eye"],"sort_order":227},{"unified":"1F442","short_names":["ear"],"sort_order":218},{"unified":"1F443","short_names":["nose"],"sort_order":220},{"unified":"1F444","short_names":["lips"],"sort_order":229},{"unified":"1F445","short_names":["tongue"],"sort_order":228},{"unified":"1F446","short_names":["point_up_2"],"sort_order":192},{"unified":"1F447","short_names":["point_down"],"sort_order":194},{"unified":"1F448","short_names":["point_left"],"sort_order":190},{"unified":"1F449","short_names":["point_right"],"sort_order":191},{"unified":"1F44A","short_names":["facepunch","punch"],"sort_order":200},{"unified":"1F44B","short_names":["wave"],"sort_order":170},{"unified":"1F44C","short_names":["ok_hand"],"sort_order":181},{"unified":"1F44D","short_names":["+1","thumbsup"],"sort_order":197},{"unified":"1F44E","short_names":["-1","thumbsdown"],"sort_order":198},{"unified":"1F44F","short_names":["clap"],"sort_order":203},{"unified":"1F450","short_names":["open_hands"],"sort_order":206},{"unified":"1F451","short_names":["crown"],"sort_order":1190},{"unified":"1F452","short_names":["womans_hat"],"sort_order":1191},{"unified":"1F453","short_names":["eyeglasses"],"sort_order":1154},{"unified":"1F454","short_names":["necktie"],"sort_order":1159},{"unified":"1F455","short_names":["shirt","tshirt"],"sort_order":1160},{"unified":"1F456","short_names":["jeans"],"sort_order":1161},{"unified":"1F457","short_names":["dress"],"sort_order":1166},{"unified":"1F458","short_names":["kimono"],"sort_order":1167},{"unified":"1F459","short_names":["bikini"],"sort_order":1172},{"unified":"1F45A","short_names":["womans_clothes"],"sort_order":1173},{"unified":"1F45B","short_names":["purse"],"sort_order":1175},{"unified":"1F45C","short_names":["handbag"],"sort_order":1176},{"unified":"1F45D","short_names":["pouch"],"sort_order":1177},{"unified":"1F45E","short_names":["mans_shoe","shoe"],"sort_order":1181},{"unified":"1F45F","short_names":["athletic_shoe"],"sort_order":1182},{"unified":"1F460","short_names":["high_heel"],"sort_order":1185},{"unified":"1F461","short_names":["sandal"],"sort_order":1186},{"unified":"1F462","short_names":["boot"],"sort_order":1188},{"unified":"1F463","short_names":["footprints"],"sort_order":554},{"unified":"1F464","short_names":["bust_in_silhouette"],"sort_order":546},{"unified":"1F465","short_names":["busts_in_silhouette"],"sort_order":547},{"unified":"1F466","short_names":["boy"],"sort_order":233},{"unified":"1F467","short_names":["girl"],"sort_order":234},{"unified":"1F468-200D-1F33E","short_names":["male-farmer"],"sort_order":302},{"unified":"1F468-200D-1F373","short_names":["male-cook"],"sort_order":305},{"unified":"1F468-200D-1F37C","short_names":["man_feeding_baby"],"sort_order":369},{"unified":"1F468-200D-1F393","short_names":["male-student"],"sort_order":293},{"unified":"1F468-200D-1F3A4","short_names":["male-singer"],"sort_order":323},{"unified":"1F468-200D-1F3A8","short_names":["male-artist"],"sort_order":326},{"unified":"1F468-200D-1F3EB","short_names":["male-teacher"],"sort_order":296},{"unified":"1F468-200D-1F3ED","short_names":["male-factory-worker"],"sort_order":311},{"unified":"1F468-200D-1F466-200D-1F466","short_names":["man-boy-boy"],"sort_order":536},{"unified":"1F468-200D-1F466","short_names":["man-boy"],"sort_order":535},{"unified":"1F468-200D-1F467-200D-1F466","short_names":["man-girl-boy"],"sort_order":538},{"unified":"1F468-200D-1F467-200D-1F467","short_names":["man-girl-girl"],"sort_order":539},{"unified":"1F468-200D-1F467","short_names":["man-girl"],"sort_order":537},{"unified":"1F468-200D-1F468-200D-1F466","short_names":["man-man-boy"],"sort_order":525},{"unified":"1F468-200D-1F468-200D-1F466-200D-1F466","short_names":["man-man-boy-boy"],"sort_order":528},{"unified":"1F468-200D-1F468-200D-1F467","short_names":["man-man-girl"],"sort_order":526},{"unified":"1F468-200D-1F468-200D-1F467-200D-1F466","short_names":["man-man-girl-boy"],"sort_order":527},{"unified":"1F468-200D-1F468-200D-1F467-200D-1F467","short_names":["man-man-girl-girl"],"sort_order":529},{"unified":"1F468-200D-1F469-200D-1F466","short_names":["man-woman-boy"],"sort_order":520},{"unified":"1F468-200D-1F469-200D-1F466-200D-1F466","short_names":["man-woman-boy-boy"],"sort_order":523},{"unified":"1F468-200D-1F469-200D-1F467","short_names":["man-woman-girl"],"sort_order":521},{"unified":"1F468-200D-1F469-200D-1F467-200D-1F466","short_names":["man-woman-girl-boy"],"sort_order":522},{"unified":"1F468-200D-1F469-200D-1F467-200D-1F467","short_names":["man-woman-girl-girl"],"sort_order":524},{"unified":"1F468-200D-1F4BB","short_names":["male-technologist"],"sort_order":320},{"unified":"1F468-200D-1F4BC","short_names":["male-office-worker"],"sort_order":314},{"unified":"1F468-200D-1F527","short_names":["male-mechanic"],"sort_order":308},{"unified":"1F468-200D-1F52C","short_names":["male-scientist"],"sort_order":317},{"unified":"1F468-200D-1F680","short_names":["male-astronaut"],"sort_order":332},{"unified":"1F468-200D-1F692","short_names":["male-firefighter"],"sort_order":335},{"unified":"1F468-200D-1F9AF-200D-27A1-FE0F","short_names":["man_with_white_cane_facing_right"],"sort_order":427},{"unified":"1F468-200D-1F9AF","short_names":["man_with_probing_cane"],"sort_order":426},{"unified":"1F468-200D-1F9B0","short_names":["red_haired_man"],"sort_order":241},{"unified":"1F468-200D-1F9B1","short_names":["curly_haired_man"],"sort_order":242},{"unified":"1F468-200D-1F9B2","short_names":["bald_man"],"sort_order":244},{"unified":"1F468-200D-1F9B3","short_names":["white_haired_man"],"sort_order":243},{"unified":"1F468-200D-1F9BC-200D-27A1-FE0F","short_names":["man_in_motorized_wheelchair_facing_right"],"sort_order":433},{"unified":"1F468-200D-1F9BC","short_names":["man_in_motorized_wheelchair"],"sort_order":432},{"unified":"1F468-200D-1F9BD-200D-27A1-FE0F","short_names":["man_in_manual_wheelchair_facing_right"],"sort_order":439},{"unified":"1F468-200D-1F9BD","short_names":["man_in_manual_wheelchair"],"sort_order":438},{"unified":"1F468-200D-2695-FE0F","short_names":["male-doctor"],"sort_order":290},{"unified":"1F468-200D-2696-FE0F","short_names":["male-judge"],"sort_order":299},{"unified":"1F468-200D-2708-FE0F","short_names":["male-pilot"],"sort_order":329},{"unified":"1F468-200D-2764-FE0F-200D-1F468","short_names":["man-heart-man"],"sort_order":518},{"unified":"1F468-200D-2764-FE0F-200D-1F48B-200D-1F468","short_names":["man-kiss-man"],"sort_order":514},{"unified":"1F468","short_names":["man"],"sort_order":237},{"unified":"1F469-200D-1F33E","short_names":["female-farmer"],"sort_order":303},{"unified":"1F469-200D-1F373","short_names":["female-cook"],"sort_order":306},{"unified":"1F469-200D-1F37C","short_names":["woman_feeding_baby"],"sort_order":368},{"unified":"1F469-200D-1F393","short_names":["female-student"],"sort_order":294},{"unified":"1F469-200D-1F3A4","short_names":["female-singer"],"sort_order":324},{"unified":"1F469-200D-1F3A8","short_names":["female-artist"],"sort_order":327},{"unified":"1F469-200D-1F3EB","short_names":["female-teacher"],"sort_order":297},{"unified":"1F469-200D-1F3ED","short_names":["female-factory-worker"],"sort_order":312},{"unified":"1F469-200D-1F466-200D-1F466","short_names":["woman-boy-boy"],"sort_order":541},{"unified":"1F469-200D-1F466","short_names":["woman-boy"],"sort_order":540},{"unified":"1F469-200D-1F467-200D-1F466","short_names":["woman-girl-boy"],"sort_order":543},{"unified":"1F469-200D-1F467-200D-1F467","short_names":["woman-girl-girl"],"sort_order":544},{"unified":"1F469-200D-1F467","short_names":["woman-girl"],"sort_order":542},{"unified":"1F469-200D-1F469-200D-1F466","short_names":["woman-woman-boy"],"sort_order":530},{"unified":"1F469-200D-1F469-200D-1F466-200D-1F466","short_names":["woman-woman-boy-boy"],"sort_order":533},{"unified":"1F469-200D-1F469-200D-1F467","short_names":["woman-woman-girl"],"sort_order":531},{"unified":"1F469-200D-1F469-200D-1F467-200D-1F466","short_names":["woman-woman-girl-boy"],"sort_order":532},{"unified":"1F469-200D-1F469-200D-1F467-200D-1F467","short_names":["woman-woman-girl-girl"],"sort_order":534},{"unified":"1F469-200D-1F4BB","short_names":["female-technologist"],"sort_order":321},{"unified":"1F469-200D-1F4BC","short_names":["female-office-worker"],"sort_order":315},{"unified":"1F469-200D-1F527","short_names":["female-mechanic"],"sort_order":309},{"unified":"1F469-200D-1F52C","short_names":["female-scientist"],"sort_order":318},{"unified":"1F469-200D-1F680","short_names":["female-astronaut"],"sort_order":333},{"unified":"1F469-200D-1F692","short_names":["female-firefighter"],"sort_order":336},{"unified":"1F469-200D-1F9AF-200D-27A1-FE0F","short_names":["woman_with_white_cane_facing_right"],"sort_order":429},{"unified":"1F469-200D-1F9AF","short_names":["woman_with_probing_cane"],"sort_order":428},{"unified":"1F469-200D-1F9B0","short_names":["red_haired_woman"],"sort_order":246},{"unified":"1F469-200D-1F9B1","short_names":["curly_haired_woman"],"sort_order":248},{"unified":"1F469-200D-1F9B2","short_names":["bald_woman"],"sort_order":252},{"unified":"1F469-200D-1F9B3","short_names":["white_haired_woman"],"sort_order":250},{"unified":"1F469-200D-1F9BC-200D-27A1-FE0F","short_names":["woman_in_motorized_wheelchair_facing_right"],"sort_order":435},{"unified":"1F469-200D-1F9BC","short_names":["woman_in_motorized_wheelchair"],"sort_order":434},{"unified":"1F469-200D-1F9BD-200D-27A1-FE0F","short_names":["woman_in_manual_wheelchair_facing_right"],"sort_order":441},{"unified":"1F469-200D-1F9BD","short_names":["woman_in_manual_wheelchair"],"sort_order":440},{"unified":"1F469-200D-2695-FE0F","short_names":["female-doctor"],"sort_order":291},{"unified":"1F469-200D-2696-FE0F","short_names":["female-judge"],"sort_order":300},{"unified":"1F469-200D-2708-FE0F","short_names":["female-pilot"],"sort_order":330},{"unified":"1F469-200D-2764-FE0F-200D-1F468","short_names":["woman-heart-man"],"sort_order":517},{"unified":"1F469-200D-2764-FE0F-200D-1F469","short_names":["woman-heart-woman"],"sort_order":519},{"unified":"1F469-200D-2764-FE0F-200D-1F48B-200D-1F468","short_names":["woman-kiss-man"],"sort_order":513},{"unified":"1F469-200D-2764-FE0F-200D-1F48B-200D-1F469","short_names":["woman-kiss-woman"],"sort_order":515},{"unified":"1F469","short_names":["woman"],"sort_order":245},{"unified":"1F46A","short_names":["family"],"sort_order":549},{"unified":"1F46B","short_names":["man_and_woman_holding_hands","woman_and_man_holding_hands","couple"],"sort_order":510},{"unified":"1F46C","short_names":["two_men_holding_hands","men_holding_hands"],"sort_order":511},{"unified":"1F46D","short_names":["two_women_holding_hands","women_holding_hands"],"sort_order":509},{"unified":"1F46E-200D-2640-FE0F","short_names":["female-police-officer"],"sort_order":339},{"unified":"1F46E-200D-2642-FE0F","short_names":["male-police-officer"],"sort_order":338},{"unified":"1F46E","short_names":["cop"],"sort_order":337},{"unified":"1F46F-200D-2640-FE0F","short_names":["women-with-bunny-ears-partying","woman-with-bunny-ears-partying"],"sort_order":453},{"unified":"1F46F-200D-2642-FE0F","short_names":["men-with-bunny-ears-partying","man-with-bunny-ears-partying"],"sort_order":452},{"unified":"1F46F","short_names":["dancers"],"sort_order":451},{"unified":"1F470-200D-2640-FE0F","short_names":["woman_with_veil"],"sort_order":363},{"unified":"1F470-200D-2642-FE0F","short_names":["man_with_veil"],"sort_order":362},{"unified":"1F470","short_names":["bride_with_veil"],"sort_order":361},{"unified":"1F471-200D-2640-FE0F","short_names":["blond-haired-woman"],"sort_order":254},{"unified":"1F471-200D-2642-FE0F","short_names":["blond-haired-man"],"sort_order":255},{"unified":"1F471","short_names":["person_with_blond_hair"],"sort_order":236},{"unified":"1F472","short_names":["man_with_gua_pi_mao"],"sort_order":356},{"unified":"1F473-200D-2640-FE0F","short_names":["woman-wearing-turban"],"sort_order":355},{"unified":"1F473-200D-2642-FE0F","short_names":["man-wearing-turban"],"sort_order":354},{"unified":"1F473","short_names":["man_with_turban"],"sort_order":353},{"unified":"1F474","short_names":["older_man"],"sort_order":257},{"unified":"1F475","short_names":["older_woman"],"sort_order":258},{"unified":"1F476","short_names":["baby"],"sort_order":231},{"unified":"1F477-200D-2640-FE0F","short_names":["female-construction-worker"],"sort_order":349},{"unified":"1F477-200D-2642-FE0F","short_names":["male-construction-worker"],"sort_order":348},{"unified":"1F477","short_names":["construction_worker"],"sort_order":347},{"unified":"1F478","short_names":["princess"],"sort_order":352},{"unified":"1F479","short_names":["japanese_ogre"],"sort_order":113},{"unified":"1F47A","short_names":["japanese_goblin"],"sort_order":114},{"unified":"1F47B","short_names":["ghost"],"sort_order":115},{"unified":"1F47C","short_names":["angel"],"sort_order":371},{"unified":"1F47D","short_names":["alien"],"sort_order":116},{"unified":"1F47E","short_names":["space_invader"],"sort_order":117},{"unified":"1F47F","short_names":["imp"],"sort_order":108},{"unified":"1F480","short_names":["skull"],"sort_order":109},{"unified":"1F481-200D-2640-FE0F","short_names":["woman-tipping-hand"],"sort_order":273},{"unified":"1F481-200D-2642-FE0F","short_names":["man-tipping-hand"],"sort_order":272},{"unified":"1F481","short_names":["information_desk_person"],"sort_order":271},{"unified":"1F482-200D-2640-FE0F","short_names":["female-guard"],"sort_order":345},{"unified":"1F482-200D-2642-FE0F","short_names":["male-guard"],"sort_order":344},{"unified":"1F482","short_names":["guardsman"],"sort_order":343},{"unified":"1F483","short_names":["dancer"],"sort_order":448},{"unified":"1F484","short_names":["lipstick"],"sort_order":1198},{"unified":"1F485","short_names":["nail_care"],"sort_order":211},{"unified":"1F486-200D-2640-FE0F","short_names":["woman-getting-massage"],"sort_order":405},{"unified":"1F486-200D-2642-FE0F","short_names":["man-getting-massage"],"sort_order":404},{"unified":"1F486","short_names":["massage"],"sort_order":403},{"unified":"1F487-200D-2640-FE0F","short_names":["woman-getting-haircut"],"sort_order":408},{"unified":"1F487-200D-2642-FE0F","short_names":["man-getting-haircut"],"sort_order":407},{"unified":"1F487","short_names":["haircut"],"sort_order":406},{"unified":"1F488","short_names":["barber"],"sort_order":915},{"unified":"1F489","short_names":["syringe"],"sort_order":1377},{"unified":"1F48A","short_names":["pill"],"sort_order":1379},{"unified":"1F48B","short_names":["kiss"],"sort_order":156},{"unified":"1F48C","short_names":["love_letter"],"sort_order":131},{"unified":"1F48D","short_names":["ring"],"sort_order":1199},{"unified":"1F48E","short_names":["gem"],"sort_order":1200},{"unified":"1F48F","short_names":["couplekiss"],"sort_order":512},{"unified":"1F490","short_names":["bouquet"],"sort_order":691},{"unified":"1F491","short_names":["couple_with_heart"],"sort_order":516},{"unified":"1F492","short_names":["wedding"],"sort_order":891},{"unified":"1F493","short_names":["heartbeat"],"sort_order":136},{"unified":"1F494","short_names":["broken_heart"],"sort_order":141},{"unified":"1F495","short_names":["two_hearts"],"sort_order":138},{"unified":"1F496","short_names":["sparkling_heart"],"sort_order":134},{"unified":"1F497","short_names":["heartpulse"],"sort_order":135},{"unified":"1F498","short_names":["cupid"],"sort_order":132},{"unified":"1F499","short_names":["blue_heart"],"sort_order":149},{"unified":"1F49A","short_names":["green_heart"],"sort_order":148},{"unified":"1F49B","short_names":["yellow_heart"],"sort_order":147},{"unified":"1F49C","short_names":["purple_heart"],"sort_order":151},{"unified":"1F49D","short_names":["gift_heart"],"sort_order":133},{"unified":"1F49E","short_names":["revolving_hearts"],"sort_order":137},{"unified":"1F49F","short_names":["heart_decoration"],"sort_order":139},{"unified":"1F4A0","short_names":["diamond_shape_with_a_dot_inside"],"sort_order":1638},{"unified":"1F4A1","short_names":["bulb"],"sort_order":1263},{"unified":"1F4A2","short_names":["anger"],"sort_order":158},{"unified":"1F4A3","short_names":["bomb"],"sort_order":1350},{"unified":"1F4A4","short_names":["zzz"],"sort_order":169},{"unified":"1F4A5","short_names":["boom","collision"],"sort_order":159},{"unified":"1F4A6","short_names":["sweat_drops"],"sort_order":161},{"unified":"1F4A7","short_names":["droplet"],"sort_order":1067},{"unified":"1F4A8","short_names":["dash"],"sort_order":162},{"unified":"1F4A9","short_names":["hankey","poop","shit"],"sort_order":111},{"unified":"1F4AA","short_names":["muscle"],"sort_order":213},{"unified":"1F4AB","short_names":["dizzy"],"sort_order":160},{"unified":"1F4AC","short_names":["speech_balloon"],"sort_order":164},{"unified":"1F4AD","short_names":["thought_balloon"],"sort_order":168},{"unified":"1F4AE","short_names":["white_flower"],"sort_order":693},{"unified":"1F4AF","short_names":["100"],"sort_order":157},{"unified":"1F4B0","short_names":["moneybag"],"sort_order":1284},{"unified":"1F4B1","short_names":["currency_exchange"],"sort_order":1532},{"unified":"1F4B2","short_names":["heavy_dollar_sign"],"sort_order":1533},{"unified":"1F4B3","short_names":["credit_card"],"sort_order":1291},{"unified":"1F4B4","short_names":["yen"],"sort_order":1286},{"unified":"1F4B5","short_names":["dollar"],"sort_order":1287},{"unified":"1F4B6","short_names":["euro"],"sort_order":1288},{"unified":"1F4B7","short_names":["pound"],"sort_order":1289},{"unified":"1F4B8","short_names":["money_with_wings"],"sort_order":1290},{"unified":"1F4B9","short_names":["chart"],"sort_order":1293},{"unified":"1F4BA","short_names":["seat"],"sort_order":981},{"unified":"1F4BB","short_names":["computer"],"sort_order":1240},{"unified":"1F4BC","short_names":["briefcase"],"sort_order":1314},{"unified":"1F4BD","short_names":["minidisc"],"sort_order":1246},{"unified":"1F4BE","short_names":["floppy_disk"],"sort_order":1247},{"unified":"1F4BF","short_names":["cd"],"sort_order":1248},{"unified":"1F4C0","short_names":["dvd"],"sort_order":1249},{"unified":"1F4C1","short_names":["file_folder"],"sort_order":1315},{"unified":"1F4C2","short_names":["open_file_folder"],"sort_order":1316},{"unified":"1F4C3","short_names":["page_with_curl"],"sort_order":1276},{"unified":"1F4C4","short_names":["page_facing_up"],"sort_order":1278},{"unified":"1F4C5","short_names":["date"],"sort_order":1318},{"unified":"1F4C6","short_names":["calendar"],"sort_order":1319},{"unified":"1F4C7","short_names":["card_index"],"sort_order":1322},{"unified":"1F4C8","short_names":["chart_with_upwards_trend"],"sort_order":1323},{"unified":"1F4C9","short_names":["chart_with_downwards_trend"],"sort_order":1324},{"unified":"1F4CA","short_names":["bar_chart"],"sort_order":1325},{"unified":"1F4CB","short_names":["clipboard"],"sort_order":1326},{"unified":"1F4CC","short_names":["pushpin"],"sort_order":1327},{"unified":"1F4CD","short_names":["round_pushpin"],"sort_order":1328},{"unified":"1F4CE","short_names":["paperclip"],"sort_order":1329},{"unified":"1F4CF","short_names":["straight_ruler"],"sort_order":1331},{"unified":"1F4D0","short_names":["triangular_ruler"],"sort_order":1332},{"unified":"1F4D1","short_names":["bookmark_tabs"],"sort_order":1281},{"unified":"1F4D2","short_names":["ledger"],"sort_order":1275},{"unified":"1F4D3","short_names":["notebook"],"sort_order":1274},{"unified":"1F4D4","short_names":["notebook_with_decorative_cover"],"sort_order":1267},{"unified":"1F4D5","short_names":["closed_book"],"sort_order":1268},{"unified":"1F4D6","short_names":["book","open_book"],"sort_order":1269},{"unified":"1F4D7","short_names":["green_book"],"sort_order":1270},{"unified":"1F4D8","short_names":["blue_book"],"sort_order":1271},{"unified":"1F4D9","short_names":["orange_book"],"sort_order":1272},{"unified":"1F4DA","short_names":["books"],"sort_order":1273},{"unified":"1F4DB","short_names":["name_badge"],"sort_order":1538},{"unified":"1F4DC","short_names":["scroll"],"sort_order":1277},{"unified":"1F4DD","short_names":["memo","pencil"],"sort_order":1313},{"unified":"1F4DE","short_names":["telephone_receiver"],"sort_order":1234},{"unified":"1F4DF","short_names":["pager"],"sort_order":1235},{"unified":"1F4E0","short_names":["fax"],"sort_order":1236},{"unified":"1F4E1","short_names":["satellite_antenna"],"sort_order":1376},{"unified":"1F4E2","short_names":["loudspeaker"],"sort_order":1205},{"unified":"1F4E3","short_names":["mega"],"sort_order":1206},{"unified":"1F4E4","short_names":["outbox_tray"],"sort_order":1298},{"unified":"1F4E5","short_names":["inbox_tray"],"sort_order":1299},{"unified":"1F4E6","short_names":["package"],"sort_order":1300},{"unified":"1F4E7","short_names":["e-mail"],"sort_order":1295},{"unified":"1F4E8","short_names":["incoming_envelope"],"sort_order":1296},{"unified":"1F4E9","short_names":["envelope_with_arrow"],"sort_order":1297},{"unified":"1F4EA","short_names":["mailbox_closed"],"sort_order":1302},{"unified":"1F4EB","short_names":["mailbox"],"sort_order":1301},{"unified":"1F4EC","short_names":["mailbox_with_mail"],"sort_order":1303},{"unified":"1F4ED","short_names":["mailbox_with_no_mail"],"sort_order":1304},{"unified":"1F4EE","short_names":["postbox"],"sort_order":1305},{"unified":"1F4EF","short_names":["postal_horn"],"sort_order":1207},{"unified":"1F4F0","short_names":["newspaper"],"sort_order":1279},{"unified":"1F4F1","short_names":["iphone"],"sort_order":1231},{"unified":"1F4F2","short_names":["calling"],"sort_order":1232},{"unified":"1F4F3","short_names":["vibration_mode"],"sort_order":1514},{"unified":"1F4F4","short_names":["mobile_phone_off"],"sort_order":1515},{"unified":"1F4F5","short_names":["no_mobile_phones"],"sort_order":1440},{"unified":"1F4F6","short_names":["signal_strength"],"sort_order":1512},{"unified":"1F4F7","short_names":["camera"],"sort_order":1256},{"unified":"1F4F8","short_names":["camera_with_flash"],"sort_order":1257},{"unified":"1F4F9","short_names":["video_camera"],"sort_order":1258},{"unified":"1F4FA","short_names":["tv"],"sort_order":1255},{"unified":"1F4FB","short_names":["radio"],"sort_order":1218},{"unified":"1F4FC","short_names":["vhs"],"sort_order":1259},{"unified":"1F4FD-FE0F","short_names":["film_projector"],"sort_order":1253},{"unified":"1F4FF","short_names":["prayer_beads"],"sort_order":1197},{"unified":"1F500","short_names":["twisted_rightwards_arrows"],"sort_order":1491},{"unified":"1F501","short_names":["repeat"],"sort_order":1492},{"unified":"1F502","short_names":["repeat_one"],"sort_order":1493},{"unified":"1F503","short_names":["arrows_clockwise"],"sort_order":1458},{"unified":"1F504","short_names":["arrows_counterclockwise"],"sort_order":1459},{"unified":"1F505","short_names":["low_brightness"],"sort_order":1510},{"unified":"1F506","short_names":["high_brightness"],"sort_order":1511},{"unified":"1F507","short_names":["mute"],"sort_order":1201},{"unified":"1F508","short_names":["speaker"],"sort_order":1202},{"unified":"1F509","short_names":["sound"],"sort_order":1203},{"unified":"1F50A","short_names":["loud_sound"],"sort_order":1204},{"unified":"1F50B","short_names":["battery"],"sort_order":1237},{"unified":"1F50C","short_names":["electric_plug"],"sort_order":1239},{"unified":"1F50D","short_names":["mag"],"sort_order":1260},{"unified":"1F50E","short_names":["mag_right"],"sort_order":1261},{"unified":"1F50F","short_names":["lock_with_ink_pen"],"sort_order":1339},{"unified":"1F510","short_names":["closed_lock_with_key"],"sort_order":1340},{"unified":"1F511","short_names":["key"],"sort_order":1341},{"unified":"1F512","short_names":["lock"],"sort_order":1337},{"unified":"1F513","short_names":["unlock"],"sort_order":1338},{"unified":"1F514","short_names":["bell"],"sort_order":1208},{"unified":"1F515","short_names":["no_bell"],"sort_order":1209},{"unified":"1F516","short_names":["bookmark"],"sort_order":1282},{"unified":"1F517","short_names":["link"],"sort_order":1362},{"unified":"1F518","short_names":["radio_button"],"sort_order":1639},{"unified":"1F519","short_names":["back"],"sort_order":1460},{"unified":"1F51A","short_names":["end"],"sort_order":1461},{"unified":"1F51B","short_names":["on"],"sort_order":1462},{"unified":"1F51C","short_names":["soon"],"sort_order":1463},{"unified":"1F51D","short_names":["top"],"sort_order":1464},{"unified":"1F51E","short_names":["underage"],"sort_order":1441},{"unified":"1F51F","short_names":["keycap_ten"],"sort_order":1568},{"unified":"1F520","short_names":["capital_abcd"],"sort_order":1569},{"unified":"1F521","short_names":["abcd"],"sort_order":1570},{"unified":"1F522","short_names":["1234"],"sort_order":1571},{"unified":"1F523","short_names":["symbols"],"sort_order":1572},{"unified":"1F524","short_names":["abc"],"sort_order":1573},{"unified":"1F525","short_names":["fire"],"sort_order":1066},{"unified":"1F526","short_names":["flashlight"],"sort_order":1264},{"unified":"1F527","short_names":["wrench"],"sort_order":1355},{"unified":"1F528","short_names":["hammer"],"sort_order":1343},{"unified":"1F529","short_names":["nut_and_bolt"],"sort_order":1357},{"unified":"1F52A","short_names":["hocho","knife"],"sort_order":848},{"unified":"1F52B","short_names":["gun"],"sort_order":1126},{"unified":"1F52C","short_names":["microscope"],"sort_order":1374},{"unified":"1F52D","short_names":["telescope"],"sort_order":1375},{"unified":"1F52E","short_names":["crystal_ball"],"sort_order":1128},{"unified":"1F52F","short_names":["six_pointed_star"],"sort_order":1476},{"unified":"1F530","short_names":["beginner"],"sort_order":1539},{"unified":"1F531","short_names":["trident"],"sort_order":1537},{"unified":"1F532","short_names":["black_square_button"],"sort_order":1641},{"unified":"1F533","short_names":["white_square_button"],"sort_order":1640},{"unified":"1F534","short_names":["red_circle"],"sort_order":1608},{"unified":"1F535","short_names":["large_blue_circle"],"sort_order":1612},{"unified":"1F536","short_names":["large_orange_diamond"],"sort_order":1632},{"unified":"1F537","short_names":["large_blue_diamond"],"sort_order":1633},{"unified":"1F538","short_names":["small_orange_diamond"],"sort_order":1634},{"unified":"1F539","short_names":["small_blue_diamond"],"sort_order":1635},{"unified":"1F53A","short_names":["small_red_triangle"],"sort_order":1636},{"unified":"1F53B","short_names":["small_red_triangle_down"],"sort_order":1637},{"unified":"1F53C","short_names":["arrow_up_small"],"sort_order":1501},{"unified":"1F53D","short_names":["arrow_down_small"],"sort_order":1503},{"unified":"1F549-FE0F","short_names":["om_symbol"],"sort_order":1467},{"unified":"1F54A-FE0F","short_names":["dove_of_peace"],"sort_order":635},{"unified":"1F54B","short_names":["kaaba"],"sort_order":899},{"unified":"1F54C","short_names":["mosque"],"sort_order":895},{"unified":"1F54D","short_names":["synagogue"],"sort_order":897},{"unified":"1F54E","short_names":["menorah_with_nine_branches"],"sort_order":1475},{"unified":"1F550","short_names":["clock1"],"sort_order":1000},{"unified":"1F551","short_names":["clock2"],"sort_order":1002},{"unified":"1F552","short_names":["clock3"],"sort_order":1004},{"unified":"1F553","short_names":["clock4"],"sort_order":1006},{"unified":"1F554","short_names":["clock5"],"sort_order":1008},{"unified":"1F555","short_names":["clock6"],"sort_order":1010},{"unified":"1F556","short_names":["clock7"],"sort_order":1012},{"unified":"1F557","short_names":["clock8"],"sort_order":1014},{"unified":"1F558","short_names":["clock9"],"sort_order":1016},{"unified":"1F559","short_names":["clock10"],"sort_order":1018},{"unified":"1F55A","short_names":["clock11"],"sort_order":1020},{"unified":"1F55B","short_names":["clock12"],"sort_order":998},{"unified":"1F55C","short_names":["clock130"],"sort_order":1001},{"unified":"1F55D","short_names":["clock230"],"sort_order":1003},{"unified":"1F55E","short_names":["clock330"],"sort_order":1005},{"unified":"1F55F","short_names":["clock430"],"sort_order":1007},{"unified":"1F560","short_names":["clock530"],"sort_order":1009},{"unified":"1F561","short_names":["clock630"],"sort_order":1011},{"unified":"1F562","short_names":["clock730"],"sort_order":1013},{"unified":"1F563","short_names":["clock830"],"sort_order":1015},{"unified":"1F564","short_names":["clock930"],"sort_order":1017},{"unified":"1F565","short_names":["clock1030"],"sort_order":1019},{"unified":"1F566","short_names":["clock1130"],"sort_order":1021},{"unified":"1F567","short_names":["clock1230"],"sort_order":999},{"unified":"1F56F-FE0F","short_names":["candle"],"sort_order":1262},{"unified":"1F570-FE0F","short_names":["mantelpiece_clock"],"sort_order":997},{"unified":"1F573-FE0F","short_names":["hole"],"sort_order":163},{"unified":"1F574-FE0F","short_names":["man_in_business_suit_levitating"],"sort_order":450},{"unified":"1F575-FE0F-200D-2640-FE0F","short_names":["female-detective"],"sort_order":342},{"unified":"1F575-FE0F-200D-2642-FE0F","short_names":["male-detective"],"sort_order":341},{"unified":"1F575-FE0F","short_names":["sleuth_or_spy"],"sort_order":340},{"unified":"1F576-FE0F","short_names":["dark_sunglasses"],"sort_order":1155},{"unified":"1F577-FE0F","short_names":["spider"],"sort_order":684},{"unified":"1F578-FE0F","short_names":["spider_web"],"sort_order":685},{"unified":"1F579-FE0F","short_names":["joystick"],"sort_order":1131},{"unified":"1F57A","short_names":["man_dancing"],"sort_order":449},{"unified":"1F587-FE0F","short_names":["linked_paperclips"],"sort_order":1330},{"unified":"1F58A-FE0F","short_names":["lower_left_ballpoint_pen"],"sort_order":1310},{"unified":"1F58B-FE0F","short_names":["lower_left_fountain_pen"],"sort_order":1309},{"unified":"1F58C-FE0F","short_names":["lower_left_paintbrush"],"sort_order":1311},{"unified":"1F58D-FE0F","short_names":["lower_left_crayon"],"sort_order":1312},{"unified":"1F590-FE0F","short_names":["raised_hand_with_fingers_splayed"],"sort_order":172},{"unified":"1F595","short_names":["middle_finger","reversed_hand_with_middle_finger_extended"],"sort_order":193},{"unified":"1F596","short_names":["spock-hand"],"sort_order":174},{"unified":"1F5A4","short_names":["black_heart"],"sort_order":153},{"unified":"1F5A5-FE0F","short_names":["desktop_computer"],"sort_order":1241},{"unified":"1F5A8-FE0F","short_names":["printer"],"sort_order":1242},{"unified":"1F5B1-FE0F","short_names":["three_button_mouse"],"sort_order":1244},{"unified":"1F5B2-FE0F","short_names":["trackball"],"sort_order":1245},{"unified":"1F5BC-FE0F","short_names":["frame_with_picture"],"sort_order":1148},{"unified":"1F5C2-FE0F","short_names":["card_index_dividers"],"sort_order":1317},{"unified":"1F5C3-FE0F","short_names":["card_file_box"],"sort_order":1334},{"unified":"1F5C4-FE0F","short_names":["file_cabinet"],"sort_order":1335},{"unified":"1F5D1-FE0F","short_names":["wastebasket"],"sort_order":1336},{"unified":"1F5D2-FE0F","short_names":["spiral_note_pad"],"sort_order":1320},{"unified":"1F5D3-FE0F","short_names":["spiral_calendar_pad"],"sort_order":1321},{"unified":"1F5DC-FE0F","short_names":["compression"],"sort_order":1359},{"unified":"1F5DD-FE0F","short_names":["old_key"],"sort_order":1342},{"unified":"1F5DE-FE0F","short_names":["rolled_up_newspaper"],"sort_order":1280},{"unified":"1F5E1-FE0F","short_names":["dagger_knife"],"sort_order":1348},{"unified":"1F5E3-FE0F","short_names":["speaking_head_in_silhouette"],"sort_order":545},{"unified":"1F5E8-FE0F","short_names":["left_speech_bubble"],"sort_order":166},{"unified":"1F5EF-FE0F","short_names":["right_anger_bubble"],"sort_order":167},{"unified":"1F5F3-FE0F","short_names":["ballot_box_with_ballot"],"sort_order":1306},{"unified":"1F5FA-FE0F","short_names":["world_map"],"sort_order":855},{"unified":"1F5FB","short_names":["mount_fuji"],"sort_order":861},{"unified":"1F5FC","short_names":["tokyo_tower"],"sort_order":892},{"unified":"1F5FD","short_names":["statue_of_liberty"],"sort_order":893},{"unified":"1F5FE","short_names":["japan"],"sort_order":856},{"unified":"1F5FF","short_names":["moyai"],"sort_order":1415},{"unified":"1F600","short_names":["grinning"],"sort_order":1},{"unified":"1F601","short_names":["grin"],"sort_order":4},{"unified":"1F602","short_names":["joy"],"sort_order":8},{"unified":"1F603","short_names":["smiley"],"sort_order":2},{"unified":"1F604","short_names":["smile"],"sort_order":3},{"unified":"1F605","short_names":["sweat_smile"],"sort_order":6},{"unified":"1F606","short_names":["laughing","satisfied"],"sort_order":5},{"unified":"1F607","short_names":["innocent"],"sort_order":14},{"unified":"1F608","short_names":["smiling_imp"],"sort_order":107},{"unified":"1F609","short_names":["wink"],"sort_order":12},{"unified":"1F60A","short_names":["blush"],"sort_order":13},{"unified":"1F60B","short_names":["yum"],"sort_order":24},{"unified":"1F60C","short_names":["relieved"],"sort_order":53},{"unified":"1F60D","short_names":["heart_eyes"],"sort_order":16},{"unified":"1F60E","short_names":["sunglasses"],"sort_order":74},{"unified":"1F60F","short_names":["smirk"],"sort_order":44},{"unified":"1F610","short_names":["neutral_face"],"sort_order":39},{"unified":"1F611","short_names":["expressionless"],"sort_order":40},{"unified":"1F612","short_names":["unamused"],"sort_order":45},{"unified":"1F613","short_names":["sweat"],"sort_order":99},{"unified":"1F614","short_names":["pensive"],"sort_order":54},{"unified":"1F615","short_names":["confused"],"sort_order":77},{"unified":"1F616","short_names":["confounded"],"sort_order":96},{"unified":"1F617","short_names":["kissing"],"sort_order":19},{"unified":"1F618","short_names":["kissing_heart"],"sort_order":18},{"unified":"1F619","short_names":["kissing_smiling_eyes"],"sort_order":22},{"unified":"1F61A","short_names":["kissing_closed_eyes"],"sort_order":21},{"unified":"1F61B","short_names":["stuck_out_tongue"],"sort_order":25},{"unified":"1F61C","short_names":["stuck_out_tongue_winking_eye"],"sort_order":26},{"unified":"1F61D","short_names":["stuck_out_tongue_closed_eyes"],"sort_order":28},{"unified":"1F61E","short_names":["disappointed"],"sort_order":98},{"unified":"1F61F","short_names":["worried"],"sort_order":79},{"unified":"1F620","short_names":["angry"],"sort_order":105},{"unified":"1F621","short_names":["rage"],"sort_order":104},{"unified":"1F622","short_names":["cry"],"sort_order":93},{"unified":"1F623","short_names":["persevere"],"sort_order":97},{"unified":"1F624","short_names":["triumph"],"sort_order":103},{"unified":"1F625","short_names":["disappointed_relieved"],"sort_order":92},{"unified":"1F626","short_names":["frowning"],"sort_order":88},{"unified":"1F627","short_names":["anguished"],"sort_order":89},{"unified":"1F628","short_names":["fearful"],"sort_order":90},{"unified":"1F629","short_names":["weary"],"sort_order":100},{"unified":"1F62A","short_names":["sleepy"],"sort_order":55},{"unified":"1F62B","short_names":["tired_face"],"sort_order":101},{"unified":"1F62C","short_names":["grimacing"],"sort_order":47},{"unified":"1F62D","short_names":["sob"],"sort_order":94},{"unified":"1F62E-200D-1F4A8","short_names":["face_exhaling"],"sort_order":48},{"unified":"1F62E","short_names":["open_mouth"],"sort_order":82},{"unified":"1F62F","short_names":["hushed"],"sort_order":83},{"unified":"1F630","short_names":["cold_sweat"],"sort_order":91},{"unified":"1F631","short_names":["scream"],"sort_order":95},{"unified":"1F632","short_names":["astonished"],"sort_order":84},{"unified":"1F633","short_names":["flushed"],"sort_order":85},{"unified":"1F634","short_names":["sleeping"],"sort_order":57},{"unified":"1F635-200D-1F4AB","short_names":["face_with_spiral_eyes"],"sort_order":69},{"unified":"1F635","short_names":["dizzy_face"],"sort_order":68},{"unified":"1F636-200D-1F32B-FE0F","short_names":["face_in_clouds"],"sort_order":43},{"unified":"1F636","short_names":["no_mouth"],"sort_order":41},{"unified":"1F637","short_names":["mask"],"sort_order":59},{"unified":"1F638","short_names":["smile_cat"],"sort_order":120},{"unified":"1F639","short_names":["joy_cat"],"sort_order":121},{"unified":"1F63A","short_names":["smiley_cat"],"sort_order":119},{"unified":"1F63B","short_names":["heart_eyes_cat"],"sort_order":122},{"unified":"1F63C","short_names":["smirk_cat"],"sort_order":123},{"unified":"1F63D","short_names":["kissing_cat"],"sort_order":124},{"unified":"1F63E","short_names":["pouting_cat"],"sort_order":127},{"unified":"1F63F","short_names":["crying_cat_face"],"sort_order":126},{"unified":"1F640","short_names":["scream_cat"],"sort_order":125},{"unified":"1F641","short_names":["slightly_frowning_face"],"sort_order":80},{"unified":"1F642-200D-2194-FE0F","short_names":["head_shaking_horizontally"],"sort_order":51},{"unified":"1F642-200D-2195-FE0F","short_names":["head_shaking_vertically"],"sort_order":52},{"unified":"1F642","short_names":["slightly_smiling_face"],"sort_order":9},{"unified":"1F643","short_names":["upside_down_face"],"sort_order":10},{"unified":"1F644","short_names":["face_with_rolling_eyes"],"sort_order":46},{"unified":"1F645-200D-2640-FE0F","short_names":["woman-gesturing-no"],"sort_order":267},{"unified":"1F645-200D-2642-FE0F","short_names":["man-gesturing-no"],"sort_order":266},{"unified":"1F645","short_names":["no_good"],"sort_order":265},{"unified":"1F646-200D-2640-FE0F","short_names":["woman-gesturing-ok"],"sort_order":270},{"unified":"1F646-200D-2642-FE0F","short_names":["man-gesturing-ok"],"sort_order":269},{"unified":"1F646","short_names":["ok_woman"],"sort_order":268},{"unified":"1F647-200D-2640-FE0F","short_names":["woman-bowing"],"sort_order":282},{"unified":"1F647-200D-2642-FE0F","short_names":["man-bowing"],"sort_order":281},{"unified":"1F647","short_names":["bow"],"sort_order":280},{"unified":"1F648","short_names":["see_no_evil"],"sort_order":128},{"unified":"1F649","short_names":["hear_no_evil"],"sort_order":129},{"unified":"1F64A","short_names":["speak_no_evil"],"sort_order":130},{"unified":"1F64B-200D-2640-FE0F","short_names":["woman-raising-hand"],"sort_order":276},{"unified":"1F64B-200D-2642-FE0F","short_names":["man-raising-hand"],"sort_order":275},{"unified":"1F64B","short_names":["raising_hand"],"sort_order":274},{"unified":"1F64C","short_names":["raised_hands"],"sort_order":204},{"unified":"1F64D-200D-2640-FE0F","short_names":["woman-frowning"],"sort_order":261},{"unified":"1F64D-200D-2642-FE0F","short_names":["man-frowning"],"sort_order":260},{"unified":"1F64D","short_names":["person_frowning"],"sort_order":259},{"unified":"1F64E-200D-2640-FE0F","short_names":["woman-pouting"],"sort_order":264},{"unified":"1F64E-200D-2642-FE0F","short_names":["man-pouting"],"sort_order":263},{"unified":"1F64E","short_names":["person_with_pouting_face"],"sort_order":262},{"unified":"1F64F","short_names":["pray"],"sort_order":209},{"unified":"1F680","short_names":["rocket"],"sort_order":987},{"unified":"1F681","short_names":["helicopter"],"sort_order":982},{"unified":"1F682","short_names":["steam_locomotive"],"sort_order":917},{"unified":"1F683","short_names":["railway_car"],"sort_order":918},{"unified":"1F684","short_names":["bullettrain_side"],"sort_order":919},{"unified":"1F685","short_names":["bullettrain_front"],"sort_order":920},{"unified":"1F686","short_names":["train2"],"sort_order":921},{"unified":"1F687","short_names":["metro"],"sort_order":922},{"unified":"1F688","short_names":["light_rail"],"sort_order":923},{"unified":"1F689","short_names":["station"],"sort_order":924},{"unified":"1F68A","short_names":["tram"],"sort_order":925},{"unified":"1F68B","short_names":["train"],"sort_order":928},{"unified":"1F68C","short_names":["bus"],"sort_order":929},{"unified":"1F68D","short_names":["oncoming_bus"],"sort_order":930},{"unified":"1F68E","short_names":["trolleybus"],"sort_order":931},{"unified":"1F68F","short_names":["busstop"],"sort_order":956},{"unified":"1F690","short_names":["minibus"],"sort_order":932},{"unified":"1F691","short_names":["ambulance"],"sort_order":933},{"unified":"1F692","short_names":["fire_engine"],"sort_order":934},{"unified":"1F693","short_names":["police_car"],"sort_order":935},{"unified":"1F694","short_names":["oncoming_police_car"],"sort_order":936},{"unified":"1F695","short_names":["taxi"],"sort_order":937},{"unified":"1F696","short_names":["oncoming_taxi"],"sort_order":938},{"unified":"1F697","short_names":["car","red_car"],"sort_order":939},{"unified":"1F698","short_names":["oncoming_automobile"],"sort_order":940},{"unified":"1F699","short_names":["blue_car"],"sort_order":941},{"unified":"1F69A","short_names":["truck"],"sort_order":943},{"unified":"1F69B","short_names":["articulated_lorry"],"sort_order":944},{"unified":"1F69C","short_names":["tractor"],"sort_order":945},{"unified":"1F69D","short_names":["monorail"],"sort_order":926},{"unified":"1F69E","short_names":["mountain_railway"],"sort_order":927},{"unified":"1F69F","short_names":["suspension_railway"],"sort_order":983},{"unified":"1F6A0","short_names":["mountain_cableway"],"sort_order":984},{"unified":"1F6A1","short_names":["aerial_tramway"],"sort_order":985},{"unified":"1F6A2","short_names":["ship"],"sort_order":975},{"unified":"1F6A3-200D-2640-FE0F","short_names":["woman-rowing-boat"],"sort_order":472},{"unified":"1F6A3-200D-2642-FE0F","short_names":["man-rowing-boat"],"sort_order":471},{"unified":"1F6A3","short_names":["rowboat"],"sort_order":470},{"unified":"1F6A4","short_names":["speedboat"],"sort_order":971},{"unified":"1F6A5","short_names":["traffic_light"],"sort_order":963},{"unified":"1F6A6","short_names":["vertical_traffic_light"],"sort_order":964},{"unified":"1F6A7","short_names":["construction"],"sort_order":966},{"unified":"1F6A8","short_names":["rotating_light"],"sort_order":962},{"unified":"1F6A9","short_names":["triangular_flag_on_post"],"sort_order":1643},{"unified":"1F6AA","short_names":["door"],"sort_order":1384},{"unified":"1F6AB","short_names":["no_entry_sign"],"sort_order":1434},{"unified":"1F6AC","short_names":["smoking"],"sort_order":1409},{"unified":"1F6AD","short_names":["no_smoking"],"sort_order":1436},{"unified":"1F6AE","short_names":["put_litter_in_its_place"],"sort_order":1419},{"unified":"1F6AF","short_names":["do_not_litter"],"sort_order":1437},{"unified":"1F6B0","short_names":["potable_water"],"sort_order":1420},{"unified":"1F6B1","short_names":["non-potable_water"],"sort_order":1438},{"unified":"1F6B2","short_names":["bike"],"sort_order":952},{"unified":"1F6B3","short_names":["no_bicycles"],"sort_order":1435},{"unified":"1F6B4-200D-2640-FE0F","short_names":["woman-biking"],"sort_order":484},{"unified":"1F6B4-200D-2642-FE0F","short_names":["man-biking"],"sort_order":483},{"unified":"1F6B4","short_names":["bicyclist"],"sort_order":482},{"unified":"1F6B5-200D-2640-FE0F","short_names":["woman-mountain-biking"],"sort_order":487},{"unified":"1F6B5-200D-2642-FE0F","short_names":["man-mountain-biking"],"sort_order":486},{"unified":"1F6B5","short_names":["mountain_bicyclist"],"sort_order":485},{"unified":"1F6B6-200D-2640-FE0F","short_names":["woman-walking"],"sort_order":411},{"unified":"1F6B6-200D-2640-FE0F-200D-27A1-FE0F","short_names":["woman_walking_facing_right"],"sort_order":413},{"unified":"1F6B6-200D-2642-FE0F","short_names":["man-walking"],"sort_order":410},{"unified":"1F6B6-200D-2642-FE0F-200D-27A1-FE0F","short_names":["man_walking_facing_right"],"sort_order":414},{"unified":"1F6B6-200D-27A1-FE0F","short_names":["person_walking_facing_right"],"sort_order":412},{"unified":"1F6B6","short_names":["walking"],"sort_order":409},{"unified":"1F6B7","short_names":["no_pedestrians"],"sort_order":1439},{"unified":"1F6B8","short_names":["children_crossing"],"sort_order":1432},{"unified":"1F6B9","short_names":["mens"],"sort_order":1422},{"unified":"1F6BA","short_names":["womens"],"sort_order":1423},{"unified":"1F6BB","short_names":["restroom"],"sort_order":1424},{"unified":"1F6BC","short_names":["baby_symbol"],"sort_order":1425},{"unified":"1F6BD","short_names":["toilet"],"sort_order":1391},{"unified":"1F6BE","short_names":["wc"],"sort_order":1426},{"unified":"1F6BF","short_names":["shower"],"sort_order":1393},{"unified":"1F6C0","short_names":["bath"],"sort_order":506},{"unified":"1F6C1","short_names":["bathtub"],"sort_order":1394},{"unified":"1F6C2","short_names":["passport_control"],"sort_order":1427},{"unified":"1F6C3","short_names":["customs"],"sort_order":1428},{"unified":"1F6C4","short_names":["baggage_claim"],"sort_order":1429},{"unified":"1F6C5","short_names":["left_luggage"],"sort_order":1430},{"unified":"1F6CB-FE0F","short_names":["couch_and_lamp"],"sort_order":1389},{"unified":"1F6CC","short_names":["sleeping_accommodation"],"sort_order":507},{"unified":"1F6CD-FE0F","short_names":["shopping_bags"],"sort_order":1178},{"unified":"1F6CE-FE0F","short_names":["bellhop_bell"],"sort_order":989},{"unified":"1F6CF-FE0F","short_names":["bed"],"sort_order":1388},{"unified":"1F6D0","short_names":["place_of_worship"],"sort_order":1465},{"unified":"1F6D1","short_names":["octagonal_sign"],"sort_order":965},{"unified":"1F6D2","short_names":["shopping_trolley"],"sort_order":1408},{"unified":"1F6D5","short_names":["hindu_temple"],"sort_order":896},{"unified":"1F6D6","short_names":["hut"],"sort_order":873},{"unified":"1F6D7","short_names":["elevator"],"sort_order":1385},{"unified":"1F6DC","short_names":["wireless"],"sort_order":1513},{"unified":"1F6DD","short_names":["playground_slide"],"sort_order":912},{"unified":"1F6DE","short_names":["wheel"],"sort_order":961},{"unified":"1F6DF","short_names":["ring_buoy"],"sort_order":968},{"unified":"1F6E0-FE0F","short_names":["hammer_and_wrench"],"sort_order":1347},{"unified":"1F6E1-FE0F","short_names":["shield"],"sort_order":1353},{"unified":"1F6E2-FE0F","short_names":["oil_drum"],"sort_order":959},{"unified":"1F6E3-FE0F","short_names":["motorway"],"sort_order":957},{"unified":"1F6E4-FE0F","short_names":["railway_track"],"sort_order":958},{"unified":"1F6E5-FE0F","short_names":["motor_boat"],"sort_order":974},{"unified":"1F6E9-FE0F","short_names":["small_airplane"],"sort_order":977},{"unified":"1F6EB","short_names":["airplane_departure"],"sort_order":978},{"unified":"1F6EC","short_names":["airplane_arriving"],"sort_order":979},{"unified":"1F6F0-FE0F","short_names":["satellite"],"sort_order":986},{"unified":"1F6F3-FE0F","short_names":["passenger_ship"],"sort_order":972},{"unified":"1F6F4","short_names":["scooter"],"sort_order":953},{"unified":"1F6F5","short_names":["motor_scooter"],"sort_order":948},{"unified":"1F6F6","short_names":["canoe"],"sort_order":970},{"unified":"1F6F7","short_names":["sled"],"sort_order":1121},{"unified":"1F6F8","short_names":["flying_saucer"],"sort_order":988},{"unified":"1F6F9","short_names":["skateboard"],"sort_order":954},{"unified":"1F6FA","short_names":["auto_rickshaw"],"sort_order":951},{"unified":"1F6FB","short_names":["pickup_truck"],"sort_order":942},{"unified":"1F6FC","short_names":["roller_skate"],"sort_order":955},{"unified":"1F7E0","short_names":["large_orange_circle"],"sort_order":1609},{"unified":"1F7E1","short_names":["large_yellow_circle"],"sort_order":1610},{"unified":"1F7E2","short_names":["large_green_circle"],"sort_order":1611},{"unified":"1F7E3","short_names":["large_purple_circle"],"sort_order":1613},{"unified":"1F7E4","short_names":["large_brown_circle"],"sort_order":1614},{"unified":"1F7E5","short_names":["large_red_square"],"sort_order":1617},{"unified":"1F7E6","short_names":["large_blue_square"],"sort_order":1621},{"unified":"1F7E7","short_names":["large_orange_square"],"sort_order":1618},{"unified":"1F7E8","short_names":["large_yellow_square"],"sort_order":1619},{"unified":"1F7E9","short_names":["large_green_square"],"sort_order":1620},{"unified":"1F7EA","short_names":["large_purple_square"],"sort_order":1622},{"unified":"1F7EB","short_names":["large_brown_square"],"sort_order":1623},{"unified":"1F7F0","short_names":["heavy_equals_sign"],"sort_order":1523},{"unified":"1F90C","short_names":["pinched_fingers"],"sort_order":182},{"unified":"1F90D","short_names":["white_heart"],"sort_order":155},{"unified":"1F90E","short_names":["brown_heart"],"sort_order":152},{"unified":"1F90F","short_names":["pinching_hand"],"sort_order":183},{"unified":"1F910","short_names":["zipper_mouth_face"],"sort_order":37},{"unified":"1F911","short_names":["money_mouth_face"],"sort_order":29},{"unified":"1F912","short_names":["face_with_thermometer"],"sort_order":60},{"unified":"1F913","short_names":["nerd_face"],"sort_order":75},{"unified":"1F914","short_names":["thinking_face"],"sort_order":35},{"unified":"1F915","short_names":["face_with_head_bandage"],"sort_order":61},{"unified":"1F916","short_names":["robot_face"],"sort_order":118},{"unified":"1F917","short_names":["hugging_face"],"sort_order":30},{"unified":"1F918","short_names":["the_horns","sign_of_the_horns"],"sort_order":188},{"unified":"1F919","short_names":["call_me_hand"],"sort_order":189},{"unified":"1F91A","short_names":["raised_back_of_hand"],"sort_order":171},{"unified":"1F91B","short_names":["left-facing_fist"],"sort_order":201},{"unified":"1F91C","short_names":["right-facing_fist"],"sort_order":202},{"unified":"1F91D","short_names":["handshake"],"sort_order":208},{"unified":"1F91E","short_names":["crossed_fingers","hand_with_index_and_middle_fingers_crossed"],"sort_order":185},{"unified":"1F91F","short_names":["i_love_you_hand_sign"],"sort_order":187},{"unified":"1F920","short_names":["face_with_cowboy_hat"],"sort_order":71},{"unified":"1F921","short_names":["clown_face"],"sort_order":112},{"unified":"1F922","short_names":["nauseated_face"],"sort_order":62},{"unified":"1F923","short_names":["rolling_on_the_floor_laughing"],"sort_order":7},{"unified":"1F924","short_names":["drooling_face"],"sort_order":56},{"unified":"1F925","short_names":["lying_face"],"sort_order":49},{"unified":"1F926-200D-2640-FE0F","short_names":["woman-facepalming"],"sort_order":285},{"unified":"1F926-200D-2642-FE0F","short_names":["man-facepalming"],"sort_order":284},{"unified":"1F926","short_names":["face_palm"],"sort_order":283},{"unified":"1F927","short_names":["sneezing_face"],"sort_order":64},{"unified":"1F928","short_names":["face_with_raised_eyebrow","face_with_one_eyebrow_raised"],"sort_order":38},{"unified":"1F929","short_names":["star-struck","grinning_face_with_star_eyes"],"sort_order":17},{"unified":"1F92A","short_names":["zany_face","grinning_face_with_one_large_and_one_small_eye"],"sort_order":27},{"unified":"1F92B","short_names":["shushing_face","face_with_finger_covering_closed_lips"],"sort_order":34},{"unified":"1F92C","short_names":["face_with_symbols_on_mouth","serious_face_with_symbols_covering_mouth"],"sort_order":106},{"unified":"1F92D","short_names":["face_with_hand_over_mouth","smiling_face_with_smiling_eyes_and_hand_covering_mouth"],"sort_order":31},{"unified":"1F92E","short_names":["face_vomiting","face_with_open_mouth_vomiting"],"sort_order":63},{"unified":"1F92F","short_names":["exploding_head","shocked_face_with_exploding_head"],"sort_order":70},{"unified":"1F930","short_names":["pregnant_woman"],"sort_order":364},{"unified":"1F931","short_names":["breast-feeding"],"sort_order":367},{"unified":"1F932","short_names":["palms_up_together"],"sort_order":207},{"unified":"1F933","short_names":["selfie"],"sort_order":212},{"unified":"1F934","short_names":["prince"],"sort_order":351},{"unified":"1F935-200D-2640-FE0F","short_names":["woman_in_tuxedo"],"sort_order":360},{"unified":"1F935-200D-2642-FE0F","short_names":["man_in_tuxedo"],"sort_order":359},{"unified":"1F935","short_names":["person_in_tuxedo"],"sort_order":358},{"unified":"1F936","short_names":["mrs_claus","mother_christmas"],"sort_order":373},{"unified":"1F937-200D-2640-FE0F","short_names":["woman-shrugging"],"sort_order":288},{"unified":"1F937-200D-2642-FE0F","short_names":["man-shrugging"],"sort_order":287},{"unified":"1F937","short_names":["shrug"],"sort_order":286},{"unified":"1F938-200D-2640-FE0F","short_names":["woman-cartwheeling"],"sort_order":490},{"unified":"1F938-200D-2642-FE0F","short_names":["man-cartwheeling"],"sort_order":489},{"unified":"1F938","short_names":["person_doing_cartwheel"],"sort_order":488},{"unified":"1F939-200D-2640-FE0F","short_names":["woman-juggling"],"sort_order":502},{"unified":"1F939-200D-2642-FE0F","short_names":["man-juggling"],"sort_order":501},{"unified":"1F939","short_names":["juggling"],"sort_order":500},{"unified":"1F93A","short_names":["fencer"],"sort_order":460},{"unified":"1F93C-200D-2640-FE0F","short_names":["woman-wrestling"],"sort_order":493},{"unified":"1F93C-200D-2642-FE0F","short_names":["man-wrestling"],"sort_order":492},{"unified":"1F93C","short_names":["wrestlers"],"sort_order":491},{"unified":"1F93D-200D-2640-FE0F","short_names":["woman-playing-water-polo"],"sort_order":496},{"unified":"1F93D-200D-2642-FE0F","short_names":["man-playing-water-polo"],"sort_order":495},{"unified":"1F93D","short_names":["water_polo"],"sort_order":494},{"unified":"1F93E-200D-2640-FE0F","short_names":["woman-playing-handball"],"sort_order":499},{"unified":"1F93E-200D-2642-FE0F","short_names":["man-playing-handball"],"sort_order":498},{"unified":"1F93E","short_names":["handball"],"sort_order":497},{"unified":"1F93F","short_names":["diving_mask"],"sort_order":1118},{"unified":"1F940","short_names":["wilted_flower"],"sort_order":697},{"unified":"1F941","short_names":["drum_with_drumsticks"],"sort_order":1226},{"unified":"1F942","short_names":["clinking_glasses"],"sort_order":836},{"unified":"1F943","short_names":["tumbler_glass"],"sort_order":837},{"unified":"1F944","short_names":["spoon"],"sort_order":847},{"unified":"1F945","short_names":["goal_net"],"sort_order":1114},{"unified":"1F947","short_names":["first_place_medal"],"sort_order":1093},{"unified":"1F948","short_names":["second_place_medal"],"sort_order":1094},{"unified":"1F949","short_names":["third_place_medal"],"sort_order":1095},{"unified":"1F94A","short_names":["boxing_glove"],"sort_order":1112},{"unified":"1F94B","short_names":["martial_arts_uniform"],"sort_order":1113},{"unified":"1F94C","short_names":["curling_stone"],"sort_order":1122},{"unified":"1F94D","short_names":["lacrosse"],"sort_order":1109},{"unified":"1F94E","short_names":["softball"],"sort_order":1098},{"unified":"1F94F","short_names":["flying_disc"],"sort_order":1104},{"unified":"1F950","short_names":["croissant"],"sort_order":760},{"unified":"1F951","short_names":["avocado"],"sort_order":740},{"unified":"1F952","short_names":["cucumber"],"sort_order":747},{"unified":"1F953","short_names":["bacon"],"sort_order":771},{"unified":"1F954","short_names":["potato"],"sort_order":742},{"unified":"1F955","short_names":["carrot"],"sort_order":743},{"unified":"1F956","short_names":["baguette_bread"],"sort_order":761},{"unified":"1F957","short_names":["green_salad"],"sort_order":788},{"unified":"1F958","short_names":["shallow_pan_of_food"],"sort_order":784},{"unified":"1F959","short_names":["stuffed_flatbread"],"sort_order":780},{"unified":"1F95A","short_names":["egg"],"sort_order":782},{"unified":"1F95B","short_names":["glass_of_milk"],"sort_order":825},{"unified":"1F95C","short_names":["peanuts"],"sort_order":752},{"unified":"1F95D","short_names":["kiwifruit"],"sort_order":736},{"unified":"1F95E","short_names":["pancakes"],"sort_order":765},{"unified":"1F95F","short_names":["dumpling"],"sort_order":807},{"unified":"1F960","short_names":["fortune_cookie"],"sort_order":808},{"unified":"1F961","short_names":["takeout_box"],"sort_order":809},{"unified":"1F962","short_names":["chopsticks"],"sort_order":844},{"unified":"1F963","short_names":["bowl_with_spoon"],"sort_order":787},{"unified":"1F964","short_names":["cup_with_straw"],"sort_order":839},{"unified":"1F965","short_names":["coconut"],"sort_order":739},{"unified":"1F966","short_names":["broccoli"],"sort_order":749},{"unified":"1F967","short_names":["pie"],"sort_order":818},{"unified":"1F968","short_names":["pretzel"],"sort_order":763},{"unified":"1F969","short_names":["cut_of_meat"],"sort_order":770},{"unified":"1F96A","short_names":["sandwich"],"sort_order":776},{"unified":"1F96B","short_names":["canned_food"],"sort_order":792},{"unified":"1F96C","short_names":["leafy_green"],"sort_order":748},{"unified":"1F96D","short_names":["mango"],"sort_order":728},{"unified":"1F96E","short_names":["moon_cake"],"sort_order":805},{"unified":"1F96F","short_names":["bagel"],"sort_order":764},{"unified":"1F970","short_names":["smiling_face_with_3_hearts"],"sort_order":15},{"unified":"1F971","short_names":["yawning_face"],"sort_order":102},{"unified":"1F972","short_names":["smiling_face_with_tear"],"sort_order":23},{"unified":"1F973","short_names":["partying_face"],"sort_order":72},{"unified":"1F974","short_names":["woozy_face"],"sort_order":67},{"unified":"1F975","short_names":["hot_face"],"sort_order":65},{"unified":"1F976","short_names":["cold_face"],"sort_order":66},{"unified":"1F977","short_names":["ninja"],"sort_order":346},{"unified":"1F978","short_names":["disguised_face"],"sort_order":73},{"unified":"1F979","short_names":["face_holding_back_tears"],"sort_order":87},{"unified":"1F97A","short_names":["pleading_face"],"sort_order":86},{"unified":"1F97B","short_names":["sari"],"sort_order":1168},{"unified":"1F97C","short_names":["lab_coat"],"sort_order":1157},{"unified":"1F97D","short_names":["goggles"],"sort_order":1156},{"unified":"1F97E","short_names":["hiking_boot"],"sort_order":1183},{"unified":"1F97F","short_names":["womans_flat_shoe"],"sort_order":1184},{"unified":"1F980","short_names":["crab"],"sort_order":670},{"unified":"1F981","short_names":["lion_face"],"sort_order":576},{"unified":"1F982","short_names":["scorpion"],"sort_order":686},{"unified":"1F983","short_names":["turkey"],"sort_order":627},{"unified":"1F984","short_names":["unicorn_face"],"sort_order":584},{"unified":"1F985","short_names":["eagle"],"sort_order":636},{"unified":"1F986","short_names":["duck"],"sort_order":637},{"unified":"1F987","short_names":["bat"],"sort_order":616},{"unified":"1F988","short_names":["shark"],"sort_order":665},{"unified":"1F989","short_names":["owl"],"sort_order":639},{"unified":"1F98A","short_names":["fox_face"],"sort_order":571},{"unified":"1F98B","short_names":["butterfly"],"sort_order":676},{"unified":"1F98C","short_names":["deer"],"sort_order":586},{"unified":"1F98D","short_names":["gorilla"],"sort_order":563},{"unified":"1F98E","short_names":["lizard"],"sort_order":652},{"unified":"1F98F","short_names":["rhinoceros"],"sort_order":605},{"unified":"1F990","short_names":["shrimp"],"sort_order":672},{"unified":"1F991","short_names":["squid"],"sort_order":673},{"unified":"1F992","short_names":["giraffe_face"],"sort_order":602},{"unified":"1F993","short_names":["zebra_face"],"sort_order":585},{"unified":"1F994","short_names":["hedgehog"],"sort_order":615},{"unified":"1F995","short_names":["sauropod"],"sort_order":656},{"unified":"1F996","short_names":["t-rex"],"sort_order":657},{"unified":"1F997","short_names":["cricket"],"sort_order":682},{"unified":"1F998","short_names":["kangaroo"],"sort_order":624},{"unified":"1F999","short_names":["llama"],"sort_order":601},{"unified":"1F99A","short_names":["peacock"],"sort_order":643},{"unified":"1F99B","short_names":["hippopotamus"],"sort_order":606},{"unified":"1F99C","short_names":["parrot"],"sort_order":644},{"unified":"1F99D","short_names":["raccoon"],"sort_order":572},{"unified":"1F99E","short_names":["lobster"],"sort_order":671},{"unified":"1F99F","short_names":["mosquito"],"sort_order":687},{"unified":"1F9A0","short_names":["microbe"],"sort_order":690},{"unified":"1F9A1","short_names":["badger"],"sort_order":625},{"unified":"1F9A2","short_names":["swan"],"sort_order":638},{"unified":"1F9A3","short_names":["mammoth"],"sort_order":604},{"unified":"1F9A4","short_names":["dodo"],"sort_order":640},{"unified":"1F9A5","short_names":["sloth"],"sort_order":621},{"unified":"1F9A6","short_names":["otter"],"sort_order":622},{"unified":"1F9A7","short_names":["orangutan"],"sort_order":564},{"unified":"1F9A8","short_names":["skunk"],"sort_order":623},{"unified":"1F9A9","short_names":["flamingo"],"sort_order":642},{"unified":"1F9AA","short_names":["oyster"],"sort_order":674},{"unified":"1F9AB","short_names":["beaver"],"sort_order":614},{"unified":"1F9AC","short_names":["bison"],"sort_order":587},{"unified":"1F9AD","short_names":["seal"],"sort_order":661},{"unified":"1F9AE","short_names":["guide_dog"],"sort_order":567},{"unified":"1F9AF","short_names":["probing_cane"],"sort_order":1361},{"unified":"1F9B4","short_names":["bone"],"sort_order":225},{"unified":"1F9B5","short_names":["leg"],"sort_order":216},{"unified":"1F9B6","short_names":["foot"],"sort_order":217},{"unified":"1F9B7","short_names":["tooth"],"sort_order":224},{"unified":"1F9B8-200D-2640-FE0F","short_names":["female_superhero"],"sort_order":377},{"unified":"1F9B8-200D-2642-FE0F","short_names":["male_superhero"],"sort_order":376},{"unified":"1F9B8","short_names":["superhero"],"sort_order":375},{"unified":"1F9B9-200D-2640-FE0F","short_names":["female_supervillain"],"sort_order":380},{"unified":"1F9B9-200D-2642-FE0F","short_names":["male_supervillain"],"sort_order":379},{"unified":"1F9B9","short_names":["supervillain"],"sort_order":378},{"unified":"1F9BA","short_names":["safety_vest"],"sort_order":1158},{"unified":"1F9BB","short_names":["ear_with_hearing_aid"],"sort_order":219},{"unified":"1F9BC","short_names":["motorized_wheelchair"],"sort_order":950},{"unified":"1F9BD","short_names":["manual_wheelchair"],"sort_order":949},{"unified":"1F9BE","short_names":["mechanical_arm"],"sort_order":214},{"unified":"1F9BF","short_names":["mechanical_leg"],"sort_order":215},{"unified":"1F9C0","short_names":["cheese_wedge"],"sort_order":767},{"unified":"1F9C1","short_names":["cupcake"],"sort_order":817},{"unified":"1F9C2","short_names":["salt"],"sort_order":791},{"unified":"1F9C3","short_names":["beverage_box"],"sort_order":841},{"unified":"1F9C4","short_names":["garlic"],"sort_order":750},{"unified":"1F9C5","short_names":["onion"],"sort_order":751},{"unified":"1F9C6","short_names":["falafel"],"sort_order":781},{"unified":"1F9C7","short_names":["waffle"],"sort_order":766},{"unified":"1F9C8","short_names":["butter"],"sort_order":790},{"unified":"1F9C9","short_names":["mate_drink"],"sort_order":842},{"unified":"1F9CA","short_names":["ice_cube"],"sort_order":843},{"unified":"1F9CB","short_names":["bubble_tea"],"sort_order":840},{"unified":"1F9CC","short_names":["troll"],"sort_order":402},{"unified":"1F9CD-200D-2640-FE0F","short_names":["woman_standing"],"sort_order":417},{"unified":"1F9CD-200D-2642-FE0F","short_names":["man_standing"],"sort_order":416},{"unified":"1F9CD","short_names":["standing_person"],"sort_order":415},{"unified":"1F9CE-200D-2640-FE0F","short_names":["woman_kneeling"],"sort_order":420},{"unified":"1F9CE-200D-2640-FE0F-200D-27A1-FE0F","short_names":["woman_kneeling_facing_right"],"sort_order":422},{"unified":"1F9CE-200D-2642-FE0F","short_names":["man_kneeling"],"sort_order":419},{"unified":"1F9CE-200D-2642-FE0F-200D-27A1-FE0F","short_names":["man_kneeling_facing_right"],"sort_order":423},{"unified":"1F9CE-200D-27A1-FE0F","short_names":["person_kneeling_facing_right"],"sort_order":421},{"unified":"1F9CE","short_names":["kneeling_person"],"sort_order":418},{"unified":"1F9CF-200D-2640-FE0F","short_names":["deaf_woman"],"sort_order":279},{"unified":"1F9CF-200D-2642-FE0F","short_names":["deaf_man"],"sort_order":278},{"unified":"1F9CF","short_names":["deaf_person"],"sort_order":277},{"unified":"1F9D0","short_names":["face_with_monocle"],"sort_order":76},{"unified":"1F9D1-200D-1F33E","short_names":["farmer"],"sort_order":301},{"unified":"1F9D1-200D-1F373","short_names":["cook"],"sort_order":304},{"unified":"1F9D1-200D-1F37C","short_names":["person_feeding_baby"],"sort_order":370},{"unified":"1F9D1-200D-1F384","short_names":["mx_claus"],"sort_order":374},{"unified":"1F9D1-200D-1F393","short_names":["student"],"sort_order":292},{"unified":"1F9D1-200D-1F3A4","short_names":["singer"],"sort_order":322},{"unified":"1F9D1-200D-1F3A8","short_names":["artist"],"sort_order":325},{"unified":"1F9D1-200D-1F3EB","short_names":["teacher"],"sort_order":295},{"unified":"1F9D1-200D-1F3ED","short_names":["factory_worker"],"sort_order":310},{"unified":"1F9D1-200D-1F4BB","short_names":["technologist"],"sort_order":319},{"unified":"1F9D1-200D-1F4BC","short_names":["office_worker"],"sort_order":313},{"unified":"1F9D1-200D-1F527","short_names":["mechanic"],"sort_order":307},{"unified":"1F9D1-200D-1F52C","short_names":["scientist"],"sort_order":316},{"unified":"1F9D1-200D-1F680","short_names":["astronaut"],"sort_order":331},{"unified":"1F9D1-200D-1F692","short_names":["firefighter"],"sort_order":334},{"unified":"1F9D1-200D-1F91D-200D-1F9D1","short_names":["people_holding_hands"],"sort_order":508},{"unified":"1F9D1-200D-1F9AF-200D-27A1-FE0F","short_names":["person_with_white_cane_facing_right"],"sort_order":425},{"unified":"1F9D1-200D-1F9AF","short_names":["person_with_probing_cane"],"sort_order":424},{"unified":"1F9D1-200D-1F9B0","short_names":["red_haired_person"],"sort_order":247},{"unified":"1F9D1-200D-1F9B1","short_names":["curly_haired_person"],"sort_order":249},{"unified":"1F9D1-200D-1F9B2","short_names":["bald_person"],"sort_order":253},{"unified":"1F9D1-200D-1F9B3","short_names":["white_haired_person"],"sort_order":251},{"unified":"1F9D1-200D-1F9BC-200D-27A1-FE0F","short_names":["person_in_motorized_wheelchair_facing_right"],"sort_order":431},{"unified":"1F9D1-200D-1F9BC","short_names":["person_in_motorized_wheelchair"],"sort_order":430},{"unified":"1F9D1-200D-1F9BD-200D-27A1-FE0F","short_names":["person_in_manual_wheelchair_facing_right"],"sort_order":437},{"unified":"1F9D1-200D-1F9BD","short_names":["person_in_manual_wheelchair"],"sort_order":436},{"unified":"1F9D1-200D-1F9D1-200D-1F9D2","short_names":["family_adult_adult_child"],"sort_order":550},{"unified":"1F9D1-200D-1F9D1-200D-1F9D2-200D-1F9D2","short_names":["family_adult_adult_child_child"],"sort_order":551},{"unified":"1F9D1-200D-1F9D2-200D-1F9D2","short_names":["family_adult_child_child"],"sort_order":553},{"unified":"1F9D1-200D-1F9D2","short_names":["family_adult_child"],"sort_order":552},{"unified":"1F9D1-200D-2695-FE0F","short_names":["health_worker"],"sort_order":289},{"unified":"1F9D1-200D-2696-FE0F","short_names":["judge"],"sort_order":298},{"unified":"1F9D1-200D-2708-FE0F","short_names":["pilot"],"sort_order":328},{"unified":"1F9D1","short_names":["adult"],"sort_order":235},{"unified":"1F9D2","short_names":["child"],"sort_order":232},{"unified":"1F9D3","short_names":["older_adult"],"sort_order":256},{"unified":"1F9D4-200D-2640-FE0F","short_names":["woman_with_beard"],"sort_order":240},{"unified":"1F9D4-200D-2642-FE0F","short_names":["man_with_beard"],"sort_order":239},{"unified":"1F9D4","short_names":["bearded_person"],"sort_order":238},{"unified":"1F9D5","short_names":["person_with_headscarf"],"sort_order":357},{"unified":"1F9D6-200D-2640-FE0F","short_names":["woman_in_steamy_room"],"sort_order":456},{"unified":"1F9D6-200D-2642-FE0F","short_names":["man_in_steamy_room"],"sort_order":455},{"unified":"1F9D6","short_names":["person_in_steamy_room"],"sort_order":454},{"unified":"1F9D7-200D-2640-FE0F","short_names":["woman_climbing"],"sort_order":459},{"unified":"1F9D7-200D-2642-FE0F","short_names":["man_climbing"],"sort_order":458},{"unified":"1F9D7","short_names":["person_climbing"],"sort_order":457},{"unified":"1F9D8-200D-2640-FE0F","short_names":["woman_in_lotus_position"],"sort_order":505},{"unified":"1F9D8-200D-2642-FE0F","short_names":["man_in_lotus_position"],"sort_order":504},{"unified":"1F9D8","short_names":["person_in_lotus_position"],"sort_order":503},{"unified":"1F9D9-200D-2640-FE0F","short_names":["female_mage"],"sort_order":383},{"unified":"1F9D9-200D-2642-FE0F","short_names":["male_mage"],"sort_order":382},{"unified":"1F9D9","short_names":["mage"],"sort_order":381},{"unified":"1F9DA-200D-2640-FE0F","short_names":["female_fairy"],"sort_order":386},{"unified":"1F9DA-200D-2642-FE0F","short_names":["male_fairy"],"sort_order":385},{"unified":"1F9DA","short_names":["fairy"],"sort_order":384},{"unified":"1F9DB-200D-2640-FE0F","short_names":["female_vampire"],"sort_order":389},{"unified":"1F9DB-200D-2642-FE0F","short_names":["male_vampire"],"sort_order":388},{"unified":"1F9DB","short_names":["vampire"],"sort_order":387},{"unified":"1F9DC-200D-2640-FE0F","short_names":["mermaid"],"sort_order":392},{"unified":"1F9DC-200D-2642-FE0F","short_names":["merman"],"sort_order":391},{"unified":"1F9DC","short_names":["merperson"],"sort_order":390},{"unified":"1F9DD-200D-2640-FE0F","short_names":["female_elf"],"sort_order":395},{"unified":"1F9DD-200D-2642-FE0F","short_names":["male_elf"],"sort_order":394},{"unified":"1F9DD","short_names":["elf"],"sort_order":393},{"unified":"1F9DE-200D-2640-FE0F","short_names":["female_genie"],"sort_order":398},{"unified":"1F9DE-200D-2642-FE0F","short_names":["male_genie"],"sort_order":397},{"unified":"1F9DE","short_names":["genie"],"sort_order":396},{"unified":"1F9DF-200D-2640-FE0F","short_names":["female_zombie"],"sort_order":401},{"unified":"1F9DF-200D-2642-FE0F","short_names":["male_zombie"],"sort_order":400},{"unified":"1F9DF","short_names":["zombie"],"sort_order":399},{"unified":"1F9E0","short_names":["brain"],"sort_order":221},{"unified":"1F9E1","short_names":["orange_heart"],"sort_order":146},{"unified":"1F9E2","short_names":["billed_cap"],"sort_order":1194},{"unified":"1F9E3","short_names":["scarf"],"sort_order":1162},{"unified":"1F9E4","short_names":["gloves"],"sort_order":1163},{"unified":"1F9E5","short_names":["coat"],"sort_order":1164},{"unified":"1F9E6","short_names":["socks"],"sort_order":1165},{"unified":"1F9E7","short_names":["red_envelope"],"sort_order":1084},{"unified":"1F9E8","short_names":["firecracker"],"sort_order":1073},{"unified":"1F9E9","short_names":["jigsaw"],"sort_order":1134},{"unified":"1F9EA","short_names":["test_tube"],"sort_order":1371},{"unified":"1F9EB","short_names":["petri_dish"],"sort_order":1372},{"unified":"1F9EC","short_names":["dna"],"sort_order":1373},{"unified":"1F9ED","short_names":["compass"],"sort_order":857},{"unified":"1F9EE","short_names":["abacus"],"sort_order":1250},{"unified":"1F9EF","short_names":["fire_extinguisher"],"sort_order":1407},{"unified":"1F9F0","short_names":["toolbox"],"sort_order":1366},{"unified":"1F9F1","short_names":["bricks"],"sort_order":870},{"unified":"1F9F2","short_names":["magnet"],"sort_order":1367},{"unified":"1F9F3","short_names":["luggage"],"sort_order":990},{"unified":"1F9F4","short_names":["lotion_bottle"],"sort_order":1397},{"unified":"1F9F5","short_names":["thread"],"sort_order":1150},{"unified":"1F9F6","short_names":["yarn"],"sort_order":1152},{"unified":"1F9F7","short_names":["safety_pin"],"sort_order":1398},{"unified":"1F9F8","short_names":["teddy_bear"],"sort_order":1135},{"unified":"1F9F9","short_names":["broom"],"sort_order":1399},{"unified":"1F9FA","short_names":["basket"],"sort_order":1400},{"unified":"1F9FB","short_names":["roll_of_paper"],"sort_order":1401},{"unified":"1F9FC","short_names":["soap"],"sort_order":1403},{"unified":"1F9FD","short_names":["sponge"],"sort_order":1406},{"unified":"1F9FE","short_names":["receipt"],"sort_order":1292},{"unified":"1F9FF","short_names":["nazar_amulet"],"sort_order":1413},{"unified":"1FA70","short_names":["ballet_shoes"],"sort_order":1187},{"unified":"1FA71","short_names":["one-piece_swimsuit"],"sort_order":1169},{"unified":"1FA72","short_names":["briefs"],"sort_order":1170},{"unified":"1FA73","short_names":["shorts"],"sort_order":1171},{"unified":"1FA74","short_names":["thong_sandal"],"sort_order":1180},{"unified":"1FA75","short_names":["light_blue_heart"],"sort_order":150},{"unified":"1FA76","short_names":["grey_heart"],"sort_order":154},{"unified":"1FA77","short_names":["pink_heart"],"sort_order":145},{"unified":"1FA78","short_names":["drop_of_blood"],"sort_order":1378},{"unified":"1FA79","short_names":["adhesive_bandage"],"sort_order":1380},{"unified":"1FA7A","short_names":["stethoscope"],"sort_order":1382},{"unified":"1FA7B","short_names":["x-ray"],"sort_order":1383},{"unified":"1FA7C","short_names":["crutch"],"sort_order":1381},{"unified":"1FA80","short_names":["yo-yo"],"sort_order":1124},{"unified":"1FA81","short_names":["kite"],"sort_order":1125},{"unified":"1FA82","short_names":["parachute"],"sort_order":980},{"unified":"1FA83","short_names":["boomerang"],"sort_order":1351},{"unified":"1FA84","short_names":["magic_wand"],"sort_order":1129},{"unified":"1FA85","short_names":["pinata"],"sort_order":1136},{"unified":"1FA86","short_names":["nesting_dolls"],"sort_order":1138},{"unified":"1FA87","short_names":["maracas"],"sort_order":1228},{"unified":"1FA88","short_names":["flute"],"sort_order":1229},{"unified":"1FA89","short_names":["harp"],"sort_order":1230},{"unified":"1FA8F","short_names":["shovel"],"sort_order":1369},{"unified":"1FA90","short_names":["ringed_planet"],"sort_order":1038},{"unified":"1FA91","short_names":["chair"],"sort_order":1390},{"unified":"1FA92","short_names":["razor"],"sort_order":1396},{"unified":"1FA93","short_names":["axe"],"sort_order":1344},{"unified":"1FA94","short_names":["diya_lamp"],"sort_order":1266},{"unified":"1FA95","short_names":["banjo"],"sort_order":1225},{"unified":"1FA96","short_names":["military_helmet"],"sort_order":1195},{"unified":"1FA97","short_names":["accordion"],"sort_order":1220},{"unified":"1FA98","short_names":["long_drum"],"sort_order":1227},{"unified":"1FA99","short_names":["coin"],"sort_order":1285},{"unified":"1FA9A","short_names":["carpentry_saw"],"sort_order":1354},{"unified":"1FA9B","short_names":["screwdriver"],"sort_order":1356},{"unified":"1FA9C","short_names":["ladder"],"sort_order":1368},{"unified":"1FA9D","short_names":["hook"],"sort_order":1365},{"unified":"1FA9E","short_names":["mirror"],"sort_order":1386},{"unified":"1FA9F","short_names":["window"],"sort_order":1387},{"unified":"1FAA0","short_names":["plunger"],"sort_order":1392},{"unified":"1FAA1","short_names":["sewing_needle"],"sort_order":1151},{"unified":"1FAA2","short_names":["knot"],"sort_order":1153},{"unified":"1FAA3","short_names":["bucket"],"sort_order":1402},{"unified":"1FAA4","short_names":["mouse_trap"],"sort_order":1395},{"unified":"1FAA5","short_names":["toothbrush"],"sort_order":1405},{"unified":"1FAA6","short_names":["headstone"],"sort_order":1411},{"unified":"1FAA7","short_names":["placard"],"sort_order":1416},{"unified":"1FAA8","short_names":["rock"],"sort_order":871},{"unified":"1FAA9","short_names":["mirror_ball"],"sort_order":1137},{"unified":"1FAAA","short_names":["identification_card"],"sort_order":1417},{"unified":"1FAAB","short_names":["low_battery"],"sort_order":1238},{"unified":"1FAAC","short_names":["hamsa"],"sort_order":1414},{"unified":"1FAAD","short_names":["folding_hand_fan"],"sort_order":1174},{"unified":"1FAAE","short_names":["hair_pick"],"sort_order":1189},{"unified":"1FAAF","short_names":["khanda"],"sort_order":1477},{"unified":"1FAB0","short_names":["fly"],"sort_order":688},{"unified":"1FAB1","short_names":["worm"],"sort_order":689},{"unified":"1FAB2","short_names":["beetle"],"sort_order":680},{"unified":"1FAB3","short_names":["cockroach"],"sort_order":683},{"unified":"1FAB4","short_names":["potted_plant"],"sort_order":704},{"unified":"1FAB5","short_names":["wood"],"sort_order":872},{"unified":"1FAB6","short_names":["feather"],"sort_order":641},{"unified":"1FAB7","short_names":["lotus"],"sort_order":694},{"unified":"1FAB8","short_names":["coral"],"sort_order":668},{"unified":"1FAB9","short_names":["empty_nest"],"sort_order":716},{"unified":"1FABA","short_names":["nest_with_eggs"],"sort_order":717},{"unified":"1FABB","short_names":["hyacinth"],"sort_order":702},{"unified":"1FABC","short_names":["jellyfish"],"sort_order":669},{"unified":"1FABD","short_names":["wing"],"sort_order":645},{"unified":"1FABE","short_names":["leafless_tree"],"sort_order":719},{"unified":"1FABF","short_names":["goose"],"sort_order":647},{"unified":"1FAC0","short_names":["anatomical_heart"],"sort_order":222},{"unified":"1FAC1","short_names":["lungs"],"sort_order":223},{"unified":"1FAC2","short_names":["people_hugging"],"sort_order":548},{"unified":"1FAC3","short_names":["pregnant_man"],"sort_order":365},{"unified":"1FAC4","short_names":["pregnant_person"],"sort_order":366},{"unified":"1FAC5","short_names":["person_with_crown"],"sort_order":350},{"unified":"1FAC6","short_names":["fingerprint"],"sort_order":555},{"unified":"1FACE","short_names":["moose"],"sort_order":581},{"unified":"1FACF","short_names":["donkey"],"sort_order":582},{"unified":"1FAD0","short_names":["blueberries"],"sort_order":735},{"unified":"1FAD1","short_names":["bell_pepper"],"sort_order":746},{"unified":"1FAD2","short_names":["olive"],"sort_order":738},{"unified":"1FAD3","short_names":["flatbread"],"sort_order":762},{"unified":"1FAD4","short_names":["tamale"],"sort_order":779},{"unified":"1FAD5","short_names":["fondue"],"sort_order":786},{"unified":"1FAD6","short_names":["teapot"],"sort_order":827},{"unified":"1FAD7","short_names":["pouring_liquid"],"sort_order":838},{"unified":"1FAD8","short_names":["beans"],"sort_order":753},{"unified":"1FAD9","short_names":["jar"],"sort_order":849},{"unified":"1FADA","short_names":["ginger_root"],"sort_order":755},{"unified":"1FADB","short_names":["pea_pod"],"sort_order":756},{"unified":"1FADC","short_names":["root_vegetable"],"sort_order":758},{"unified":"1FADF","short_names":["splatter"],"sort_order":1555},{"unified":"1FAE0","short_names":["melting_face"],"sort_order":11},{"unified":"1FAE1","short_names":["saluting_face"],"sort_order":36},{"unified":"1FAE2","short_names":["face_with_open_eyes_and_hand_over_mouth"],"sort_order":32},{"unified":"1FAE3","short_names":["face_with_peeking_eye"],"sort_order":33},{"unified":"1FAE4","short_names":["face_with_diagonal_mouth"],"sort_order":78},{"unified":"1FAE5","short_names":["dotted_line_face"],"sort_order":42},{"unified":"1FAE6","short_names":["biting_lip"],"sort_order":230},{"unified":"1FAE7","short_names":["bubbles"],"sort_order":1404},{"unified":"1FAE8","short_names":["shaking_face"],"sort_order":50},{"unified":"1FAE9","short_names":["face_with_bags_under_eyes"],"sort_order":58},{"unified":"1FAF0","short_names":["hand_with_index_finger_and_thumb_crossed"],"sort_order":186},{"unified":"1FAF1","short_names":["rightwards_hand"],"sort_order":175},{"unified":"1FAF2","short_names":["leftwards_hand"],"sort_order":176},{"unified":"1FAF3","short_names":["palm_down_hand"],"sort_order":177},{"unified":"1FAF4","short_names":["palm_up_hand"],"sort_order":178},{"unified":"1FAF5","short_names":["index_pointing_at_the_viewer"],"sort_order":196},{"unified":"1FAF6","short_names":["heart_hands"],"sort_order":205},{"unified":"1FAF7","short_names":["leftwards_pushing_hand"],"sort_order":179},{"unified":"1FAF8","short_names":["rightwards_pushing_hand"],"sort_order":180},{"unified":"203C-FE0F","short_names":["bangbang"],"sort_order":1525},{"unified":"2049-FE0F","short_names":["interrobang"],"sort_order":1526},{"unified":"2122-FE0F","short_names":["tm"],"sort_order":1554},{"unified":"2139-FE0F","short_names":["information_source"],"sort_order":1580},{"unified":"2194-FE0F","short_names":["left_right_arrow"],"sort_order":1453},{"unified":"2195-FE0F","short_names":["arrow_up_down"],"sort_order":1452},{"unified":"2196-FE0F","short_names":["arrow_upper_left"],"sort_order":1451},{"unified":"2197-FE0F","short_names":["arrow_upper_right"],"sort_order":1445},{"unified":"2198-FE0F","short_names":["arrow_lower_right"],"sort_order":1447},{"unified":"2199-FE0F","short_names":["arrow_lower_left"],"sort_order":1449},{"unified":"21A9-FE0F","short_names":["leftwards_arrow_with_hook"],"sort_order":1454},{"unified":"21AA-FE0F","short_names":["arrow_right_hook"],"sort_order":1455},{"unified":"231A","short_names":["watch"],"sort_order":993},{"unified":"231B","short_names":["hourglass"],"sort_order":991},{"unified":"2328-FE0F","short_names":["keyboard"],"sort_order":1243},{"unified":"23CF-FE0F","short_names":["eject"],"sort_order":1508},{"unified":"23E9","short_names":["fast_forward"],"sort_order":1495},{"unified":"23EA","short_names":["rewind"],"sort_order":1499},{"unified":"23EB","short_names":["arrow_double_up"],"sort_order":1502},{"unified":"23EC","short_names":["arrow_double_down"],"sort_order":1504},{"unified":"23ED-FE0F","short_names":["black_right_pointing_double_triangle_with_vertical_bar"],"sort_order":1496},{"unified":"23EE-FE0F","short_names":["black_left_pointing_double_triangle_with_vertical_bar"],"sort_order":1500},{"unified":"23EF-FE0F","short_names":["black_right_pointing_triangle_with_double_vertical_bar"],"sort_order":1497},{"unified":"23F0","short_names":["alarm_clock"],"sort_order":994},{"unified":"23F1-FE0F","short_names":["stopwatch"],"sort_order":995},{"unified":"23F2-FE0F","short_names":["timer_clock"],"sort_order":996},{"unified":"23F3","short_names":["hourglass_flowing_sand"],"sort_order":992},{"unified":"23F8-FE0F","short_names":["double_vertical_bar"],"sort_order":1505},{"unified":"23F9-FE0F","short_names":["black_square_for_stop"],"sort_order":1506},{"unified":"23FA-FE0F","short_names":["black_circle_for_record"],"sort_order":1507},{"unified":"24C2-FE0F","short_names":["m"],"sort_order":1582},{"unified":"25AA-FE0F","short_names":["black_small_square"],"sort_order":1630},{"unified":"25AB-FE0F","short_names":["white_small_square"],"sort_order":1631},{"unified":"25B6-FE0F","short_names":["arrow_forward"],"sort_order":1494},{"unified":"25C0-FE0F","short_names":["arrow_backward"],"sort_order":1498},{"unified":"25FB-FE0F","short_names":["white_medium_square"],"sort_order":1627},{"unified":"25FC-FE0F","short_names":["black_medium_square"],"sort_order":1626},{"unified":"25FD","short_names":["white_medium_small_square"],"sort_order":1629},{"unified":"25FE","short_names":["black_medium_small_square"],"sort_order":1628},{"unified":"2600-FE0F","short_names":["sunny"],"sort_order":1035},{"unified":"2601-FE0F","short_names":["cloud"],"sort_order":1043},{"unified":"2602-FE0F","short_names":["umbrella"],"sort_order":1058},{"unified":"2603-FE0F","short_names":["snowman"],"sort_order":1063},{"unified":"2604-FE0F","short_names":["comet"],"sort_order":1065},{"unified":"260E-FE0F","short_names":["phone","telephone"],"sort_order":1233},{"unified":"2611-FE0F","short_names":["ballot_box_with_check"],"sort_order":1542},{"unified":"2614","short_names":["umbrella_with_rain_drops"],"sort_order":1059},{"unified":"2615","short_names":["coffee"],"sort_order":826},{"unified":"2618-FE0F","short_names":["shamrock"],"sort_order":711},{"unified":"261D-FE0F","short_names":["point_up"],"sort_order":195},{"unified":"2620-FE0F","short_names":["skull_and_crossbones"],"sort_order":110},{"unified":"2622-FE0F","short_names":["radioactive_sign"],"sort_order":1442},{"unified":"2623-FE0F","short_names":["biohazard_sign"],"sort_order":1443},{"unified":"2626-FE0F","short_names":["orthodox_cross"],"sort_order":1472},{"unified":"262A-FE0F","short_names":["star_and_crescent"],"sort_order":1473},{"unified":"262E-FE0F","short_names":["peace_symbol"],"sort_order":1474},{"unified":"262F-FE0F","short_names":["yin_yang"],"sort_order":1470},{"unified":"2638-FE0F","short_names":["wheel_of_dharma"],"sort_order":1469},{"unified":"2639-FE0F","short_names":["white_frowning_face"],"sort_order":81},{"unified":"263A-FE0F","short_names":["relaxed"],"sort_order":20},{"unified":"2640-FE0F","short_names":["female_sign"],"sort_order":1516},{"unified":"2642-FE0F","short_names":["male_sign"],"sort_order":1517},{"unified":"2648","short_names":["aries"],"sort_order":1478},{"unified":"2649","short_names":["taurus"],"sort_order":1479},{"unified":"264A","short_names":["gemini"],"sort_order":1480},{"unified":"264B","short_names":["cancer"],"sort_order":1481},{"unified":"264C","short_names":["leo"],"sort_order":1482},{"unified":"264D","short_names":["virgo"],"sort_order":1483},{"unified":"264E","short_names":["libra"],"sort_order":1484},{"unified":"264F","short_names":["scorpius"],"sort_order":1485},{"unified":"2650","short_names":["sagittarius"],"sort_order":1486},{"unified":"2651","short_names":["capricorn"],"sort_order":1487},{"unified":"2652","short_names":["aquarius"],"sort_order":1488},{"unified":"2653","short_names":["pisces"],"sort_order":1489},{"unified":"265F-FE0F","short_names":["chess_pawn"],"sort_order":1143},{"unified":"2660-FE0F","short_names":["spades"],"sort_order":1139},{"unified":"2663-FE0F","short_names":["clubs"],"sort_order":1142},{"unified":"2665-FE0F","short_names":["hearts"],"sort_order":1140},{"unified":"2666-FE0F","short_names":["diamonds"],"sort_order":1141},{"unified":"2668-FE0F","short_names":["hotsprings"],"sort_order":910},{"unified":"267B-FE0F","short_names":["recycle"],"sort_order":1535},{"unified":"267E-FE0F","short_names":["infinity"],"sort_order":1524},{"unified":"267F","short_names":["wheelchair"],"sort_order":1421},{"unified":"2692-FE0F","short_names":["hammer_and_pick"],"sort_order":1346},{"unified":"2693","short_names":["anchor"],"sort_order":967},{"unified":"2694-FE0F","short_names":["crossed_swords"],"sort_order":1349},{"unified":"2695-FE0F","short_names":["medical_symbol","staff_of_aesculapius"],"sort_order":1534},{"unified":"2696-FE0F","short_names":["scales"],"sort_order":1360},{"unified":"2697-FE0F","short_names":["alembic"],"sort_order":1370},{"unified":"2699-FE0F","short_names":["gear"],"sort_order":1358},{"unified":"269B-FE0F","short_names":["atom_symbol"],"sort_order":1466},{"unified":"269C-FE0F","short_names":["fleur_de_lis"],"sort_order":1536},{"unified":"26A0-FE0F","short_names":["warning"],"sort_order":1431},{"unified":"26A1","short_names":["zap"],"sort_order":1061},{"unified":"26A7-FE0F","short_names":["transgender_symbol"],"sort_order":1518},{"unified":"26AA","short_names":["white_circle"],"sort_order":1616},{"unified":"26AB","short_names":["black_circle"],"sort_order":1615},{"unified":"26B0-FE0F","short_names":["coffin"],"sort_order":1410},{"unified":"26B1-FE0F","short_names":["funeral_urn"],"sort_order":1412},{"unified":"26BD","short_names":["soccer"],"sort_order":1096},{"unified":"26BE","short_names":["baseball"],"sort_order":1097},{"unified":"26C4","short_names":["snowman_without_snow"],"sort_order":1064},{"unified":"26C5","short_names":["partly_sunny"],"sort_order":1044},{"unified":"26C8-FE0F","short_names":["thunder_cloud_and_rain"],"sort_order":1045},{"unified":"26CE","short_names":["ophiuchus"],"sort_order":1490},{"unified":"26CF-FE0F","short_names":["pick"],"sort_order":1345},{"unified":"26D1-FE0F","short_names":["helmet_with_white_cross"],"sort_order":1196},{"unified":"26D3-FE0F-200D-1F4A5","short_names":["broken_chain"],"sort_order":1363},{"unified":"26D3-FE0F","short_names":["chains"],"sort_order":1364},{"unified":"26D4","short_names":["no_entry"],"sort_order":1433},{"unified":"26E9-FE0F","short_names":["shinto_shrine"],"sort_order":898},{"unified":"26EA","short_names":["church"],"sort_order":894},{"unified":"26F0-FE0F","short_names":["mountain"],"sort_order":859},{"unified":"26F1-FE0F","short_names":["umbrella_on_ground"],"sort_order":1060},{"unified":"26F2","short_names":["fountain"],"sort_order":900},{"unified":"26F3","short_names":["golf"],"sort_order":1115},{"unified":"26F4-FE0F","short_names":["ferry"],"sort_order":973},{"unified":"26F5","short_names":["boat","sailboat"],"sort_order":969},{"unified":"26F7-FE0F","short_names":["skier"],"sort_order":462},{"unified":"26F8-FE0F","short_names":["ice_skate"],"sort_order":1116},{"unified":"26F9-FE0F-200D-2640-FE0F","short_names":["woman-bouncing-ball"],"sort_order":478},{"unified":"26F9-FE0F-200D-2642-FE0F","short_names":["man-bouncing-ball"],"sort_order":477},{"unified":"26F9-FE0F","short_names":["person_with_ball"],"sort_order":476},{"unified":"26FA","short_names":["tent"],"sort_order":901},{"unified":"26FD","short_names":["fuelpump"],"sort_order":960},{"unified":"2702-FE0F","short_names":["scissors"],"sort_order":1333},{"unified":"2705","short_names":["white_check_mark"],"sort_order":1541},{"unified":"2708-FE0F","short_names":["airplane"],"sort_order":976},{"unified":"2709-FE0F","short_names":["email","envelope"],"sort_order":1294},{"unified":"270A","short_names":["fist"],"sort_order":199},{"unified":"270B","short_names":["hand","raised_hand"],"sort_order":173},{"unified":"270C-FE0F","short_names":["v"],"sort_order":184},{"unified":"270D-FE0F","short_names":["writing_hand"],"sort_order":210},{"unified":"270F-FE0F","short_names":["pencil2"],"sort_order":1307},{"unified":"2712-FE0F","short_names":["black_nib"],"sort_order":1308},{"unified":"2714-FE0F","short_names":["heavy_check_mark"],"sort_order":1543},{"unified":"2716-FE0F","short_names":["heavy_multiplication_x"],"sort_order":1519},{"unified":"271D-FE0F","short_names":["latin_cross"],"sort_order":1471},{"unified":"2721-FE0F","short_names":["star_of_david"],"sort_order":1468},{"unified":"2728","short_names":["sparkles"],"sort_order":1074},{"unified":"2733-FE0F","short_names":["eight_spoked_asterisk"],"sort_order":1549},{"unified":"2734-FE0F","short_names":["eight_pointed_black_star"],"sort_order":1550},{"unified":"2744-FE0F","short_names":["snowflake"],"sort_order":1062},{"unified":"2747-FE0F","short_names":["sparkle"],"sort_order":1551},{"unified":"274C","short_names":["x"],"sort_order":1544},{"unified":"274E","short_names":["negative_squared_cross_mark"],"sort_order":1545},{"unified":"2753","short_names":["question"],"sort_order":1527},{"unified":"2754","short_names":["grey_question"],"sort_order":1528},{"unified":"2755","short_names":["grey_exclamation"],"sort_order":1529},{"unified":"2757","short_names":["exclamation","heavy_exclamation_mark"],"sort_order":1530},{"unified":"2763-FE0F","short_names":["heavy_heart_exclamation_mark_ornament"],"sort_order":140},{"unified":"2764-FE0F-200D-1F525","short_names":["heart_on_fire"],"sort_order":142},{"unified":"2764-FE0F-200D-1FA79","short_names":["mending_heart"],"sort_order":143},{"unified":"2764-FE0F","short_names":["heart"],"sort_order":144},{"unified":"2795","short_names":["heavy_plus_sign"],"sort_order":1520},{"unified":"2796","short_names":["heavy_minus_sign"],"sort_order":1521},{"unified":"2797","short_names":["heavy_division_sign"],"sort_order":1522},{"unified":"27A1-FE0F","short_names":["arrow_right"],"sort_order":1446},{"unified":"27B0","short_names":["curly_loop"],"sort_order":1546},{"unified":"27BF","short_names":["loop"],"sort_order":1547},{"unified":"2934-FE0F","short_names":["arrow_heading_up"],"sort_order":1456},{"unified":"2935-FE0F","short_names":["arrow_heading_down"],"sort_order":1457},{"unified":"2B05-FE0F","short_names":["arrow_left"],"sort_order":1450},{"unified":"2B06-FE0F","short_names":["arrow_up"],"sort_order":1444},{"unified":"2B07-FE0F","short_names":["arrow_down"],"sort_order":1448},{"unified":"2B1B","short_names":["black_large_square"],"sort_order":1624},{"unified":"2B1C","short_names":["white_large_square"],"sort_order":1625},{"unified":"2B50","short_names":["star"],"sort_order":1039},{"unified":"2B55","short_names":["o"],"sort_order":1540},{"unified":"3030-FE0F","short_names":["wavy_dash"],"sort_order":1531},{"unified":"303D-FE0F","short_names":["part_alternation_mark"],"sort_order":1548},{"unified":"3297-FE0F","short_names":["congratulations"],"sort_order":1604},{"unified":"3299-FE0F","short_names":["secret"],"sort_order":1605}] diff --git a/Core/Tests/CoreTests/InputUtilsTests/EmojiDictionaryTests.swift b/Core/Tests/CoreTests/InputUtilsTests/EmojiDictionaryTests.swift new file mode 100644 index 00000000..4769ec0c --- /dev/null +++ b/Core/Tests/CoreTests/InputUtilsTests/EmojiDictionaryTests.swift @@ -0,0 +1,44 @@ +import Core +import Testing + +@Test func testEmojiDictionarySearchReturnsEmptyForEmptyQuery() async throws { + #expect(EmojiDictionary.search(query: "").isEmpty) +} + +@Test func testEmojiDictionarySearchFindsExactShortname() async throws { + let results = EmojiDictionary.search(query: "smile") + #expect(!results.isEmpty) + #expect(results.contains { $0.shortnames.contains("smile") }) +} + +@Test func testEmojiDictionarySearchIsCaseInsensitive() async throws { + let lower = EmojiDictionary.search(query: "smile") + let upper = EmojiDictionary.search(query: "SMILE") + #expect(!lower.isEmpty) + #expect(!upper.isEmpty) + #expect(lower.map(\.emoji) == upper.map(\.emoji)) +} + +@Test func testEmojiDictionarySearchPrefixMatchesPreferredOverSubstring() async throws { + // "hand" で始まる shortname ("handshake" など) が、substring マッチよりも先に並ぶ + let results = EmojiDictionary.search(query: "hand", limit: 30) + #expect(results.count > 1) + // 先頭数件は "hand" で始まるものがある + let firstFew = results.prefix(3) + #expect(firstFew.contains { entry in + entry.shortnames.contains { $0.lowercased().hasPrefix("hand") } + }) +} + +@Test func testEmojiDictionarySearchRespectsLimit() async throws { + let results = EmojiDictionary.search(query: "e", limit: 5) + #expect(results.count <= 5) +} + +@Test func testEmojiDictionarySearchReturnsValidEmoji() async throws { + let results = EmojiDictionary.search(query: "thumbsup") + let entry = try #require(results.first { $0.shortnames.contains("+1") || $0.shortnames.contains("thumbsup") }) + // 絵文字が空でなく、Unicodeスカラが1つ以上含まれる + #expect(!entry.emoji.isEmpty) + #expect(entry.emoji.unicodeScalars.count >= 1) +} diff --git a/Core/Tests/CoreTests/InputUtilsTests/InputStateEmojiTests.swift b/Core/Tests/CoreTests/InputUtilsTests/InputStateEmojiTests.swift new file mode 100644 index 00000000..04ddf0a4 --- /dev/null +++ b/Core/Tests/CoreTests/InputUtilsTests/InputStateEmojiTests.swift @@ -0,0 +1,240 @@ +import Core +import KanaKanjiConverterModule +import Testing + +/// 絵文字入力モード (`.emojiInput`, `.emojiInputNested`) の遷移テスト +private let zeroEvent = KeyEventCore( + modifierFlags: [], + characters: nil, + charactersIgnoringModifiers: nil, + keyCode: 0 +) + +/// 日本語モードで全角コロン `:` を打ったのと同等の UserAction を作る +private func colonInputAction() -> UserAction { + .input([.key(intention: ":", input: ":", modifiers: [])]) +} + +/// 任意の半角文字を日本語モードで打ったのと同等の UserAction を作る +private func asciiInputAction(_ c: Character) -> UserAction { + guard let fullwidth = Core.KeyMap.h2zMap(c) else { + return .input([.character(c)]) + } + return .input([.key(intention: fullwidth, input: c, modifiers: [])]) +} + +private func runEvent( + state: InputState, + userAction: UserAction, + inputLanguage: InputLanguage = .japanese, + emojiInputEnabled: Bool = true, + emojiInputTrigger: String = ":" +) -> (ClientAction, ClientActionCallback) { + state.event( + eventCore: zeroEvent, + userAction: userAction, + inputLanguage: inputLanguage, + liveConversionEnabled: false, + enableDebugWindow: false, + enableSuggestion: false, + emojiInputEnabled: emojiInputEnabled, + emojiInputTrigger: emojiInputTrigger + ) +} + +// MARK: - トリガー発動 + +@Test func testColonFromNoneEntersEmojiInput() async throws { + let (action, callback) = runEvent(state: .none, userAction: colonInputAction()) + guard case .enterEmojiInputMode = action else { + Issue.record("expected .enterEmojiInputMode, got \(action)") + return + } + guard case .transition(.emojiInput("")) = callback else { + Issue.record("expected .transition(.emojiInput(empty)), got \(callback)") + return + } +} + +@Test func testColonFromComposingEntersEmojiInputNested() async throws { + let (action, callback) = runEvent(state: .composing, userAction: colonInputAction()) + guard case .enterEmojiInputMode = action else { + Issue.record("expected .enterEmojiInputMode, got \(action)") + return + } + guard case .transition(.emojiInputNested("")) = callback else { + Issue.record("expected .transition(.emojiInputNested(empty)), got \(callback)") + return + } +} + +@Test func testColonFromPreviewingEntersEmojiInputNested() async throws { + let (_, callback) = runEvent(state: .previewing, userAction: colonInputAction()) + guard case .transition(.emojiInputNested("")) = callback else { + Issue.record("expected .transition(.emojiInputNested(empty)), got \(callback)") + return + } +} + +@Test func testColonFromSelectingEntersEmojiInputNested() async throws { + let (_, callback) = runEvent(state: .selecting, userAction: colonInputAction()) + guard case .transition(.emojiInputNested("")) = callback else { + Issue.record("expected .transition(.emojiInputNested(empty)), got \(callback)") + return + } +} + +// MARK: - 無効化時は発動しない + +@Test func testColonDoesNotTriggerWhenDisabled() async throws { + let (action, _) = runEvent(state: .none, userAction: colonInputAction(), emojiInputEnabled: false) + // enterEmojiInputMode が返ってこないことを確認 + if case .enterEmojiInputMode = action { + Issue.record("emoji input should not trigger when disabled") + } +} + +@Test func testEnglishModeColonDoesNotTriggerEmoji() async throws { + // 英語モードでは :key(intention: nil) になり preferIntention:true でも ":" 一致しない + let englishColon: UserAction = .input([.character(":")]) + let (action, _) = runEvent(state: .none, userAction: englishColon, inputLanguage: .english) + if case .enterEmojiInputMode = action { + Issue.record("emoji input should not trigger in English mode") + } +} + +// MARK: - emojiInput 中のキー操作 + +@Test func testLetterAppendsToEmojiQuery() async throws { + let (action, callback) = runEvent(state: .emojiInput("sm"), userAction: asciiInputAction("i")) + guard case .appendToEmojiInput(let appended) = action else { + Issue.record("expected .appendToEmojiInput, got \(action)") + return + } + #expect(appended == "i") + guard case .transition(.emojiInput("smi")) = callback else { + Issue.record("expected .transition(.emojiInput(smi)), got \(callback)") + return + } +} + +@Test func testBackspaceShrinksEmojiQuery() async throws { + let (action, callback) = runEvent(state: .emojiInput("smile"), userAction: .backspace) + if case .removeLastEmojiInput = action {} else { + Issue.record("expected .removeLastEmojiInput, got \(action)") + } + guard case .transition(.emojiInput("smil")) = callback else { + Issue.record("expected .transition(.emojiInput(smil)), got \(callback)") + return + } +} + +@Test func testBackspaceOnEmptyQueryCancels() async throws { + let (action, callback) = runEvent(state: .emojiInput(""), userAction: .backspace) + if case .cancelEmojiInput = action {} else { + Issue.record("expected .cancelEmojiInput, got \(action)") + } + guard case .transition(.none) = callback else { + Issue.record("expected .transition(.none), got \(callback)") + return + } +} + +@Test func testBackspaceOnEmptyNestedQueryReturnsToComposing() async throws { + let (_, callback) = runEvent(state: .emojiInputNested(""), userAction: .backspace) + guard case .transition(.composing) = callback else { + Issue.record("expected .transition(.composing), got \(callback)") + return + } +} + +@Test func testEnterSubmitsEmojiCandidate() async throws { + let (action, callback) = runEvent(state: .emojiInput("smile"), userAction: .enter) + if case .submitSelectedEmojiCandidate = action {} else { + Issue.record("expected .submitSelectedEmojiCandidate, got \(action)") + } + guard case .transition(.none) = callback else { + Issue.record("expected .transition(.none), got \(callback)") + return + } +} + +@Test func testNestedEnterReturnsToComposing() async throws { + let (_, callback) = runEvent(state: .emojiInputNested("smile"), userAction: .enter) + guard case .transition(.composing) = callback else { + Issue.record("expected .transition(.composing), got \(callback)") + return + } +} + +@Test func testEscapeCancels() async throws { + let (action, callback) = runEvent(state: .emojiInput("smile"), userAction: .escape) + if case .cancelEmojiInput = action {} else { + Issue.record("expected .cancelEmojiInput, got \(action)") + } + guard case .transition(.none) = callback else { + Issue.record("expected .transition(.none), got \(callback)") + return + } +} + +@Test func testNavigationDownSelectsNext() async throws { + let (action, _) = runEvent(state: .emojiInput("smile"), userAction: .navigation(.down)) + if case .selectNextEmojiCandidate = action {} else { + Issue.record("expected .selectNextEmojiCandidate, got \(action)") + } +} + +@Test func testNavigationUpSelectsPrev() async throws { + let (action, _) = runEvent(state: .emojiInput("smile"), userAction: .navigation(.up)) + if case .selectPrevEmojiCandidate = action {} else { + Issue.record("expected .selectPrevEmojiCandidate, got \(action)") + } +} + +@Test func testSecondTriggerCharSubmitsSelected() async throws { + // "smile" のクエリ中にもう一度「:」を打つと選択中候補を確定 + let (action, callback) = runEvent(state: .emojiInput("smile"), userAction: colonInputAction()) + if case .submitSelectedEmojiCandidate = action {} else { + Issue.record("expected .submitSelectedEmojiCandidate, got \(action)") + } + guard case .transition(.none) = callback else { + Issue.record("expected .transition(.none), got \(callback)") + return + } +} + +// MARK: - カスタムトリガー文字 + +@Test func testCustomTriggerFiresOnly() async throws { + // トリガーを ";" (全角セミコロン) に変更したら、コロンでは発動しない + let customTrigger = ";" + let (action, _) = runEvent( + state: .none, + userAction: colonInputAction(), + emojiInputTrigger: customTrigger + ) + if case .enterEmojiInputMode = action { + Issue.record("colon should not trigger when custom trigger is set to semicolon") + } +} + +// MARK: - 無効化時のパススルー + +@Test func testComposingColonPassesThroughAsNormalInputWhenDisabled() async throws { + // 絵文字モード無効時、.composing 中の「:」は通常の入力として composing に追加される + let (action, callback) = runEvent( + state: .composing, + userAction: colonInputAction(), + emojiInputEnabled: false + ) + if case .enterEmojiInputMode = action { + Issue.record("emoji input should not trigger when disabled") + } + if case .appendPieceToMarkedText = action {} else { + Issue.record("expected .appendPieceToMarkedText, got \(action)") + } + if case .fallthrough = callback {} else { + Issue.record("expected .fallthrough, got \(callback)") + } +} diff --git a/README.md b/README.md index e710c7a7..a1e21ecb 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,9 @@ GitHub Sponsorsをご利用ください。 * LLMによる「いい感じ変換」機能 * ライブ変換 * AZIKのネイティブサポート +* Slack風ショートネーム絵文字入力(日本語入力中に `:` を打ち、`:smile` のように英字でインクリメンタル検索して絵文字を確定) + * ON/OFFと起動トリガー文字は「設定 > カスタマイズ > 絵文字入力」で変更可能 + * 変換途中でトリガーを打っても、composingテキストを保持したまま絵文字を挿入できる ## 開発ガイド @@ -149,5 +152,9 @@ Thanks to authors!! * https://stackoverflow.com/questions/27813151/how-to-develop-a-simple-input-method-for-mac-os-x-in-swift * https://mzp.booth.pm/items/809262 +## Third-Party Data + +* 絵文字入力機能のショートネーム/絵文字対応表として、[iamcal/emoji-data](https://github.com/iamcal/emoji-data)(MIT License)の `emoji.json` をバンドルしています。 + ## Acknowledgement 本プロジェクトは情報処理推進機構(IPA)による[2024年度未踏IT人材発掘・育成事業](https://www.ipa.go.jp/jinzai/mitou/it/2024/koubokekka.html)の支援を受けて開発を行いました。 diff --git a/azooKeyMac/InputController/CandidateWindow/BaseCandidateViewController.swift b/azooKeyMac/InputController/CandidateWindow/BaseCandidateViewController.swift index 137ecdd6..eb83c8f5 100644 --- a/azooKeyMac/InputController/CandidateWindow/BaseCandidateViewController.swift +++ b/azooKeyMac/InputController/CandidateWindow/BaseCandidateViewController.swift @@ -239,7 +239,15 @@ class BaseCandidateViewController: NSViewController { let rowHeight = self.tableView.rowHeight let tableViewHeight = CGFloat(self.numberOfVisibleRows) * rowHeight - let maxWidth = self.getMaxTextWidth(candidates: self.candidates.lazy.map { $0.candidate.text }) + let maxTextWidth = self.getMaxTextWidth(candidates: self.candidates.lazy.map { $0.candidate.text }) + let annotationFont = NSFont.systemFont(ofSize: 12) + let maxAnnotationWidth = self.candidates.lazy + .compactMap { $0.displayContext.annotationText } + .reduce(CGFloat(0)) { partial, text in + let size = NSAttributedString(string: text, attributes: [.font: annotationFont]).size() + return max(partial, size.width) + } + let maxWidth = maxTextWidth + (maxAnnotationWidth > 0 ? maxAnnotationWidth + 8 : 0) let windowWidth = self.getWindowWidth(maxContentWidth: maxWidth) let newWindowFrame = WindowPositioning.frameNearCursor( currentFrame: .init(window.frame), diff --git a/azooKeyMac/InputController/CandidateWindow/CandidateView.swift b/azooKeyMac/InputController/CandidateWindow/CandidateView.swift index 68b3d8a7..9d1f3b22 100644 --- a/azooKeyMac/InputController/CandidateWindow/CandidateView.swift +++ b/azooKeyMac/InputController/CandidateWindow/CandidateView.swift @@ -95,11 +95,12 @@ class CandidatesViewController: BaseCandidateViewController { } override func getWindowWidth(maxContentWidth: CGFloat) -> CGFloat { - let hasAnnotation = self.candidates.contains { $0.displayContext.annotationText != nil } + // maxContentWidth には candidate.text + annotation実幅 + 8 が含まれている + // (BaseCandidateViewController.resizeWindowToFitContent 参照) if self.showCandidateIndex { - return maxContentWidth + 48 + (hasAnnotation ? 56 : 0) + return maxContentWidth + 48 } else { - return maxContentWidth + 20 + (hasAnnotation ? 56 : 0) + return maxContentWidth + 20 } } } diff --git a/azooKeyMac/InputController/azooKeyMacInputController.swift b/azooKeyMac/InputController/azooKeyMacInputController.swift index 9f9bb91d..575af9f1 100644 --- a/azooKeyMac/InputController/azooKeyMacInputController.swift +++ b/azooKeyMac/InputController/azooKeyMacInputController.swift @@ -193,12 +193,23 @@ class azooKeyMacInputController: IMKInputController, NSMenuItemValidation { // s @MainActor override func commitComposition(_ sender: Any!) { - // Unicode入力モードの場合は状態だけリセットして終了 + // Unicode入力モード/Emoji入力モードの場合は状態だけリセットして終了 // マウスクリック等でOSがMarkedTextを確定した場合、IME側からは消せないため if case .unicodeInput = self.inputState { self.inputState = .none return } + if case .emojiInput = self.inputState { + self.segmentsManager.clearEmojiInput() + self.inputState = .none + return + } + if case .emojiInputNested = self.inputState { + // emoji 部分だけリセットし、残った composing は後段でコミットさせる + self.segmentsManager.clearEmojiInput() + self.inputState = .composing + // fallthrough: 下の segmentsManager.commitMarkedText で composing を確定 + } if self.segmentsManager.isEmpty { return } @@ -361,7 +372,9 @@ class azooKeyMacInputController: IMKInputController, NSMenuItemValidation { // s inputLanguage: self.inputLanguage, liveConversionEnabled: Config.LiveConversion().value, enableDebugWindow: Config.DebugWindow().value, - enableSuggestion: aiBackendEnabled + enableSuggestion: aiBackendEnabled, + emojiInputEnabled: Config.EmojiInputEnabled().value, + emojiInputTrigger: Config.EmojiInputTrigger().value ) return handleClientAction(clientAction, clientActionCallback: clientActionCallback, client: client) } @@ -527,6 +540,43 @@ class azooKeyMacInputController: IMKInputController, NSMenuItemValidation { // s client.insertText(text, replacementRange: NSRange(location: NSNotFound, length: 0)) self.segmentsManager.stopComposition() } + // Emoji Input + case .enterEmojiInputMode: + // 状態遷移と候補更新は後段で行う + break + case .appendToEmojiInput, .removeLastEmojiInput: + // 候補更新は末尾で行う + break + case .submitSelectedEmojiCandidate: + // 挿入する文字列を決定: 選択中の絵文字があればそれ、無ければ "query" を直書き + let emojiInsertText: String + if let candidate = self.segmentsManager.selectedEmojiCandidate { + emojiInsertText = candidate.text + } else if case .emojiInput(let query) = self.inputState { + emojiInsertText = Config.EmojiInputTrigger().value + query + } else if case .emojiInputNested(let query) = self.inputState { + emojiInsertText = Config.EmojiInputTrigger().value + query + } else { + emojiInsertText = "" + } + if case .emojiInputNested = self.inputState { + // 入れ子モード: composingText に絵文字/文字列を追加 (composing 保持) + if !emojiInsertText.isEmpty { + self.segmentsManager.insertAtCursorPosition(emojiInsertText, inputStyle: .direct) + } + } else { + // 通常モード: クライアントに直接挿入 + if !emojiInsertText.isEmpty { + client.insertText(emojiInsertText, replacementRange: NSRange(location: NSNotFound, length: 0)) + } + } + self.segmentsManager.clearEmojiInput() + case .cancelEmojiInput: + self.segmentsManager.clearEmojiInput() + case .selectNextEmojiCandidate: + self.segmentsManager.selectNextEmojiCandidate() + case .selectPrevEmojiCandidate: + self.segmentsManager.selectPrevEmojiCandidate() // MARK: 特殊ケース case .consume: // 何もせず先に進む @@ -551,6 +601,14 @@ class azooKeyMacInputController: IMKInputController, NSMenuItemValidation { // s self.inputState = self.segmentsManager.isEmpty ? ifIsEmpty : ifIsNotEmpty } + // 絵文字入力モード (通常 or 入れ子) に遷移・継続している場合、クエリに合わせて候補を更新 + switch self.inputState { + case .emojiInput(let query), .emojiInputNested(let query): + self.segmentsManager.updateEmojiCandidates(query: query) + default: + break + } + self.refreshMarkedText() self.refreshCandidateWindow() self.refreshPredictionWindow() @@ -575,7 +633,13 @@ class azooKeyMacInputController: IMKInputController, NSMenuItemValidation { // s var rect: NSRect = .zero self.client().attributes(forCharacterIndex: 0, lineHeightRectangle: &rect) self.candidatesViewController.showCandidateIndex = true - let candidatePresentations = self.segmentsManager.makeCandidatePresentations(candidates) + let candidatePresentations: [CandidatePresentation] + switch self.inputState { + case .emojiInput, .emojiInputNested: + candidatePresentations = self.segmentsManager.makeEmojiCandidatePresentations() + default: + candidatePresentations = self.segmentsManager.makeCandidatePresentations(candidates) + } self.candidatesViewController.updateCandidatePresentations( candidatePresentations, selectionIndex: selectionIndex, diff --git a/azooKeyMac/Windows/ConfigWindow.swift b/azooKeyMac/Windows/ConfigWindow.swift index d9bcd4a3..fb2208c6 100644 --- a/azooKeyMac/Windows/ConfigWindow.swift +++ b/azooKeyMac/Windows/ConfigWindow.swift @@ -23,6 +23,8 @@ struct ConfigWindow: View { @ConfigState private var systemUserDictionary = Config.SystemUserDictionary() @ConfigState private var keyboardLayout = Config.KeyboardLayout() @ConfigState private var aiBackend = Config.AIBackendPreference() + @ConfigState private var emojiInputEnabled = Config.EmojiInputEnabled() + @ConfigState private var emojiInputTrigger = Config.EmojiInputTrigger() @State private var selectedTab: Tab = .basic @State private var zenzaiProfileHelpPopover = false @@ -485,6 +487,25 @@ struct ConfigWindow: View { Label("入力オプション", systemImage: "character.cursor.ibeam") } + Section { + Toggle("絵文字入力を有効にする", isOn: $emojiInputEnabled) + if emojiInputEnabled.value { + LabeledContent { + TextField("", text: $emojiInputTrigger) + .textFieldStyle(.roundedBorder) + .frame(width: 80) + .multilineTextAlignment(.center) + } label: { + Text("起動トリガー文字") + } + Text("日本語入力中にトリガー文字を打つと絵文字候補が表示されます (例: 「:」「;」「/」)") + .font(.caption) + .foregroundColor(.secondary) + } + } header: { + Label("絵文字入力", systemImage: "face.smiling") + } + Section { Picker("履歴学習", selection: $learning) { Text("学習する").tag(Config.Learning.Value.inputAndOutput)