From f6c1c84d9069d7551c41784668bd550672df15b0 Mon Sep 17 00:00:00 2001 From: nielsandriesse Date: Thu, 12 Nov 2020 07:58:56 +1100 Subject: [PATCH] Remove various unused files --- Gemfile | 5 - Gemfile.lock | 212 ------- Jenkinsfile | 56 -- Loki/LokiTestUtilities.swift | 54 -- Loki/MultiDeviceProtocolTests.swift | 63 -- Loki/OnionRequestAPITests.swift | 24 - Loki/SessionManagementProtocolTests.swift | 9 - Loki/SyncMessagesProtocolTests.swift | 56 -- Loki/XCTest+Utilities.swift | 47 -- Makefile | 45 -- Scripts/AuditStringH.py | 106 ---- Scripts/ClearDerivedData.sh | 3 - Scripts/HardResetGit.sh | 4 - Scripts/bump_build_tag.py | 206 ------- Scripts/debug_log_upload.py | 73 --- Scripts/emoji-data.txt | 679 ---------------------- Scripts/emoji_ranges.py | 88 --- Scripts/git_hooks/README.md | 1 - Scripts/git_hooks/post-commit | 3 - Scripts/git_hooks/pre-commit | 3 - Scripts/precommit.py | 475 --------------- Scripts/reverse_integration_check.py | 98 ---- Scripts/update_plist_info.sh | 37 -- Signal.xcodeproj/project.pbxproj | 15 - fastlane/.gitignore | 4 - fastlane/Appfile | 6 - fastlane/Fastfile | 27 - 27 files changed, 2399 deletions(-) delete mode 100644 Gemfile delete mode 100644 Gemfile.lock delete mode 100644 Jenkinsfile delete mode 100644 Loki/LokiTestUtilities.swift delete mode 100644 Loki/MultiDeviceProtocolTests.swift delete mode 100644 Loki/OnionRequestAPITests.swift delete mode 100644 Loki/SessionManagementProtocolTests.swift delete mode 100644 Loki/SyncMessagesProtocolTests.swift delete mode 100644 Loki/XCTest+Utilities.swift delete mode 100644 Makefile delete mode 100755 Scripts/AuditStringH.py delete mode 100755 Scripts/ClearDerivedData.sh delete mode 100755 Scripts/HardResetGit.sh delete mode 100755 Scripts/bump_build_tag.py delete mode 100755 Scripts/debug_log_upload.py delete mode 100644 Scripts/emoji-data.txt delete mode 100755 Scripts/emoji_ranges.py delete mode 100644 Scripts/git_hooks/README.md delete mode 100755 Scripts/git_hooks/post-commit delete mode 100755 Scripts/git_hooks/pre-commit delete mode 100755 Scripts/precommit.py delete mode 100755 Scripts/reverse_integration_check.py delete mode 100755 Scripts/update_plist_info.sh delete mode 100644 fastlane/.gitignore delete mode 100644 fastlane/Appfile delete mode 100644 fastlane/Fastfile diff --git a/Gemfile b/Gemfile deleted file mode 100644 index 0814db77a..000000000 --- a/Gemfile +++ /dev/null @@ -1,5 +0,0 @@ -source 'https://rubygems.org' - -gem 'cocoapods' -gem 'fastlane' - diff --git a/Gemfile.lock b/Gemfile.lock deleted file mode 100644 index 4ccf91405..000000000 --- a/Gemfile.lock +++ /dev/null @@ -1,212 +0,0 @@ -GEM - remote: https://rubygems.org/ - specs: - CFPropertyList (3.0.0) - activesupport (4.2.10) - i18n (~> 0.7) - minitest (~> 5.1) - thread_safe (~> 0.3, >= 0.3.4) - tzinfo (~> 1.1) - addressable (2.5.2) - public_suffix (>= 2.0.2, < 4.0) - atomos (0.1.3) - babosa (1.0.2) - claide (1.0.2) - cocoapods (1.5.3) - activesupport (>= 4.0.2, < 5) - claide (>= 1.0.2, < 2.0) - cocoapods-core (= 1.5.3) - cocoapods-deintegrate (>= 1.0.2, < 2.0) - cocoapods-downloader (>= 1.2.0, < 2.0) - cocoapods-plugins (>= 1.0.0, < 2.0) - cocoapods-search (>= 1.0.0, < 2.0) - cocoapods-stats (>= 1.0.0, < 2.0) - cocoapods-trunk (>= 1.3.0, < 2.0) - cocoapods-try (>= 1.1.0, < 2.0) - colored2 (~> 3.1) - escape (~> 0.0.4) - fourflusher (~> 2.0.1) - gh_inspector (~> 1.0) - molinillo (~> 0.6.5) - nap (~> 1.0) - ruby-macho (~> 1.1) - xcodeproj (>= 1.5.7, < 2.0) - cocoapods-core (1.5.3) - activesupport (>= 4.0.2, < 6) - fuzzy_match (~> 2.0.4) - nap (~> 1.0) - cocoapods-deintegrate (1.0.2) - cocoapods-downloader (1.2.2) - cocoapods-plugins (1.0.0) - nap - cocoapods-search (1.0.0) - cocoapods-stats (1.0.0) - cocoapods-trunk (1.3.1) - nap (>= 0.8, < 2.0) - netrc (~> 0.11) - cocoapods-try (1.1.0) - colored (1.2) - colored2 (3.1.2) - commander-fastlane (4.4.6) - highline (~> 1.7.2) - concurrent-ruby (1.1.3) - declarative (0.0.10) - declarative-option (0.1.0) - digest-crc (0.4.1) - domain_name (0.5.20180417) - unf (>= 0.0.5, < 1.0.0) - dotenv (2.5.0) - emoji_regex (0.1.1) - escape (0.0.4) - excon (0.62.0) - faraday (0.15.4) - multipart-post (>= 1.2, < 3) - faraday-cookie_jar (0.0.6) - faraday (>= 0.7.4) - http-cookie (~> 1.0.0) - faraday_middleware (0.12.2) - faraday (>= 0.7.4, < 1.0) - fastimage (2.1.5) - fastlane (2.112.0) - CFPropertyList (>= 2.3, < 4.0.0) - addressable (>= 2.3, < 3.0.0) - babosa (>= 1.0.2, < 2.0.0) - bundler (>= 1.12.0, < 2.0.0) - colored - commander-fastlane (>= 4.4.6, < 5.0.0) - dotenv (>= 2.1.1, < 3.0.0) - emoji_regex (~> 0.1) - excon (>= 0.45.0, < 1.0.0) - faraday (~> 0.9) - faraday-cookie_jar (~> 0.0.6) - faraday_middleware (~> 0.9) - fastimage (>= 2.1.0, < 3.0.0) - gh_inspector (>= 1.1.2, < 2.0.0) - google-api-client (>= 0.21.2, < 0.24.0) - google-cloud-storage (>= 1.15.0, < 2.0.0) - highline (>= 1.7.2, < 2.0.0) - json (< 3.0.0) - mini_magick (~> 4.5.1) - multi_json - multi_xml (~> 0.5) - multipart-post (~> 2.0.0) - plist (>= 3.1.0, < 4.0.0) - public_suffix (~> 2.0.0) - rubyzip (>= 1.2.2, < 2.0.0) - security (= 0.1.3) - simctl (~> 1.6.3) - slack-notifier (>= 2.0.0, < 3.0.0) - terminal-notifier (>= 1.6.2, < 2.0.0) - terminal-table (>= 1.4.5, < 2.0.0) - tty-screen (>= 0.6.3, < 1.0.0) - tty-spinner (>= 0.8.0, < 1.0.0) - word_wrap (~> 1.0.0) - xcodeproj (>= 1.6.0, < 2.0.0) - xcpretty (~> 0.3.0) - xcpretty-travis-formatter (>= 0.0.3) - fourflusher (2.0.1) - fuzzy_match (2.0.4) - gh_inspector (1.1.3) - google-api-client (0.23.9) - addressable (~> 2.5, >= 2.5.1) - googleauth (>= 0.5, < 0.7.0) - httpclient (>= 2.8.1, < 3.0) - mime-types (~> 3.0) - representable (~> 3.0) - retriable (>= 2.0, < 4.0) - signet (~> 0.9) - google-cloud-core (1.2.7) - google-cloud-env (~> 1.0) - google-cloud-env (1.0.5) - faraday (~> 0.11) - google-cloud-storage (1.15.0) - digest-crc (~> 0.4) - google-api-client (~> 0.23) - google-cloud-core (~> 1.2) - googleauth (~> 0.6.2) - googleauth (0.6.7) - faraday (~> 0.12) - jwt (>= 1.4, < 3.0) - memoist (~> 0.16) - multi_json (~> 1.11) - os (>= 0.9, < 2.0) - signet (~> 0.7) - highline (1.7.10) - http-cookie (1.0.3) - domain_name (~> 0.5) - httpclient (2.8.3) - i18n (0.9.5) - concurrent-ruby (~> 1.0) - json (2.1.0) - jwt (2.1.0) - memoist (0.16.0) - mime-types (3.2.2) - mime-types-data (~> 3.2015) - mime-types-data (3.2018.0812) - mini_magick (4.5.1) - minitest (5.11.3) - molinillo (0.6.6) - multi_json (1.13.1) - multi_xml (0.6.0) - multipart-post (2.0.0) - nanaimo (0.2.6) - nap (1.1.0) - naturally (2.2.0) - netrc (0.11.0) - os (1.0.0) - plist (3.5.0) - public_suffix (2.0.5) - representable (3.0.4) - declarative (< 0.1.0) - declarative-option (< 0.2.0) - uber (< 0.2.0) - retriable (3.1.2) - rouge (2.0.7) - ruby-macho (1.3.1) - rubyzip (1.2.2) - security (0.1.3) - signet (0.11.0) - addressable (~> 2.3) - faraday (~> 0.9) - jwt (>= 1.5, < 3.0) - multi_json (~> 1.10) - simctl (1.6.5) - CFPropertyList - naturally - slack-notifier (2.3.2) - terminal-notifier (1.8.0) - terminal-table (1.8.0) - unicode-display_width (~> 1.1, >= 1.1.1) - thread_safe (0.3.6) - tty-cursor (0.6.0) - tty-screen (0.6.5) - tty-spinner (0.9.0) - tty-cursor (~> 0.6.0) - tzinfo (1.2.5) - thread_safe (~> 0.1) - uber (0.1.0) - unf (0.1.4) - unf_ext - unf_ext (0.0.7.5) - unicode-display_width (1.4.1) - word_wrap (1.0.0) - xcodeproj (1.7.0) - CFPropertyList (>= 2.3.3, < 4.0) - atomos (~> 0.1.3) - claide (>= 1.0.2, < 2.0) - colored2 (~> 3.1) - nanaimo (~> 0.2.6) - xcpretty (0.3.0) - rouge (~> 2.0.7) - xcpretty-travis-formatter (1.0.0) - xcpretty (~> 0.2, >= 0.0.7) - -PLATFORMS - ruby - -DEPENDENCIES - cocoapods - fastlane - -BUNDLED WITH - 1.17.2 diff --git a/Jenkinsfile b/Jenkinsfile deleted file mode 100644 index f8dc0882d..000000000 --- a/Jenkinsfile +++ /dev/null @@ -1,56 +0,0 @@ -pipeline { - agent any - - environment { - LANG = "en_US.UTF-8" - LANGUAGE = "en_US.UTF-8" - LC_ALL = "en_US.UTF-8" - PATH = "PATH=$HOME/.rbenv/bin:$HOME/.rbenv/shims:/usr/local/bin/:$PATH" - } - - stages { - stage('env setup') { - steps { - script { - // CHANGE_ID is set only for pull requests, so it is safe to access the pullRequest global variable - if (env.CHANGE_ID) { - currentBuild.displayName = "PR #${pullRequest.number}: ${pullRequest.title}" - } - } - sh 'make setup' - } - } - stage('build dependencies') { - steps { - sh 'make dependencies' - } - } - stage('test') { - steps { - ansiColor('xterm') { - sh 'make test' - } - } - } - } - - post { - success { - script { - // CHANGE_ID is set only for pull requests, so it is safe to access the pullRequest global variable - if (env.CHANGE_ID) { - def comment = pullRequest.comment("๐Ÿ‘ Build PASSED commit: ${pullRequest.head}\nbuild: ${currentBuild.absoluteUrl}") - } - } - } - - failure { - script { - // CHANGE_ID is set only for pull requests, so it is safe to access the pullRequest global variable - if (env.CHANGE_ID) { - def comment = pullRequest.comment("๐Ÿ’ฅ Build FAILED commit: ${pullRequest.head}\nbuild: ${currentBuild.absoluteUrl}") - } - } - } - } -} diff --git a/Loki/LokiTestUtilities.swift b/Loki/LokiTestUtilities.swift deleted file mode 100644 index 9a09bd5e6..000000000 --- a/Loki/LokiTestUtilities.swift +++ /dev/null @@ -1,54 +0,0 @@ -import Foundation -import SignalServiceKit -import Curve25519Kit - -enum LokiTestUtilities { - - public static func setUpMockEnvironment() { - // Activate the mock Signal environment - ClearCurrentAppContextForTests() - SetCurrentAppContext(TestAppContext()) - MockSSKEnvironment.activate() - // Register a mock user - let identityManager = OWSIdentityManager.shared() - let seed = Randomness.generateRandomBytes(16)! - let keyPair = Curve25519.generateKeyPair(fromSeed: seed + seed) - let databaseConnection = identityManager.value(forKey: "dbConnection") as! YapDatabaseConnection - databaseConnection.setObject(keyPair, forKey: OWSPrimaryStorageIdentityKeyStoreIdentityKey, inCollection: OWSPrimaryStorageIdentityKeyStoreCollection) - TSAccountManager.sharedInstance().phoneNumberAwaitingVerification = keyPair.hexEncodedPublicKey - TSAccountManager.sharedInstance().didRegister() - } - - public static func generateKeyPair() -> ECKeyPair { - return Curve25519.generateKeyPair() - } - - public static func getCurrentUserHexEncodedPublicKey() -> String { - return OWSIdentityManager.shared().identityKeyPair()!.hexEncodedPublicKey - } - - public static func generateHexEncodedPublicKey() -> String { - return generateKeyPair().hexEncodedPublicKey - } - - public static func getDevice(for hexEncodedPublicKey: String) -> DeviceLink.Device? { - guard let signature = Data.getSecureRandomData(ofSize: 64) else { return nil } - return DeviceLink.Device(hexEncodedPublicKey: hexEncodedPublicKey, signature: signature) - } - - public static func createContactThread(for hexEncodedPublicKey: String) -> TSContactThread { - return TSContactThread.getOrCreateThread(contactId: hexEncodedPublicKey) - } - - public static func createGroupThread(groupType: GroupType) -> TSGroupThread? { - let hexEncodedGroupID = Randomness.generateRandomBytes(kGroupIdLength)!.toHexString() - let groupID: Data - switch groupType { - case .closedGroup: groupID = LKGroupUtilities.getEncodedClosedGroupIDAsData(hexEncodedGroupID) - case .openGroup: groupID = LKGroupUtilities.getEncodedOpenGroupIDAsData(hexEncodedGroupID) - case .rssFeed: groupID = LKGroupUtilities.getEncodedRSSFeedIDAsData(hexEncodedGroupID) - default: return nil - } - return TSGroupThread.getOrCreateThread(withGroupId: groupID, groupType: groupType) - } -} diff --git a/Loki/MultiDeviceProtocolTests.swift b/Loki/MultiDeviceProtocolTests.swift deleted file mode 100644 index 8ed82c1b2..000000000 --- a/Loki/MultiDeviceProtocolTests.swift +++ /dev/null @@ -1,63 +0,0 @@ -/* -import PromiseKit -@testable import SignalServiceKit -import XCTest - -class MultiDeviceProtocolTests : XCTestCase { - - private var storage: OWSPrimaryStorage { OWSPrimaryStorage.shared() } - - override func setUp() { - super.setUp() - LokiTestUtilities.setUpMockEnvironment() - } - - // MARK: - isSlaveThread - - func test_isSlaveThreadShouldReturnFalseOnGroupThreads() { - let allGroupTypes: [GroupType] = [ .closedGroup, .openGroup, .rssFeed ] - for groupType in allGroupTypes { - guard let groupThread = LokiTestUtilities.createGroupThread(groupType: groupType) else { return XCTFail() } - XCTAssertFalse(MultiDeviceProtocol.isSlaveThread(groupThread)) - } - } - - func test_isSlaveThreadShouldReturnTheCorrectValues() { - let master = LokiTestUtilities.generateHexEncodedPublicKey() - let slave = LokiTestUtilities.generateHexEncodedPublicKey() - let other = LokiTestUtilities.generateHexEncodedPublicKey() - - guard let masterDevice = LokiTestUtilities.getDevice(for: master) else { return XCTFail() } - guard let slaveDevice = LokiTestUtilities.getDevice(for: slave) else { return XCTFail() } - - let deviceLink = DeviceLink(between: masterDevice, and: slaveDevice) - - storage.dbReadWriteConnection.readWrite { transaction in - self.storage.addDeviceLink(deviceLink, in: transaction) - } - - let masterThread = LokiTestUtilities.createContactThread(for: master) - let slaveThread = LokiTestUtilities.createContactThread(for: slave) - let otherThread = LokiTestUtilities.createContactThread(for: other) - - storage.dbReadConnection.read { transaction in - XCTAssertNotNil(self.storage.getMasterHexEncodedPublicKey(for: slaveThread.contactIdentifier(), in: transaction)) - } - - XCTAssertFalse(MultiDeviceProtocol.isSlaveThread(masterThread)) - XCTAssertTrue(MultiDeviceProtocol.isSlaveThread(slaveThread)) - XCTAssertFalse(MultiDeviceProtocol.isSlaveThread(otherThread)) - } - - func test_isSlaveThreadShouldWorkInsideATransaction() { - let bob = LokiTestUtilities.generateHexEncodedPublicKey() - let thread = LokiTestUtilities.createContactThread(for: bob) - storage.dbReadWriteConnection.read { transaction in - XCTAssertNoThrow(MultiDeviceProtocol.isSlaveThread(thread)) - } - storage.dbReadWriteConnection.readWrite { transaction in - XCTAssertNoThrow(MultiDeviceProtocol.isSlaveThread(thread)) - } - } -} - */ diff --git a/Loki/OnionRequestAPITests.swift b/Loki/OnionRequestAPITests.swift deleted file mode 100644 index 164bcc9b8..000000000 --- a/Loki/OnionRequestAPITests.swift +++ /dev/null @@ -1,24 +0,0 @@ -import CryptoSwift -import PromiseKit -@testable import SignalServiceKit -import XCTest - -class OnionRequestAPITests : XCTestCase { - private let maxRetryCount: UInt = 2 // Be a bit more stringent when testing - private let testPublicKey = "0501da4723331eb54aaa9a6753a0a59f762103de63f1dc40879cb65a5b5f508814" - - func testOnionRequestSending() { - let semaphore = DispatchSemaphore(value: 0) - var error: Error? = nil - LokiAPI.useOnionRequests = true - let _ = attempt(maxRetryCount: maxRetryCount, recoveringOn: LokiAPI.workQueue) { [testPublicKey = self.testPublicKey] in - LokiAPI.getSwarm(for: testPublicKey) - }.done(on: LokiAPI.workQueue) { _ in - semaphore.signal() - }.catch(on: LokiAPI.workQueue) { - error = $0; semaphore.signal() - } - semaphore.wait() - XCTAssert(error == nil) - } -} diff --git a/Loki/SessionManagementProtocolTests.swift b/Loki/SessionManagementProtocolTests.swift deleted file mode 100644 index 4daf58284..000000000 --- a/Loki/SessionManagementProtocolTests.swift +++ /dev/null @@ -1,9 +0,0 @@ -import PromiseKit -@testable import SignalServiceKit -import XCTest - -class SessionManagementProtocolTests : XCTestCase { - - // TODO: Add tests - -} diff --git a/Loki/SyncMessagesProtocolTests.swift b/Loki/SyncMessagesProtocolTests.swift deleted file mode 100644 index aa12ceea8..000000000 --- a/Loki/SyncMessagesProtocolTests.swift +++ /dev/null @@ -1,56 +0,0 @@ -/* -import PromiseKit -@testable import SignalServiceKit -import XCTest - -class SyncMessagesProtocolTests : XCTestCase { - - private var storage: OWSPrimaryStorage { OWSPrimaryStorage.shared() } - private var messageSender: OWSFakeMessageSender { MockSSKEnvironment.shared.messageSender as! OWSFakeMessageSender } - - override func setUp() { - super.setUp() - LokiTestUtilities.setUpMockEnvironment() - } - - func testContactSyncMessageHandling() { - // Let's say Alice and Bob have an ongoing conversation. Alice now links a device. Let's call Alice's master device A1 - // and her slave device A2, and let's call Bob's device B. When Alice links A2 to A1, A2 needs to somehow establish a - // session with B (it already established a session with A1 when the devices were linked). How does it do this? - // - // As part of the linking process, A2 should've received a contact sync from A1. Upon receiving this contact sync, - // A2 should send out AFRs to the subset of the contacts it received from A1 for which it doesn't yet have a session (in - // theory this should be all of them). - let base64EncodedContactData = "AAAA7QpCMDU0ZmI2M2IxYTU4YjU1YTcwNjMxODkyOWRjNmQxMWM4ZWY3OTAxMTZhNzRjOWFmNTVmYTZhMzZlNjhmMTYzYTMyEhBZMyAoLi4uOGYxNjNhMzIpIgZvcmFuZ2UqaQpCMDU0ZmI2M2IxYTU4YjU1YTcwNjMxODkyOWRjNmQxMWM4ZWY3OTAxMTZhNzRjOWFmNTVmYTZhMzZlNjhmMTYzYTMyEiEFT7Y7Gli1WnBjGJKdxtEcjveQEWp0ya9V+mo25o8WOjIYADIgXAgtAlrJr81tnuWyk8TgJhdsKzz+yIui5mXnbcMyPk1AAAAAAOwKQjA1Nzg4MmQzM2E4OTI1NDdiOTI2NjIyYjk0ZDZjMWNmYjI1ZmY2YTczZmQ4OTZlMWIxNmY1ODI0NzRjZjQ3MDE2YhIQWTQgKC4uLmNmNDcwMTZiKSIFYnJvd24qaQpCMDU3ODgyZDMzYTg5MjU0N2I5MjY2MjJiOTRkNmMxY2ZiMjVmZjZhNzNmZDg5NmUxYjE2ZjU4MjQ3NGNmNDcwMTZiEiEFeILTOoklR7kmYiuU1sHPsl/2pz/YluGxb1gkdM9HAWsYADIgD1QA1ofVIccRhbx8AnbygQYo5iOiyGUMG/sGNP1ENRJAAAAAAPAKQjA1OTUyYTRiNTFjNDJkZWE2OWEwYWNhNWU2OTgxYTQ2MDk0NGI2Yjc0NjdkOWQ5OTliOWU3NjExNzdkYWI1NzIxMxIQWTEgKC4uLmRhYjU3MjEzKSIJYmx1ZV9ncmV5KmkKQjA1OTUyYTRiNTFjNDJkZWE2OWEwYWNhNWU2OTgxYTQ2MDk0NGI2Yjc0NjdkOWQ5OTliOWU3NjExNzdkYWI1NzIxMxIhBZUqS1HELeppoKyl5pgaRglEtrdGfZ2Zm552EXfatXITGAAyIBkyX0S08IAuov6faUvaxYsfJtdpww1G4LF6bG5vG7L+QAA=" - let contactData = Data(base64Encoded: base64EncodedContactData)! - let parser = ContactParser(data: contactData) - let hexEncodedPublicKeys = parser.parseHexEncodedPublicKeys() - let expectation = self.expectation(description: "Send friend request messages") - var messageCount = 0 - let messageSender = self.messageSender - messageSender.sendMessageWasCalledBlock = { sentMessage in - messageCount += 1 - guard sentMessage is FriendRequestMessage else { - return XCTFail("Expected a friend request to be sent, but found: \(sentMessage).") - } - guard messageCount == hexEncodedPublicKeys.count else { return } - expectation.fulfill() - messageSender.sendMessageWasCalledBlock = nil - } - storage.dbReadWriteConnection.readWrite { transaction in - SyncMessagesProtocol.handleContactSyncMessageData(contactData, using: transaction) - } - wait(for: [ expectation ], timeout: 1) - /* TODO: Re-enable when we've split friend request logic from OWSMessageSender - hexEncodedPublicKeys.forEach { hexEncodedPublicKey in - var friendRequestStatus: LKFriendRequestStatus! - storage.dbReadWriteConnection.readWrite { transaction in - friendRequestStatus = self.storage.getFriendRequestStatus(for: hexEncodedPublicKey, transaction: transaction) - } - XCTAssert(friendRequestStatus == .requestSent) - } - */ - // TODO: Test the case where Bob has multiple devices - } -} - */ diff --git a/Loki/XCTest+Utilities.swift b/Loki/XCTest+Utilities.swift deleted file mode 100644 index 85ab48e75..000000000 --- a/Loki/XCTest+Utilities.swift +++ /dev/null @@ -1,47 +0,0 @@ -import XCTest - -extension XCTestCase { - - /// A helper for asynchronous testing. - /// - /// Usage example: - /// - /// ``` - /// func testSomething() { - /// doAsyncThings() - /// eventually { - /// /* XCTAssert goes here... */ - /// } - /// } - /// ``` - /// - /// The provided closure won't execute until `timeout` seconds have passed. Pass - /// in a timeout long enough for your asynchronous process to finish if it's - /// expected to take more than the default 0.1 second. - /// - /// - Parameters: - /// - timeout: number of seconds to wait before executing `closure`. - /// - closure: a closure to execute when `timeout` seconds have passed. - /// - /// - Note: `timeout` must be less than 60 seconds. - func eventually(timeout: TimeInterval = 0.1, closure: @escaping () -> Void) { - assert(timeout < 60) - let expectation = self.expectation(description: "") - expectation.fulfillAfter(timeout) - self.waitForExpectations(timeout: 60) { _ in - closure() - } - } -} - -extension XCTestExpectation { - - /// Call `fulfill()` after some time. - /// - /// - Parameter time: number of seconds after which `fulfill()` will be called. - func fulfillAfter(_ time: TimeInterval) { - DispatchQueue.main.asyncAfter(deadline: .now() + time) { - self.fulfill() - } - } -} diff --git a/Makefile b/Makefile deleted file mode 100644 index a9a0e6163..000000000 --- a/Makefile +++ /dev/null @@ -1,45 +0,0 @@ -# Make sure we're failing even though we pipe to xcpretty -SHELL=/bin/bash -o pipefail -o errexit - -WORKING_DIR = ./ -THIRD_PARTY_DIR = $(WORKING_DIR)/ThirdParty -SCHEME = Signal -XCODE_BUILD = xcrun xcodebuild -workspace $(SCHEME).xcworkspace -scheme $(SCHEME) -sdk iphonesimulator - -.PHONY: build test retest clean dependencies - -default: test - -update_dependencies: - bundle exec pod update - carthage update --platform iOS - -setup: - rbenv install -s - gem install bundler - bundle install - -dependencies: - cd $(WORKING_DIR) && \ - git submodule update --init - cd $(THIRD_PARTY_DIR) && \ - carthage build --platform iOS - -build: dependencies - cd $(WORKING_DIR) && \ - $(XCODE_BUILD) build | xcpretty - -test: - bundle exec fastlane test - -clean: clean_carthage - cd $(WORKING_DIR) && \ - $(XCODE_BUILD) clean | xcpretty - -clean_carthage: - cd $(THIRD_PARTY_DIR) && \ - rm -fr Carthage/Build - -# Migrating across swift versions requires me to run this sometimes -clean_carthage_cache: - rm -fr ~/Library/Caches/org.carthage.CarthageKit/ diff --git a/Scripts/AuditStringH.py b/Scripts/AuditStringH.py deleted file mode 100755 index 1f8d9f7d0..000000000 --- a/Scripts/AuditStringH.py +++ /dev/null @@ -1,106 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -import os -import sys -import subprocess -import datetime -import argparse -import commands -import re - -git_repo_path = os.path.abspath(subprocess.check_output(['git', 'rev-parse', '--show-toplevel']).strip()) - -string_h_functions = [ - "memchr", - "memcmp", - "memcpy", - "memmove", - "memset", - "strcat", - "strchr", - "strcmp", - "strcoll", - "strcpy", - "strcspn", - "strerror", - "strlen", - "strncat", - "strncmp", - "strncpy", - "strpbrk", - "strrchr", - "strspn", - "strstr", - "strtok", - "strxfrm", - "strtok_r", - "strerror_r", - "strdup", - "memccpy", - "stpcpy", - "stpncpy", - "strndup", - "strnlen", - "strsignal", - "memset_s", - "memmem", - "memset_pattern4", - "memset_pattern8", - "memset_pattern16", - "strcasestr", - "strnstr", - "strlcat", - "strlcpy", - "strmode", - "strsep", - "swab", - "timingsafe_bcmp", - ] - - -def process_if_appropriate(file_path): - file_ext = os.path.splitext(file_path)[1] - if file_ext.lower() not in ('.c', '.cpp', '.m', '.mm', '.h', '.swift'): - return - # print 'file_path', file_path, 'file_ext', file_ext - - with open(file_path, 'rt') as f: - text = f.read() - - has_match = False - for string_h_function in string_h_functions: - regex = re.compile(string_h_function + r'\s*\(') - assert(regex) - matches = [] - for match in regex.finditer(text): - matches.append(match) - # matches = regex.findall(text) - if not matches: - continue - if not has_match: - has_match = True - print 'file_path', file_path, 'file_ext', file_ext - for match in matches: - # print 'match', match, type(match) - print '\t', 'match:', match.group(0) - if has_match: - print - - -if __name__ == "__main__": - - parser = argparse.ArgumentParser(description='Precommit script.') - parser.add_argument('--path', help='used to specify a path to process.') - args = parser.parse_args() - - - if args.path: - dir_path = args.path - else: - dir_path = git_repo_path - - for rootdir, dirnames, filenames in os.walk(dir_path): - for filename in filenames: - file_path = os.path.abspath(os.path.join(rootdir, filename)) - process_if_appropriate(file_path) diff --git a/Scripts/ClearDerivedData.sh b/Scripts/ClearDerivedData.sh deleted file mode 100755 index f4a9064a2..000000000 --- a/Scripts/ClearDerivedData.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -rm -rf ~/Library/Developer/Xcode/DerivedData \ No newline at end of file diff --git a/Scripts/HardResetGit.sh b/Scripts/HardResetGit.sh deleted file mode 100755 index d37c7eed9..000000000 --- a/Scripts/HardResetGit.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -git reset --hard HEAD -git clean -xdff diff --git a/Scripts/bump_build_tag.py b/Scripts/bump_build_tag.py deleted file mode 100755 index 6569a4daf..000000000 --- a/Scripts/bump_build_tag.py +++ /dev/null @@ -1,206 +0,0 @@ -#!/usr/bin/env python -import sys -import os -import re -import commands -import subprocess -import argparse -import inspect - -def fail(message): - file_name = __file__ - current_line_no = inspect.stack()[1][2] - current_function_name = inspect.stack()[1][3] - print 'Failure in:', file_name, current_line_no, current_function_name - print message - sys.exit(1) - - -def execute_command(command): - try: - print ' '.join(command) - output = subprocess.check_output(command) - if output: - print output - except subprocess.CalledProcessError as e: - print e.output - sys.exit(1) - - -def find_project_root(): - path = os.path.abspath(os.curdir) - - while True: - # print 'path', path - if not os.path.exists(path): - break - git_path = os.path.join(path, '.git') - if os.path.exists(git_path): - return path - new_path = os.path.abspath(os.path.dirname(path)) - if not new_path or new_path == path: - break - path = new_path - - fail('Could not find project root path') - - -def is_valid_release_version(value): - regex = re.compile(r'^(\d+)\.(\d+)\.(\d+)$') - match = regex.search(value) - return match is not None - - -def is_valid_build_version(value): - regex = re.compile(r'^(\d+)\.(\d+)\.(\d+)\.(\d+)$') - match = regex.search(value) - return match is not None - - -def set_versions(plist_file_path, release_version, build_version): - if not is_valid_release_version(release_version): - fail('Invalid release version: %s' % release_version) - if not is_valid_build_version(build_version): - fail('Invalid build version: %s' % build_version) - - with open(plist_file_path, 'rt') as f: - text = f.read() - # print 'text', text - - # The "short" version is the release number. - # - # CFBundleShortVersionString - # 2.20.0 - file_regex = re.compile(r'CFBundleShortVersionString\s*([\d\.]+)', re.MULTILINE) - file_match = file_regex.search(text) - # print 'match', match - if not file_match: - fail('Could not parse .plist') - text = text[:file_match.start(1)] + release_version + text[file_match.end(1):] - - # The "long" version is the build number. - # - # CFBundleVersion - # 2.20.0.3 - file_regex = re.compile(r'CFBundleVersion\s*([\d\.]+)', re.MULTILINE) - file_match = file_regex.search(text) - # print 'match', match - if not file_match: - fail('Could not parse .plist') - text = text[:file_match.start(1)] + build_version + text[file_match.end(1):] - - with open(plist_file_path, 'wt') as f: - f.write(text) - - -def get_versions(plist_file_path): - with open(plist_file_path, 'rt') as f: - text = f.read() - # print 'text', text - - # CFBundleVersion - # 2.13.0.13 - file_regex = re.compile(r'CFBundleVersion\s*([\d\.]+)', re.MULTILINE) - file_match = file_regex.search(text) - # print 'match', match - if not file_match: - fail('Could not parse .plist') - - # e.g. "2.13.0.13" - old_build_version = file_match.group(1) - print 'old_build_version:', old_build_version - - if not is_valid_build_version(old_build_version): - fail('Invalid build version: %s' % old_build_version) - - build_number_regex = re.compile(r'\.(\d+)$') - build_number_match = build_number_regex.search(old_build_version) - if not build_number_match: - fail('Could not parse .plist version') - - # e.g. "13" - old_build_number = build_number_match.group(1) - print 'old_build_number:', old_build_number - - release_number_regex = re.compile(r'^(.+)\.\d+$') - release_number_match = release_number_regex.search(old_build_version) - if not release_number_match: - fail('Could not parse .plist') - - # e.g. "2.13.0" - old_release_version = release_number_match.group(1) - print 'old_release_version:', old_release_version - - # Given "2.13.0.13", this should return "2.13.0" and "13" as strings. - return old_release_version, old_build_number - - -if __name__ == '__main__': - parser = argparse.ArgumentParser(description='Precommit cleanup script.') - parser.add_argument('--version', help='used for starting a new version.') - - args = parser.parse_args() - - project_root_path = find_project_root() - # print 'project_root_path', project_root_path - # plist_path - main_plist_path = os.path.join(project_root_path, 'Signal', 'Signal-Info.plist') - if not os.path.exists(main_plist_path): - fail('Could not find main app info .plist') - share_ext_plist_path = os.path.join(project_root_path, 'SignalShareExtension', 'Info.plist') - if not os.path.exists(share_ext_plist_path): - fail('Could not find share extension info .plist') - - output = subprocess.check_output(['git', 'status', '--porcelain']) - if len(output.strip()) > 0: - print output - fail('Git repository has untracked files.') - output = subprocess.check_output(['git', 'diff', '--shortstat']) - if len(output.strip()) > 0: - print output - fail('Git repository has untracked files.') - - # Ensure .plist is in xml format, not binary. - output = subprocess.check_output(['plutil', '-convert', 'xml1', main_plist_path]) - output = subprocess.check_output(['plutil', '-convert', 'xml1', share_ext_plist_path]) - # print 'output', output - - # --------------- - # Main App - # --------------- - - old_release_version, old_build_number = get_versions(main_plist_path) - - if args.version: - # e.g. --version 1.2.3 -> "1.2.3", "1.2.3.0" - new_release_version = args.version.strip() - new_build_version = new_release_version + ".0" - else: - new_build_number = str(1 + int(old_build_number)) - print 'new_build_number:', new_build_number - - new_release_version = old_release_version - new_build_version = old_release_version + "." + new_build_number - - print 'new_release_version:', new_release_version - print 'new_build_version:', new_build_version - - set_versions(main_plist_path, new_release_version, new_build_version) - - # --------------- - # Share Extension - # --------------- - - set_versions(share_ext_plist_path, new_release_version, new_build_version) - - # --------------- - # Git - # --------------- - command = ['git', 'add', '.'] - execute_command(command) - command = ['git', 'commit', '-m', '"Bump build to %s."' % new_build_version] - execute_command(command) - command = ['git', 'tag', new_build_version] - execute_command(command) - - diff --git a/Scripts/debug_log_upload.py b/Scripts/debug_log_upload.py deleted file mode 100755 index dd6a3239c..000000000 --- a/Scripts/debug_log_upload.py +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/env python -import sys -import os -import re -import commands -import subprocess -import argparse -import inspect -import urllib2 -import json - -def fail(message): - file_name = __file__ - current_line_no = inspect.stack()[1][2] - current_function_name = inspect.stack()[1][3] - print 'Failure in:', file_name, current_line_no, current_function_name - print message - sys.exit(1) - - -def execute_command(command): - try: - print ' '.join(command) - output = subprocess.check_output(command) - if output: - print output - except subprocess.CalledProcessError as e: - print e.output - sys.exit(1) - -def add_field(curl_command, form_key, form_value): - curl_command.append('-F') - curl_command.append("%s=%s" % (form_key, form_value)) - -if __name__ == '__main__': - parser = argparse.ArgumentParser(description='Precommit cleanup script.') - parser.add_argument('--file', required=True, help='used for starting a new version.') - - args = parser.parse_args() - - params_response = urllib2.urlopen("https://debuglogs.org/").read() - - params = json.loads(params_response) - - upload_url = params['url'] - upload_fields = params['fields'] - - upload_key = upload_fields.pop('key') - upload_key = upload_key + os.path.splitext(args.file)[1] - - download_url = 'https://debuglogs.org/' + upload_key - print 'download_url:', download_url - - curl_command = ['curl', '-v', '-i', '-X', 'POST'] - - # key must appear before other fields - add_field(curl_command, 'key', upload_key) - for field_name in upload_fields: - add_field(curl_command, field_name, upload_fields[field_name]) - - add_field(curl_command, "content-type", "application/octet-stream") - - curl_command.append('-F') - curl_command.append("file=@%s" % (args.file,)) - curl_command.append(upload_url) - - print ' '.join(curl_command) - - print 'Running...' - execute_command(curl_command) - - print 'download_url:', download_url - diff --git a/Scripts/emoji-data.txt b/Scripts/emoji-data.txt deleted file mode 100644 index dadf63173..000000000 --- a/Scripts/emoji-data.txt +++ /dev/null @@ -1,679 +0,0 @@ -# emoji-data.txt -# Date: 2017-08-10, 11:51:32 GMT -# ยฉ 2017 Unicodeยฎ, Inc. -# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. -# For terms of use, see http://www.unicode.org/terms_of_use.html -# -# Emoji Data for UTR #51 -# Version: 6.0 -# -# For documentation and usage, see http://www.unicode.org/reports/tr51 -# -# Format: -# ; # -# Note: there is no guarantee as to the structure of whitespace or comments -# -# Characters and sequences are listed in code point order. Users should be shown a more natural order. -# See the CLDR collation order for Emoji. - - -# ================================================ - -# All omitted code points have Emoji=No -# @missing: 0000..10FFFF ; Emoji ; No - -0023 ; Emoji # 1.1 [1] (#๏ธ) number sign -002A ; Emoji # 1.1 [1] (*๏ธ) asterisk -0030..0039 ; Emoji # 1.1 [10] (0๏ธ..9๏ธ) digit zero..digit nine -00A9 ; Emoji # 1.1 [1] (ยฉ๏ธ) copyright -00AE ; Emoji # 1.1 [1] (ยฎ๏ธ) registered -203C ; Emoji # 1.1 [1] (โ€ผ๏ธ) double exclamation mark -2049 ; Emoji # 3.0 [1] (โ‰๏ธ) exclamation question mark -2122 ; Emoji # 1.1 [1] (โ„ข๏ธ) trade mark -2139 ; Emoji # 3.0 [1] (โ„น๏ธ) information -2194..2199 ; Emoji # 1.1 [6] (โ†”๏ธ..โ†™๏ธ) left-right arrow..down-left arrow -21A9..21AA ; Emoji # 1.1 [2] (โ†ฉ๏ธ..โ†ช๏ธ) right arrow curving left..left arrow curving right -231A..231B ; Emoji # 1.1 [2] (โŒš..โŒ›) watch..hourglass done -2328 ; Emoji # 1.1 [1] (โŒจ๏ธ) keyboard -23CF ; Emoji # 4.0 [1] (โ๏ธ) eject button -23E9..23F3 ; Emoji # 6.0 [11] (โฉ..โณ) fast-forward button..hourglass not done -23F8..23FA ; Emoji # 7.0 [3] (โธ๏ธ..โบ๏ธ) pause button..record button -24C2 ; Emoji # 1.1 [1] (โ“‚๏ธ) circled M -25AA..25AB ; Emoji # 1.1 [2] (โ–ช๏ธ..โ–ซ๏ธ) black small square..white small square -25B6 ; Emoji # 1.1 [1] (โ–ถ๏ธ) play button -25C0 ; Emoji # 1.1 [1] (โ—€๏ธ) reverse button -25FB..25FE ; Emoji # 3.2 [4] (โ—ป๏ธ..โ—พ) white medium square..black medium-small square -2600..2604 ; Emoji # 1.1 [5] (โ˜€๏ธ..โ˜„๏ธ) sun..comet -260E ; Emoji # 1.1 [1] (โ˜Ž๏ธ) telephone -2611 ; Emoji # 1.1 [1] (โ˜‘๏ธ) ballot box with check -2614..2615 ; Emoji # 4.0 [2] (โ˜”..โ˜•) umbrella with rain drops..hot beverage -2618 ; Emoji # 4.1 [1] (โ˜˜๏ธ) shamrock -261D ; Emoji # 1.1 [1] (โ˜๏ธ) index pointing up -2620 ; Emoji # 1.1 [1] (โ˜ ๏ธ) skull and crossbones -2622..2623 ; Emoji # 1.1 [2] (โ˜ข๏ธ..โ˜ฃ๏ธ) radioactive..biohazard -2626 ; Emoji # 1.1 [1] (โ˜ฆ๏ธ) orthodox cross -262A ; Emoji # 1.1 [1] (โ˜ช๏ธ) star and crescent -262E..262F ; Emoji # 1.1 [2] (โ˜ฎ๏ธ..โ˜ฏ๏ธ) peace symbol..yin yang -2638..263A ; Emoji # 1.1 [3] (โ˜ธ๏ธ..โ˜บ๏ธ) wheel of dharma..smiling face -2640 ; Emoji # 1.1 [1] (โ™€๏ธ) female sign -2642 ; Emoji # 1.1 [1] (โ™‚๏ธ) male sign -2648..2653 ; Emoji # 1.1 [12] (โ™ˆ..โ™“) Aries..Pisces -2660 ; Emoji # 1.1 [1] (โ™ ๏ธ) spade suit -2663 ; Emoji # 1.1 [1] (โ™ฃ๏ธ) club suit -2665..2666 ; Emoji # 1.1 [2] (โ™ฅ๏ธ..โ™ฆ๏ธ) heart suit..diamond suit -2668 ; Emoji # 1.1 [1] (โ™จ๏ธ) hot springs -267B ; Emoji # 3.2 [1] (โ™ป๏ธ) recycling symbol -267F ; Emoji # 4.1 [1] (โ™ฟ) wheelchair symbol -2692..2697 ; Emoji # 4.1 [6] (โš’๏ธ..โš—๏ธ) hammer and pick..alembic -2699 ; Emoji # 4.1 [1] (โš™๏ธ) gear -269B..269C ; Emoji # 4.1 [2] (โš›๏ธ..โšœ๏ธ) atom symbol..fleur-de-lis -26A0..26A1 ; Emoji # 4.0 [2] (โš ๏ธ..โšก) warning..high voltage -26AA..26AB ; Emoji # 4.1 [2] (โšช..โšซ) white circle..black circle -26B0..26B1 ; Emoji # 4.1 [2] (โšฐ๏ธ..โšฑ๏ธ) coffin..funeral urn -26BD..26BE ; Emoji # 5.2 [2] (โšฝ..โšพ) soccer ball..baseball -26C4..26C5 ; Emoji # 5.2 [2] (โ›„..โ›…) snowman without snow..sun behind cloud -26C8 ; Emoji # 5.2 [1] (โ›ˆ๏ธ) cloud with lightning and rain -26CE ; Emoji # 6.0 [1] (โ›Ž) Ophiuchus -26CF ; Emoji # 5.2 [1] (โ›๏ธ) pick -26D1 ; Emoji # 5.2 [1] (โ›‘๏ธ) rescue workerโ€™s helmet -26D3..26D4 ; Emoji # 5.2 [2] (โ›“๏ธ..โ›”) chains..no entry -26E9..26EA ; Emoji # 5.2 [2] (โ›ฉ๏ธ..โ›ช) shinto shrine..church -26F0..26F5 ; Emoji # 5.2 [6] (โ›ฐ๏ธ..โ›ต) mountain..sailboat -26F7..26FA ; Emoji # 5.2 [4] (โ›ท๏ธ..โ›บ) skier..tent -26FD ; Emoji # 5.2 [1] (โ›ฝ) fuel pump -2702 ; Emoji # 1.1 [1] (โœ‚๏ธ) scissors -2705 ; Emoji # 6.0 [1] (โœ…) white heavy check mark -2708..2709 ; Emoji # 1.1 [2] (โœˆ๏ธ..โœ‰๏ธ) airplane..envelope -270A..270B ; Emoji # 6.0 [2] (โœŠ..โœ‹) raised fist..raised hand -270C..270D ; Emoji # 1.1 [2] (โœŒ๏ธ..โœ๏ธ) victory hand..writing hand -270F ; Emoji # 1.1 [1] (โœ๏ธ) pencil -2712 ; Emoji # 1.1 [1] (โœ’๏ธ) black nib -2714 ; Emoji # 1.1 [1] (โœ”๏ธ) heavy check mark -2716 ; Emoji # 1.1 [1] (โœ–๏ธ) heavy multiplication x -271D ; Emoji # 1.1 [1] (โœ๏ธ) latin cross -2721 ; Emoji # 1.1 [1] (โœก๏ธ) star of David -2728 ; Emoji # 6.0 [1] (โœจ) sparkles -2733..2734 ; Emoji # 1.1 [2] (โœณ๏ธ..โœด๏ธ) eight-spoked asterisk..eight-pointed star -2744 ; Emoji # 1.1 [1] (โ„๏ธ) snowflake -2747 ; Emoji # 1.1 [1] (โ‡๏ธ) sparkle -274C ; Emoji # 6.0 [1] (โŒ) cross mark -274E ; Emoji # 6.0 [1] (โŽ) cross mark button -2753..2755 ; Emoji # 6.0 [3] (โ“..โ•) question mark..white exclamation mark -2757 ; Emoji # 5.2 [1] (โ—) exclamation mark -2763..2764 ; Emoji # 1.1 [2] (โฃ๏ธ..โค๏ธ) heavy heart exclamation..red heart -2795..2797 ; Emoji # 6.0 [3] (โž•..โž—) heavy plus sign..heavy division sign -27A1 ; Emoji # 1.1 [1] (โžก๏ธ) right arrow -27B0 ; Emoji # 6.0 [1] (โžฐ) curly loop -27BF ; Emoji # 6.0 [1] (โžฟ) double curly loop -2934..2935 ; Emoji # 3.2 [2] (โคด๏ธ..โคต๏ธ) right arrow curving up..right arrow curving down -2B05..2B07 ; Emoji # 4.0 [3] (โฌ…๏ธ..โฌ‡๏ธ) left arrow..down arrow -2B1B..2B1C ; Emoji # 5.1 [2] (โฌ›..โฌœ) black large square..white large square -2B50 ; Emoji # 5.1 [1] (โญ) white medium star -2B55 ; Emoji # 5.2 [1] (โญ•) heavy large circle -3030 ; Emoji # 1.1 [1] (ใ€ฐ๏ธ) wavy dash -303D ; Emoji # 3.2 [1] (ใ€ฝ๏ธ) part alternation mark -3297 ; Emoji # 1.1 [1] (ใŠ—๏ธ) Japanese โ€œcongratulationsโ€ button -3299 ; Emoji # 1.1 [1] (ใŠ™๏ธ) Japanese โ€œsecretโ€ button -1F004 ; Emoji # 5.1 [1] (๐Ÿ€„) mahjong red dragon -1F0CF ; Emoji # 6.0 [1] (๐Ÿƒ) joker -1F170..1F171 ; Emoji # 6.0 [2] (๐Ÿ…ฐ๏ธ..๐Ÿ…ฑ๏ธ) A button (blood type)..B button (blood type) -1F17E ; Emoji # 6.0 [1] (๐Ÿ…พ๏ธ) O button (blood type) -1F17F ; Emoji # 5.2 [1] (๐Ÿ…ฟ๏ธ) P button -1F18E ; Emoji # 6.0 [1] (๐Ÿ†Ž) AB button (blood type) -1F191..1F19A ; Emoji # 6.0 [10] (๐Ÿ†‘..๐Ÿ†š) CL button..VS button -1F1E6..1F1FF ; Emoji # 6.0 [26] (๐Ÿ‡ฆ..๐Ÿ‡ฟ) regional indicator symbol letter a..regional indicator symbol letter z -1F201..1F202 ; Emoji # 6.0 [2] (๐Ÿˆ..๐Ÿˆ‚๏ธ) Japanese โ€œhereโ€ button..Japanese โ€œservice chargeโ€ button -1F21A ; Emoji # 5.2 [1] (๐Ÿˆš) Japanese โ€œfree of chargeโ€ button -1F22F ; Emoji # 5.2 [1] (๐Ÿˆฏ) Japanese โ€œreservedโ€ button -1F232..1F23A ; Emoji # 6.0 [9] (๐Ÿˆฒ..๐Ÿˆบ) Japanese โ€œprohibitedโ€ button..Japanese โ€œopen for businessโ€ button -1F250..1F251 ; Emoji # 6.0 [2] (๐Ÿ‰..๐Ÿ‰‘) Japanese โ€œbargainโ€ button..Japanese โ€œacceptableโ€ button -1F300..1F320 ; Emoji # 6.0 [33] (๐ŸŒ€..๐ŸŒ ) cyclone..shooting star -1F321 ; Emoji # 7.0 [1] (๐ŸŒก๏ธ) thermometer -1F324..1F32C ; Emoji # 7.0 [9] (๐ŸŒค๏ธ..๐ŸŒฌ๏ธ) sun behind small cloud..wind face -1F32D..1F32F ; Emoji # 8.0 [3] (๐ŸŒญ..๐ŸŒฏ) hot dog..burrito -1F330..1F335 ; Emoji # 6.0 [6] (๐ŸŒฐ..๐ŸŒต) chestnut..cactus -1F336 ; Emoji # 7.0 [1] (๐ŸŒถ๏ธ) hot pepper -1F337..1F37C ; Emoji # 6.0 [70] (๐ŸŒท..๐Ÿผ) tulip..baby bottle -1F37D ; Emoji # 7.0 [1] (๐Ÿฝ๏ธ) fork and knife with plate -1F37E..1F37F ; Emoji # 8.0 [2] (๐Ÿพ..๐Ÿฟ) bottle with popping cork..popcorn -1F380..1F393 ; Emoji # 6.0 [20] (๐ŸŽ€..๐ŸŽ“) ribbon..graduation cap -1F396..1F397 ; Emoji # 7.0 [2] (๐ŸŽ–๏ธ..๐ŸŽ—๏ธ) military medal..reminder ribbon -1F399..1F39B ; Emoji # 7.0 [3] (๐ŸŽ™๏ธ..๐ŸŽ›๏ธ) studio microphone..control knobs -1F39E..1F39F ; Emoji # 7.0 [2] (๐ŸŽž๏ธ..๐ŸŽŸ๏ธ) film frames..admission tickets -1F3A0..1F3C4 ; Emoji # 6.0 [37] (๐ŸŽ ..๐Ÿ„) carousel horse..person surfing -1F3C5 ; Emoji # 7.0 [1] (๐Ÿ…) sports medal -1F3C6..1F3CA ; Emoji # 6.0 [5] (๐Ÿ†..๐ŸŠ) trophy..person swimming -1F3CB..1F3CE ; Emoji # 7.0 [4] (๐Ÿ‹๏ธ..๐ŸŽ๏ธ) person lifting weights..racing car -1F3CF..1F3D3 ; Emoji # 8.0 [5] (๐Ÿ..๐Ÿ“) cricket game..ping pong -1F3D4..1F3DF ; Emoji # 7.0 [12] (๐Ÿ”๏ธ..๐ŸŸ๏ธ) snow-capped mountain..stadium -1F3E0..1F3F0 ; Emoji # 6.0 [17] (๐Ÿ ..๐Ÿฐ) house..castle -1F3F3..1F3F5 ; Emoji # 7.0 [3] (๐Ÿณ๏ธ..๐Ÿต๏ธ) white flag..rosette -1F3F7 ; Emoji # 7.0 [1] (๐Ÿท๏ธ) label -1F3F8..1F3FF ; Emoji # 8.0 [8] (๐Ÿธ..๐Ÿฟ) badminton..dark skin tone -1F400..1F43E ; Emoji # 6.0 [63] (๐Ÿ€..๐Ÿพ) rat..paw prints -1F43F ; Emoji # 7.0 [1] (๐Ÿฟ๏ธ) chipmunk -1F440 ; Emoji # 6.0 [1] (๐Ÿ‘€) eyes -1F441 ; Emoji # 7.0 [1] (๐Ÿ‘๏ธ) eye -1F442..1F4F7 ; Emoji # 6.0[182] (๐Ÿ‘‚..๐Ÿ“ท) ear..camera -1F4F8 ; Emoji # 7.0 [1] (๐Ÿ“ธ) camera with flash -1F4F9..1F4FC ; Emoji # 6.0 [4] (๐Ÿ“น..๐Ÿ“ผ) video camera..videocassette -1F4FD ; Emoji # 7.0 [1] (๐Ÿ“ฝ๏ธ) film projector -1F4FF ; Emoji # 8.0 [1] (๐Ÿ“ฟ) prayer beads -1F500..1F53D ; Emoji # 6.0 [62] (๐Ÿ”€..๐Ÿ”ฝ) shuffle tracks button..down button -1F549..1F54A ; Emoji # 7.0 [2] (๐Ÿ•‰๏ธ..๐Ÿ•Š๏ธ) om..dove -1F54B..1F54E ; Emoji # 8.0 [4] (๐Ÿ•‹..๐Ÿ•Ž) kaaba..menorah -1F550..1F567 ; Emoji # 6.0 [24] (๐Ÿ•..๐Ÿ•ง) one oโ€™clock..twelve-thirty -1F56F..1F570 ; Emoji # 7.0 [2] (๐Ÿ•ฏ๏ธ..๐Ÿ•ฐ๏ธ) candle..mantelpiece clock -1F573..1F579 ; Emoji # 7.0 [7] (๐Ÿ•ณ๏ธ..๐Ÿ•น๏ธ) hole..joystick -1F57A ; Emoji # 9.0 [1] (๐Ÿ•บ) man dancing -1F587 ; Emoji # 7.0 [1] (๐Ÿ–‡๏ธ) linked paperclips -1F58A..1F58D ; Emoji # 7.0 [4] (๐Ÿ–Š๏ธ..๐Ÿ–๏ธ) pen..crayon -1F590 ; Emoji # 7.0 [1] (๐Ÿ–๏ธ) hand with fingers splayed -1F595..1F596 ; Emoji # 7.0 [2] (๐Ÿ–•..๐Ÿ––) middle finger..vulcan salute -1F5A4 ; Emoji # 9.0 [1] (๐Ÿ–ค) black heart -1F5A5 ; Emoji # 7.0 [1] (๐Ÿ–ฅ๏ธ) desktop computer -1F5A8 ; Emoji # 7.0 [1] (๐Ÿ–จ๏ธ) printer -1F5B1..1F5B2 ; Emoji # 7.0 [2] (๐Ÿ–ฑ๏ธ..๐Ÿ–ฒ๏ธ) computer mouse..trackball -1F5BC ; Emoji # 7.0 [1] (๐Ÿ–ผ๏ธ) framed picture -1F5C2..1F5C4 ; Emoji # 7.0 [3] (๐Ÿ—‚๏ธ..๐Ÿ—„๏ธ) card index dividers..file cabinet -1F5D1..1F5D3 ; Emoji # 7.0 [3] (๐Ÿ—‘๏ธ..๐Ÿ—“๏ธ) wastebasket..spiral calendar -1F5DC..1F5DE ; Emoji # 7.0 [3] (๐Ÿ—œ๏ธ..๐Ÿ—ž๏ธ) clamp..rolled-up newspaper -1F5E1 ; Emoji # 7.0 [1] (๐Ÿ—ก๏ธ) dagger -1F5E3 ; Emoji # 7.0 [1] (๐Ÿ—ฃ๏ธ) speaking head -1F5E8 ; Emoji # 7.0 [1] (๐Ÿ—จ๏ธ) left speech bubble -1F5EF ; Emoji # 7.0 [1] (๐Ÿ—ฏ๏ธ) right anger bubble -1F5F3 ; Emoji # 7.0 [1] (๐Ÿ—ณ๏ธ) ballot box with ballot -1F5FA ; Emoji # 7.0 [1] (๐Ÿ—บ๏ธ) world map -1F5FB..1F5FF ; Emoji # 6.0 [5] (๐Ÿ—ป..๐Ÿ—ฟ) mount fuji..moai -1F600 ; Emoji # 6.1 [1] (๐Ÿ˜€) grinning face -1F601..1F610 ; Emoji # 6.0 [16] (๐Ÿ˜..๐Ÿ˜) beaming face with smiling eyes..neutral face -1F611 ; Emoji # 6.1 [1] (๐Ÿ˜‘) expressionless face -1F612..1F614 ; Emoji # 6.0 [3] (๐Ÿ˜’..๐Ÿ˜”) unamused face..pensive face -1F615 ; Emoji # 6.1 [1] (๐Ÿ˜•) confused face -1F616 ; Emoji # 6.0 [1] (๐Ÿ˜–) confounded face -1F617 ; Emoji # 6.1 [1] (๐Ÿ˜—) kissing face -1F618 ; Emoji # 6.0 [1] (๐Ÿ˜˜) face blowing a kiss -1F619 ; Emoji # 6.1 [1] (๐Ÿ˜™) kissing face with smiling eyes -1F61A ; Emoji # 6.0 [1] (๐Ÿ˜š) kissing face with closed eyes -1F61B ; Emoji # 6.1 [1] (๐Ÿ˜›) face with tongue -1F61C..1F61E ; Emoji # 6.0 [3] (๐Ÿ˜œ..๐Ÿ˜ž) winking face with tongue..disappointed face -1F61F ; Emoji # 6.1 [1] (๐Ÿ˜Ÿ) worried face -1F620..1F625 ; Emoji # 6.0 [6] (๐Ÿ˜ ..๐Ÿ˜ฅ) angry face..sad but relieved face -1F626..1F627 ; Emoji # 6.1 [2] (๐Ÿ˜ฆ..๐Ÿ˜ง) frowning face with open mouth..anguished face -1F628..1F62B ; Emoji # 6.0 [4] (๐Ÿ˜จ..๐Ÿ˜ซ) fearful face..tired face -1F62C ; Emoji # 6.1 [1] (๐Ÿ˜ฌ) grimacing face -1F62D ; Emoji # 6.0 [1] (๐Ÿ˜ญ) loudly crying face -1F62E..1F62F ; Emoji # 6.1 [2] (๐Ÿ˜ฎ..๐Ÿ˜ฏ) face with open mouth..hushed face -1F630..1F633 ; Emoji # 6.0 [4] (๐Ÿ˜ฐ..๐Ÿ˜ณ) anxious face with sweat..flushed face -1F634 ; Emoji # 6.1 [1] (๐Ÿ˜ด) sleeping face -1F635..1F640 ; Emoji # 6.0 [12] (๐Ÿ˜ต..๐Ÿ™€) dizzy face..weary cat face -1F641..1F642 ; Emoji # 7.0 [2] (๐Ÿ™..๐Ÿ™‚) slightly frowning face..slightly smiling face -1F643..1F644 ; Emoji # 8.0 [2] (๐Ÿ™ƒ..๐Ÿ™„) upside-down face..face with rolling eyes -1F645..1F64F ; Emoji # 6.0 [11] (๐Ÿ™…..๐Ÿ™) person gesturing NO..folded hands -1F680..1F6C5 ; Emoji # 6.0 [70] (๐Ÿš€..๐Ÿ›…) rocket..left luggage -1F6CB..1F6CF ; Emoji # 7.0 [5] (๐Ÿ›‹๏ธ..๐Ÿ›๏ธ) couch and lamp..bed -1F6D0 ; Emoji # 8.0 [1] (๐Ÿ›) place of worship -1F6D1..1F6D2 ; Emoji # 9.0 [2] (๐Ÿ›‘..๐Ÿ›’) stop sign..shopping cart -1F6E0..1F6E5 ; Emoji # 7.0 [6] (๐Ÿ› ๏ธ..๐Ÿ›ฅ๏ธ) hammer and wrench..motor boat -1F6E9 ; Emoji # 7.0 [1] (๐Ÿ›ฉ๏ธ) small airplane -1F6EB..1F6EC ; Emoji # 7.0 [2] (๐Ÿ›ซ..๐Ÿ›ฌ) airplane departure..airplane arrival -1F6F0 ; Emoji # 7.0 [1] (๐Ÿ›ฐ๏ธ) satellite -1F6F3 ; Emoji # 7.0 [1] (๐Ÿ›ณ๏ธ) passenger ship -1F6F4..1F6F6 ; Emoji # 9.0 [3] (๐Ÿ›ด..๐Ÿ›ถ) kick scooter..canoe -1F6F7..1F6F8 ; Emoji # 10.0 [2] (๐Ÿ›ท..๐Ÿ›ธ) sled..flying saucer -1F910..1F918 ; Emoji # 8.0 [9] (๐Ÿค..๐Ÿค˜) zipper-mouth face..sign of the horns -1F919..1F91E ; Emoji # 9.0 [6] (๐Ÿค™..๐Ÿคž) call me hand..crossed fingers -1F91F ; Emoji # 10.0 [1] (๐ŸคŸ) love-you gesture -1F920..1F927 ; Emoji # 9.0 [8] (๐Ÿค ..๐Ÿคง) cowboy hat face..sneezing face -1F928..1F92F ; Emoji # 10.0 [8] (๐Ÿคจ..๐Ÿคฏ) face with raised eyebrow..exploding head -1F930 ; Emoji # 9.0 [1] (๐Ÿคฐ) pregnant woman -1F931..1F932 ; Emoji # 10.0 [2] (๐Ÿคฑ..๐Ÿคฒ) breast-feeding..palms up together -1F933..1F93A ; Emoji # 9.0 [8] (๐Ÿคณ..๐Ÿคบ) selfie..person fencing -1F93C..1F93E ; Emoji # 9.0 [3] (๐Ÿคผ..๐Ÿคพ) people wrestling..person playing handball -1F940..1F945 ; Emoji # 9.0 [6] (๐Ÿฅ€..๐Ÿฅ…) wilted flower..goal net -1F947..1F94B ; Emoji # 9.0 [5] (๐Ÿฅ‡..๐Ÿฅ‹) 1st place medal..martial arts uniform -1F94C ; Emoji # 10.0 [1] (๐ŸฅŒ) curling stone -1F950..1F95E ; Emoji # 9.0 [15] (๐Ÿฅ..๐Ÿฅž) croissant..pancakes -1F95F..1F96B ; Emoji # 10.0 [13] (๐ŸฅŸ..๐Ÿฅซ) dumpling..canned food -1F980..1F984 ; Emoji # 8.0 [5] (๐Ÿฆ€..๐Ÿฆ„) crab..unicorn face -1F985..1F991 ; Emoji # 9.0 [13] (๐Ÿฆ…..๐Ÿฆ‘) eagle..squid -1F992..1F997 ; Emoji # 10.0 [6] (๐Ÿฆ’..๐Ÿฆ—) giraffe..cricket -1F9C0 ; Emoji # 8.0 [1] (๐Ÿง€) cheese wedge -1F9D0..1F9E6 ; Emoji # 10.0 [23] (๐Ÿง..๐Ÿงฆ) face with monocle..socks - -# Total elements: 1182 - -# ================================================ - -# All omitted code points have Emoji_Presentation=No -# @missing: 0000..10FFFF ; Emoji_Presentation ; No - -231A..231B ; Emoji_Presentation # 1.1 [2] (โŒš..โŒ›) watch..hourglass done -23E9..23EC ; Emoji_Presentation # 6.0 [4] (โฉ..โฌ) fast-forward button..fast down button -23F0 ; Emoji_Presentation # 6.0 [1] (โฐ) alarm clock -23F3 ; Emoji_Presentation # 6.0 [1] (โณ) hourglass not done -25FD..25FE ; Emoji_Presentation # 3.2 [2] (โ—ฝ..โ—พ) white medium-small square..black medium-small square -2614..2615 ; Emoji_Presentation # 4.0 [2] (โ˜”..โ˜•) umbrella with rain drops..hot beverage -2648..2653 ; Emoji_Presentation # 1.1 [12] (โ™ˆ..โ™“) Aries..Pisces -267F ; Emoji_Presentation # 4.1 [1] (โ™ฟ) wheelchair symbol -2693 ; Emoji_Presentation # 4.1 [1] (โš“) anchor -26A1 ; Emoji_Presentation # 4.0 [1] (โšก) high voltage -26AA..26AB ; Emoji_Presentation # 4.1 [2] (โšช..โšซ) white circle..black circle -26BD..26BE ; Emoji_Presentation # 5.2 [2] (โšฝ..โšพ) soccer ball..baseball -26C4..26C5 ; Emoji_Presentation # 5.2 [2] (โ›„..โ›…) snowman without snow..sun behind cloud -26CE ; Emoji_Presentation # 6.0 [1] (โ›Ž) Ophiuchus -26D4 ; Emoji_Presentation # 5.2 [1] (โ›”) no entry -26EA ; Emoji_Presentation # 5.2 [1] (โ›ช) church -26F2..26F3 ; Emoji_Presentation # 5.2 [2] (โ›ฒ..โ›ณ) fountain..flag in hole -26F5 ; Emoji_Presentation # 5.2 [1] (โ›ต) sailboat -26FA ; Emoji_Presentation # 5.2 [1] (โ›บ) tent -26FD ; Emoji_Presentation # 5.2 [1] (โ›ฝ) fuel pump -2705 ; Emoji_Presentation # 6.0 [1] (โœ…) white heavy check mark -270A..270B ; Emoji_Presentation # 6.0 [2] (โœŠ..โœ‹) raised fist..raised hand -2728 ; Emoji_Presentation # 6.0 [1] (โœจ) sparkles -274C ; Emoji_Presentation # 6.0 [1] (โŒ) cross mark -274E ; Emoji_Presentation # 6.0 [1] (โŽ) cross mark button -2753..2755 ; Emoji_Presentation # 6.0 [3] (โ“..โ•) question mark..white exclamation mark -2757 ; Emoji_Presentation # 5.2 [1] (โ—) exclamation mark -2795..2797 ; Emoji_Presentation # 6.0 [3] (โž•..โž—) heavy plus sign..heavy division sign -27B0 ; Emoji_Presentation # 6.0 [1] (โžฐ) curly loop -27BF ; Emoji_Presentation # 6.0 [1] (โžฟ) double curly loop -2B1B..2B1C ; Emoji_Presentation # 5.1 [2] (โฌ›..โฌœ) black large square..white large square -2B50 ; Emoji_Presentation # 5.1 [1] (โญ) white medium star -2B55 ; Emoji_Presentation # 5.2 [1] (โญ•) heavy large circle -1F004 ; Emoji_Presentation # 5.1 [1] (๐Ÿ€„) mahjong red dragon -1F0CF ; Emoji_Presentation # 6.0 [1] (๐Ÿƒ) joker -1F18E ; Emoji_Presentation # 6.0 [1] (๐Ÿ†Ž) AB button (blood type) -1F191..1F19A ; Emoji_Presentation # 6.0 [10] (๐Ÿ†‘..๐Ÿ†š) CL button..VS button -1F1E6..1F1FF ; Emoji_Presentation # 6.0 [26] (๐Ÿ‡ฆ..๐Ÿ‡ฟ) regional indicator symbol letter a..regional indicator symbol letter z -1F201 ; Emoji_Presentation # 6.0 [1] (๐Ÿˆ) Japanese โ€œhereโ€ button -1F21A ; Emoji_Presentation # 5.2 [1] (๐Ÿˆš) Japanese โ€œfree of chargeโ€ button -1F22F ; Emoji_Presentation # 5.2 [1] (๐Ÿˆฏ) Japanese โ€œreservedโ€ button -1F232..1F236 ; Emoji_Presentation # 6.0 [5] (๐Ÿˆฒ..๐Ÿˆถ) Japanese โ€œprohibitedโ€ button..Japanese โ€œnot free of chargeโ€ button -1F238..1F23A ; Emoji_Presentation # 6.0 [3] (๐Ÿˆธ..๐Ÿˆบ) Japanese โ€œapplicationโ€ button..Japanese โ€œopen for businessโ€ button -1F250..1F251 ; Emoji_Presentation # 6.0 [2] (๐Ÿ‰..๐Ÿ‰‘) Japanese โ€œbargainโ€ button..Japanese โ€œacceptableโ€ button -1F300..1F320 ; Emoji_Presentation # 6.0 [33] (๐ŸŒ€..๐ŸŒ ) cyclone..shooting star -1F32D..1F32F ; Emoji_Presentation # 8.0 [3] (๐ŸŒญ..๐ŸŒฏ) hot dog..burrito -1F330..1F335 ; Emoji_Presentation # 6.0 [6] (๐ŸŒฐ..๐ŸŒต) chestnut..cactus -1F337..1F37C ; Emoji_Presentation # 6.0 [70] (๐ŸŒท..๐Ÿผ) tulip..baby bottle -1F37E..1F37F ; Emoji_Presentation # 8.0 [2] (๐Ÿพ..๐Ÿฟ) bottle with popping cork..popcorn -1F380..1F393 ; Emoji_Presentation # 6.0 [20] (๐ŸŽ€..๐ŸŽ“) ribbon..graduation cap -1F3A0..1F3C4 ; Emoji_Presentation # 6.0 [37] (๐ŸŽ ..๐Ÿ„) carousel horse..person surfing -1F3C5 ; Emoji_Presentation # 7.0 [1] (๐Ÿ…) sports medal -1F3C6..1F3CA ; Emoji_Presentation # 6.0 [5] (๐Ÿ†..๐ŸŠ) trophy..person swimming -1F3CF..1F3D3 ; Emoji_Presentation # 8.0 [5] (๐Ÿ..๐Ÿ“) cricket game..ping pong -1F3E0..1F3F0 ; Emoji_Presentation # 6.0 [17] (๐Ÿ ..๐Ÿฐ) house..castle -1F3F4 ; Emoji_Presentation # 7.0 [1] (๐Ÿด) black flag -1F3F8..1F3FF ; Emoji_Presentation # 8.0 [8] (๐Ÿธ..๐Ÿฟ) badminton..dark skin tone -1F400..1F43E ; Emoji_Presentation # 6.0 [63] (๐Ÿ€..๐Ÿพ) rat..paw prints -1F440 ; Emoji_Presentation # 6.0 [1] (๐Ÿ‘€) eyes -1F442..1F4F7 ; Emoji_Presentation # 6.0[182] (๐Ÿ‘‚..๐Ÿ“ท) ear..camera -1F4F8 ; Emoji_Presentation # 7.0 [1] (๐Ÿ“ธ) camera with flash -1F4F9..1F4FC ; Emoji_Presentation # 6.0 [4] (๐Ÿ“น..๐Ÿ“ผ) video camera..videocassette -1F4FF ; Emoji_Presentation # 8.0 [1] (๐Ÿ“ฟ) prayer beads -1F500..1F53D ; Emoji_Presentation # 6.0 [62] (๐Ÿ”€..๐Ÿ”ฝ) shuffle tracks button..down button -1F54B..1F54E ; Emoji_Presentation # 8.0 [4] (๐Ÿ•‹..๐Ÿ•Ž) kaaba..menorah -1F550..1F567 ; Emoji_Presentation # 6.0 [24] (๐Ÿ•..๐Ÿ•ง) one oโ€™clock..twelve-thirty -1F57A ; Emoji_Presentation # 9.0 [1] (๐Ÿ•บ) man dancing -1F595..1F596 ; Emoji_Presentation # 7.0 [2] (๐Ÿ–•..๐Ÿ––) middle finger..vulcan salute -1F5A4 ; Emoji_Presentation # 9.0 [1] (๐Ÿ–ค) black heart -1F5FB..1F5FF ; Emoji_Presentation # 6.0 [5] (๐Ÿ—ป..๐Ÿ—ฟ) mount fuji..moai -1F600 ; Emoji_Presentation # 6.1 [1] (๐Ÿ˜€) grinning face -1F601..1F610 ; Emoji_Presentation # 6.0 [16] (๐Ÿ˜..๐Ÿ˜) beaming face with smiling eyes..neutral face -1F611 ; Emoji_Presentation # 6.1 [1] (๐Ÿ˜‘) expressionless face -1F612..1F614 ; Emoji_Presentation # 6.0 [3] (๐Ÿ˜’..๐Ÿ˜”) unamused face..pensive face -1F615 ; Emoji_Presentation # 6.1 [1] (๐Ÿ˜•) confused face -1F616 ; Emoji_Presentation # 6.0 [1] (๐Ÿ˜–) confounded face -1F617 ; Emoji_Presentation # 6.1 [1] (๐Ÿ˜—) kissing face -1F618 ; Emoji_Presentation # 6.0 [1] (๐Ÿ˜˜) face blowing a kiss -1F619 ; Emoji_Presentation # 6.1 [1] (๐Ÿ˜™) kissing face with smiling eyes -1F61A ; Emoji_Presentation # 6.0 [1] (๐Ÿ˜š) kissing face with closed eyes -1F61B ; Emoji_Presentation # 6.1 [1] (๐Ÿ˜›) face with tongue -1F61C..1F61E ; Emoji_Presentation # 6.0 [3] (๐Ÿ˜œ..๐Ÿ˜ž) winking face with tongue..disappointed face -1F61F ; Emoji_Presentation # 6.1 [1] (๐Ÿ˜Ÿ) worried face -1F620..1F625 ; Emoji_Presentation # 6.0 [6] (๐Ÿ˜ ..๐Ÿ˜ฅ) angry face..sad but relieved face -1F626..1F627 ; Emoji_Presentation # 6.1 [2] (๐Ÿ˜ฆ..๐Ÿ˜ง) frowning face with open mouth..anguished face -1F628..1F62B ; Emoji_Presentation # 6.0 [4] (๐Ÿ˜จ..๐Ÿ˜ซ) fearful face..tired face -1F62C ; Emoji_Presentation # 6.1 [1] (๐Ÿ˜ฌ) grimacing face -1F62D ; Emoji_Presentation # 6.0 [1] (๐Ÿ˜ญ) loudly crying face -1F62E..1F62F ; Emoji_Presentation # 6.1 [2] (๐Ÿ˜ฎ..๐Ÿ˜ฏ) face with open mouth..hushed face -1F630..1F633 ; Emoji_Presentation # 6.0 [4] (๐Ÿ˜ฐ..๐Ÿ˜ณ) anxious face with sweat..flushed face -1F634 ; Emoji_Presentation # 6.1 [1] (๐Ÿ˜ด) sleeping face -1F635..1F640 ; Emoji_Presentation # 6.0 [12] (๐Ÿ˜ต..๐Ÿ™€) dizzy face..weary cat face -1F641..1F642 ; Emoji_Presentation # 7.0 [2] (๐Ÿ™..๐Ÿ™‚) slightly frowning face..slightly smiling face -1F643..1F644 ; Emoji_Presentation # 8.0 [2] (๐Ÿ™ƒ..๐Ÿ™„) upside-down face..face with rolling eyes -1F645..1F64F ; Emoji_Presentation # 6.0 [11] (๐Ÿ™…..๐Ÿ™) person gesturing NO..folded hands -1F680..1F6C5 ; Emoji_Presentation # 6.0 [70] (๐Ÿš€..๐Ÿ›…) rocket..left luggage -1F6CC ; Emoji_Presentation # 7.0 [1] (๐Ÿ›Œ) person in bed -1F6D0 ; Emoji_Presentation # 8.0 [1] (๐Ÿ›) place of worship -1F6D1..1F6D2 ; Emoji_Presentation # 9.0 [2] (๐Ÿ›‘..๐Ÿ›’) stop sign..shopping cart -1F6EB..1F6EC ; Emoji_Presentation # 7.0 [2] (๐Ÿ›ซ..๐Ÿ›ฌ) airplane departure..airplane arrival -1F6F4..1F6F6 ; Emoji_Presentation # 9.0 [3] (๐Ÿ›ด..๐Ÿ›ถ) kick scooter..canoe -1F6F7..1F6F8 ; Emoji_Presentation # 10.0 [2] (๐Ÿ›ท..๐Ÿ›ธ) sled..flying saucer -1F910..1F918 ; Emoji_Presentation # 8.0 [9] (๐Ÿค..๐Ÿค˜) zipper-mouth face..sign of the horns -1F919..1F91E ; Emoji_Presentation # 9.0 [6] (๐Ÿค™..๐Ÿคž) call me hand..crossed fingers -1F91F ; Emoji_Presentation # 10.0 [1] (๐ŸคŸ) love-you gesture -1F920..1F927 ; Emoji_Presentation # 9.0 [8] (๐Ÿค ..๐Ÿคง) cowboy hat face..sneezing face -1F928..1F92F ; Emoji_Presentation # 10.0 [8] (๐Ÿคจ..๐Ÿคฏ) face with raised eyebrow..exploding head -1F930 ; Emoji_Presentation # 9.0 [1] (๐Ÿคฐ) pregnant woman -1F931..1F932 ; Emoji_Presentation # 10.0 [2] (๐Ÿคฑ..๐Ÿคฒ) breast-feeding..palms up together -1F933..1F93A ; Emoji_Presentation # 9.0 [8] (๐Ÿคณ..๐Ÿคบ) selfie..person fencing -1F93C..1F93E ; Emoji_Presentation # 9.0 [3] (๐Ÿคผ..๐Ÿคพ) people wrestling..person playing handball -1F940..1F945 ; Emoji_Presentation # 9.0 [6] (๐Ÿฅ€..๐Ÿฅ…) wilted flower..goal net -1F947..1F94B ; Emoji_Presentation # 9.0 [5] (๐Ÿฅ‡..๐Ÿฅ‹) 1st place medal..martial arts uniform -1F94C ; Emoji_Presentation # 10.0 [1] (๐ŸฅŒ) curling stone -1F950..1F95E ; Emoji_Presentation # 9.0 [15] (๐Ÿฅ..๐Ÿฅž) croissant..pancakes -1F95F..1F96B ; Emoji_Presentation # 10.0 [13] (๐ŸฅŸ..๐Ÿฅซ) dumpling..canned food -1F980..1F984 ; Emoji_Presentation # 8.0 [5] (๐Ÿฆ€..๐Ÿฆ„) crab..unicorn face -1F985..1F991 ; Emoji_Presentation # 9.0 [13] (๐Ÿฆ…..๐Ÿฆ‘) eagle..squid -1F992..1F997 ; Emoji_Presentation # 10.0 [6] (๐Ÿฆ’..๐Ÿฆ—) giraffe..cricket -1F9C0 ; Emoji_Presentation # 8.0 [1] (๐Ÿง€) cheese wedge -1F9D0..1F9E6 ; Emoji_Presentation # 10.0 [23] (๐Ÿง..๐Ÿงฆ) face with monocle..socks - -# Total elements: 966 - -# ================================================ - -# All omitted code points have Emoji_Modifier=No -# @missing: 0000..10FFFF ; Emoji_Modifier ; No - -1F3FB..1F3FF ; Emoji_Modifier # 8.0 [5] (๐Ÿป..๐Ÿฟ) light skin tone..dark skin tone - -# Total elements: 5 - -# ================================================ - -# All omitted code points have Emoji_Modifier_Base=No -# @missing: 0000..10FFFF ; Emoji_Modifier_Base ; No - -261D ; Emoji_Modifier_Base # 1.1 [1] (โ˜๏ธ) index pointing up -26F9 ; Emoji_Modifier_Base # 5.2 [1] (โ›น๏ธ) person bouncing ball -270A..270B ; Emoji_Modifier_Base # 6.0 [2] (โœŠ..โœ‹) raised fist..raised hand -270C..270D ; Emoji_Modifier_Base # 1.1 [2] (โœŒ๏ธ..โœ๏ธ) victory hand..writing hand -1F385 ; Emoji_Modifier_Base # 6.0 [1] (๐ŸŽ…) Santa Claus -1F3C2..1F3C4 ; Emoji_Modifier_Base # 6.0 [3] (๐Ÿ‚..๐Ÿ„) snowboarder..person surfing -1F3C7 ; Emoji_Modifier_Base # 6.0 [1] (๐Ÿ‡) horse racing -1F3CA ; Emoji_Modifier_Base # 6.0 [1] (๐ŸŠ) person swimming -1F3CB..1F3CC ; Emoji_Modifier_Base # 7.0 [2] (๐Ÿ‹๏ธ..๐ŸŒ๏ธ) person lifting weights..person golfing -1F442..1F443 ; Emoji_Modifier_Base # 6.0 [2] (๐Ÿ‘‚..๐Ÿ‘ƒ) ear..nose -1F446..1F450 ; Emoji_Modifier_Base # 6.0 [11] (๐Ÿ‘†..๐Ÿ‘) backhand index pointing up..open hands -1F466..1F469 ; Emoji_Modifier_Base # 6.0 [4] (๐Ÿ‘ฆ..๐Ÿ‘ฉ) boy..woman -1F46E ; Emoji_Modifier_Base # 6.0 [1] (๐Ÿ‘ฎ) police officer -1F470..1F478 ; Emoji_Modifier_Base # 6.0 [9] (๐Ÿ‘ฐ..๐Ÿ‘ธ) bride with veil..princess -1F47C ; Emoji_Modifier_Base # 6.0 [1] (๐Ÿ‘ผ) baby angel -1F481..1F483 ; Emoji_Modifier_Base # 6.0 [3] (๐Ÿ’..๐Ÿ’ƒ) person tipping hand..woman dancing -1F485..1F487 ; Emoji_Modifier_Base # 6.0 [3] (๐Ÿ’…..๐Ÿ’‡) nail polish..person getting haircut -1F4AA ; Emoji_Modifier_Base # 6.0 [1] (๐Ÿ’ช) flexed biceps -1F574..1F575 ; Emoji_Modifier_Base # 7.0 [2] (๐Ÿ•ด๏ธ..๐Ÿ•ต๏ธ) man in suit levitating..detective -1F57A ; Emoji_Modifier_Base # 9.0 [1] (๐Ÿ•บ) man dancing -1F590 ; Emoji_Modifier_Base # 7.0 [1] (๐Ÿ–๏ธ) hand with fingers splayed -1F595..1F596 ; Emoji_Modifier_Base # 7.0 [2] (๐Ÿ–•..๐Ÿ––) middle finger..vulcan salute -1F645..1F647 ; Emoji_Modifier_Base # 6.0 [3] (๐Ÿ™…..๐Ÿ™‡) person gesturing NO..person bowing -1F64B..1F64F ; Emoji_Modifier_Base # 6.0 [5] (๐Ÿ™‹..๐Ÿ™) person raising hand..folded hands -1F6A3 ; Emoji_Modifier_Base # 6.0 [1] (๐Ÿšฃ) person rowing boat -1F6B4..1F6B6 ; Emoji_Modifier_Base # 6.0 [3] (๐Ÿšด..๐Ÿšถ) person biking..person walking -1F6C0 ; Emoji_Modifier_Base # 6.0 [1] (๐Ÿ›€) person taking bath -1F6CC ; Emoji_Modifier_Base # 7.0 [1] (๐Ÿ›Œ) person in bed -1F918 ; Emoji_Modifier_Base # 8.0 [1] (๐Ÿค˜) sign of the horns -1F919..1F91C ; Emoji_Modifier_Base # 9.0 [4] (๐Ÿค™..๐Ÿคœ) call me hand..right-facing fist -1F91E ; Emoji_Modifier_Base # 9.0 [1] (๐Ÿคž) crossed fingers -1F91F ; Emoji_Modifier_Base # 10.0 [1] (๐ŸคŸ) love-you gesture -1F926 ; Emoji_Modifier_Base # 9.0 [1] (๐Ÿคฆ) person facepalming -1F930 ; Emoji_Modifier_Base # 9.0 [1] (๐Ÿคฐ) pregnant woman -1F931..1F932 ; Emoji_Modifier_Base # 10.0 [2] (๐Ÿคฑ..๐Ÿคฒ) breast-feeding..palms up together -1F933..1F939 ; Emoji_Modifier_Base # 9.0 [7] (๐Ÿคณ..๐Ÿคน) selfie..person juggling -1F93D..1F93E ; Emoji_Modifier_Base # 9.0 [2] (๐Ÿคฝ..๐Ÿคพ) person playing water polo..person playing handball -1F9D1..1F9DD ; Emoji_Modifier_Base # 10.0 [13] (๐Ÿง‘..๐Ÿง) adult..elf - -# Total elements: 102 - -# ================================================ - -# All omitted code points have Emoji_Component=No -# @missing: 0000..10FFFF ; Emoji_Component ; No - -0023 ; Emoji_Component # 1.1 [1] (#๏ธ) number sign -002A ; Emoji_Component # 1.1 [1] (*๏ธ) asterisk -0030..0039 ; Emoji_Component # 1.1 [10] (0๏ธ..9๏ธ) digit zero..digit nine -200D ; Emoji_Component # 1.1 [1] (โ€) zero width joiner -20E3 ; Emoji_Component # 3.0 [1] (โƒฃ) combining enclosing keycap -FE0F ; Emoji_Component # 3.2 [1] () VARIATION SELECTOR-16 -1F1E6..1F1FF ; Emoji_Component # 6.0 [26] (๐Ÿ‡ฆ..๐Ÿ‡ฟ) regional indicator symbol letter a..regional indicator symbol letter z -1F3FB..1F3FF ; Emoji_Component # 8.0 [5] (๐Ÿป..๐Ÿฟ) light skin tone..dark skin tone -E0020..E007F ; Emoji_Component # 3.1 [96] (๓ € ..๓ ฟ) tag space..cancel tag - -# Total elements: 142 - -# ================================================ - -# All omitted code points have Extended_Pictographic=No -# @missing: 0000..10FFFF ; Extended_Pictographic ; No - -00A9 ; Extended_Pictographic# 1.1 [1] (ยฉ๏ธ) copyright -00AE ; Extended_Pictographic# 1.1 [1] (ยฎ๏ธ) registered -203C ; Extended_Pictographic# 1.1 [1] (โ€ผ๏ธ) double exclamation mark -2049 ; Extended_Pictographic# 3.0 [1] (โ‰๏ธ) exclamation question mark -2122 ; Extended_Pictographic# 1.1 [1] (โ„ข๏ธ) trade mark -2139 ; Extended_Pictographic# 3.0 [1] (โ„น๏ธ) information -2194..2199 ; Extended_Pictographic# 1.1 [6] (โ†”๏ธ..โ†™๏ธ) left-right arrow..down-left arrow -21A9..21AA ; Extended_Pictographic# 1.1 [2] (โ†ฉ๏ธ..โ†ช๏ธ) right arrow curving left..left arrow curving right -231A..231B ; Extended_Pictographic# 1.1 [2] (โŒš..โŒ›) watch..hourglass done -2328 ; Extended_Pictographic# 1.1 [1] (โŒจ๏ธ) keyboard -2388 ; Extended_Pictographic# 3.0 [1] (โŽˆ๏ธ) HELM SYMBOL -23CF ; Extended_Pictographic# 4.0 [1] (โ๏ธ) eject button -23E9..23F3 ; Extended_Pictographic# 6.0 [11] (โฉ..โณ) fast-forward button..hourglass not done -23F8..23FA ; Extended_Pictographic# 7.0 [3] (โธ๏ธ..โบ๏ธ) pause button..record button -24C2 ; Extended_Pictographic# 1.1 [1] (โ“‚๏ธ) circled M -25AA..25AB ; Extended_Pictographic# 1.1 [2] (โ–ช๏ธ..โ–ซ๏ธ) black small square..white small square -25B6 ; Extended_Pictographic# 1.1 [1] (โ–ถ๏ธ) play button -25C0 ; Extended_Pictographic# 1.1 [1] (โ—€๏ธ) reverse button -25FB..25FE ; Extended_Pictographic# 3.2 [4] (โ—ป๏ธ..โ—พ) white medium square..black medium-small square -2600..2605 ; Extended_Pictographic# 1.1 [6] (โ˜€๏ธ..โ˜…๏ธ) sun..BLACK STAR -2607..2612 ; Extended_Pictographic# 1.1 [12] (โ˜‡๏ธ..โ˜’๏ธ) LIGHTNING..BALLOT BOX WITH X -2614..2615 ; Extended_Pictographic# 4.0 [2] (โ˜”..โ˜•) umbrella with rain drops..hot beverage -2616..2617 ; Extended_Pictographic# 3.2 [2] (โ˜–๏ธ..โ˜—๏ธ) WHITE SHOGI PIECE..BLACK SHOGI PIECE -2618 ; Extended_Pictographic# 4.1 [1] (โ˜˜๏ธ) shamrock -2619 ; Extended_Pictographic# 3.0 [1] (โ˜™๏ธ) REVERSED ROTATED FLORAL HEART BULLET -261A..266F ; Extended_Pictographic# 1.1 [86] (โ˜š๏ธ..โ™ฏ๏ธ) BLACK LEFT POINTING INDEX..MUSIC SHARP SIGN -2670..2671 ; Extended_Pictographic# 3.0 [2] (โ™ฐ๏ธ..โ™ฑ๏ธ) WEST SYRIAC CROSS..EAST SYRIAC CROSS -2672..267D ; Extended_Pictographic# 3.2 [12] (โ™ฒ๏ธ..โ™ฝ๏ธ) UNIVERSAL RECYCLING SYMBOL..PARTIALLY-RECYCLED PAPER SYMBOL -267E..267F ; Extended_Pictographic# 4.1 [2] (โ™พ๏ธ..โ™ฟ) PERMANENT PAPER SIGN..wheelchair symbol -2680..2689 ; Extended_Pictographic# 3.2 [10] (โš€๏ธ..โš‰๏ธ) DIE FACE-1..BLACK CIRCLE WITH TWO WHITE DOTS -268A..2691 ; Extended_Pictographic# 4.0 [8] (โšŠ๏ธ..โš‘๏ธ) MONOGRAM FOR YANG..BLACK FLAG -2692..269C ; Extended_Pictographic# 4.1 [11] (โš’๏ธ..โšœ๏ธ) hammer and pick..fleur-de-lis -269D ; Extended_Pictographic# 5.1 [1] (โš๏ธ) OUTLINED WHITE STAR -269E..269F ; Extended_Pictographic# 5.2 [2] (โšž๏ธ..โšŸ๏ธ) THREE LINES CONVERGING RIGHT..THREE LINES CONVERGING LEFT -26A0..26A1 ; Extended_Pictographic# 4.0 [2] (โš ๏ธ..โšก) warning..high voltage -26A2..26B1 ; Extended_Pictographic# 4.1 [16] (โšข๏ธ..โšฑ๏ธ) DOUBLED FEMALE SIGN..funeral urn -26B2 ; Extended_Pictographic# 5.0 [1] (โšฒ๏ธ) NEUTER -26B3..26BC ; Extended_Pictographic# 5.1 [10] (โšณ๏ธ..โšผ๏ธ) CERES..SESQUIQUADRATE -26BD..26BF ; Extended_Pictographic# 5.2 [3] (โšฝ..โšฟ๏ธ) soccer ball..SQUARED KEY -26C0..26C3 ; Extended_Pictographic# 5.1 [4] (โ›€๏ธ..โ›ƒ๏ธ) WHITE DRAUGHTS MAN..BLACK DRAUGHTS KING -26C4..26CD ; Extended_Pictographic# 5.2 [10] (โ›„..โ›๏ธ) snowman without snow..DISABLED CAR -26CE ; Extended_Pictographic# 6.0 [1] (โ›Ž) Ophiuchus -26CF..26E1 ; Extended_Pictographic# 5.2 [19] (โ›๏ธ..โ›ก๏ธ) pick..RESTRICTED LEFT ENTRY-2 -26E2 ; Extended_Pictographic# 6.0 [1] (โ›ข๏ธ) ASTRONOMICAL SYMBOL FOR URANUS -26E3 ; Extended_Pictographic# 5.2 [1] (โ›ฃ๏ธ) HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE -26E4..26E7 ; Extended_Pictographic# 6.0 [4] (โ›ค๏ธ..โ›ง๏ธ) PENTAGRAM..INVERTED PENTAGRAM -26E8..26FF ; Extended_Pictographic# 5.2 [24] (โ›จ๏ธ..โ›ฟ๏ธ) BLACK CROSS ON SHIELD..WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE -2700 ; Extended_Pictographic# 7.0 [1] (โœ€๏ธ) BLACK SAFETY SCISSORS -2701..2704 ; Extended_Pictographic# 1.1 [4] (โœ๏ธ..โœ„๏ธ) UPPER BLADE SCISSORS..WHITE SCISSORS -2705 ; Extended_Pictographic# 6.0 [1] (โœ…) white heavy check mark -2708..2709 ; Extended_Pictographic# 1.1 [2] (โœˆ๏ธ..โœ‰๏ธ) airplane..envelope -270A..270B ; Extended_Pictographic# 6.0 [2] (โœŠ..โœ‹) raised fist..raised hand -270C..2712 ; Extended_Pictographic# 1.1 [7] (โœŒ๏ธ..โœ’๏ธ) victory hand..black nib -2714 ; Extended_Pictographic# 1.1 [1] (โœ”๏ธ) heavy check mark -2716 ; Extended_Pictographic# 1.1 [1] (โœ–๏ธ) heavy multiplication x -271D ; Extended_Pictographic# 1.1 [1] (โœ๏ธ) latin cross -2721 ; Extended_Pictographic# 1.1 [1] (โœก๏ธ) star of David -2728 ; Extended_Pictographic# 6.0 [1] (โœจ) sparkles -2733..2734 ; Extended_Pictographic# 1.1 [2] (โœณ๏ธ..โœด๏ธ) eight-spoked asterisk..eight-pointed star -2744 ; Extended_Pictographic# 1.1 [1] (โ„๏ธ) snowflake -2747 ; Extended_Pictographic# 1.1 [1] (โ‡๏ธ) sparkle -274C ; Extended_Pictographic# 6.0 [1] (โŒ) cross mark -274E ; Extended_Pictographic# 6.0 [1] (โŽ) cross mark button -2753..2755 ; Extended_Pictographic# 6.0 [3] (โ“..โ•) question mark..white exclamation mark -2757 ; Extended_Pictographic# 5.2 [1] (โ—) exclamation mark -2763..2767 ; Extended_Pictographic# 1.1 [5] (โฃ๏ธ..โง๏ธ) heavy heart exclamation..ROTATED FLORAL HEART BULLET -2795..2797 ; Extended_Pictographic# 6.0 [3] (โž•..โž—) heavy plus sign..heavy division sign -27A1 ; Extended_Pictographic# 1.1 [1] (โžก๏ธ) right arrow -27B0 ; Extended_Pictographic# 6.0 [1] (โžฐ) curly loop -27BF ; Extended_Pictographic# 6.0 [1] (โžฟ) double curly loop -2934..2935 ; Extended_Pictographic# 3.2 [2] (โคด๏ธ..โคต๏ธ) right arrow curving up..right arrow curving down -2B05..2B07 ; Extended_Pictographic# 4.0 [3] (โฌ…๏ธ..โฌ‡๏ธ) left arrow..down arrow -2B1B..2B1C ; Extended_Pictographic# 5.1 [2] (โฌ›..โฌœ) black large square..white large square -2B50 ; Extended_Pictographic# 5.1 [1] (โญ) white medium star -2B55 ; Extended_Pictographic# 5.2 [1] (โญ•) heavy large circle -3030 ; Extended_Pictographic# 1.1 [1] (ใ€ฐ๏ธ) wavy dash -303D ; Extended_Pictographic# 3.2 [1] (ใ€ฝ๏ธ) part alternation mark -3297 ; Extended_Pictographic# 1.1 [1] (ใŠ—๏ธ) Japanese โ€œcongratulationsโ€ button -3299 ; Extended_Pictographic# 1.1 [1] (ใŠ™๏ธ) Japanese โ€œsecretโ€ button -1F000..1F02B ; Extended_Pictographic# 5.1 [44] (๐Ÿ€€๏ธ..๐Ÿ€ซ๏ธ) MAHJONG TILE EAST WIND..MAHJONG TILE BACK -1F02C..1F02F ; Extended_Pictographic# 10.0 [4] (๐Ÿ€ฌ๏ธ..๐Ÿ€ฏ๏ธ) .. -1F030..1F093 ; Extended_Pictographic# 5.1[100] (๐Ÿ€ฐ๏ธ..๐Ÿ‚“๏ธ) DOMINO TILE HORIZONTAL BACK..DOMINO TILE VERTICAL-06-06 -1F094..1F09F ; Extended_Pictographic# 10.0 [12] (๐Ÿ‚”๏ธ..๐Ÿ‚Ÿ๏ธ) .. -1F0A0..1F0AE ; Extended_Pictographic# 6.0 [15] (๐Ÿ‚ ๏ธ..๐Ÿ‚ฎ๏ธ) PLAYING CARD BACK..PLAYING CARD KING OF SPADES -1F0AF..1F0B0 ; Extended_Pictographic# 10.0 [2] (๐Ÿ‚ฏ๏ธ..๐Ÿ‚ฐ๏ธ) .. -1F0B1..1F0BE ; Extended_Pictographic# 6.0 [14] (๐Ÿ‚ฑ๏ธ..๐Ÿ‚พ๏ธ) PLAYING CARD ACE OF HEARTS..PLAYING CARD KING OF HEARTS -1F0BF ; Extended_Pictographic# 7.0 [1] (๐Ÿ‚ฟ๏ธ) PLAYING CARD RED JOKER -1F0C0 ; Extended_Pictographic# 10.0 [1] (๐Ÿƒ€๏ธ) -1F0C1..1F0CF ; Extended_Pictographic# 6.0 [15] (๐Ÿƒ๏ธ..๐Ÿƒ) PLAYING CARD ACE OF DIAMONDS..joker -1F0D0 ; Extended_Pictographic# 10.0 [1] (๐Ÿƒ๏ธ) -1F0D1..1F0DF ; Extended_Pictographic# 6.0 [15] (๐Ÿƒ‘๏ธ..๐ŸƒŸ๏ธ) PLAYING CARD ACE OF CLUBS..PLAYING CARD WHITE JOKER -1F0E0..1F0F5 ; Extended_Pictographic# 7.0 [22] (๐Ÿƒ ๏ธ..๐Ÿƒต๏ธ) PLAYING CARD FOOL..PLAYING CARD TRUMP-21 -1F0F6..1F0FF ; Extended_Pictographic# 10.0 [10] (๐Ÿƒถ๏ธ..๐Ÿƒฟ๏ธ) .. -1F10D..1F10F ; Extended_Pictographic# 10.0 [3] (๐Ÿ„๏ธ..๐Ÿ„๏ธ) .. -1F12F ; Extended_Pictographic# 10.0 [1] (๐Ÿ„ฏ๏ธ) -1F16C..1F16F ; Extended_Pictographic# 10.0 [4] (๐Ÿ…ฌ๏ธ..๐Ÿ…ฏ๏ธ) .. -1F170..1F171 ; Extended_Pictographic# 6.0 [2] (๐Ÿ…ฐ๏ธ..๐Ÿ…ฑ๏ธ) A button (blood type)..B button (blood type) -1F17E ; Extended_Pictographic# 6.0 [1] (๐Ÿ…พ๏ธ) O button (blood type) -1F17F ; Extended_Pictographic# 5.2 [1] (๐Ÿ…ฟ๏ธ) P button -1F18E ; Extended_Pictographic# 6.0 [1] (๐Ÿ†Ž) AB button (blood type) -1F191..1F19A ; Extended_Pictographic# 6.0 [10] (๐Ÿ†‘..๐Ÿ†š) CL button..VS button -1F1AD..1F1E5 ; Extended_Pictographic# 10.0 [57] (๐Ÿ†ญ๏ธ..๐Ÿ‡ฅ๏ธ) .. -1F201..1F202 ; Extended_Pictographic# 6.0 [2] (๐Ÿˆ..๐Ÿˆ‚๏ธ) Japanese โ€œhereโ€ button..Japanese โ€œservice chargeโ€ button -1F203..1F20F ; Extended_Pictographic# 10.0 [13] (๐Ÿˆƒ๏ธ..๐Ÿˆ๏ธ) .. -1F21A ; Extended_Pictographic# 5.2 [1] (๐Ÿˆš) Japanese โ€œfree of chargeโ€ button -1F22F ; Extended_Pictographic# 5.2 [1] (๐Ÿˆฏ) Japanese โ€œreservedโ€ button -1F232..1F23A ; Extended_Pictographic# 6.0 [9] (๐Ÿˆฒ..๐Ÿˆบ) Japanese โ€œprohibitedโ€ button..Japanese โ€œopen for businessโ€ button -1F23C..1F23F ; Extended_Pictographic# 10.0 [4] (๐Ÿˆผ๏ธ..๐Ÿˆฟ๏ธ) .. -1F249..1F24F ; Extended_Pictographic# 10.0 [7] (๐Ÿ‰‰๏ธ..๐Ÿ‰๏ธ) .. -1F250..1F251 ; Extended_Pictographic# 6.0 [2] (๐Ÿ‰..๐Ÿ‰‘) Japanese โ€œbargainโ€ button..Japanese โ€œacceptableโ€ button -1F252..1F25F ; Extended_Pictographic# 10.0 [14] (๐Ÿ‰’๏ธ..๐Ÿ‰Ÿ๏ธ) .. -1F260..1F265 ; Extended_Pictographic# 10.0 [6] (๐Ÿ‰ ๏ธ..๐Ÿ‰ฅ๏ธ) ROUNDED SYMBOL FOR FU..ROUNDED SYMBOL FOR CAI -1F266..1F2FF ; Extended_Pictographic# 10.0[154] (๐Ÿ‰ฆ๏ธ..๐Ÿ‹ฟ๏ธ) .. -1F300..1F320 ; Extended_Pictographic# 6.0 [33] (๐ŸŒ€..๐ŸŒ ) cyclone..shooting star -1F321..1F32C ; Extended_Pictographic# 7.0 [12] (๐ŸŒก๏ธ..๐ŸŒฌ๏ธ) thermometer..wind face -1F32D..1F32F ; Extended_Pictographic# 8.0 [3] (๐ŸŒญ..๐ŸŒฏ) hot dog..burrito -1F330..1F335 ; Extended_Pictographic# 6.0 [6] (๐ŸŒฐ..๐ŸŒต) chestnut..cactus -1F336 ; Extended_Pictographic# 7.0 [1] (๐ŸŒถ๏ธ) hot pepper -1F337..1F37C ; Extended_Pictographic# 6.0 [70] (๐ŸŒท..๐Ÿผ) tulip..baby bottle -1F37D ; Extended_Pictographic# 7.0 [1] (๐Ÿฝ๏ธ) fork and knife with plate -1F37E..1F37F ; Extended_Pictographic# 8.0 [2] (๐Ÿพ..๐Ÿฟ) bottle with popping cork..popcorn -1F380..1F393 ; Extended_Pictographic# 6.0 [20] (๐ŸŽ€..๐ŸŽ“) ribbon..graduation cap -1F394..1F39F ; Extended_Pictographic# 7.0 [12] (๐ŸŽ”๏ธ..๐ŸŽŸ๏ธ) HEART WITH TIP ON THE LEFT..admission tickets -1F3A0..1F3C4 ; Extended_Pictographic# 6.0 [37] (๐ŸŽ ..๐Ÿ„) carousel horse..person surfing -1F3C5 ; Extended_Pictographic# 7.0 [1] (๐Ÿ…) sports medal -1F3C6..1F3CA ; Extended_Pictographic# 6.0 [5] (๐Ÿ†..๐ŸŠ) trophy..person swimming -1F3CB..1F3CE ; Extended_Pictographic# 7.0 [4] (๐Ÿ‹๏ธ..๐ŸŽ๏ธ) person lifting weights..racing car -1F3CF..1F3D3 ; Extended_Pictographic# 8.0 [5] (๐Ÿ..๐Ÿ“) cricket game..ping pong -1F3D4..1F3DF ; Extended_Pictographic# 7.0 [12] (๐Ÿ”๏ธ..๐ŸŸ๏ธ) snow-capped mountain..stadium -1F3E0..1F3F0 ; Extended_Pictographic# 6.0 [17] (๐Ÿ ..๐Ÿฐ) house..castle -1F3F1..1F3F7 ; Extended_Pictographic# 7.0 [7] (๐Ÿฑ๏ธ..๐Ÿท๏ธ) WHITE PENNANT..label -1F3F8..1F3FA ; Extended_Pictographic# 8.0 [3] (๐Ÿธ..๐Ÿบ) badminton..amphora -1F400..1F43E ; Extended_Pictographic# 6.0 [63] (๐Ÿ€..๐Ÿพ) rat..paw prints -1F43F ; Extended_Pictographic# 7.0 [1] (๐Ÿฟ๏ธ) chipmunk -1F440 ; Extended_Pictographic# 6.0 [1] (๐Ÿ‘€) eyes -1F441 ; Extended_Pictographic# 7.0 [1] (๐Ÿ‘๏ธ) eye -1F442..1F4F7 ; Extended_Pictographic# 6.0[182] (๐Ÿ‘‚..๐Ÿ“ท) ear..camera -1F4F8 ; Extended_Pictographic# 7.0 [1] (๐Ÿ“ธ) camera with flash -1F4F9..1F4FC ; Extended_Pictographic# 6.0 [4] (๐Ÿ“น..๐Ÿ“ผ) video camera..videocassette -1F4FD..1F4FE ; Extended_Pictographic# 7.0 [2] (๐Ÿ“ฝ๏ธ..๐Ÿ“พ๏ธ) film projector..PORTABLE STEREO -1F4FF ; Extended_Pictographic# 8.0 [1] (๐Ÿ“ฟ) prayer beads -1F500..1F53D ; Extended_Pictographic# 6.0 [62] (๐Ÿ”€..๐Ÿ”ฝ) shuffle tracks button..down button -1F53E..1F53F ; Extended_Pictographic# 7.0 [2] (๐Ÿ”พ๏ธ..๐Ÿ”ฟ๏ธ) LOWER RIGHT SHADOWED WHITE CIRCLE..UPPER RIGHT SHADOWED WHITE CIRCLE -1F540..1F543 ; Extended_Pictographic# 6.1 [4] (๐Ÿ•€๏ธ..๐Ÿ•ƒ๏ธ) CIRCLED CROSS POMMEE..NOTCHED LEFT SEMICIRCLE WITH THREE DOTS -1F544..1F54A ; Extended_Pictographic# 7.0 [7] (๐Ÿ•„๏ธ..๐Ÿ•Š๏ธ) NOTCHED RIGHT SEMICIRCLE WITH THREE DOTS..dove -1F54B..1F54F ; Extended_Pictographic# 8.0 [5] (๐Ÿ•‹..๐Ÿ•๏ธ) kaaba..BOWL OF HYGIEIA -1F550..1F567 ; Extended_Pictographic# 6.0 [24] (๐Ÿ•..๐Ÿ•ง) one oโ€™clock..twelve-thirty -1F568..1F579 ; Extended_Pictographic# 7.0 [18] (๐Ÿ•จ๏ธ..๐Ÿ•น๏ธ) RIGHT SPEAKER..joystick -1F57A ; Extended_Pictographic# 9.0 [1] (๐Ÿ•บ) man dancing -1F57B..1F5A3 ; Extended_Pictographic# 7.0 [41] (๐Ÿ•ป๏ธ..๐Ÿ–ฃ๏ธ) LEFT HAND TELEPHONE RECEIVER..BLACK DOWN POINTING BACKHAND INDEX -1F5A4 ; Extended_Pictographic# 9.0 [1] (๐Ÿ–ค) black heart -1F5A5..1F5FA ; Extended_Pictographic# 7.0 [86] (๐Ÿ–ฅ๏ธ..๐Ÿ—บ๏ธ) desktop computer..world map -1F5FB..1F5FF ; Extended_Pictographic# 6.0 [5] (๐Ÿ—ป..๐Ÿ—ฟ) mount fuji..moai -1F600 ; Extended_Pictographic# 6.1 [1] (๐Ÿ˜€) grinning face -1F601..1F610 ; Extended_Pictographic# 6.0 [16] (๐Ÿ˜..๐Ÿ˜) beaming face with smiling eyes..neutral face -1F611 ; Extended_Pictographic# 6.1 [1] (๐Ÿ˜‘) expressionless face -1F612..1F614 ; Extended_Pictographic# 6.0 [3] (๐Ÿ˜’..๐Ÿ˜”) unamused face..pensive face -1F615 ; Extended_Pictographic# 6.1 [1] (๐Ÿ˜•) confused face -1F616 ; Extended_Pictographic# 6.0 [1] (๐Ÿ˜–) confounded face -1F617 ; Extended_Pictographic# 6.1 [1] (๐Ÿ˜—) kissing face -1F618 ; Extended_Pictographic# 6.0 [1] (๐Ÿ˜˜) face blowing a kiss -1F619 ; Extended_Pictographic# 6.1 [1] (๐Ÿ˜™) kissing face with smiling eyes -1F61A ; Extended_Pictographic# 6.0 [1] (๐Ÿ˜š) kissing face with closed eyes -1F61B ; Extended_Pictographic# 6.1 [1] (๐Ÿ˜›) face with tongue -1F61C..1F61E ; Extended_Pictographic# 6.0 [3] (๐Ÿ˜œ..๐Ÿ˜ž) winking face with tongue..disappointed face -1F61F ; Extended_Pictographic# 6.1 [1] (๐Ÿ˜Ÿ) worried face -1F620..1F625 ; Extended_Pictographic# 6.0 [6] (๐Ÿ˜ ..๐Ÿ˜ฅ) angry face..sad but relieved face -1F626..1F627 ; Extended_Pictographic# 6.1 [2] (๐Ÿ˜ฆ..๐Ÿ˜ง) frowning face with open mouth..anguished face -1F628..1F62B ; Extended_Pictographic# 6.0 [4] (๐Ÿ˜จ..๐Ÿ˜ซ) fearful face..tired face -1F62C ; Extended_Pictographic# 6.1 [1] (๐Ÿ˜ฌ) grimacing face -1F62D ; Extended_Pictographic# 6.0 [1] (๐Ÿ˜ญ) loudly crying face -1F62E..1F62F ; Extended_Pictographic# 6.1 [2] (๐Ÿ˜ฎ..๐Ÿ˜ฏ) face with open mouth..hushed face -1F630..1F633 ; Extended_Pictographic# 6.0 [4] (๐Ÿ˜ฐ..๐Ÿ˜ณ) anxious face with sweat..flushed face -1F634 ; Extended_Pictographic# 6.1 [1] (๐Ÿ˜ด) sleeping face -1F635..1F640 ; Extended_Pictographic# 6.0 [12] (๐Ÿ˜ต..๐Ÿ™€) dizzy face..weary cat face -1F641..1F642 ; Extended_Pictographic# 7.0 [2] (๐Ÿ™..๐Ÿ™‚) slightly frowning face..slightly smiling face -1F643..1F644 ; Extended_Pictographic# 8.0 [2] (๐Ÿ™ƒ..๐Ÿ™„) upside-down face..face with rolling eyes -1F645..1F64F ; Extended_Pictographic# 6.0 [11] (๐Ÿ™…..๐Ÿ™) person gesturing NO..folded hands -1F680..1F6C5 ; Extended_Pictographic# 6.0 [70] (๐Ÿš€..๐Ÿ›…) rocket..left luggage -1F6C6..1F6CF ; Extended_Pictographic# 7.0 [10] (๐Ÿ›†๏ธ..๐Ÿ›๏ธ) TRIANGLE WITH ROUNDED CORNERS..bed -1F6D0 ; Extended_Pictographic# 8.0 [1] (๐Ÿ›) place of worship -1F6D1..1F6D2 ; Extended_Pictographic# 9.0 [2] (๐Ÿ›‘..๐Ÿ›’) stop sign..shopping cart -1F6D3..1F6D4 ; Extended_Pictographic# 10.0 [2] (๐Ÿ›“๏ธ..๐Ÿ›”๏ธ) STUPA..PAGODA -1F6D5..1F6DF ; Extended_Pictographic# 10.0 [11] (๐Ÿ›•๏ธ..๐Ÿ›Ÿ๏ธ) .. -1F6E0..1F6EC ; Extended_Pictographic# 7.0 [13] (๐Ÿ› ๏ธ..๐Ÿ›ฌ) hammer and wrench..airplane arrival -1F6ED..1F6EF ; Extended_Pictographic# 10.0 [3] (๐Ÿ›ญ๏ธ..๐Ÿ›ฏ๏ธ) .. -1F6F0..1F6F3 ; Extended_Pictographic# 7.0 [4] (๐Ÿ›ฐ๏ธ..๐Ÿ›ณ๏ธ) satellite..passenger ship -1F6F4..1F6F6 ; Extended_Pictographic# 9.0 [3] (๐Ÿ›ด..๐Ÿ›ถ) kick scooter..canoe -1F6F7..1F6F8 ; Extended_Pictographic# 10.0 [2] (๐Ÿ›ท..๐Ÿ›ธ) sled..flying saucer -1F6F9..1F6FF ; Extended_Pictographic# 10.0 [7] (๐Ÿ›น๏ธ..๐Ÿ›ฟ๏ธ) .. -1F774..1F77F ; Extended_Pictographic# 10.0 [12] (๐Ÿด๏ธ..๐Ÿฟ๏ธ) .. -1F7D5..1F7FF ; Extended_Pictographic# 10.0 [43] (๐ŸŸ•๏ธ..๐ŸŸฟ๏ธ) .. -1F80C..1F80F ; Extended_Pictographic# 10.0 [4] (๐Ÿ Œ๏ธ..๐Ÿ ๏ธ) .. -1F848..1F84F ; Extended_Pictographic# 10.0 [8] (๐Ÿกˆ๏ธ..๐Ÿก๏ธ) .. -1F85A..1F85F ; Extended_Pictographic# 10.0 [6] (๐Ÿกš๏ธ..๐ŸกŸ๏ธ) .. -1F888..1F88F ; Extended_Pictographic# 10.0 [8] (๐Ÿขˆ๏ธ..๐Ÿข๏ธ) .. -1F8AE..1F8FF ; Extended_Pictographic# 10.0 [82] (๐Ÿขฎ๏ธ..๐Ÿฃฟ๏ธ) .. -1F900..1F90B ; Extended_Pictographic# 10.0 [12] (๐Ÿค€๏ธ..๐Ÿค‹๏ธ) CIRCLED CROSS FORMEE WITH FOUR DOTS..DOWNWARD FACING NOTCHED HOOK WITH DOT -1F90C..1F90F ; Extended_Pictographic# 10.0 [4] (๐ŸคŒ๏ธ..๐Ÿค๏ธ) .. -1F910..1F918 ; Extended_Pictographic# 8.0 [9] (๐Ÿค..๐Ÿค˜) zipper-mouth face..sign of the horns -1F919..1F91E ; Extended_Pictographic# 9.0 [6] (๐Ÿค™..๐Ÿคž) call me hand..crossed fingers -1F91F ; Extended_Pictographic# 10.0 [1] (๐ŸคŸ) love-you gesture -1F920..1F927 ; Extended_Pictographic# 9.0 [8] (๐Ÿค ..๐Ÿคง) cowboy hat face..sneezing face -1F928..1F92F ; Extended_Pictographic# 10.0 [8] (๐Ÿคจ..๐Ÿคฏ) face with raised eyebrow..exploding head -1F930 ; Extended_Pictographic# 9.0 [1] (๐Ÿคฐ) pregnant woman -1F931..1F932 ; Extended_Pictographic# 10.0 [2] (๐Ÿคฑ..๐Ÿคฒ) breast-feeding..palms up together -1F933..1F93A ; Extended_Pictographic# 9.0 [8] (๐Ÿคณ..๐Ÿคบ) selfie..person fencing -1F93C..1F93E ; Extended_Pictographic# 9.0 [3] (๐Ÿคผ..๐Ÿคพ) people wrestling..person playing handball -1F93F ; Extended_Pictographic# 10.0 [1] (๐Ÿคฟ๏ธ) -1F940..1F945 ; Extended_Pictographic# 9.0 [6] (๐Ÿฅ€..๐Ÿฅ…) wilted flower..goal net -1F947..1F94B ; Extended_Pictographic# 9.0 [5] (๐Ÿฅ‡..๐Ÿฅ‹) 1st place medal..martial arts uniform -1F94C ; Extended_Pictographic# 10.0 [1] (๐ŸฅŒ) curling stone -1F94D..1F94F ; Extended_Pictographic# 10.0 [3] (๐Ÿฅ๏ธ..๐Ÿฅ๏ธ) .. -1F950..1F95E ; Extended_Pictographic# 9.0 [15] (๐Ÿฅ..๐Ÿฅž) croissant..pancakes -1F95F..1F96B ; Extended_Pictographic# 10.0 [13] (๐ŸฅŸ..๐Ÿฅซ) dumpling..canned food -1F96C..1F97F ; Extended_Pictographic# 10.0 [20] (๐Ÿฅฌ๏ธ..๐Ÿฅฟ๏ธ) .. -1F980..1F984 ; Extended_Pictographic# 8.0 [5] (๐Ÿฆ€..๐Ÿฆ„) crab..unicorn face -1F985..1F991 ; Extended_Pictographic# 9.0 [13] (๐Ÿฆ…..๐Ÿฆ‘) eagle..squid -1F992..1F997 ; Extended_Pictographic# 10.0 [6] (๐Ÿฆ’..๐Ÿฆ—) giraffe..cricket -1F998..1F9BF ; Extended_Pictographic# 10.0 [40] (๐Ÿฆ˜๏ธ..๐Ÿฆฟ๏ธ) .. -1F9C0 ; Extended_Pictographic# 8.0 [1] (๐Ÿง€) cheese wedge -1F9C1..1F9CF ; Extended_Pictographic# 10.0 [15] (๐Ÿง๏ธ..๐Ÿง๏ธ) .. -1F9D0..1F9E6 ; Extended_Pictographic# 10.0 [23] (๐Ÿง..๐Ÿงฆ) face with monocle..socks -1F9E7..1FFFD ; Extended_Pictographic# 10.0[1559] (๐Ÿงง๏ธ..๐Ÿฟฝ๏ธ) .. - -# Total elements: 3823 - -#EOF diff --git a/Scripts/emoji_ranges.py b/Scripts/emoji_ranges.py deleted file mode 100755 index 32cc9b698..000000000 --- a/Scripts/emoji_ranges.py +++ /dev/null @@ -1,88 +0,0 @@ -#!/usr/bin/env python -import sys -import os -import re -import commands -import subprocess -import io - -def fail(message): - print message - sys.exit(1) - -# For simplicity and compactness, we pre-define the -# emoji code planes to ensure that all of the currently-used -# emoji ranges within them are combined. -big_ranges = [ - (0x1F600,0x1F64F, ), - (0x1F300,0x1F5FF, ), - (0x1F680,0x1F6FF, ), - (0x2600,0x26FF, ), - (0x2700,0x27BF, ), - (0xFE00,0xFE0F, ), - (0x1F900,0x1F9FF, ), - (65024,65039,), - (8400, 8447,) - ] - -if __name__ == '__main__': - src_filename = "emoji-data.txt" - src_dir_path = os.path.dirname(__file__) - src_file_path = os.path.join(src_dir_path, src_filename) - print 'src_file_path', src_file_path - if not os.path.exists(src_file_path): - fail("Could not find input file") - - with io.open(src_file_path, "r", encoding="utf-8") as f: - text = f.read() - - lines = text.split('\n') - raw_ranges = [] - for line in lines: - if '#' in line: - line = line[:line.index('#')].strip() - if ';' not in line: - continue - print 'line:', line - range_text = line[:line.index(';')] - print '\t:', range_text - if '..' in range_text: - range_start_hex_string, range_end_hex_string = range_text.split('..') - else: - range_start_hex_string = range_end_hex_string = range_text.strip() - range_start = int(range_start_hex_string.strip(), 16) - range_end = int(range_end_hex_string.strip(), 16) - print '\t', range_start, range_end - - raw_ranges.append((range_start, range_end,)) - - raw_ranges += big_ranges - - raw_ranges.sort(key=lambda a:a[0]) - - - new_ranges = [] - for range_start, range_end in raw_ranges: - if len(new_ranges) > 0: - last_range = new_ranges[-1] - # print 'last_range', last_range - last_range_start, last_range_end = last_range - if range_start >= last_range_start and range_start <= last_range_end + 1: - # if last_range_end + 1 == range_start: - new_ranges = new_ranges[:-1] - print 'merging', last_range_start, last_range_end, 'and', range_start, range_end - new_ranges.append((last_range_start, max(range_end, last_range_end),)) - continue - - new_ranges.append((range_start, range_end,)) - - print - for range_start, range_end in new_ranges: - # print '0x%X...0x%X, // %d Emotions' % (range_start, range_end, (1 + range_end - range_start), ) - print 'EmojiRange(rangeStart:0x%X, rangeEnd:0x%X),' % (range_start, range_end, ) - print 'new_ranges:', len(new_ranges) - print - print 'Copy and paste the code above into DisplayableText.swift' - print - - diff --git a/Scripts/git_hooks/README.md b/Scripts/git_hooks/README.md deleted file mode 100644 index 146c2df48..000000000 --- a/Scripts/git_hooks/README.md +++ /dev/null @@ -1 +0,0 @@ -Copy these git hooks into .git/hooks diff --git a/Scripts/git_hooks/post-commit b/Scripts/git_hooks/post-commit deleted file mode 100755 index ed392f169..000000000 --- a/Scripts/git_hooks/post-commit +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env bash - -Scripts/reverse_integration_check.py diff --git a/Scripts/git_hooks/pre-commit b/Scripts/git_hooks/pre-commit deleted file mode 100755 index 89a316307..000000000 --- a/Scripts/git_hooks/pre-commit +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env bash - -Scripts/precommit.py diff --git a/Scripts/precommit.py b/Scripts/precommit.py deleted file mode 100755 index d8d9191a3..000000000 --- a/Scripts/precommit.py +++ /dev/null @@ -1,475 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -import os -import sys -import subprocess -import datetime -import argparse -import commands - - -git_repo_path = os.path.abspath(subprocess.check_output(['git', 'rev-parse', '--show-toplevel']).strip()) - - - -class include: - def __init__(self, isInclude, isQuote, body, comment): - self.isInclude = isInclude - self.isQuote = isQuote - self.body = body - self.comment = comment - - def format(self): - result = '%s %s%s%s' % ( - ('#include' if self.isInclude else '#import'), - ('"' if self.isQuote else '<'), - self.body.strip(), - ('"' if self.isQuote else '>'), - ) - if self.comment.strip(): - result += ' ' + self.comment.strip() - return result - - -def is_include_or_import(line): - line = line.strip() - if line.startswith('#include '): - return True - elif line.startswith('#import '): - return True - else: - return False - - -def parse_include(line): - remainder = line.strip() - - if remainder.startswith('#include '): - isInclude = True - remainder = remainder[len('#include '):] - elif remainder.startswith('#import '): - isInclude = False - remainder = remainder[len('#import '):] - elif remainder == '//': - return None - elif not remainder: - return None - else: - print ('Unexpected import or include: '+ line) - sys.exit(1) - - comment = None - if remainder.startswith('"'): - isQuote = True - endIndex = remainder.find('"', 1) - if endIndex < 0: - print ('Unexpected import or include: '+ line) - sys.exit(1) - body = remainder[1:endIndex] - comment = remainder[endIndex+1:] - elif remainder.startswith('<'): - isQuote = False - endIndex = remainder.find('>', 1) - if endIndex < 0: - print ('Unexpected import or include: '+ line) - sys.exit(1) - body = remainder[1:endIndex] - comment = remainder[endIndex+1:] - else: - print ('Unexpected import or include: '+ remainder) - sys.exit(1) - - return include(isInclude, isQuote, body, comment) - - -def parse_includes(text): - lines = text.split('\n') - - includes = [] - for line in lines: - include = parse_include(line) - if include: - includes.append(include) - - return includes - - -def sort_include_block(text, filepath, filename, file_extension): - lines = text.split('\n') - - includes = parse_includes(text) - - blocks = [] - - file_extension = file_extension.lower() - - for include in includes: - include.isInclude = False - - if file_extension in ('c', 'cpp', 'hpp'): - for include in includes: - include.isInclude = True - elif file_extension in ('m'): - for include in includes: - include.isInclude = False - - # Make sure matching header is first. - matching_header_includes = [] - other_includes = [] - def is_matching_header(include): - filename_wo_ext = os.path.splitext(filename)[0] - include_filename_wo_ext = os.path.splitext(os.path.basename(include.body))[0] - return filename_wo_ext == include_filename_wo_ext - for include in includes: - if is_matching_header(include): - matching_header_includes.append(include) - else: - other_includes.append(include) - includes = other_includes - - def formatBlock(includes): - lines = [include.format() for include in includes] - lines = list(set(lines)) - def include_sorter(a, b): - # return cmp(a.lower(), b.lower()) - return cmp(a, b) - # print 'before' - # for line in lines: - # print '\t', line - # print - lines.sort(include_sorter) - # print 'after' - # for line in lines: - # print '\t', line - # print - # print - # print 'filepath' - # for line in lines: - # print '\t', line - # print - return '\n'.join(lines) - - includeAngles = [include for include in includes if include.isInclude and not include.isQuote] - includeQuotes = [include for include in includes if include.isInclude and include.isQuote] - importAngles = [include for include in includes if (not include.isInclude) and not include.isQuote] - importQuotes = [include for include in includes if (not include.isInclude) and include.isQuote] - if matching_header_includes: - blocks.append(formatBlock(matching_header_includes)) - if includeQuotes: - blocks.append(formatBlock(includeQuotes)) - if includeAngles: - blocks.append(formatBlock(includeAngles)) - if importQuotes: - blocks.append(formatBlock(importQuotes)) - if importAngles: - blocks.append(formatBlock(importAngles)) - - return '\n'.join(blocks) + '\n' - - -def sort_class_statement_block(text, filepath, filename, file_extension): - lines = text.split('\n') - lines = [line.strip() for line in lines if line.strip()] - lines = list(set(lines)) - lines.sort() - return '\n' + '\n'.join(lines) + '\n' - - -def find_matching_section(text, match_test): - lines = text.split('\n') - first_matching_line_index = None - for index, line in enumerate(lines): - if match_test(line): - first_matching_line_index = index - break - - if first_matching_line_index is None: - return None - - # Absorb any leading empty lines. - while first_matching_line_index > 0: - prev_line = lines[first_matching_line_index - 1] - if prev_line.strip(): - break - first_matching_line_index = first_matching_line_index - 1 - - first_non_matching_line_index = None - for index, line in enumerate(lines[first_matching_line_index:]): - if not line.strip(): - # Absorb any trailing empty lines. - continue - if not match_test(line): - first_non_matching_line_index = index + first_matching_line_index - break - - text0 = '\n'.join(lines[:first_matching_line_index]) - if first_non_matching_line_index is None: - text1 = '\n'.join(lines[first_matching_line_index:]) - text2 = None - else: - text1 = '\n'.join(lines[first_matching_line_index:first_non_matching_line_index]) - text2 = '\n'.join(lines[first_non_matching_line_index:]) - - return text0, text1, text2 - - -def sort_matching_blocks(sort_name, filepath, filename, file_extension, text, match_func, sort_func): - unprocessed = text - processed = None - while True: - section = find_matching_section(unprocessed, match_func) - # print '\t', 'sort_matching_blocks', section - if not section: - if processed: - processed = '\n'.join((processed, unprocessed,)) - else: - processed = unprocessed - break - - text0, text1, text2 = section - - if processed: - processed = '\n'.join((processed, text0,)) - else: - processed = text0 - - # print 'before:' - # temp_lines = text1.split('\n') - # for index, line in enumerate(temp_lines): - # if index < 3 or index + 3 >= len(temp_lines): - # print '\t', index, line - # # print text1 - # print - text1 = sort_func(text1, filepath, filename, file_extension) - # print 'after:' - # # print text1 - # temp_lines = text1.split('\n') - # for index, line in enumerate(temp_lines): - # if index < 3 or index + 3 >= len(temp_lines): - # print '\t', index, line - # print - processed = '\n'.join((processed, text1,)) - if text2: - unprocessed = text2 - else: - break - - if text != processed: - print sort_name, filepath - return processed - - -def find_class_statement_section(text): - def is_class_statement(line): - return line.strip().startswith('@class ') - - return find_matching_section(text, is_class_statement) - - -def find_include_section(text): - def is_include_line(line): - return is_include_or_import(line) - # return is_include_or_import_or_empty(line) - - return find_matching_section(text, is_include_line) - - -def sort_includes(filepath, filename, file_extension, text): - # print 'sort_includes', filepath - if file_extension not in ('.h', '.m', '.mm'): - return text - return sort_matching_blocks('sort_includes', filepath, filename, file_extension, text, find_include_section, sort_include_block) - - -def sort_class_statements(filepath, filename, file_extension, text): - # print 'sort_class_statements', filepath - if file_extension not in ('.h', '.m', '.mm'): - return text - return sort_matching_blocks('sort_class_statements', filepath, filename, file_extension, text, find_class_statement_section, sort_class_statement_block) - - -def splitall(path): - allparts = [] - while 1: - parts = os.path.split(path) - if parts[0] == path: # sentinel for absolute paths - allparts.insert(0, parts[0]) - break - elif parts[1] == path: # sentinel for relative paths - allparts.insert(0, parts[1]) - break - else: - path = parts[0] - allparts.insert(0, parts[1]) - return allparts - - -def process(filepath): - - short_filepath = filepath[len(git_repo_path):] - if short_filepath.startswith(os.sep): - short_filepath = short_filepath[len(os.sep):] - - filename = os.path.basename(filepath) - if filename.startswith('.'): - raise "shouldn't call process with dotfile" - file_ext = os.path.splitext(filename)[1] - if file_ext in ('.swift'): - env_copy = os.environ.copy() - env_copy["SCRIPT_INPUT_FILE_COUNT"] = "1" - env_copy["SCRIPT_INPUT_FILE_0"] = '%s' % ( short_filepath, ) - lint_output = subprocess.check_output(['swiftlint', 'autocorrect', '--use-script-input-files'], env=env_copy) - print lint_output - try: - lint_output = subprocess.check_output(['swiftlint', 'lint', '--use-script-input-files'], env=env_copy) - except subprocess.CalledProcessError, e: - lint_output = e.output - print lint_output - - with open(filepath, 'rt') as f: - text = f.read() - - original_text = text - - text = sort_includes(filepath, filename, file_ext, text) - text = sort_class_statements(filepath, filename, file_ext, text) - - lines = text.split('\n') - while lines and lines[0].startswith('//'): - lines = lines[1:] - text = '\n'.join(lines) - text = text.strip() - - header = '''// -// Copyright (c) %s Open Whisper Systems. All rights reserved. -// - -''' % ( - datetime.datetime.now().year, - ) - text = header + text + '\n' - - if original_text == text: - return - - print 'Updating:', short_filepath - - with open(filepath, 'wt') as f: - f.write(text) - - -def should_ignore_path(path): - ignore_paths = [ - os.path.join(git_repo_path, '.git') - ] - for ignore_path in ignore_paths: - if path.startswith(ignore_path): - return True - for component in splitall(path): - if component.startswith('.'): - return True - if component.endswith('.framework'): - return True - if component in ('Pods', 'ThirdParty', 'Carthage',): - return True - - return False - - -def process_if_appropriate(filepath): - filename = os.path.basename(filepath) - if filename.startswith('.'): - return - file_ext = os.path.splitext(filename)[1] - if file_ext not in ('.h', '.hpp', '.cpp', '.m', '.mm', '.pch', '.swift'): - return - if should_ignore_path(filepath): - return - process(filepath) - - -def check_diff_for_keywords(): - objc_keywords = [ - "OWSAbstractMethod\(" - "OWSAssert\(", - "OWSCAssert\(", - "OWSFail\(", - "OWSCFail\(", - "ows_add_overflow\(", - "ows_sub_overflow\(", - ] - - swift_keywords = [ - "owsFail\(", - "precondition\(", - "fatalError\(", - "dispatchPrecondition\(", - "preconditionFailure\(", - "notImplemented\(" - ] - - keywords = objc_keywords + swift_keywords - - matching_expression = "|".join(keywords) - command_line = 'git diff --staged | grep --color=always -C 3 -E "%s"' % matching_expression - try: - output = subprocess.check_output(command_line, shell=True) - except subprocess.CalledProcessError, e: - # > man grep - # EXIT STATUS - # The grep utility exits with one of the following values: - # 0 One or more lines were selected. - # 1 No lines were selected. - # >1 An error occurred. - if e.returncode == 1: - # no keywords in diff output - return - else: - # some other error - bad grep expression? - raise e - - if len(output) > 0: - print("โš ๏ธ keywords detected in diff:") - print(output) - - -if __name__ == "__main__": - - parser = argparse.ArgumentParser(description='Precommit script.') - parser.add_argument('--all', action='store_true', help='process all files in or below current dir') - parser.add_argument('--path', help='used to specify a path to process.') - args = parser.parse_args() - - if args.all: - for rootdir, dirnames, filenames in os.walk(git_repo_path): - for filename in filenames: - file_path = os.path.abspath(os.path.join(rootdir, filename)) - process_if_appropriate(file_path) - elif args.path: - for rootdir, dirnames, filenames in os.walk(args.path): - for filename in filenames: - file_path = os.path.abspath(os.path.join(rootdir, filename)) - process_if_appropriate(file_path) - else: - filepaths = [] - - # Staging - output = commands.getoutput('git diff --cached --name-only --diff-filter=ACMR') - filepaths.extend([line.strip() for line in output.split('\n')]) - - # Working - output = commands.getoutput('git diff --name-only --diff-filter=ACMR') - filepaths.extend([line.strip() for line in output.split('\n')]) - - # Only process each path once. - filepaths = sorted(set(filepaths)) - - for filepath in filepaths: - filepath = os.path.abspath(os.path.join(git_repo_path, filepath)) - process_if_appropriate(filepath) - - print 'git clang-format...' - print commands.getoutput('git clang-format') - - check_diff_for_keywords() diff --git a/Scripts/reverse_integration_check.py b/Scripts/reverse_integration_check.py deleted file mode 100755 index b5b845aa8..000000000 --- a/Scripts/reverse_integration_check.py +++ /dev/null @@ -1,98 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# When we make a hotfix, we need to reverse integrate our hotfix back into -# master. After commiting to master, this script audits that all tags have been -# reverse integrated. -import subprocess -from distutils.version import LooseVersion -import logging - -#logging.basicConfig(level=logging.DEBUG) - -def is_on_master(): - output = subprocess.check_output(["git", "rev-parse", "--abbrev-ref", "HEAD"]).strip() - logging.debug("branch output: %s" % output) - return output == "master" - -def main(): - if not is_on_master(): - # Don't interfere while on a feature or hotfix branch - logging.debug("not on master branch") - return - - logging.debug("on master branch") - - unmerged_tags_output = subprocess.check_output(["git", "tag", "--no-merged", "master"]) - unmerged_tags = [line.strip() for line in unmerged_tags_output.split("\n") if len(line) > 0] - - logging.debug("All unmerged tags: %s" % unmerged_tags) - - # Before this point we weren't always reverse integrating our tags. As we - # audit old tags, we can ratchet this version number back. - epoch_tag="2.21.0" - - logging.debug("ignoring tags before epoch_tag: %s" % epoch_tag) - - tags_of_concern = [tag for tag in unmerged_tags if LooseVersion(tag) > LooseVersion(epoch_tag)] - - # Don't reverse integrate tags for adhoc builds - tags_of_concern = [tag for tag in tags_of_concern if "adhoc" not in tag] - - tags_to_ignore = [ - '2.23.3.0', - '2.23.3.1', - '2.26.0.6', - '2.26.0.7', - '2.26.0.15', - '2.26.0.16', - '2.29.0.7', - '2.29.0.8', - '2.29.0.9', - '2.29.0.11', - '2.30.0.0', - '2.30.0.1', - '2.30.2.0', - '3.0', - '3.0.1', - '3.0.2', - # These tags were from unmerged branches investigating an issue that only reproduced when installed from TF. - '2.34.0.10', '2.34.0.11', '2.34.0.12', '2.34.0.13', '2.34.0.15', '2.34.0.16', '2.34.0.17', '2.34.0.18', '2.34.0.19', '2.34.0.20', '2.34.0.6', '2.34.0.7', '2.34.0.8', '2.34.0.9', - '2.37.3.0', - '2.37.4.0', - # these were internal release only tags, now we include "-internal" in the tag name to avoid this - '2.38.0.2.1', - '2.38.0.3.1', - '2.38.0.4.1', - # the work in these tags was moved to the 2.38.1 release instead - '2.38.0.12', - '2.38.0.13', - '2.38.0.14', - # - ] - tags_of_concern = [tag for tag in tags_of_concern if tag not in tags_to_ignore] - - # Interal Builds - # - # If you want to tag a build which is not intended to be reverse - # integrated, include the text "internal" somewhere in the tag name, such as - # - # 1.2.3.4.5-internal - # 1.2.3.4.5-internal-mkirk - # - # NOTE: that if you upload the build to test flight, you still need to give testflight - # a numeric build number - so tag won't match the build number exactly as they do - # with production build tags. That's fine. - # - # To avoid collision with "production" build numbers, use at least a 5 - # digit build number. - tags_of_concern = [tag for tag in tags_of_concern if "internal" not in tag] - - if len(tags_of_concern) > 0: - logging.debug("Found unmerged tags newer than epoch: %s" % tags_of_concern) - raise RuntimeError("๐Ÿ’ฅ Found unmerged tags: %s" % tags_of_concern) - else: - logging.debug("No unmerged tags newer than epoch. All good!") - -if __name__ == "__main__": - main() diff --git a/Scripts/update_plist_info.sh b/Scripts/update_plist_info.sh deleted file mode 100755 index 830facd05..000000000 --- a/Scripts/update_plist_info.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/sh - -set -e - -# PROJECT_DIR will be set when run from xcode, else we infer it -if [ "${PROJECT_DIR}" = "" ]; then - PROJECT_DIR=`git rev-parse --show-toplevel` - echo "inferred ${PROJECT_DIR}" -fi - -# Capture hash & comment from last WebRTC git commit. -cd $PROJECT_DIR/ThirdParty/WebRTC/ -_git_commit=`git log --pretty=oneline | head -1` -cd $PROJECT_DIR - -# Remove existing .plist entry, if any. -/usr/libexec/PlistBuddy -c "Delete BuildDetails" Signal/Signal-Info.plist || true -# Add new .plist entry. -/usr/libexec/PlistBuddy -c "add BuildDetails dict" Signal/Signal-Info.plist - -/usr/libexec/PlistBuddy -c "add :BuildDetails:WebRTCCommit string '$_git_commit'" Signal/Signal-Info.plist - -_osx_version=`defaults read loginwindow SystemVersionStampAsString` -/usr/libexec/PlistBuddy -c "add :BuildDetails:OSXVersion string '$_osx_version'" Signal/Signal-Info.plist - -_carthage_version=`carthage version` -/usr/libexec/PlistBuddy -c "add :BuildDetails:CarthageVersion string '$_carthage_version'" Signal/Signal-Info.plist - -echo "CONFIGURATION: ${CONFIGURATION}" -if [ "${CONFIGURATION}" = "App Store Release" ]; then - /usr/libexec/PlistBuddy -c "add :BuildDetails:XCodeVersion string '${XCODE_VERSION_MAJOR}.${XCODE_VERSION_MINOR}'" Signal/Signal-Info.plist - - # Use UTC - _build_datetime=`date -u` - /usr/libexec/PlistBuddy -c "add :BuildDetails:DateTime string '$_build_datetime'" Signal/Signal-Info.plist -fi - diff --git a/Signal.xcodeproj/project.pbxproj b/Signal.xcodeproj/project.pbxproj index 3b1044346..25db76c5d 100644 --- a/Signal.xcodeproj/project.pbxproj +++ b/Signal.xcodeproj/project.pbxproj @@ -5483,7 +5483,6 @@ 1460156AE01E0DB0949D61FE /* [CP] Check Pods Manifest.lock */, D221A085169C9E5E00537ABF /* Sources */, D221A086169C9E5E00537ABF /* Frameworks */, - 34C239432180B01B00B6108F /* Run Script: update_list_info */, D221A087169C9E5E00537ABF /* Resources */, 59C9DBA462715B5C999FFB02 /* [CP] Embed Pods Frameworks */, 451DE9EE1DC1546A00810E42 /* [Carthage] Copy Frameworks */, @@ -5855,20 +5854,6 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 34C239432180B01B00B6108F /* Run Script: update_list_info */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Run Script: update_list_info"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "$PROJECT_DIR/Scripts/update_plist_info.sh\n"; - }; 451DE9EE1DC1546A00810E42 /* [Carthage] Copy Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; diff --git a/fastlane/.gitignore b/fastlane/.gitignore deleted file mode 100644 index 54a42f915..000000000 --- a/fastlane/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -README.md -test_output -report.xml - diff --git a/fastlane/Appfile b/fastlane/Appfile deleted file mode 100644 index 180306309..000000000 --- a/fastlane/Appfile +++ /dev/null @@ -1,6 +0,0 @@ -# app_identifier("[[APP_IDENTIFIER]]") # The bundle identifier of your app -# apple_id("[[APPLE_ID]]") # Your Apple email address - - -# For more information about the Appfile, see: -# https://docs.fastlane.tools/advanced/#appfile diff --git a/fastlane/Fastfile b/fastlane/Fastfile deleted file mode 100644 index 99a588575..000000000 --- a/fastlane/Fastfile +++ /dev/null @@ -1,27 +0,0 @@ -# This file contains the fastlane.tools configuration -# You can find the documentation at https://docs.fastlane.tools -# -# For a list of all available actions, check out -# -# https://docs.fastlane.tools/actions -# -# For a list of all available plugins, check out -# -# https://docs.fastlane.tools/plugins/available-plugins -# - -# Uncomment the line if you want fastlane to automatically update itself -# update_fastlane - -default_platform(:ios) - -platform :ios do - desc "Description of what the lane does" - lane :test do - run_tests( - workspace: "Signal.xcworkspace", - scheme: "Signal", - devices: ["iPhone SE"] - ) - end -end