From c2aa17e3623a6b5533b516132e78683bc59443bd Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Tue, 8 Nov 2016 13:08:04 -0500 Subject: [PATCH] Changed Safety numbers no longer block communication When your partner changes their identity key (e.g. by reinstalling), you'll see a notice alongside their message, but it will no longer prevent the message from showing. aka "non blocking". Existing users will be opted into the previous blocking behavior. This is configurable for all users in Settings > Privacy. // FREEBIE --- Podfile.lock | 6 +- Signal.xcodeproj/project.pbxproj | 6 ++ ...OWS101ExistingUsersBlockOnIdentityChange.h | 12 +++ ...OWS101ExistingUsersBlockOnIdentityChange.m | 30 +++++++ .../Migrations/OWSDatabaseMigrationRunner.m | 6 +- .../src/environment/PropertyListPreferences.h | 5 ++ .../src/environment/PropertyListPreferences.m | 19 +++++ .../CodeVerificationViewController.m | 3 +- .../PrivacySettingsTableViewController.m | 76 +++++++++++++----- .../translations/ar.lproj/Localizable.strings | Bin 62398 -> 63280 bytes .../az_AZ.lproj/Localizable.strings | Bin 62754 -> 63636 bytes .../translations/bg.lproj/Localizable.strings | Bin 65118 -> 66000 bytes .../translations/bs.lproj/Localizable.strings | Bin 64172 -> 65054 bytes .../translations/ca.lproj/Localizable.strings | Bin 64966 -> 65848 bytes .../translations/cs.lproj/Localizable.strings | Bin 62600 -> 63482 bytes .../translations/da.lproj/Localizable.strings | Bin 63368 -> 64250 bytes .../translations/de.lproj/Localizable.strings | Bin 67292 -> 68388 bytes .../el_GR.lproj/Localizable.strings | Bin 64886 -> 65970 bytes .../translations/en.lproj/Localizable.strings | Bin 62560 -> 63442 bytes .../translations/es.lproj/Localizable.strings | Bin 65506 -> 66504 bytes .../translations/fa.lproj/Localizable.strings | Bin 64634 -> 65516 bytes .../translations/fi.lproj/Localizable.strings | Bin 65346 -> 66406 bytes .../fil.lproj/Localizable.strings | Bin 62652 -> 63534 bytes .../translations/fr.lproj/Localizable.strings | Bin 65408 -> 66290 bytes .../translations/gl.lproj/Localizable.strings | Bin 63658 -> 64540 bytes .../translations/he.lproj/Localizable.strings | Bin 60498 -> 61380 bytes .../translations/hr.lproj/Localizable.strings | Bin 62778 -> 63660 bytes .../translations/hu.lproj/Localizable.strings | Bin 64702 -> 65584 bytes .../translations/id.lproj/Localizable.strings | Bin 63804 -> 64686 bytes .../it_IT.lproj/Localizable.strings | Bin 65106 -> 65988 bytes .../ja_JP.lproj/Localizable.strings | Bin 53964 -> 54454 bytes .../ko_KR.lproj/Localizable.strings | Bin 59134 -> 60016 bytes .../translations/lv.lproj/Localizable.strings | Bin 63776 -> 64658 bytes .../translations/mk.lproj/Localizable.strings | Bin 65024 -> 65906 bytes .../nb_NO.lproj/Localizable.strings | Bin 63334 -> 64216 bytes .../translations/nl.lproj/Localizable.strings | Bin 64656 -> 65538 bytes .../translations/pl.lproj/Localizable.strings | Bin 63720 -> 64602 bytes .../pt_BR.lproj/Localizable.strings | Bin 64796 -> 65678 bytes .../pt_PT.lproj/Localizable.strings | Bin 64026 -> 64908 bytes .../translations/ro.lproj/Localizable.strings | Bin 65380 -> 66262 bytes .../translations/ru.lproj/Localizable.strings | Bin 64278 -> 65164 bytes .../translations/sl.lproj/Localizable.strings | Bin 64636 -> 65628 bytes .../translations/sn.lproj/Localizable.strings | Bin 64254 -> 65136 bytes .../translations/sq.lproj/Localizable.strings | Bin 64118 -> 65000 bytes .../sv_SE.lproj/Localizable.strings | Bin 63458 -> 64340 bytes .../th_TH.lproj/Localizable.strings | Bin 61786 -> 62668 bytes .../tr_TR.lproj/Localizable.strings | Bin 62806 -> 63688 bytes .../zh_CN.lproj/Localizable.strings | Bin 52712 -> 53594 bytes 48 files changed, 137 insertions(+), 26 deletions(-) create mode 100644 Signal/src/environment/Migrations/OWS101ExistingUsersBlockOnIdentityChange.h create mode 100644 Signal/src/environment/Migrations/OWS101ExistingUsersBlockOnIdentityChange.m diff --git a/Podfile.lock b/Podfile.lock index e66a8ce89..535b1503e 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -44,7 +44,7 @@ PODS: - Reachability (3.2) - SAMKeychain (1.5.2) - SCWaveformView (1.0.0) - - SignalServiceKit (0.5.3): + - SignalServiceKit (0.6.0): - '25519' - AFNetworking - AxolotlKit @@ -140,7 +140,7 @@ CHECKOUT OPTIONS: :commit: 03cde781234ade464dd26914d87e6e95afde1119 :git: https://github.com/WhisperSystems/JSQMessagesViewController.git SignalServiceKit: - :commit: 725153307e605681c45b3f789ed2153f218805a6 + :commit: 70e536ca8f81fbd3e0e3b4be9954717d10768717 :git: https://github.com/WhisperSystems/SignalServiceKit.git SocketRocket: :commit: 41b57bb2fc292a814f758441a05243eb38457027 @@ -164,7 +164,7 @@ SPEC CHECKSUMS: Reachability: 33e18b67625424e47b6cde6d202dce689ad7af96 SAMKeychain: 1865333198217411f35327e8da61b43de79b635b SCWaveformView: 52a96750255d817e300565a80c81fb643e233e07 - SignalServiceKit: f596e83ab9d7ff9ef89364dfe4a912afda62d55a + SignalServiceKit: c580eb2197f87212fcba9f7faf56163f410225e9 SocketRocket: dbb1554b8fc288ef8ef370d6285aeca7361be31e SQLCipher: 4c768761421736a247ed6cf412d9045615d53dff TwistedOakCollapsingFutures: f359b90f203e9ab13dfb92c9ff41842a7fe1cd0c diff --git a/Signal.xcodeproj/project.pbxproj b/Signal.xcodeproj/project.pbxproj index 86fe19349..a46d7480d 100644 --- a/Signal.xcodeproj/project.pbxproj +++ b/Signal.xcodeproj/project.pbxproj @@ -14,6 +14,7 @@ 450873C41D9D5149006B54F2 /* OWSExpirationTimerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 450873C21D9D5149006B54F2 /* OWSExpirationTimerView.m */; }; 450873C71D9D867B006B54F2 /* OWSIncomingMessageCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 450873C61D9D867B006B54F2 /* OWSIncomingMessageCollectionViewCell.m */; }; 450873C81D9D867B006B54F2 /* OWSIncomingMessageCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 450873C61D9D867B006B54F2 /* OWSIncomingMessageCollectionViewCell.m */; }; + 4516E3FF1DD2193B00DC4206 /* OWS101ExistingUsersBlockOnIdentityChange.m in Sources */ = {isa = PBXBuildFile; fileRef = 4516E3FE1DD2193B00DC4206 /* OWS101ExistingUsersBlockOnIdentityChange.m */; }; 451DE9F81DC18C9500810E42 /* AccountManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45CD81EE1DC030E7004C9430 /* AccountManager.swift */; }; 451DE9FD1DC1A28200810E42 /* SyncPushTokensJob.swift in Sources */ = {isa = PBXBuildFile; fileRef = 451DE9FC1DC1A28200810E42 /* SyncPushTokensJob.swift */; }; 451DE9FE1DC1A28200810E42 /* SyncPushTokensJob.swift in Sources */ = {isa = PBXBuildFile; fileRef = 451DE9FC1DC1A28200810E42 /* SyncPushTokensJob.swift */; }; @@ -544,6 +545,8 @@ 450873C51D9D867B006B54F2 /* OWSIncomingMessageCollectionViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSIncomingMessageCollectionViewCell.h; sourceTree = ""; }; 450873C61D9D867B006B54F2 /* OWSIncomingMessageCollectionViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OWSIncomingMessageCollectionViewCell.m; sourceTree = ""; }; 450873C91D9D86F4006B54F2 /* OWSExpirableMessageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSExpirableMessageView.h; sourceTree = ""; }; + 4516E3FD1DD2193B00DC4206 /* OWS101ExistingUsersBlockOnIdentityChange.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OWS101ExistingUsersBlockOnIdentityChange.h; path = Migrations/OWS101ExistingUsersBlockOnIdentityChange.h; sourceTree = ""; }; + 4516E3FE1DD2193B00DC4206 /* OWS101ExistingUsersBlockOnIdentityChange.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = OWS101ExistingUsersBlockOnIdentityChange.m; path = Migrations/OWS101ExistingUsersBlockOnIdentityChange.m; sourceTree = ""; }; 451DE9F11DC1585F00810E42 /* PromiseKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PromiseKit.framework; path = Carthage/Build/iOS/PromiseKit.framework; sourceTree = ""; }; 451DE9FC1DC1A28200810E42 /* SyncPushTokensJob.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SyncPushTokensJob.swift; path = Models/SyncPushTokensJob.swift; sourceTree = ""; }; 4520D8D41D417D8E00123472 /* Photos.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Photos.framework; path = System/Library/Frameworks/Photos.framework; sourceTree = SDKROOT; }; @@ -1201,6 +1204,8 @@ 45666F7A1D9C0533008FE134 /* OWSDatabaseMigration.m */, 45666F7C1D9C0814008FE134 /* OWSDatabaseMigrationRunner.h */, 45666F7D1D9C0814008FE134 /* OWSDatabaseMigrationRunner.m */, + 4516E3FD1DD2193B00DC4206 /* OWS101ExistingUsersBlockOnIdentityChange.h */, + 4516E3FE1DD2193B00DC4206 /* OWS101ExistingUsersBlockOnIdentityChange.m */, ); name = Migrations; sourceTree = ""; @@ -2822,6 +2827,7 @@ B97940271832BD2400BD66CB /* UIUtil.m in Sources */, 4CE0E3771B954546007210CF /* TSAnimatedAdapter.m in Sources */, 76EB05BE18170B33006006FC /* ConfirmPacket.m in Sources */, + 4516E3FF1DD2193B00DC4206 /* OWS101ExistingUsersBlockOnIdentityChange.m in Sources */, 76EB05A818170B33006006FC /* RtpSocket.m in Sources */, E197B61818BBEC1A00F073E5 /* RemoteIOAudio.m in Sources */, B67ADDC41989FF8700E1A773 /* RPServerRequestsManager.m in Sources */, diff --git a/Signal/src/environment/Migrations/OWS101ExistingUsersBlockOnIdentityChange.h b/Signal/src/environment/Migrations/OWS101ExistingUsersBlockOnIdentityChange.h new file mode 100644 index 000000000..650786bce --- /dev/null +++ b/Signal/src/environment/Migrations/OWS101ExistingUsersBlockOnIdentityChange.h @@ -0,0 +1,12 @@ +// Created by Michael Kirk on 11/8/16. +// Copyright © 2016 Open Whisper Systems. All rights reserved. + +#import "OWSDatabaseMigration.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface OWS101ExistingUsersBlockOnIdentityChange : OWSDatabaseMigration + +@end + +NS_ASSUME_NONNULL_END diff --git a/Signal/src/environment/Migrations/OWS101ExistingUsersBlockOnIdentityChange.m b/Signal/src/environment/Migrations/OWS101ExistingUsersBlockOnIdentityChange.m new file mode 100644 index 000000000..8fdd7f591 --- /dev/null +++ b/Signal/src/environment/Migrations/OWS101ExistingUsersBlockOnIdentityChange.m @@ -0,0 +1,30 @@ +// Created by Michael Kirk on 11/8/16. +// Copyright © 2016 Open Whisper Systems. All rights reserved. + +#import "OWS101ExistingUsersBlockOnIdentityChange.h" +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +// Increment a similar constant for every future DBMigration +static NSString *const OWS101ExistingUsersBlockOnIdentityChangeMigrationId = @"101"; + +@implementation OWS101ExistingUsersBlockOnIdentityChange + ++ (NSString *)migrationId +{ + return OWS101ExistingUsersBlockOnIdentityChangeMigrationId; +} + +- (void)runUpWithTransaction:(YapDatabaseReadWriteTransaction *)transaction +{ + DDLogWarn(@"[OWS101ExistingUsersBlockOnIdentityChange] Opting existing user into 'blocking' on identity changes."); + TSPrivacyPreferences *preferences = [TSPrivacyPreferences sharedInstance]; + preferences.shouldBlockOnIdentityChange = YES; + [preferences saveWithTransaction:transaction]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/Signal/src/environment/Migrations/OWSDatabaseMigrationRunner.m b/Signal/src/environment/Migrations/OWSDatabaseMigrationRunner.m index 9b055339d..8de503067 100644 --- a/Signal/src/environment/Migrations/OWSDatabaseMigrationRunner.m +++ b/Signal/src/environment/Migrations/OWSDatabaseMigrationRunner.m @@ -3,6 +3,7 @@ #import "OWSDatabaseMigrationRunner.h" #import "OWS100RemoveTSRecipientsMigration.h" +#import "OWS101ExistingUsersBlockOnIdentityChange.h" NS_ASSUME_NONNULL_BEGIN @@ -22,7 +23,10 @@ NS_ASSUME_NONNULL_BEGIN - (NSArray *)allMigrations { - return @[ [[OWS100RemoveTSRecipientsMigration alloc] initWithStorageManager:self.storageManager] ]; + return @[ + [[OWS100RemoveTSRecipientsMigration alloc] initWithStorageManager:self.storageManager], + [[OWS101ExistingUsersBlockOnIdentityChange alloc] initWithStorageManager:self.storageManager] + ]; } - (void)assumeAllExistingMigrationsRun diff --git a/Signal/src/environment/PropertyListPreferences.h b/Signal/src/environment/PropertyListPreferences.h index 2844829f9..f1e81c630 100644 --- a/Signal/src/environment/PropertyListPreferences.h +++ b/Signal/src/environment/PropertyListPreferences.h @@ -53,6 +53,11 @@ typedef NS_ENUM(NSUInteger, TSImageQuality) { - (nullable NSString *)lastRanVersion; - (NSString *)setAndGetCurrentVersion; +#pragma mark - Block on Identity Change + +- (BOOL)shouldBlockOnIdentityChange; +- (void)setShouldBlockOnIdentityChange:(BOOL)value; + #pragma mark - Push Tokens - (void)setPushToken:(NSString *)value; diff --git a/Signal/src/environment/PropertyListPreferences.m b/Signal/src/environment/PropertyListPreferences.m index 8f9825ef8..fe1c4f2e7 100644 --- a/Signal/src/environment/PropertyListPreferences.m +++ b/Signal/src/environment/PropertyListPreferences.m @@ -1,6 +1,7 @@ #import "PropertyListPreferences.h" #import "Constraints.h" #import "TSStorageHeaders.h" +#import NS_ASSUME_NONNULL_BEGIN @@ -46,6 +47,11 @@ NSString *const PropertyListPreferencesKeyLastRecordedVoipToken = @"LastRecorded inCollection:PropertyListPreferencesSignalDatabaseCollection]; } +- (TSPrivacyPreferences *)tsPrivacyPreferences +{ + return [TSPrivacyPreferences sharedInstance]; +} + #pragma mark - Specific Preferences - (NSTimeInterval)getCachedOrDefaultDesiredBufferDepth @@ -202,6 +208,19 @@ NSString *const PropertyListPreferencesKeyLastRecordedVoipToken = @"LastRecorded } } +#pragma mark - Block on Identity Change + +- (BOOL)shouldBlockOnIdentityChange +{ + return self.tsPrivacyPreferences.shouldBlockOnIdentityChange; +} + +- (void)setShouldBlockOnIdentityChange:(BOOL)value +{ + self.tsPrivacyPreferences.shouldBlockOnIdentityChange = value; + [self.tsPrivacyPreferences save]; +} + #pragma mark - Push Tokens - (void)setPushToken:(NSString *)value diff --git a/Signal/src/view controllers/CodeVerificationViewController.m b/Signal/src/view controllers/CodeVerificationViewController.m index 5de09028b..844a16109 100644 --- a/Signal/src/view controllers/CodeVerificationViewController.m +++ b/Signal/src/view controllers/CodeVerificationViewController.m @@ -59,7 +59,8 @@ NSString *const kCompletedRegistrationSegue = @"CompletedRegistration"; [super viewDidLoad]; [self initializeKeyboardHandlers]; _headerLabel.text = NSLocalizedString(@"VERIFICATION_HEADER", @"Navigation title in the registration flow - during the sms code verification process."); - _challengeTextField.placeholder = NSLocalizedString(@"VERIFICATION_CHALLENGE_DEFAULT_TEXT", @"Text field placeholder for SMS verification code during registartion"); + _challengeTextField.placeholder = NSLocalizedString(@"VERIFICATION_CHALLENGE_DEFAULT_TEXT", + @"Text field placeholder for SMS verification code during registration"); _challengeTextField.delegate = self; [_challengeButton setTitle:NSLocalizedString(@"VERIFICATION_CHALLENGE_SUBMIT_CODE", @"button text during registration to submit your SMS verification code") forState:UIControlStateNormal]; diff --git a/Signal/src/view controllers/PrivacySettingsTableViewController.m b/Signal/src/view controllers/PrivacySettingsTableViewController.m index 11aae7c35..36337acc6 100644 --- a/Signal/src/view controllers/PrivacySettingsTableViewController.m +++ b/Signal/src/view controllers/PrivacySettingsTableViewController.m @@ -14,10 +14,20 @@ #import "UIUtil.h" #import <25519/Curve25519.h> +NS_ASSUME_NONNULL_BEGIN + +typedef NS_ENUM(NSInteger, PrivacySettingsTableViewControllerSectionIndex) { + PrivacySettingsTableViewControllerSectionIndexScreenSecurity, + PrivacySettingsTableViewControllerSectionIndexHistoryLog, + PrivacySettingsTableViewControllerSectionIndexBlockOnIdentityChange +}; + @interface PrivacySettingsTableViewController () @property (nonatomic, strong) UITableViewCell *enableScreenSecurityCell; @property (nonatomic, strong) UISwitch *enableScreenSecuritySwitch; +@property (nonatomic, strong) UITableViewCell *blockOnIdentityChangeCell; +@property (nonatomic, strong) UISwitch *blockOnIdentityChangeSwitch; @property (nonatomic, strong) UITableViewCell *clearHistoryLogCell; @end @@ -51,37 +61,50 @@ action:@selector(didToggleScreenSecuritySwitch:) forControlEvents:UIControlEventTouchUpInside]; - // Clear History Log Cell self.clearHistoryLogCell = [[UITableViewCell alloc] init]; self.clearHistoryLogCell.textLabel.text = NSLocalizedString(@"SETTINGS_CLEAR_HISTORY", @""); self.clearHistoryLogCell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; + + // Block Identity on KeyChange + self.blockOnIdentityChangeCell = [UITableViewCell new]; + self.blockOnIdentityChangeCell.textLabel.text + = NSLocalizedString(@"SETTINGS_BLOCK_ON_IDENTITY_CHANGE_TITLE", @"Table cell label"); + self.blockOnIdentityChangeSwitch = [[UISwitch alloc] initWithFrame:CGRectZero]; + self.blockOnIdentityChangeCell.accessoryView = self.blockOnIdentityChangeSwitch; + [self.blockOnIdentityChangeSwitch setOn:[Environment.preferences shouldBlockOnIdentityChange]]; + [self.blockOnIdentityChangeSwitch addTarget:self + action:@selector(didToggleBlockOnIdentityChangeSwitch:) + forControlEvents:UIControlEventTouchUpInside]; } #pragma mark - Table view data source - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { - return 2; + return 3; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { switch (section) { - case 0: + case PrivacySettingsTableViewControllerSectionIndexScreenSecurity: return 1; - case 1: + case PrivacySettingsTableViewControllerSectionIndexHistoryLog: + return 1; + case PrivacySettingsTableViewControllerSectionIndexBlockOnIdentityChange: return 1; - // TODO: optionally non-blocking - // case 2: - // return 1; default: return 0; } } -- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section { +- (nullable NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section +{ switch (section) { - case 0: + case PrivacySettingsTableViewControllerSectionIndexScreenSecurity: return NSLocalizedString(@"SETTINGS_SCREEN_SECURITY_DETAIL", nil); + case PrivacySettingsTableViewControllerSectionIndexBlockOnIdentityChange: + return NSLocalizedString( + @"SETTINGS_BLOCK_ON_IDENITY_CHANGE_DETAIL", @"User settings section footer, a detailed explanation"); default: return nil; } @@ -89,25 +112,27 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { switch (indexPath.section) { - case 0: + case PrivacySettingsTableViewControllerSectionIndexScreenSecurity: return self.enableScreenSecurityCell; - case 1: + case PrivacySettingsTableViewControllerSectionIndexHistoryLog: return self.clearHistoryLogCell; - // TODO - safetynumber settings - // case 2: - // return [UITableViewCell new]; + case PrivacySettingsTableViewControllerSectionIndexBlockOnIdentityChange: + return self.blockOnIdentityChangeCell; + default: { + DDLogError(@"%@ Requested unknown table view cell for row at indexPath: %@", self.tag, indexPath); + return [UITableViewCell new]; + } } - - return nil; } -- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { +- (nullable NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section +{ switch (section) { - case 0: + case PrivacySettingsTableViewControllerSectionIndexScreenSecurity: return NSLocalizedString(@"SETTINGS_SECURITY_TITLE", @"Section header"); - case 1: + case PrivacySettingsTableViewControllerSectionIndexHistoryLog: return NSLocalizedString(@"SETTINGS_HISTORYLOG_TITLE", @"Section header"); - case 2: + case PrivacySettingsTableViewControllerSectionIndexBlockOnIdentityChange: return NSLocalizedString(@"SETTINGS_PRIVACY_VERIFICATION_TITLE", @"Section header"); default: return nil; @@ -118,7 +143,7 @@ [tableView deselectRowAtIndexPath:indexPath animated:YES]; switch (indexPath.section) { - case 1: { + case PrivacySettingsTableViewControllerSectionIndexHistoryLog: { [DJWActionSheet showInView:self.parentViewController.view withTitle:NSLocalizedString(@"SETTINGS_DELETE_HISTORYLOG_CONFIRMATION", @"") cancelButtonTitle:NSLocalizedString(@"TXT_CANCEL_TITLE", @"") @@ -151,6 +176,13 @@ [Environment.preferences setScreenSecurity:enabled]; } +- (void)didToggleBlockOnIdentityChangeSwitch:(UISwitch *)sender +{ + BOOL enabled = self.blockOnIdentityChangeSwitch.isOn; + DDLogInfo(@"%@ toggled blockOnIdentityChange: %@", self.tag, enabled ? @"ON" : @"OFF"); + [Environment.preferences setShouldBlockOnIdentityChange:enabled]; +} + #pragma mark - Log util + (NSString *)tag @@ -164,3 +196,5 @@ } @end + +NS_ASSUME_NONNULL_END diff --git a/Signal/translations/ar.lproj/Localizable.strings b/Signal/translations/ar.lproj/Localizable.strings index 607d92105cf1f968db043d6d61ae3f4175e87a2a..b136b072fe700c1220549dd19f0c8d26169fd3b6 100644 GIT binary patch delta 538 zcmZ8eO-n*S6g?zC(IPWSB8rC_38ZjeLB66MhDBKr5&F`X3C}d2meC@L{=wb0Y@gv) zT!r)p+D5J13H^i4OkX6!Fz4KRX70InS{+}#>#Hxuf(dLOffQm`Co&O-MZPK@ePe?r z*07}6!}Fv>Ui`9a`sLQlHfCep%l;jBaOAojjPpbW735LG2@D+ZERs7YBSLO-XUQr= zdALMbMjX^oBC~nN{<$sD=G4`nnbfyE3(Huc6$?r1(eAG`MpHVMq*aSeg!u9TcL-ao zaEdA`mWe#ZF6gRCrW}>H%H(InE+dE3DBsk|$aHWnPggm{&w0OsVl|qMC-PQy@}vP+rvAo}PxQYZs|8u+4Z*&%zbEJt{YbA?f6R y%r^tWJrn8q9{XS-`oCL))9CH+>u*f$m%Yj3`@W=~0*zX0b4Kp&#~ZJmx1mpO3V3$_ delta 36 ucmV+<0Nekt?gPH(1F$|qvm!&@dy~+}T(j!IP$>gp0CJO2s}r+O>);Df!4aAO diff --git a/Signal/translations/az_AZ.lproj/Localizable.strings b/Signal/translations/az_AZ.lproj/Localizable.strings index 04f0258a6f2faed3dd48af623d90020aa5d9fe0d..5783605706312679f5940226821e97c70e2d4f14 100644 GIT binary patch delta 514 zcmZ`$JxfAi7(F6{5Pc&dHQXSGK#2y2rcx6V!y+VVDDmT#!u2Ds_5l&}2a0$KY6=>{ zEy1~>C6K0;#+r?WTADlWrHH6_xxD8*&$-WY4)58s{qW6RtNOiB%pi(5{Fo*RAc8P? zh?OuV5hRWg#jwaq08{X(uADUb}R$QSPXfiwBn{k5yJT_;(o@B9pxwH7bX0buz>n zdkL7b8yfPeJSj_+vs4E6sl;kaj!0!yPO_X}T8Rx9a=P!7iQ`UNOb+w`d7XEtv?Kqg v{o@gs*QfWk{m3gfjh+t8@}cp$l*_!_?=014uWyItvDq%#xufoGzPEk=o?d#f delta 32 qcmV+*0N?+V@dKjj1F)zvrV9>YWZ^7eR!vi5*5B1mGv$RxduA z+XElmg0KZAG_3PDaexRC&{05{ID;b6h!W?JCywEq^$gCKiL1Tb>D|Um-ReEL89ij3 zU8?4^1tf}bLJ|ghHO@2m70f9v;s{TisK6+R6r(sZIW$zwmpsHb=P>R($lu7A*q?}d5#YgV=A Zi+ZEsT2$5cgsMJTRHwaMU;A7b{{jskhi3o) delta 36 ucmV+<0Nel2g9P6E1F#T8v-Ct-f|H=iUb8yNDk}qF0CJPTW)rh|^;Qf+q7aS% diff --git a/Signal/translations/bs.lproj/Localizable.strings b/Signal/translations/bs.lproj/Localizable.strings index ac1dfa3d0176d8332fbb37b234a1e4f8623dd1bd..a086609ccdf9aeefdb487d94830fcbaf2c6aeb1f 100644 GIT binary patch delta 631 zcmZ`%F-yZh7=2g-2N7C_BB&h2NfdE(P|#RvsZ^|0P=`|6)CQ8KwyCjG5jwjZIEkx^ zgHrGh2wkkJqxcI11vdxZofc7A!X@APzRSyd?{fVSxcm&UgBL%imZhWLPeswzTVeAIORO2c^u7S>u?KNiNl#nMX9wET~&u;Yk4lk z37(0?#8ou5e0vy`sVO1Pc8275J2clnpq?i!PY1&Des9{k)%%yUW;&NcIj74 z{72qE%n&JJ>fOD1NVZFkZgOlx4PN5}6(affB2S6>|5o%DruVlj+V$AOo3j~hbr-}z V!zLWPNpbdU7mvN==H17Z;~RU*iL3ws delta 32 qcmV+*0N?+(f&|9<1F+yjv&2Lof|HQMT(i!};3@-Q0CKaj^oI->$q3izpn35RzW*f?Bj}(ZWnh6z#);Y9W)3IWXgxj+sz|yNFi3pV6Yg zWf0*q+O+E@)T(_Dblxk8!s79UbMAfj&OPUzz69Q01J_ScH;oL^$YB8~q8O4$kS{Tk zz#`(rS)weq7>QvSQJsw=0)ctn2-abu2n#-%yadK;{$KaEJ;e@yAITe*4@n*C{t;MRW|@wu*8cf0a&ct@_>8SRJLv#Ee3OvEUb8^Lh$#bM0CJNNrW3Q?>l_SW2oY}p diff --git a/Signal/translations/da.lproj/Localizable.strings b/Signal/translations/da.lproj/Localizable.strings index 1ba7eb536b79240834ecf663da85651d9df4cd93..45a550cbc6287cc92bd8890c4c7e8b3d7b16b6ac 100644 GIT binary patch delta 546 zcmZ`$y-Pw-96cdHLz!40(U(m@^f@%OR8L7!UK9#7h*)X~&-cvdM+xN`H2$WbrN5xS z-EfSS#-gP?qL!AX&V3~j6_@+&Ip_X9&imct7uWln>$0NF>sW=3B$g2+(hxzIe1%FF z0R)L-L@{hq(GbFtx|NgrLDBC#au)DND7qoDi$jfyRy*vB!$w9D*S-i(Y@>u6EST^k z%hMvypomHG6nC1eM3jR;l%|rwJ_=+h=A_!$l4=f5eH%=ES#BHrWe-6)e;BB*v)UfY ztX?FtS^a{%i-{fHRjHJ)OJqAy8GcPC zt4h_PzRP%9=3L_o>QCFXRFpvvY8I+U6XtCiT}bxs7*; z(e%#zKZ8FWiBnjc_VxUjg0yb>di{=HKc7?iH08pZkjGYkLvM{t$kDUAQG0TCe*k=Z Bd?Ww> delta 32 ocmezMmAT_R^M*3#%~38@wUY%-$86qrL_v!=k)dew!*`NA00=7%C`WmuhD)91Dr3J(lUBUMlA}O8c>JB#UBdL?@GmpMs4!!LjSB1q@GFv6_n@$q>hP0~eUUkgTG3<55~8zKpI_!rD$zKLd?}Zu zX3kbq+c_hy3le>7M(RKX)v~_;?PZN=qL&i}Xu+R1QGEAF?4(xE;=;r>PA>Vw_JHQW` Kd;O8kmEaa4gwufl delta 436 zcmZutu}T9$5S?&ogoug+v^#B51gr&1K@mZOXd&1vd+T|UyVKo0B~>~tL=YBCC4%Gw zgtfG=@C(E;jkP}@7Qr{0N|1rsnKy6dy}RLEeRNZQdfxDlo2yZOk4i*LISDGLhw2Db zMqR2%lOhA;0==bURGhPbNo*D91xe%;%yzM(&>LiC>Tpd^8txUq47N+)7R(-YmTAqk zcBb8E>(YO3|FrrC7*`;k2I+H1ac=@WrUZv2>I}jP9gDDambG|0n538qAaO7zF)@f3 za(qdnl9=ScHD0#8548lfCAIK}Xs~1$rhM=j)tYk?HTG8GiX!Efl6iOAZMd;LX|pGG y#cC5K|C)at_=oDNInx2%BKUJsGJ~_J+M<8C9XPRT{7%eait z@<4!olBe=Qh)dDkfwT1X)@qvH@|!ItQ!*_ha+&aMIIWmlvyhUjTKcJp{L3u-TNq?*76;+YP&+!9d^28AKM;Pc;&oClc=UFJ6 zP(D^CN{wz0Sv}4T$~Af-Wc}GmJBu?fT*X_Om;nM!OaduaV-IV{zFgG>v9u#pP_!0IGh@8c5LM|xPa+p#omkw_lk=*s1E;)5;#$B|gZ==y~+%#HJT|WZ! zn1FQ@+(iR9xi+iFO62-%z-GUi895Ck=6gq|aA&`~CMRj7&qX`Jr|6!`LH65rI&-|( zC@=lgLX~%&r5G&$OF%TH8b{&pkpRO<_kZ0@4|la*{u;%2oODGV%~4GBNJCyoj3 zF9VM&Rk;7TPMVZb*evdVS$qNA&8Qy4(Wymj9?uD@$0T#Rr>2JnF*9}JZyBMd(-vD) zjZ_kAxiWCt_@!*GrF=|5kEp)tiaO^=z?($3G7#dRh{~4)tv0zy)2>)YX$abWnHgc_UL-Ik@$t z=oM|EhgQ6v8a|y9ed2-$iY^S)dHe=p<6aF|3w*7x`a}z2I&f-*r%ikyx?#15F4`0F zP{XqG@?$W8EIhxc6ZL@N7tP{Lz+Hz1Z$RBO1F9b+yvTVJk5@Dy_j{rrwR&*sh3`Y) z>4&AES~vcBU|+(y1D)sMDxEkne@1cv8G4lp9jbB=F*Nj7nWdQ;+xO7g8~H3k;S(Y} z(UIZjO1Ez!NL4E?m!=A9kcVM0g*JMSJWH=HJB;SV|0+le6;tLPpK3!9Z@lPA(xQSQs`vf2lsJ6fdC&X4=Q+>wob&9e;rmbd zv{I%X7A-W~qDypR{dEbRe=wsy<0#(ACMBrtG4v=&<8oGpWEhW)zC2Y-$)F5NRYYi3 z#e{sTSLb91iqQ&J`wm>5%}Q5AR8C5bdd6i$E@*cWk4Xwb2nH?qojhz@q}3#Dq&!5! z2@me2)}gw=jO)h}HAC7|f)+IoCunusD`ffvofagdmvU6j%LTm3+?^eiQDU^2Bd9s* znL)C(oH*UW6>G_%IBQx5Y2OREsI%R|dd-?B$2(a^NKR1Kv>cNWEN5HDgc_t|H7Q}V zWUb)S9}_axT%_MCI)y5_g@>X5MQy?_e4QLb|VZc+&473ZjCknpQ=i=i~KBD0?oXc~yH_)a4 zecd#ePTS^jeu}sfpy8zhm}(zIe7qW`;iJqJy%-H9$*;gGdg-r z@*-7sib~<2xmoXEJ6O!t8J*O}nHZu^$75D3n+;$qVwSk{bqn?TY4qU!5gX25%g|*X zu+Jz)7d7|elJ7J&3JqFwfvVVRC>7B0oy3>bGv9-ROS~|+V!?F5etcCM$;32MJTI{K z_AZPRK7d-AiN>2|yl*upchF{rD#Nl72mX1=ng5;+?&jK);=bYY*`g$VQf?CLT+KEy n8slk8#q+8*Q0*AR$kG{YA>7-j(9<#voqfA@+wwn4E)Myx5 diff --git a/Signal/translations/en.lproj/Localizable.strings b/Signal/translations/en.lproj/Localizable.strings index 6362f17aae728a6a722f31318d82a22eb1147e3f..ef63be482f67ee4667d6105b7c58f27d2802cfc7 100644 GIT binary patch delta 560 zcmaJ;%}N4c6g}ahA}9$gETU=ABKmiGGNWnK|d&JNG;H-sh(0{>^hS84ARaKpbg=ut20EhA4T2 zN)&Sl6DNt1Sf!$49zlt!+lOH_67hCtv4so@*i@;TbgeJ6vfsH32L?*YYx#nLvM9rZ z%_I#Q{MzJFr3W z)a#hi>qGyH;jb+nKKWm4w(U_^7G_QN!0cD+j AdjJ3c delta 32 ocmccgp83HG<_+3ToB5rsY9{ONjoEB`XqF~(B16&U3$K}Y0QXW300000 diff --git a/Signal/translations/es.lproj/Localizable.strings b/Signal/translations/es.lproj/Localizable.strings index 53f9fd055577ab294948f90c4d8826476f21b6c3..c233b9d18b607c2e48dba2a60fa3443f23b37bee 100644 GIT binary patch delta 595 zcmZ8ezb^w}7=A<(C89zaArjR=qKe7bNVN@@HbhjSgyx*XCA73BK{|Ak*yP?I9>2mp~2}D(N?NQL&Ffs2Dh%oi6E(&+j1|~&=L_z+IH7N8Ub~!K!l4%9;7c=AvlY)Wt30Wy z_K;l#R$HtsX`M|BwTc7mG4HTTX|-sd$(1q9{SD8gm{l>87~8BV(krvV)~Z9)YtmP! z9#V*wEjQ025}oaB%gXoWs8n-)wTZyLP5ir+eEZD&C^uiG<_^R$Kkg* r%e#ShE005qsVqk}iIaS~PI`94g#T|@6 delta 45 zcmX@n&hqF#^M(?a%_Xii+Ux}ki3~*yiJRFA%_AlU9E;gpaAuYkGf-?Z@Aut20I9hW ABme*a diff --git a/Signal/translations/fa.lproj/Localizable.strings b/Signal/translations/fa.lproj/Localizable.strings index 4369755d16864eff6a1e4a533cd04be51b28f41e..343c8d9a33e917b435a76b5b3260e29b61447931 100644 GIT binary patch delta 502 zcmZ8eze~el5PhWx{sK#(w&D^*5JU$NM~B)L4N3*6P^VJcXr*adlho=Ut*(yeB+ky3 zIyi`%gCNC89Q^|vI*N)bYrIFESp9+Xnc+`fQgLU6T6D;+E+5r25MG9X$yL};i zH!J&OX-_g_B#VsrHR7_HGS>O<+{=ZkKPtFNaHwF>p$(k6q!befazUEISp=Jf+%_G+ zVWCeE%8*%$0^D`wW=E`JR`@b<5KXgTEk_aZV9TfZyp_e zOw1tIOu4<^6G3x%-qoYRCA?yzDhJE`eCO(IOYq6?5D#v2@?72d&lX$#-oAS`-^|#8 kjeWG9w#k^rKE)<wC1e5Jb1?0|KX_E-WR&R0EbhNxc~qF delta 35 tcmV+;0NnrPh6KX?1F)7wvxY|Mf|KyaT(Zp?Dg$8va+7iH6SFY)HVjMO5efhR diff --git a/Signal/translations/fil.lproj/Localizable.strings b/Signal/translations/fil.lproj/Localizable.strings index f7c4bcba316df5cc4a8529b43f47723e11de9ebb..b6892cbd9e511cf971709de679c05bfde949e167 100644 GIT binary patch delta 514 zcmZXR%}YW-6vaP2B5K_-+9b5FU90HK3+apDy*cO3ojbp|(`ebw+P3phK+67ZcN}R15W^yZh$4bG z=H+2-z!Ag({K_FL{@|3nCzfS)W~d$t#P)kqFp!hCYfqFjHc*8I9VK{?=d9D`P{BBT zhF_MhN~NJlm1QJ{U6koE+>`0-mZRqI#5YQsND3~35W-XuB(XyO6U^~Ac(}xB+b~(Z zLS?Y}9tli3b$XejLcc>@WMrK=ic#fyNv>my!z71B_r+4eCf90=R8gQZtgIaWC2LoW zQJwJu^9}Lck4~$bc511tA{kUK)X7^^stf8wjcbP0i=suNBQKNBBV9>(TJ_0C$}Y!E zSO1?L{Ckcor>FPVttD~ec6u#7FZ-jocn9&BYjW9e)n6}e$K;^ZCnu-&`rS+0@d+CG BdjkLf delta 36 ucmV+<0Nekr@B_T*1F%FwvnWGMe3KBqT(e%n$|(b30CJOIV-vGJ?C=XQGY|m) diff --git a/Signal/translations/fr.lproj/Localizable.strings b/Signal/translations/fr.lproj/Localizable.strings index 9f57f29577ba42be73a900951ac18340e1f54587..2393e95ed7e1d7c50d3a4160f585dbec95107f5d 100644 GIT binary patch delta 574 zcmZ`$OG^S_6g`npPy`7QMbYFY=)I2?WU_U&RqDDwgbjoc!6Md({8&YRe3_8| zmY@@diNe@p#E%vDoLe1UXjtI!Vn;rMBRw%3B8m)>Fl6g?Un;)gYF!VVckLn%137u} zdVC7SP(TV6Q#B;`wa9soDe@>!oUA~Uf=Lu-#K19ZGL{!B>5;3Nd%7(*@?)SS_Ybks z|2%lQ%{o~WSvN&O z5tf_Cm|WI|X8-s9=ep$1Js{WjuF3WUG_LZu>*iMc%~eYF!K#)Y?Fq3PeNs+#%WGq% JI`^^J`wgio5FAONf{-Z2a0n7BMNDB~VIiVt(4a&jNg)>DOfDvH`7n3!s}SrgY-C#z z3n8G5nEU}PtTerUz$#+WSy(vl6vc2HH?uo$cjn!7+jIWmxzqzutRadd7O+aBV+9fN zC3)BVy*idL@3Q36uryA5Qm^~uYSy{aFOIqsuwkMsF)c7>A_WII6j4AB8Gei8>|&DK z;F~6Mh;p!q(yW-+M~TcpLE2TnG#>{-e=d?gz9Lvem>wdCV}m|_Js~V_&)Up7=j@=u zxn&}oa}T(?LZ{?ai7i&Ps8Q~ym75nWRKPZ?dpzwROJuW`r$*&4-AXXl_%w@@~+C_K9yK)$rGup%1MqBY&Wq5OZw0J(s=cC#U+**l~$rhrS*2C?YQ&f pac$~_ zcds9-SZbl?=9nCxx&{(BKpYwDLq}4Y3*~yv*H@9J3%lIjkAyAK2^5fm$s`SX{F=l% z@|Yox^GOmF7^Pq+5i&X|$Py{xc;~j{8soEnreZ%fLkJ*9OCdzDMccm?5ftBpr@BG4 z9Ew!WGqR|DNC!nCRXxj-CoVBI$m}vlc~rR?otsGW6zL;H)b^s9)leo=VDlO^RhG_o zrgf`K)+Db6V@WPBHLp7DXsIlN9@H#UfJyG#ac;$T4 zAxDj&!LA8(t>tpkGxxt^jSK7Uvb_s`XLa&&9g~xWvu?lJo|c_2r(~}j_0s2i|2I&q BeINh; delta 32 qcmV+*0N?+_-viRv1F)b!vxGnjc$0v(T(fw)S||fy0CKa{DB@Vc3XvZXgvmp4 z9vbTPV;PGkYd*Wg9nho^*^%~wyKeK(opo=)KuRv2oRVA}@TF1UDkFswywH%~PLh?0 zve1c=yh)*oB3S}??lLO{5}- z462_}twN@z7r9F0$HY2s_SvI6vR4wL&Z#UN9P<8z-dzebzpYo%r2c1HL9vPIU$hDp-Eh=v548#TY&qnzJzKA~9_?Sv1$Z$4 delta 32 qcmV+*0N?+t@dLW*1F!}|v+6@Qe6z5^_9+8l0CJNdWD~Qz?C=W&=?`!K diff --git a/Signal/translations/hu.lproj/Localizable.strings b/Signal/translations/hu.lproj/Localizable.strings index 81558d525f7dc984c86aacf9dc2e8a6f1571e9e5..7b26d178e0da422a2194e3cbdf1dde6a1727f625 100644 GIT binary patch delta 502 zcmZ8eOG^S#7(Hr1Q5gm`SPIjsMY)J5uvKMNVi<%iY$KCSIW#^;du+nLP+vcyrQkkj zVLNHnGUx{cwQbkA(_4niJ?DF#bLaNm*J}2)ym2js9i))O8n%gINFqVLDIVYWU<_MW zby@deN_EJgjEv;?eadC3fj-5DG0ajTww=&!%(h_>+G ipU&UX>*@35W3EQ!$CSJK$|-erEjGfjL-R@BTJDEgRjj>xJjxcef&VivR!s delta 35 tcmV+;0Nnqs`2)Q21F()mvvNdIf0Gc$UbC>q=qUqX0CJNtWfP;W@C-VO5O@Fp diff --git a/Signal/translations/it_IT.lproj/Localizable.strings b/Signal/translations/it_IT.lproj/Localizable.strings index d4d0fda088642653ab942c17b713ce6c4c286ee9..6e56b2618f75c4db9ecaf64a6f3b9cda73c71eed 100644 GIT binary patch delta 637 zcmZ`%O-n*S6g{PoR2UdywdpCX%!<|_WKStc6v`ITLd>)T_4%3EMxuYv{DJxhft!{E zM$4l9KwFnZOBbE{Dl{R6_qgZIoqNwYGcP?$=fZkp4Y{I-A&Mk65MiWa8)4#2^*-wK z>)1j-5JK=kgP)%VyGS963~Fc+7g0w62gDUriPJddei27%r0i5zixKr4m}^@@Z|7rs zEMS?sjyZLS(rl4~!D5XK4X&Em#z&mucSuxYltZ4;Au}1AqC_MEQp(+(R=tj6sZTxm zBPNU>DMu+Kjs(RG2vPH|v#lL=DwBAQq%$V%Ca2elWO9kCLVUtF&y0u@eo`v}4GJ!> zy2$fs)`$uU=3awQjRt7!DODN%i{_~Yvj+2GPPN5A(halle>cU5-*M6?Z#tee$rZRK zCJ8ASUp1}Dn}iM0)p$=ilA=+}E%V;iFwV6CFDx43>S@8PN(q}dI5p&;T>iwMXZJI% n)xVx;d>F$%eczh8hOUVpsxUVhq@uWM`DKZ28AUyg{& delta 36 ucmV+<0Nek>g9Ot21F!@|v*<^+XIzDiG!X diff --git a/Signal/translations/ja_JP.lproj/Localizable.strings b/Signal/translations/ja_JP.lproj/Localizable.strings index 7ba64b48be772dff81d3891e496d632c899a5d77..bdb44dc389c484665d5ef165a4381120cc60ce6a 100644 GIT binary patch delta 649 zcmX@JlzH1q<_#SdrhW|m41Nsp3{DI_K$bIuH-jgT?+z64WN=|{1+qhctPqAspolYr z2ZJL>cJjhn(a8;#e3MVvM@%*_mD${3afV4g*dWh9c|u~XM_>k&m2F@c8J-$$P-hTs z5I?!O({%Ga>kEpLdH8tTd<<3_JT!P|kZrKYV7+@lJftCpRsijX z8S7(kG`_JDsD1K7fyl`+2?Cp^#Lp3!d}F21X1{_phOD6s#SE#F3s;JJ18Ih2h7yKM zhJ1!R1_g#RAe|57r!o{V=m7bNK%4^Pl>k|p3^_nn3Q#1Kp@N|R$V&w3NrdU1yl|mx zJt9csp@9qwQj7ov26Q|)xI=&e>lh-U1(#P!$EGdJ*b+RIp nxBzG5mo#KkCp)ak+8nkhOm%Y13BF0a9Ft$2(A)gs_#G|)o`J-& delta 465 zcmah_Jxc>Y5FNcn5JC!-APA?Rl?Z}GL=o`^1R*iRLd>yuo(JBCw-+Te6r!bn#L_pL%1Q=iXWqOIVCXW*8qB=np z(HV6pr+_q&OY{YuqLLh0Oo5f4_edeHVYUxWfLQFRYcBZ^RH!2u2IxdwP8PcYZyl2mGY^Ps4^o(DgbN!{%26py zV&FMmIrji=KI(#k%AZ9Ik`|a^K5xy=jm_k=6e0n_hXB`JSGd17#XmoDvqB*Z3IwyX62^~l)M}IM+IP3nvS?S? zF8T+xi#CCOp?*L_=MB+^JO<9W_r811dGq;Xe}A@Lhr-?z(nukP2v&%qSVodOAx58P zFp5PiSS+x&jB>|WY5TlWB~-A>`abVBut#LFTjo@ioubv*Bi7i@@LMH=Z0CJPDq7#$)-!8J>a0|{m B6s!OM diff --git a/Signal/translations/lv.lproj/Localizable.strings b/Signal/translations/lv.lproj/Localizable.strings index 2b6614b8ba66e11f27576a2f7da55fe564d51f4c..1cf5d7729565556707191a5b7077480e867bc090 100644 GIT binary patch delta 544 zcmZ`$y-LGS7(Eh@f*|OiI7m|{2-4!i4O{~SIMR8wP7W!%s^|i-S@p3&XYEM&TA13w@z=8`0DjM8fauXhM zN1H+h$^Fn5Fdd%-IgB9U^3PkH}~B6FLaV zWcN0gM}9igVdX%v$ox5mph4f*O4ZJuw;8}-CfF_Y2N16OPaaM<_OTEc>U*wg! z6?xO7mW;CLLC!*UZV|~T$c`4z{CF02?8ZeySU2erU0h@{;%+x3a=pog|7S4#VJ1@3 ii@&F!^3nd@eDFS6>{{N?jLsjf=0*2)Jj%X(j(q{!NOoNS delta 32 qcmV+*0N?+T`2(Qx1F*_Nv#vzOev`n)UbA4vC@KSC0CKa7@COVT)DMFI diff --git a/Signal/translations/mk.lproj/Localizable.strings b/Signal/translations/mk.lproj/Localizable.strings index 92b255b43af489db611a8b095d6a9a1d34f10cff..189dfb716312e6ad9ee0b6dc492cde6da329d295 100644 GIT binary patch delta 544 zcmZ8eO-lk%6g^f@P*?;qMKn&XA_{^Q5oA;vC5Ay+(L%)3N*EhIMlEO|?rZb@KFNmULLFZ0|DZ}I4bLYH!&$+ky+5cV}c+!Jf1bc`ej!o<`3LuOS@wR&H z^JoF=U_%hL;DZ4_j}HgRbvHF;Ac+ekaEWuIk%GEkFW2?pV{PydMP>@B<@1CkO2S44 z7MTXlcw5B$k9pz*Pm0K9l!3`8#Y`Gk$Pr2P#NTU`Z%!|CRK|aGhY+N?2vtXMLLdJ$ zt9E;GWuMjZD6x8hQIXZJsh~t8-E;g3#AU`NGpFQ;Msk(kt1V|7e+DXiZ_}^A3Kp_t ziJvrag;|TY%tES5wxYgny{qCc>9Dg7+hk{%fb`2U67Ql(dK8@rn2rXE9QCrMyP~QU zn^B9$L+YkEKH6hl7Bt*tc0ya~HfwNsy#{~Q5a_HZe7NfmZ$~5F D(U*FN delta 32 ocmey=#M1DGd4rtGW+vBlO_K#q$8DZ-sz{4Dk)dd_;MYVR0PWlju>b%7 diff --git a/Signal/translations/nb_NO.lproj/Localizable.strings b/Signal/translations/nb_NO.lproj/Localizable.strings index 7a51fc90389934c41a67ba00d0592f8d9904895d..155f0deea356d42b8f98f407c80589968612f238 100644 GIT binary patch delta 573 zcmZ`$JxhX77(Eg}A44ISI8?7vOVr@l5TO<(iAm`Y4f>|9DfpEisYCQ5o*{z%f)MB& zwMDc94MC035{OHC=U$`_Aujjwocr8+?m6ea_eP#SN3OblX9PQlAOSzZtOD3Zh&U)_ z(6JuC7JLd}6CM~?uAoYsLYDm^j$nx`(CT#kPp6}Cwk&zP zb4vPr+M7X%qo%Jc^NPut)`TW<$g@gw$3hcjB9e*Oc1ZZ%zVah7F_0a?2E|1vI);7P z_$66vFRs;H@*GoQj`A!mu*J9QMC#o#M}_!=b)GxQhEm6~GCSuy%V{G98oXblF@p>x z+O@bAxvEZ75hSpV9Y#THBTT%h zKKniXAhr+?gbjFMV2#I%eI${E2^Upj8)f8?A}*ptoW=?7Z5+c?kGE4Q>d!V?p?YoT zfY&TiSMQ#HL}@n2!C|Svb`C#RH(4T1@??lyMmboFGR&AbM}dg#)$+YZT|7C51s4QH$KtGP-``z4oyLK|dgTme!!5 zF>-5B8iW3TQPh+W4Q`E{SBmI^czIvW^YNbN9G+&&(Rg!Q1Y@BD=8-@OQG8li##R9JH#e4tL#x4*(;L`Zy=8iW_S79MwZB8Eyo_};j1cHVvVl> zOCpZpkaD%w?#i{hOwQBDsix$Jlw+l2lMGhdw+T~DkNYJ2?CMBLZOA9?C8wBm&p&Se v+QHLNa0E8mGma$WXM|@Pj4~0LHfrK>z>% diff --git a/Signal/translations/pt_BR.lproj/Localizable.strings b/Signal/translations/pt_BR.lproj/Localizable.strings index 7c5d63c4c1b53d9f597ae7fa7aa5a53ef2a4cb6c..bfab4bffd97ffcdc6562ffacd7b290daab604383 100644 GIT binary patch delta 557 zcmaJ;yGjF55Itf95f!x&ktNqO3TkT;MB*lxRf&QT6pI*5ViqD&{mKLc2=I*7%U7j+{?_F*O{5CukO>D=XNTn*GBiD0t*o= z5wQ?NhDwNvLuoLu8LJ!cJlp_NiqkWiqg7wOGht3Kb$H4yssFqLTcx zZdQe8j<_sA`UzTr(&LulmucHoCEg($#g4)uLrpdzy>0r6?mirsR}Lxt{^sq9YHxZ% z?{4+#$HvG%d+2Z|9Z0!*m~71!_%plkQ9SI=@$_(Y=lbknTC3)uK5x#|pFhI=-;=z1 Ac>n+a delta 44 zcmeBcWSR4ed4q<_W*%3$#>oYzVm6DMe5b{o$WX*k!jQ?3&yY7c@tfslw=W(%0E|Hq AIRF3v diff --git a/Signal/translations/pt_PT.lproj/Localizable.strings b/Signal/translations/pt_PT.lproj/Localizable.strings index 699e0795826dd3bc22d02a733e26823fbc9e3a57..238d56634373966576e91f585335766b71b49e28 100644 GIT binary patch delta 632 zcmZ`$y)VO26g^UjuR+tK#N<~Dgh>1WhSo4#+SleQ1zBJQ}CsHo!Tp8j`#tCLrnlff@i7?DC$(5(ZI8lhS z<3_KA0;3%DTO6ug5uPcYT8S~Xj5q3%W(%h8e=pUVuh(==0t0Gz)UZo3Qr}d8KA$!2 zB@E* pmEGIMLD@dIQZ#ehk-FwcN_ulC1?bv-Qv6w^(NtlRXpD2z!7>svR$_VOl z>>?@=wh@AcP2La=VZlZYH8j+RH#eC!;uoFLjFD@d~ aTia9*oq2Dj(_K@i-hz7hTJknN!&BdyeuZ`b delta 32 ocmccC%JSqN^M)>$&3UdG&65?5$82sm{ZETIk)ddF)1$i$oR{kRqR@ zl0pJW;w(`Xt5ht^!PKs}?_6?y+b^|bkDNs7tysdb)47CA6j76lw9C|J4Rw@IK^X?t zSu5o9F-o52Dv;HQO4uMOP$^;yRkA$Fa@=&uz-9N!Pq5rq)bC)wVli&69XiXHDGuai z&oGx4UKLY*HK{D_ab>EE95x1r4VWrIWm*MQm^I9rQ955-O{kDE5YkmLH$zg}?~`h> z$I`AzFVgPl=NTXS`PCE^13?u~V+in;fhbk|szqP-3-g4JH-i#=ba!MW@A1g_vRzL( z{{NJJd_R)1>*$r2d8cgm*}FbpozeN_^?~|nT8v9)>*&fDk;b!A&YJet{Zr8K0iITD A8~^|S delta 32 ocmeDA%RKEH^9Bc(%{s0;4U-Gb#cY;4p`gW_$WXM|@sl?X0O-;UBLDyZ diff --git a/Signal/translations/sl.lproj/Localizable.strings b/Signal/translations/sl.lproj/Localizable.strings index cce05b4d485682be10101a0e3255e8dfd0ed62c8..cc274724a65c4f9312c55654b99cf65bad1b7df3 100644 GIT binary patch delta 514 zcmZXQ%S!@L6voe#p!A@(BDfeAwdv`iT?95tNv16f3=Qe&20=wLc%aZXC^*pd=+ILvs{IrO_hA zpy&C$ZKzYD1qusAQC^QM@mW00%d>%+qm3N7SExb;m3i0i3mddS4w+<=MJjFLYeQp7 zW6(OD9F&8~q#aZ_bPU>~5|oY|okNWQZr=Bg|6pWVU@?kN6c8~=(JDZHL%r1fd}*m1 zx$<)T)Z@1$Qx@*Rw*WU4PZ8(eK27rRiT6OTRN<*BqAE$wGI&hMTcrtf6PV}mmqFc1 z0U316L;@Rck!lMav0KKL$faVEl^v1a#-=5mkqh1in8e*U=$oux4D(%Iuae?WFv#a= zk4W9~C-uL}e|7t&lhUIieGPeT5gn0mA3ocXOeD*(XaB3bmdjo tKKM7G%{#g9KcSnyq&wC3t!tJ`CK6BIw$$$&&Dq=3oYWf=&5PIFp)bNrcqIS; delta 32 qcmV+*0N?-c`~&{=1F*P5vz$Z}fRnJnT(g?TVk!e+0CKbc@o@|$fDo<# diff --git a/Signal/translations/sq.lproj/Localizable.strings b/Signal/translations/sq.lproj/Localizable.strings index ccb7197d6b414424adb16c008b19d28c9c286fa2..3af8bb51abc338400b8100b83eba78939268e3a0 100644 GIT binary patch delta 698 zcmZ`%%}N4M7(HN%kO*qirsC#OB5554IY|wLMU7A^nRL{F8OL(WTv^X>U!?E}%6I4) zS_x6KY18?x3{oVQnK|Fjo$s7;@7HJQ?K}0DwzMkD`6X0Pz%fo>;RrTLIAF%cK8nN+ zk%LQSEF5CbREx+!A`UUWFqDie;#qgrhk*M%csUDCh`#w)tK>chc+V_<|e!K(r9fkl~$od z5t~T+Pgupsb|}=QB~zJaoN!HXK3RK4TA!@CMuW@AZK4RboE?yj7$CgaJ78EP47s`_ z=QElR6ju~_%*1p_giDvlcZ+YSG>MgQP>hjm&-Bf9TntL4$$tXaax8VjE+i87M1lC- zF&+knal{_Q!}Li?91O5U^*cy&<&b5~(fN-JJuc7d)zNZpwyXbM82yx5+5YXJqQ`%I ao1D0nTpIoS5)NNSaaNzcFAgup>kB_eWs4&K delta 32 ocmaFyoB7)p<_%oVo8LJXG)xva9kbcvc!?HsB16&U{U0@X01}c9Jpcdz diff --git a/Signal/translations/sv_SE.lproj/Localizable.strings b/Signal/translations/sv_SE.lproj/Localizable.strings index 07d14f569287ea7714a23a4623e80d3d16b7cf09..cf813c54fa2029c8b8c0e1c1260d065257ac4041 100644 GIT binary patch delta 620 zcmZ`$O-lk%6g}diMNv?RAVHHvP`GOyeN2&37?v$sgiSi?(D;##nTwEq!|R6>ZiCR@ z(85(v(8`6o+IH@%(1dur;hcLfcg{KQt?z&S@ZWdMU>paCBZV#O6PegUjC@z!Mg!|6 zqSzFM9fV)VSjfVLhX#2OH5718UO|;SjXe8B@oh95uME#N+8D5ps(+L*@}VaEUUk*tkZSOx9cKp*N!X=O81hq6{F#SsY7nRq!ouYY;B}LMKv-}Q|76VUlF^kh+Wal*(Pb4u)tHJ zFo(?2)+7T1byhrPVsNQU+58syl}?`6(0NI6QmyN`|MQh_e*Y$WTrA5YWVN~ikt8P$ z95$;uKUXU*A*(*$=Y2_)$StVFPH1W*H+k^!p`=vXA6)&Liow)IllXo=bLi21PZzDb Pc4$St^e0=7y`_mSSa^gU delta 44 zcmV+{0Mq}}_5@qVuGkeb2d4Bgie0i?Sup7q~;z(fyo3tX>K#cwx zBQdNZN;^R-fg~dltYcZPSKTzmf;qTcWnDVYQj0sI8(XlE*9{Dwr#PY~O)X~ItZ`JU zHNEglA=M$(rO<z&62VHQXAzRp`mQBobf1$(d98F#gDdb(gc49T z?@D}F;0j=ua1H*CO;93M9)A8;5W`#n%)w(Ip5`56Qb!Jc|-jW$2;8nf!+a-wyv01F%v+vo=9Gdy~M!T(ergk|_gW0CKbM=-mql^$*$r diff --git a/Signal/translations/tr_TR.lproj/Localizable.strings b/Signal/translations/tr_TR.lproj/Localizable.strings index 986c56ecbd501bc55994d34cff31da9a55c36aed..ace24bc1f1a2fb849dafc8828d5b33b770ec9969 100644 GIT binary patch delta 528 zcmZ8eyGufG6#mE|dVnIR^cbu~ib5KiYUpZOQW%6mk3lRgh3g})rVUcGwj^hBYjDr} z14L{n+MR0&YO4RB?{|BV9PYi}ch0%zeCM3*o8|t)a#Pb>VQe6bD12Ba@?#Al@)ddR za}4;g3e9BK4`UMU+T_k>lb7JOyf2P7YuZJne+vc@$V=ngp(%8L0#e8#12+!&&5|>Y z8S)sPI9Y)x1)V5PPXcA+$YRJyweAqTW1syK6aAJK!ZHGs5<&z!l=~|U0r5VLoNcns zF^a64Co)*~l)Z~&s&9^#CqE(9>DgzFQm1m=)SN|{R;20_S3-61`dalgu}y67Aoz10J=kO3XmL delta 44 zcmV+{0Mq}-@dMWC1F)JwvwlK?eUor6N|T_(60_>UvMB>$0CJNNV-u6??Jl$6?C1;j CG!{4j diff --git a/Signal/translations/zh_CN.lproj/Localizable.strings b/Signal/translations/zh_CN.lproj/Localizable.strings index a6371eb6c0276f6001ab6ab4bcf915ebb2f4c62b..16cc298fb02e2cd895dabc743c08a717bfe28579 100644 GIT binary patch delta 591 zcmZ`$OG`pw5Ita!ScC~;(B@`A5Rr%r7g=B?C5A!W0tpfGm7rbokp+dcZxPM12hpZw zg5VFRU(mK)(4v*g7Ogtpg^*r+T<)1O^Ua(&-`j=d`PS0v_{Hw;^Tv?G0#>k!5Tb}6 zh9xo)EFw&-6X}SP31JyQm6fNvQON}C18M9agE zk&}c|CXVgi91NbC;xG-37d2!U)rblx5@pC_aey)-ww0#tl%q>WvnMV|kxK5DxL?vJ zIcW;lDK)~S-0V5W&y6+q-b0v|oDsrO6u4+z+NI9UisNPl6hoU*# zV2y@#@_A;Io*C+&g^kC9Ddu!}*&I8MSd~4V|LytX?GTn>i_7=j42@>}G(fGT@y&ZL boN~tH=E~82zwVC9+2fF$>elwhL)Z2R#0Y<& delta 36 ucmV+<0NelCq66rg1F*I?vzj>MW|JPIT(fAR?jr+X0CJOYj}x