Release 2.0.0

This commit is contained in:
Frank Rotermund
2022-11-27 13:18:53 +00:00
parent bf57719009
commit 0dc8ec0982
570 changed files with 20366 additions and 4410 deletions

View File

@@ -5,7 +5,7 @@ body:
- type: markdown
attributes:
value: |
Thank you for taking the time to propose a new feature or make a suggestion.
Thank you for taking the time to propose an enhancement to an existing feature. If you would like to propose a new feature or a major cross-platform change, please [start a discussion here](https://github.com/vector-im/element-meta/discussions/new?category=ideas)
- type: textarea
id: usecase
attributes:

View File

@@ -63,3 +63,5 @@ jobs:
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v3
with:
flags: unittests

View File

@@ -1,9 +1,6 @@
name: UI Tests CI
on:
push:
branches: [ develop ]
pull_request:
workflow_dispatch:
@@ -61,4 +58,6 @@ jobs:
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v3
with:
flags: uitests

View File

@@ -4,6 +4,7 @@ on:
# Triggers the workflow on any pull request
pull_request:
types: [ labeled, synchronized, opened, reopened ]
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
@@ -27,7 +28,11 @@ jobs:
build:
# Run job if secrets are available (not available for forks).
needs: [check-secret]
if: needs.check-secret.outputs.out-key == 'true'
if: |
needs.check-secret.outputs.out-key == 'true' &&
(github.event_name == 'push' ||
(github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'Trigger-PR-Build')))
name: Release
runs-on: macos-12

View File

@@ -17,7 +17,8 @@ jobs:
contains(github.event.issue.labels.*.name, 'Z-IA') ||
contains(github.event.issue.labels.*.name, 'A-Themes-Custom') ||
contains(github.event.issue.labels.*.name, 'A-E2EE-Dehydration') ||
contains(github.event.issue.labels.*.name, 'A-Tags')
contains(github.event.issue.labels.*.name, 'A-Tags') ||
contains(github.event.issue.labels.*.name, 'A-Rich-Text-Editor')
steps:
- uses: actions/github-script@v5
with:
@@ -44,7 +45,13 @@ jobs:
name: P1 X-Needs-Design to Design project board
runs-on: ubuntu-latest
if: >
contains(github.event.issue.labels.*.name, 'X-Needs-Design')
contains(github.event.issue.labels.*.name, 'X-Needs-Design') &&
(contains(github.event.issue.labels.*.name, 'S-Critical') &&
(contains(github.event.issue.labels.*.name, 'O-Frequent') ||
contains(github.event.issue.labels.*.name, 'O-Occasional')) ||
(contains(github.event.issue.labels.*.name, 'S-Major') &&
contains(github.event.issue.labels.*.name, 'O-Frequent')) ||
contains(github.event.issue.labels.*.name, 'A11y'))
steps:
- uses: octokit/graphql-action@v2.x
id: add_to_project
@@ -202,3 +209,105 @@ jobs:
env:
PROJECT_ID: "PN_kwDOAM0swc4AArk0"
GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }}
ps_features1:
name: Add labelled issues to PS features team 1
runs-on: ubuntu-latest
if: >
contains(github.event.issue.labels.*.name, 'A-Polls') ||
contains(github.event.issue.labels.*.name, 'A-Location-Sharing') ||
(contains(github.event.issue.labels.*.name, 'A-Voice-Messages') &&
!contains(github.event.issue.labels.*.name, 'A-Broadcast')) ||
(contains(github.event.issue.labels.*.name, 'A-Session-Mgmt') &&
contains(github.event.issue.labels.*.name, 'A-User-Settings'))
steps:
- uses: octokit/graphql-action@v2.x
id: add_to_project
with:
headers: '{"GraphQL-Features": "projects_next_graphql"}'
query: |
mutation add_to_project($projectid:ID!,$contentid:ID!) {
addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) {
item {
id
}
}
}
projectid: ${{ env.PROJECT_ID }}
contentid: ${{ github.event.issue.node_id }}
env:
PROJECT_ID: "PVT_kwDOAM0swc4AHJKF"
GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }}
ps_features2:
name: Add labelled issues to PS features team 2
runs-on: ubuntu-latest
if: >
contains(github.event.issue.labels.*.name, 'A-DM-Start') ||
contains(github.event.issue.labels.*.name, 'A-Broadcast')
steps:
- uses: octokit/graphql-action@v2.x
id: add_to_project
with:
headers: '{"GraphQL-Features": "projects_next_graphql"}'
query: |
mutation add_to_project($projectid:ID!,$contentid:ID!) {
addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) {
item {
id
}
}
}
projectid: ${{ env.PROJECT_ID }}
contentid: ${{ github.event.issue.node_id }}
env:
PROJECT_ID: "PVT_kwDOAM0swc4AHJKd"
GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }}
ps_features3:
name: Add labelled issues to PS features team 3
runs-on: ubuntu-latest
if: >
contains(github.event.issue.labels.*.name, 'A-Rich-Text-Editor')
steps:
- uses: octokit/graphql-action@v2.x
id: add_to_project
with:
headers: '{"GraphQL-Features": "projects_next_graphql"}'
query: |
mutation add_to_project($projectid:ID!,$contentid:ID!) {
addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) {
item {
id
}
}
}
projectid: ${{ env.PROJECT_ID }}
contentid: ${{ github.event.issue.node_id }}
env:
PROJECT_ID: "PVT_kwDOAM0swc4AHJKW"
GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }}
voip:
name: Add labelled issues to VoIP project board
runs-on: ubuntu-latest
if: >
contains(github.event.issue.labels.*.name, 'Team: VoIP')
steps:
- uses: octokit/graphql-action@v2.x
id: add_to_project
with:
headers: '{"GraphQL-Features": "projects_next_graphql"}'
query: |
mutation add_to_project($projectid:ID!,$contentid:ID!) {
addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) {
item {
id
}
}
}
projectid: ${{ env.PROJECT_ID }}
contentid: ${{ github.event.issue.node_id }}
env:
PROJECT_ID: "PVT_kwDOAM0swc4ABMIk"
GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }}

View File

@@ -25,7 +25,7 @@ jobs:
- uses: alex-page/github-project-automation-plus@bb266ff4dde9242060e2d5418e120a133586d488
with:
project: iOS App Team
column: P1
column: "Important Issues & Topics (P1)"
repo-token: ${{ secrets.ELEMENT_BOT_TOKEN }}
P1_issues_to_crypto_team_workboard:

View File

@@ -1,3 +1,97 @@
## Changes in 1.9.10 (2022-11-01)
✨ Features
- Changed the info in the background audio message player. ([#6870](https://github.com/vector-im/element-ios/pull/6870))
- Added voice message support to the Rich Text Composer ([#6941](https://github.com/vector-im/element-ios/issues/6941))
🙌 Improvements
- Improves external links interaction UX. ([#6936](https://github.com/vector-im/element-ios/pull/6936))
- Verification: Deprecate legacy device-to-device verification ([#6937](https://github.com/vector-im/element-ios/pull/6937))
- Crypto: Define MXCrypto and MXCrossSigning as protocols ([#6943](https://github.com/vector-im/element-ios/pull/6943))
- Hide the old session list when the new device manager is enabled. ([#6999](https://github.com/vector-im/element-ios/pull/6999))
- Upgrade MatrixSDK version ([v0.24.2](https://github.com/matrix-org/matrix-ios-sdk/releases/tag/v0.24.2)).
- Added a responsive placeholder text to the Rich Text Composer ([#6935](https://github.com/vector-im/element-ios/issues/6935))
- Added the maximise/minimise toggle button to the Rich Text Composer ([#6954](https://github.com/vector-im/element-ios/issues/6954))
🐛 Bugfixes
- Timeline: Fix layout for SwiftUI content views. ([#5326](https://github.com/vector-im/element-ios/issues/5326))
- Updates the avatar image loading logics. ([#6847](https://github.com/vector-im/element-ios/issues/6847))
- Fixes input text view height when containing multiple lines of text. ([#6849](https://github.com/vector-im/element-ios/issues/6849))
- Fixed the placeholder flickering in the input toolbar when there is an height change. ([#6949](https://github.com/vector-im/element-ios/issues/6949))
🧱 Build
- Add Z-Labs tag for rich text editor and update to the new label naming. ([#6996](https://github.com/vector-im/element-ios/pull/6996))
🚧 In development 🚧
- Device Manager: Multi-session selection. ([#6928](https://github.com/vector-im/element-ios/issues/6928))
Others
- Updated templates readme file. ([#6925](https://github.com/vector-im/element-ios/issues/6925))
## Changes in 1.9.9 (2022-10-18)
✨ Features
- Added RendezvousService and secure channel establishment implementation ([#6806](https://github.com/vector-im/element-ios/pull/6806))
- Implemented login with QR code flows when scanning from mobile ([#6857](https://github.com/vector-im/element-ios/pull/6857))
🙌 Improvements
- User agents: Ignore OS version for web based sessions (PSG-826). ([#6852](https://github.com/vector-im/element-ios/pull/6852))
- Upgrade MatrixSDK version ([v0.24.1](https://github.com/matrix-org/matrix-ios-sdk/releases/tag/v0.24.1)).
- Display push toggle for sessions with m.local_notification_settings.<device-id> events in account_data ([#6797](https://github.com/vector-im/element-ios/issues/6797))
- CryptoV2: Incoming verification requests ([#6809](https://github.com/vector-im/element-ios/issues/6809))
- Check enabled field in notification settings push toggles ([#6814](https://github.com/vector-im/element-ios/issues/6814))
- Only use device type name as fallback for session display name ([#6820](https://github.com/vector-im/element-ios/issues/6820))
- Include app name in default session display name ([#6828](https://github.com/vector-im/element-ios/issues/6828))
- Tidy up TabBarCoordinator now that AllChatsCoordinator exists. ([#6853](https://github.com/vector-im/element-ios/issues/6853))
- Sign Out: Add a SignOutFlowPresenter and use this in All Chats, Settings and the Device Manager. ([#6854](https://github.com/vector-im/element-ios/issues/6854))
- Improved the Rich Text Editor to match design requirements. ([#6903](https://github.com/vector-im/element-ios/issues/6903))
🐛 Bugfixes
- Filter out application section in session details if needed. ([#6898](https://github.com/vector-im/element-ios/pull/6898))
- Rich text editor now supports interactive dismissal by dragging the timeline. ([#6919](https://github.com/vector-im/element-ios/pull/6919), [#6900](https://github.com/vector-im/element-ios/issues/6900))
- Location sharing: removing the loader. ([#5571](https://github.com/vector-im/element-ios/issues/5571))
- Element freezes after searching in a room. ([#6762](https://github.com/vector-im/element-ios/issues/6762))
- Settings: Use regular titles for all of the sub-screens. ([#6804](https://github.com/vector-im/element-ios/issues/6804))
- All Chats: Fix a header glitch when aborting a pop gesture. ([#6833](https://github.com/vector-im/element-ios/issues/6833))
- Device manager: Fixes from x-platform testing. ([#6864](https://github.com/vector-im/element-ios/issues/6864))
- All chats shows no rooms in the list. ([#6869](https://github.com/vector-im/element-ios/issues/6869))
- Device Manager: Navigating to session overview goes to session details. ([#6877](https://github.com/vector-im/element-ios/issues/6877))
- "Notifications on this device" not refreshed in user settings screen ([#6888](https://github.com/vector-im/element-ios/issues/6888))
- Rich text editor now always focuses if field is tapped within the border. ([#6897](https://github.com/vector-im/element-ios/issues/6897))
- Device Manger: Device client information not updated. ([#6904](https://github.com/vector-im/element-ios/issues/6904))
🧱 Build
- Remove the (now unused) FFMPEG pod. ([#6419](https://github.com/vector-im/element-ios/issues/6419))
- Update build tools from Cocoapods. ([#6886](https://github.com/vector-im/element-ios/issues/6886))
🚧 In development 🚧
- Device manager: Inactive sessions screen. ([#6786](https://github.com/vector-im/element-ios/issues/6786))
- Device manager: Unverified sessions screen. ([#6801](https://github.com/vector-im/element-ios/issues/6801))
- Device Manager: Add logout actions to UserSessionsOverview and UserSessionOverview ([#6802](https://github.com/vector-im/element-ios/issues/6802))
- Device Manager: 'View all' button in other sessions list. ([#6817](https://github.com/vector-im/element-ios/issues/6817))
- Device manager: Add UserSessionName and Rename actions to UserSessionsOverview and UserSessionOverview. ([#6823](https://github.com/vector-im/element-ios/issues/6823))
- Device Manager: Filter sessions. ([#6838](https://github.com/vector-im/element-ios/issues/6838))
- Device manager: Add verify device actions to UserSessionsOverview and UserSessionOverview. ([#6845](https://github.com/vector-im/element-ios/issues/6845))
- Device manager: Identify inactive sessions. ([#6881](https://github.com/vector-im/element-ios/issues/6881))
Others
- Expose AuthenticationRestClient async login token generation method ([#6827](https://github.com/vector-im/element-ios/pull/6827))
- Use unstable prefixes for login with QR flows. ([#6899](https://github.com/vector-im/element-ios/pull/6899))
## Changes in 1.9.8 (2022-10-04)
🙌 Improvements

View File

@@ -1,6 +1,37 @@
Changes in BWI project 2.0.0 (2022-11-23)
===================================================
Upstream merge ✨:
- v1.9.10
Features ✨:
- Chat bubbles enabled
- Praise the birthday (#3646)
Improvements 🙌:
- New Logo (#3719)
- Refactored Buildsettings (#3626)
- Remove Element terms of service view (#3791)
- Remove room settings for DMs to be more similar to Android (#3639)
- being able to change pusher url and change it to push-local (#3637)
Bugfix 🐛:
- Disable sharing toolbar for pdfs (#3880)
- Fix going into app without pin log in some cases (#3891)
Translations 🗣 :
SDK API changes ⚠️:
+Build 🧱:
Changes in BWI project 1.26.0 (2022-10-21)
===================================================
Upstream merge ✨:

View File

@@ -35,7 +35,8 @@ class AppConfiguration: CommonConfiguration {
// bwi: add additional event for nicknames
MXKAppSettings.standard()?.addSupportedEventTypes([kWidgetMatrixEventTypeString,
kWidgetModularEventTypeString,
BwiBuildSettings.bwiUserLabelEventTypeString])
BWIBuildSettings.shared.bwiUserLabelEventTypeString,
VoiceBroadcastSettings.voiceBroadcastInfoContentKeyType])
// Hide undecryptable messages that were sent while the user was not in the room
MXKAppSettings.standard()?.hidePreJoinedUndecryptableEvents = true
@@ -53,7 +54,7 @@ class AppConfiguration: CommonConfiguration {
MXSDKOptions.sharedInstance().enableKeyBackupWhenStartingMXCrypto = true
// bwi: explicitly set option for key sharing
MXSDKOptions.sharedInstance().enableRoomSharedHistoryOnInvite = BwiBuildSettings.allowKeySharingOnRoomInvite
MXSDKOptions.sharedInstance().enableRoomSharedHistoryOnInvite = BWIBuildSettings.shared.allowKeySharingOnRoomInvite
}
@@ -63,7 +64,7 @@ class AppConfiguration: CommonConfiguration {
super.setupSettings(for: matrixSession)
setupWidgetReadReceipts(for: matrixSession)
if BuildSettings.enableAntivirusScan, let homeServerStringURL = matrixSession.credentials?.homeServer {
if BWIBuildSettings.shared.enableAntivirusScan, let homeServerStringURL = matrixSession.credentials?.homeServer {
matrixSession.antivirusServerURL = homeServerStringURL
}
}

View File

@@ -16,5 +16,5 @@
//
// Version
MARKETING_VERSION = 1.26.0
MARKETING_VERSION = 2.0.0
CURRENT_PROJECT_VERSION = 20220714163152

View File

@@ -0,0 +1,499 @@
//
/*
* Copyright (c) 2022 BWI GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import Foundation
import KeychainAccess
@objcMembers
class BWIBuildSettings: NSObject {
static let shared = BWIBuildSettings()
private let vault: KeyValueVault
override init() {
vault = KeychainVault(Keychain(service: BwiSettingsConstants.bwiSettingsKeychainService,
accessGroup: BuildSettings.keychainAccessGroup))
super.init()
overrideTargetSpecificSettings()
}
// MARK: -
private enum UserDefaultsKeys {
static let additionalBwiHeaderKey = "bwiHeader"
}
private struct BwiSettingsConstants {
static let bwiSettingsKeychainService: String = BuildSettings.baseBundleIdentifier + ".bwi-settings-service"
}
func reset() {
additionalBwiHeader = UserAgentService().bwiUserAgentDict
let sdkOptions = MXSDKOptions.sharedInstance()
sdkOptions.httpAdditionalHeaders = UserAgentService().bwiUserAgentDict
}
// MARK: Servers
var additionalBwiHeader: Dictionary<String, String> {
get {
do {
guard let data = try vault.data(forKey: UserDefaultsKeys.additionalBwiHeaderKey) else {
return UserAgentService().bwiUserAgentDict
}
var dict = try JSONDecoder().decode(Dictionary<String,String>.self, from: data)
dict["User-Agent"] = UserAgentService().bwiUserAgent
return dict
} catch {
return UserAgentService().bwiUserAgentDict
}
} set {
do {
let data = try JSONEncoder().encode(newValue)
try vault.set(data, forKey: UserDefaultsKeys.additionalBwiHeaderKey)
} catch let error {
NSLog("[PinCodePreferences] Error when storing addional header to the vault: \(error)")
}
}
}
// MARK: -
// Integration check
var forcedPinProtection = true
// Jailbreak check
var forcedNoneJailbroken = true
/// Default number of iterations for secure storage. Do not change this value after going live.
var iterationsForSecureStorage: UInt = 100000
/// Allow split view detail view stacking
var allowSplitViewDetailsScreenStacking = true
// direct rooms are for two persons only in bwi context
var allowInviteOnDirectRooms = false
// test setup for downtime: should be false for all builds
var useTestDataForDowntime = false
var flavor = ""
var showBwiSplashScreen = false
var bwiShowRoomSearch = false
var bwiAllowRoomPermalink = false
var bwiAllowUserPermalink = false
var bwiCheckAppVersion = true
var bwiNotificationTimes = true
var bwiUserLabelsAdminSettingsVisible = true
var bwiUserLabelsMemberDetailsVisible = true
var bwiUserLabelsParticipantsVisible = true
var bwiUserLabelsTimelineDisplayNameVisible = true
var bwiUserLabelsTimelineEventVisible = true
var bwiUserLabelEventTypeString = "de.bwi.room.user_function_labels"
var bwiUserLabelParticipantSorting = true
var bwiShowClosedPolls = true
var bwiShowThreads = false
var bwiShowRoomCreationSectionFooter = false
var bwiAutoCreateAliasOnRoomCreation = true
var bwiLocationShareButtonVisible = true
var bwiUseCustomPersonalNotesAvatar = true
var bwiBetterIgnoredUsers = true
var bwiSettingsShowInAppNotifications = false
var bwiFilteredContextMenu = true
var bwiShowPinnedNotificationSettings = false
var bwiShowSessionSettingsFooter = false
var bwiEnablePersonalState = false
// In onboarding splash screen dis/enable register button
var bwiOnboardingSplashScreenEnableRegister = false
// make sure that the NSE extention always resets message body and title
var bwiHideNotificationMessageBody = true
// in Auth screen dis/enable register button even with onboarding splash screen enabled
var bwiAuthentificationScreenEnableRegister = false
// enable BuM style authentication UI (more Info text and a logo)
var bwiEnableBuMAuthentificationUI = true
// voicemessages should resignplaying when the app enters the background
var bwiResignPlayingVoiceMessageInBackground = true
// enable BUM style UI in pincode and maybe other places
var bwiEnableBuMUI = true
// clear media cache every time when leaving a room vc: no media should be saved on device for security purposes
var bwiClearMediaCacheOnRoomExit = true
var bwiEnableLoginProtection = true
var bwiHashes = [ "a3f65e35a7476799afe8d80282fb3c45b39dab06d1d8c70dc98e45ab7d8e93a9",
"2fda1a831655c22a5e6096d7cfbff4429fbf27891141e191b46adbf168142a11",
"4f8cbb3fef885f7284d0477d797d7007f0e1ba76221834132752f4d645796e28",
"24c2ec541e61e8e68944b96dc45ed5df12f6bdbda283cb0b3a522742aa970256",
"1be0b314a6c915d4475290522baef5b642db1b6d68937792b8e0eb5b7b0d6666",
"3deb73db8cafcd1d5a59e25e251c35816162e1f6ee67b5d7d011da0e8d6ef931",
"42e57985d61202c2c7dd87d898cef9bdce020877a4c7a8c7cd699f6a28f58c0c",
"e1c3c7cac12bd65bd48de79a2677187d2e768d2769377627534023588b8d7a33"]
// use a different badge color if the user was mentioned in a room
var showMentionsInRoom = true
// replace feature history link variable with the appropiate build setting
var bwiFeatureHistoryLink = "https://messenger.bwi.de/#c4783"
var bwiReplaceFeatureLink = true
// login with matrix id should only be enabled in some configurations
var bwiEnableLoginWithMatrixID = true
// show app specific loading icons instead of the rotating element logo
var showBUMLottieAnimation = true
// DMs don't need all roomsettings (like changing avatar, name, topic)
var showUnrelatedRoomSettingsForDirectMessages = false
// create rooms without shared history
var enableSharedHistoryOnRoomCreation = false
// explicitly set sdk option for key sharing => We don't want to share even if the room setting allows it
var allowKeySharingOnRoomInvite = true
// DMs don't need all roomsettings (like changing avatar, name, topic)
var allowDoubleTapOnImageAttachmentsForZoom = true
// ------ End of BwiBuildSettings ---------
// Element-Web instance for the app
var applicationWebAppUrlString = ""
// Default servers proposed on the authentication screen
var serverConfigDefaultHomeserverUrlString = ""
var serverConfigDefaultIdentityServerUrlString = ""
var serverConfigPreSelections = ["":""]
var serverConfigSygnalAPIUrlString = "http://push-local/_matrix/push/v1/notify"
// Note: Set empty strings to hide the related entry in application settings
var applicationCopyrightUrlString = "https://messenger.bwi.de/copyright"
var applicationPrivacyPolicyUrlString = ""
var applicationTermsConditionsUrlString = ""
// MARk: - Matrix permalinks
// Paths for URLs that will considered as Matrix permalinks. Those permalinks are opened within the app
var permalinkSupportedHosts: [String: [String]] = [:]
// MARK: - VoIP
var allowVoIPUsage = false
var stunServerFallbackUrlString: String? = ""
// MARK: - Public rooms Directory
// List of homeservers for the public rooms directory
var publicRoomsDirectoryServers = ["matrix.org"]
// MARK: - Analytics
/// BWI: set host and key to nil to disable PostHog tracking
var analyticsHost: String? = nil
var analyticsKey: String? = nil
var bwiAnalyticsServerUrlString = ""
var bwiAnalyticsAppId = "1"
/// The configuration to use for analytics during development. Set `isEnabled` to false to disable analytics in debug builds.
var analyticsConfiguration = BuildSettings.AnalyticsConfiguration(isEnabled: false,
host: "",
apiKey: "",
termsURL: URL(string: "https://element.io/cookie-policy")!)
// MARK: - Bug report
var bugReportEndpointUrlString = ""
// MARK: - Integrations
// Widgets in those paths require a scalar token
var integrationsScalarWidgetsPaths = [""]
// Jitsi server used outside integrations to create conference calls from the call button in the timeline
var jitsiServerUrl = URL(string: "https://enter.jitsi.url")!
var enableJSInWebView = false
// MARK: - Features
/// Setting to force protection by pin code
var forcePinProtection = true
/// Max allowed time to continue using the app without prompting PIN
var pinCodeGraceTimeInSeconds: TimeInterval = 180
var allowLocalContactsAccess = false
var allowInviteExernalUsers = false
var enableSideMenu = false
var sideMenuShowInviteFriends = false
// MARK: - Feature Specifics
/// Not allowed pin codes. User won't be able to select one of the pin in the list.
var notAllowedPINs: [String] = [
"1234",
"1111",
"0000",
"1212",
"7777",
"1004",
"2000",
"4444",
"2222",
"6969",
"9999",
"3333",
"5555",
"6666",
"1122",
"1313",
"8888",
"4321",
"2001",
"1010",
"2580",
"4711",
"0815",
"0852"
]
var allowLocalContactPresence = false
/// Indicates should the app log out the user when number of PIN failures reaches `maxAllowedNumberOfPinFailures`. Defaults to `false`
var logOutUserWhenPINFailuresExceeded = true
/// Indicates should the app log out the user when number of biometrics failures reaches `maxAllowedNumberOfBiometricsFailures`. Defaults to `false`
var logOutUserWhenBiometricsFailuresExceeded = true
/// If force is enabled the dialog for asking if reseting the key backup is not shown.. already asked before in mandatory verfication
var forceResetBackupIfLost = true
/// if skip is enabled the key backup dialogs are passed through
var skipKeyBackupStep = true
// MARK: - Main Tabs
var homeScreenShowHomeTab = false
// MARK: - General Settings Screen
var settingsScreenAllowAddingLinkedEmails = false
var settingsScreenAllowAddingPhoneNumbers = false
var settingsScreenAllowAddingEmailThreepids = false
var settingsScreenAllowAddingPhoneThreepids = false
var settingsScreenShowThreepidExplanatory = false
var settingsScreenShowDiscoverySettings = false
var settingsScreenAllowIdentityServerConfig = false
var settingsScreenShowConfirmMediaSize = false
var settingsScreenShowAdvancedSettings = false
var settingsScreenShowLabSettings = false
var settingsScreenAllowChangingRageshakeSettings = false
var settingsScreenAllowChangingCrashUsageDataSettings = false
var settingsScreenAllowBugReportingManually = false
var settingsScreenAllowDeactivatingAccount = false
var settingsScreenShowLinkPreviews = false
var settingsScreenShowInviteFriends = false
var settingsScreenShowSettings = true
var settingsScreenShowFeedback = false
var settingsScreenShowHelp = false
var settingsScreenShowNotificationDecodedContentOption = false
var settingsScreenShowSystemSettingsOption = false
var settingsScreenShowNsfwRoomsOption = false
var settingsScreenShowSupportSetting = true
var settingsScreenSupportSettingHTML = "support"
var settingsSecurityScreenShowCryptographyInfo:Bool = false
var settingsSecurityScreenShowCryptographyExport:Bool = false
var settingsSecurityScreenShowAdvancedUnverifiedDevices:Bool = false
// MARK: - Notification Settings
var settingsNotificationsBWIDefaultSet = true
var settingsNotificationsShowDefault = true
var settingsNotificationsShowMentions = false
var settingsNotificationsShowAdvanced = false
// MARK: - Timeline settings
var roomInputToolbarCompressionMode: BuildSettings.MediaCompressionMode = .none
// MARK: - Room Creation Screen
var roomCreationScreenAllowEncryptionConfiguration = false
// MARK: - Room Screen
var roomScreenAllowStickerAction = false
// MARK: - Room Info Screen
var roomInfoScreenShowIntegrations = false
// MARK: - Room Settings Screen
var roomSettingsScreenShowLowPriorityOption = false
var roomSettingsScreenShowDirectChatOption = false
var roomSettingsScreenAllowChangingAccessSettings = false
var roomSettingsScreenAllowChangingHistorySettings = false
var roomSettingsScreenShowAddressSettings = false
var roomSettingsScreenShowAdvancedSettings = false
var roomSettingsScreenShowAccessSettingsBW = true
var roomSettingsScreenRemoveLeave = true
var roomSettingsScreenShowNotificationsV2 = false
// MARK: - Message
var messageDetailsAllowShare = false
var messageDetailsAllowPermalink = false
var messageDetailsAllowViewSource = false
var messageDetailsAllowSave = false
var messageDetailsAllowCopyMedia = false
var messageDetailsAllowPasteMedia = false
// MARK: - Authentication Screen
var authScreenShowRegister = false
var authScreenShowPhoneNumber = false
var authScreenShowForgotPassword = false
var authScreenShowCustomServerOptions = true
var authScreenShowTestServerOptions = true
var authScreenShowSocialLoginSection = false
// MARK: - Cross-signing (bwi=true)
var disableSelfUserVerification = true
// MARK: - Antivirus scan (bwi=true)
var enableAntivirusScan = true
// MARK: Verification screen (bwi=false)
var showRecoverWithKey = false
// MARK: Unified search screen (bwi=false)
var showUnifiedSearchViewMessagesTab = false
var showUnifiedSearchViewFilesTab = false
// MARK: - Onboarding
var onboardingShowAccountPersonalization = false
var onboardingEnableNewAuthenticationFlow = false
// ---
// MARK: Last message timestamp support (bwi=false)
var enableLastMessageTimestamp = false
// MARK: Invite friends in Direct Chat (bwi=false)
var directChatShowInviteFriends = false
// MARK: Last admin is not allowed to leave the room (bwi=true)
var lastAdminIsNotAllowedToLeaveRoom = true
// MARK: Room Member Details Screen (bwi=true)
var roomMemberDetailsHideLeaveButton = true
// MARK: Room create options (bwi=false)
var enableShowInRoomDirectory = false
// Mark: Unified Search (bwi=true)
var unifiedSearchScreenShowPublicDirectory = true
// MARK: Allows removal of uploaded avatar photos (bwi=true)
var enableRemoveAvatarImage = true
// MARK: Add a toggle button to the login screen to make the password visible
var passwordIndicatorOnLogin = true
// MARK: Displays the element base version on the settings screen
var elementBaseVersion = "1.9.10"
var showElementBaseVersion = true
// MARK: Bypasses the normal forgot password process by presenting the user an information alert
// (requires authScreenShowForgotPassword set to true)
var forgotPasswordInformationAlert = true
// MARK: Promote new feature within a banner below the navigation view
var showTopBanner = true
var showCustomServerDisplayName = true
var customServerDisplayName = ""
// MARK BWI show/hide developer menu
var bwiShowDeveloperSettings = false
// MARK BWI personal notes room
var bwiPersonalNotesRoom = false
var bwiPersonalNotesRoomLeavable = false
var bwiResetPersonalNotesAccountData = false
var bwiShowTimelineSettings = false
// MARK BWI personal state
var bwiPersonalState = false
// MARK BWI personal notes room
var bwiRollsAndRights = true
// MARK: Timeline
var settingsScreenShowSimpleTimeLineOptions = false
var settingsScreenShowTimeStampOption = true
var settingsScreenShowDeletedMessagesOption = false
var settingsScreenShowNameChangeOption = false
var settingsScreenShowChatEffectsOption = false
var settingsScreenShowRoomAvatarChangeOption = false
var settingsScreenShowUserAvatarChangeOption = true
var settingsScreenShowEnterRoomOption = true
var bwiLastAdminCanDowngradeHimself = false
var bwiEnableErrorTracking = false
var bwiEnableRegisterInfo = false
var bwiShowHappyBirthdayCampaign = false
var bwiHappyBirthdayCampaignIdentifier: String = "2022"
var bwiDisableSecuritySettingsUntrustedDevices = true
var bwiMatomoTrackingDefaultState = false
var bwiShowNewFeatures = true
// MARK: - Message Bubbles bwi show in our menu and only for beta builds
var bwiShowMessageBubbleSettings = false
// bwi disable encrypted option in message context menu
var roomContextualMenuShowEncryptionOption = false
// bwi disable side menu coach message
var showSideMenuCoachMessage = false
}

View File

@@ -0,0 +1,32 @@
//
/*
* Copyright (c) 2022 BWI GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import Foundation
extension BWIBuildSettings {
func overrideTargetSpecificSettings() {
authScreenShowRegister = true
showTopBanner = false
bwiShowDeveloperSettings = true
bwiPersonalState = true
bwiEnableErrorTracking = true
bwiMatomoTrackingDefaultState = true
bwiShowMessageBubbles = true
}
}

View File

@@ -1,572 +0,0 @@
//
// Copyright 2020 Vector Creations Ltd
// Copyright (c) 2021 BWI GmbH
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
import Foundation
/// BuildSettings provides settings computed at build time.
/// In future, it may be automatically generated from xcconfig files
@objcMembers
final class BuildSettings: NSObject {
// MARK: - Bundle Settings
static var applicationGroupIdentifier: String {
guard let applicationGroupIdentifier = Bundle.app.object(forInfoDictionaryKey: "applicationGroupIdentifier") as? String else {
fatalError("applicationGroupIdentifier should be defined")
}
return applicationGroupIdentifier
}
static var baseBundleIdentifier: String {
guard let baseBundleIdentifier = Bundle.app.object(forInfoDictionaryKey: "baseBundleIdentifier") as? String else {
fatalError("baseBundleIdentifier should be defined")
}
return baseBundleIdentifier
}
static var keychainAccessGroup: String {
guard let keychainAccessGroup = Bundle.app.object(forInfoDictionaryKey: "keychainAccessGroup") as? String else {
fatalError("keychainAccessGroup should be defined")
}
return keychainAccessGroup
}
static var applicationURLScheme: String? {
guard let urlTypes = Bundle.app.object(forInfoDictionaryKey: "CFBundleURLTypes") as? [AnyObject],
let urlTypeDictionary = urlTypes.first as? [String: AnyObject],
let urlSchemes = urlTypeDictionary["CFBundleURLSchemes"] as? [AnyObject],
let externalURLScheme = urlSchemes.first as? String else {
return nil
}
return externalURLScheme
}
static var pushKitAppIdProd: String {
return baseBundleIdentifier + ".ios.voip.prod"
}
static var pushKitAppIdDev: String {
return baseBundleIdentifier + ".ios.voip.dev"
}
static var pusherAppIdProd: String {
return baseBundleIdentifier + ".ios.prod"
}
static var pusherAppIdDev: String {
return baseBundleIdentifier + ".ios.dev"
}
static var pushKitAppId: String {
#if DEBUG
return pushKitAppIdDev
#else
return pushKitAppIdProd
#endif
}
static var pusherAppId: String {
#if DEBUG
return pusherAppIdDev
#else
return pusherAppIdProd
#endif
}
// Element-Web instance for the app
static let applicationWebAppUrlString = ""
// MARK: - Localization
/// Whether to allow the app to use a right to left layout or force left to right for all languages
static let disableRightToLeftLayout = true
// MARK: - Server configuration
// Default servers proposed on the authentication screen
static let serverConfigDefaultHomeserverUrlString = ""
static let serverConfigDefaultIdentityServerUrlString = ""
static let serverConfigPreSelections = ["":""]
static let serverConfigSygnalAPIUrlString = ""
// MARK: - Legal URLs
// Note: Set empty strings to hide the related entry in application settings
static let applicationCopyrightUrlString = "https://messenger.bwi.de/copyright"
static let applicationPrivacyPolicyUrlString = ""
static let applicationTermsConditionsUrlString = "https://element.io/terms-of-service"
static let applicationHelpUrlString = "https://element.io/help"
// MARk: - Matrix permalinks
// Paths for URLs that will considered as Matrix permalinks. Those permalinks are opened within the app
static let permalinkSupportedHosts: [String: [String]] = [:]
// For use in clients that use a custom base url for permalinks rather than matrix.to.
// This baseURL is used to generate permalinks within the app (E.g. timeline message permalinks).
// Optional String that when set is used as permalink base, when nil matrix.to format is used.
// Example value would be "https://www.example.com", note there is no trailing '/'.
static let clientPermalinkBaseUrl: String? = ""
// MARK: - VoIP
static var allowVoIPUsage: Bool {
#if canImport(JitsiMeetSDK)
return false
#else
return false
#endif
}
static let stunServerFallbackUrlString: String? = ""
// MARK: - Public rooms Directory
// List of homeservers for the public rooms directory
static let publicRoomsDirectoryServers = [
"matrix.org",
"gitter.im"
]
// MARK: - Rooms Screen
static let roomsAllowToJoinPublicRooms: Bool = true
// MARK: - Analytics
// $$$
static let analyticsServerUrl = URL(string: "")
static let analyticsAppId = "0"
/// BWI: set host and key to nil to disable PostHog tracking
static let analyticsHost: String? = nil
static let analyticsKey: String? = nil
static let analyticsTermsURL = URL(string: "https://element.io/cookie-policy")!
static let bwiPresentAnalyticsPrompt = false
static let bwiAnalyticsServerUrlString = ""
static let bwiAnalyticsAppId = "1"
/// A type that represents how to set up the analytics module in the app.
///
/// **Note:** Analytics are disabled by default for forks.
/// If you are maintaining a fork, set custom configurations.
struct AnalyticsConfiguration {
/// Whether or not analytics should be enabled.
let isEnabled: Bool
/// The host to use for PostHog analytics.
let host: String
/// The public key for submitting analytics.
let apiKey: String
/// The URL to open with more information about analytics terms.
let termsURL: URL
}
/// The configuration to use for analytics during development. Set `isEnabled` to false to disable analytics in debug builds.
static let analyticsConfiguration = AnalyticsConfiguration(isEnabled: false,
host: "",
apiKey: "",
termsURL: URL(string: "https://element.io/cookie-policy")!)
// MARK: - Bug report
static let bugReportEndpointUrlString = ""
// Use the name allocated by the bug report server
static let bugReportApplicationId = "riot-ios"
static let bugReportUISIId = "element-auto-uisi"
// MARK: - Integrations
static let integrationsUiUrlString = "https://scalar.vector.im/"
static let integrationsRestApiUrlString = "https://scalar.vector.im/api"
// Widgets in those paths require a scalar token
static let integrationsScalarWidgetsPaths = [""]
// Jitsi server used outside integrations to create conference calls from the call button in the timeline
static let jitsiServerUrl: URL = URL(string: "https://enter.jitsi.url")!
// MARK: - Features
/// Setting to force protection by pin code
static let forcePinProtection: Bool = true
/// Max allowed time to continue using the app without prompting PIN
static let pinCodeGraceTimeInSeconds: TimeInterval = 180
/// Force non-jailbroken app usage
static let forceNonJailbrokenUsage: Bool = true
static let allowSendingStickers: Bool = false
static let allowLocalContactsAccess: Bool = false
static let allowInviteExernalUsers: Bool = false
static let enableSideMenu: Bool = false
static let sideMenuShowInviteFriends: Bool = false
/// Whether to read the `io.element.functional_members` state event and exclude any service members when computing a room's name and avatar.
static let supportFunctionalMembers: Bool = true
// MARK: - Feature Specifics
/// Not allowed pin codes. User won't be able to select one of the pin in the list.
static let notAllowedPINs: [String] = [
"1234",
"1111",
"0000",
"1212",
"7777",
"1004",
"2000",
"4444",
"2222",
"6969",
"9999",
"3333",
"5555",
"6666",
"1122",
"1313",
"8888",
"4321",
"2001",
"1010",
"2580",
"4711",
"0815",
"0852"
]
/// Maximum number of allowed pin failures when unlocking, before force logging out the user. Defaults to `3`
static let maxAllowedNumberOfPinFailures: Int = 3
/// Maximum number of allowed biometrics failures when unlocking, before fallbacking the user to the pin if set or logging out the user. Defaults to `5`
static let maxAllowedNumberOfBiometricsFailures: Int = 5
static let allowLocalContactPresence: Bool = false
/// Indicates should the app log out the user when number of PIN failures reaches `maxAllowedNumberOfPinFailures`. Defaults to `false`
static let logOutUserWhenPINFailuresExceeded: Bool = true
/// Indicates should the app log out the user when number of biometrics failures reaches `maxAllowedNumberOfBiometricsFailures`. Defaults to `false`
static let logOutUserWhenBiometricsFailuresExceeded: Bool = true
/// If force is enabled the dialog for asking if reseting the key backup is not shown.. already asked before in mandatory verfication
static let forceResetBackupIfLost: Bool = true
/// if skip is enabled the key backup dialogs are passed through
static let skipKeyBackupStep: Bool = true
static let showNotificationsV2: Bool = true
// MARK: - Main Tabs
static let homeScreenShowHomeTab: Bool = false
static let homeScreenShowFavouritesTab: Bool = true
static let homeScreenShowPeopleTab: Bool = true
static let homeScreenShowRoomsTab: Bool = true
// MARK: - General Settings Screen
static let settingsScreenShowUserFirstName: Bool = false
static let settingsScreenShowUserSurname: Bool = false
static let settingsScreenAllowAddingLinkedEmails: Bool = false
static let settingsScreenAllowAddingPhoneNumbers: Bool = false
static let settingsScreenAllowAddingEmailThreepids: Bool = false
static let settingsScreenAllowAddingPhoneThreepids: Bool = false
static let settingsScreenShowThreepidExplanatory: Bool = false
static let settingsScreenShowDiscoverySettings: Bool = false
static let settingsScreenAllowIdentityServerConfig: Bool = false
static let settingsScreenShowConfirmMediaSize: Bool = false
static let settingsScreenShowAdvancedSettings: Bool = false
static let settingsScreenShowLabSettings: Bool = false
static let settingsScreenAllowChangingRageshakeSettings: Bool = false
static let settingsScreenAllowChangingCrashUsageDataSettings: Bool = false
static let settingsScreenAllowBugReportingManually: Bool = false
static let settingsScreenAllowDeactivatingAccount: Bool = false
static let settingsScreenEnableDecodedContentAndGlobalSettings: Bool = false
static let settingsScreenShowChangePassword:Bool = true
static let settingsScreenShowLinkPreviews:Bool = false
static let settingsScreenShowInviteFriends:Bool = false
static let settingsScreenShowSettings:Bool = true
static let settingsScreenShowFeedback:Bool = false
static let settingsScreenShowHelp:Bool = false
static let settingsScreenShowEnableStunServerFallback: Bool = true
static let settingsScreenShowNotificationDecodedContentOption: Bool = false
static let settingsScreenShowSystemSettingsOption: Bool = false
static let settingsScreenShowNsfwRoomsOption: Bool = false
static let settingsScreenShowTACSetting: Bool = false
static let settingsScreenShowSupportSetting: Bool = true
static let settingsSecurityScreenShowSessions:Bool = true
static let settingsSecurityScreenShowSetupBackup:Bool = true
static let settingsSecurityScreenShowRestoreBackup:Bool = true
static let settingsSecurityScreenShowDeleteBackup:Bool = true
/// A setting to enable the presence configuration settings section.
static let settingsScreenPresenceAllowConfiguration: Bool = false
static let settingsSecurityScreenShowCryptographyInfo:Bool = false
static let settingsSecurityScreenShowCryptographyExport:Bool = false
static let settingsSecurityScreenShowAdvancedUnverifiedDevices:Bool = false
// MARK: - Notification Settings
static let settingsNotificationsBWIDefaultSet:Bool = true
static let settingsNotificationsShowDefault:Bool = true
static let settingsNotificationsShowMentions:Bool = false
static let settingsNotificationsShowAdvanced:Bool = false
// MARK: - Timeline settings
static let roomInputToolbarCompressionMode: MediaCompressionMode = .none
enum MediaCompressionMode {
case prompt, small, medium, large, none
}
// MARK: - Room Creation Screen
static let roomCreationScreenAllowEncryptionConfiguration: Bool = false
static let roomCreationScreenRoomIsEncrypted: Bool = true
static let roomCreationScreenAllowRoomTypeConfiguration: Bool = true
static let roomCreationScreenRoomIsPublic: Bool = false
// MARK: - Room Screen
static let roomScreenAllowVoIPForDirectRoom: Bool = true
static let roomScreenAllowVoIPForNonDirectRoom: Bool = true
static let roomScreenAllowCameraAction: Bool = true
static let roomScreenAllowMediaLibraryAction: Bool = true
static let roomScreenAllowStickerAction: Bool = false
static let roomScreenAllowFilesAction: Bool = true
// Timeline style
static let roomScreenAllowTimelineStyleConfiguration: Bool = true
static let roomScreenTimelineDefaultStyleIdentifier: RoomTimelineStyleIdentifier = .plain
static var isRoomScreenEnableMessageBubblesByDefault: Bool {
return self.roomScreenTimelineDefaultStyleIdentifier == .bubble
}
static let roomScreenUseOnlyLatestUserAvatarAndName: Bool = false
/// Allow split view detail view stacking
static let allowSplitViewDetailsScreenStacking: Bool = true
// MARK: - Room Contextual Menu
static let roomContextualMenuShowMoreOptionForMessages: Bool = true
static let roomContextualMenuShowMoreOptionForStates: Bool = true
static let roomContextualMenuShowReportContentOption: Bool = true
static let roomContextualMenuShowEncryptionOption: Bool = false
// MARK: - Room Info Screen
static let roomInfoScreenShowIntegrations: Bool = false
// MARK: - Room Settings Screen
static let roomSettingsScreenShowLowPriorityOption: Bool = false
static let roomSettingsScreenShowDirectChatOption: Bool = false
static let roomSettingsScreenAllowChangingAccessSettings: Bool = false
static let roomSettingsScreenAllowChangingHistorySettings: Bool = false
static let roomSettingsScreenShowAddressSettings: Bool = false
static let roomSettingsScreenShowAdvancedSettings: Bool = false
static let roomSettingsScreenShowAccessSettingsBW: Bool = true
static let roomSettingsScreenRemoveLeave: Bool = true
static let roomSettingsScreenAdvancedShowEncryptToVerifiedOption: Bool = true
static let roomSettingsScreenShowNotificationsV2: Bool = false
// MARK: - Room Member Screen
static let roomMemberScreenShowIgnore: Bool = true
// MARK: - Message
static let messageDetailsAllowShare: Bool = false
static let messageDetailsAllowPermalink: Bool = false
static let messageDetailsAllowViewSource: Bool = false
static let messageDetailsAllowSave: Bool = false
static let messageDetailsAllowCopyMedia: Bool = false
static let messageDetailsAllowPasteMedia: Bool = false
// MARK: - Notifications
static let decryptNotificationsByDefault: Bool = true
// MARK: - Authentication Screen
static let authScreenShowRegister = true
static let authScreenShowPhoneNumber = false
static let authScreenShowForgotPassword = false
static let authScreenShowCustomServerOptions = true
static let authScreenShowTestServerOptions = true
static let authScreenShowSocialLoginSection = false
// MARK: - Authentication Options
static let authEnableRefreshTokens = false
// MARK: - Cross-signing (bwi=true)
static let disableSelfUserVerification = true
// MARK: - Antivirus scan (bwi=true)
static let enableAntivirusScan = false
// MARK: - Room Screen
static let enableRoomSearchItem = false
// MARK: - Matomo Analytics (bwi=false)
static let enableMatomoAnalytics = true
// MARK: Verification screen (bwi=false)
static let showDetailedVerificationElements : Bool = false
static let showRecoverWithKey : Bool = false
// MARK: Unified search screen (bwi=false)
static let showUnifiedSearchViewMessagesTab : Bool = false
static let showUnifiedSearchViewFilesTab : Bool = false
// MARK: - Onboarding
static let onboardingShowAccountPersonalization = false
static let onboardingEnableNewAuthenticationFlow = false
// MARK: - Secrets Recovery
static let secretsRecoveryAllowReset = true
// MARK: VoIP support (bwi=false)
static let enableVoIPSupport : Bool = false
// MARK: - UISI Autoreporting
static let cryptoUISIAutoReportingEnabled = false
// MARK: - Polls
// MARK: Last message timestamp support (bwi=false)
static let enableLastMessageTimestamp : Bool = false
// MARK: Room chat alert screen (bwi=false)
static let enableViewEncryptionAction : Bool = false
// MARK: JavaScript support in WKWebView (bwi=false)
static let enableJSInWebView : Bool = false
// MARK: Secure pin code description (bwi=false)
static let settingsSettingsSecureShowPinCodeDescription : Bool = false
// MARK: Invite friends in Direct Chat (bwi=false)
static let directChatShowInviteFriends : Bool = false
// MARK: Last admin is not allowed to leave the room (bwi=true)
static let lastAdminIsNotAllowedToLeaveRoom : Bool = true
// MARK: Room Member Details Screen (bwi=true)
static let roomMemberDetailsHideLeaveButton : Bool = true
// MARK: Room create options (bwi=false)
static let enableShowInRoomDirectory : Bool = false
// MARK: sticker in composer (bwi=false)
static let enableRoomComposerSticker : Bool = false
// Mark: Unified Search (bwi=true)
static let unifiedSearchScreenShowPublicDirectory = true
// MARK: Allows removal of uploaded avatar photos (bwi=true)
static let enableRemoveAvatarImage = true
// MARK: Add a toggle button to the login screen to make the password visible
static let passwordIndicatorOnLogin : Bool = true
// MARK: Displays the element base version on the settings screen
static let elementBaseVersion : String = "1.9.8"
static let showElementBaseVersion : Bool = true
// MARK: Bypasses the normal forgot password process by presenting the user an information alert
// (requires authScreenShowForgotPassword set to true)
static let forgotPasswordInformationAlert : Bool = true
// MARK: Promote new feature within a banner below the navigation view
static let showTopBanner : Bool = false
static let showCustomServerDisplayName : Bool = true
static let customServerDisplayName : String = ""
// MARK BWI show/hide developer menu
static let bwiShowDeveloperSettings : Bool = true
// MARK BWI personal notes room
static let bwiPersonalNotesRoom : Bool = false
static let bwiPersonalNotesRoomLeavable : Bool = false
static let bwiResetPersonalNotesAccountData : Bool = false
static let bwiShowTimelineSettings : Bool = false
// MARK BWI personal state
static let bwiPersonalState : Bool = true
// MARK BWI personal notes room
static let bwiRollsAndRights : Bool = true
// MARK: Timeline
static let settingsScreenShowSimpleTimeLineOptions : Bool = false
static let settingsScreenShowTimeStampOption : Bool = true
static let settingsScreenShowDeletedMessagesOption : Bool = false
static let settingsScreenShowNameChangeOption : Bool = false
static let settingsScreenShowChatEffectsOption : Bool = false
static let settingsScreenShowRoomAvatarChangeOption : Bool = false
static let settingsScreenShowUserAvatarChangeOption : Bool = true
static let settingsScreenShowEnterRoomOption : Bool = true
static let bwiLastAdminCanDowngradeHimself : Bool = false
static let bwiEnableErrorTracking : Bool = true
static let bwiEnableRegisterInfo : Bool = false
static let bwiShowHappyBirthdayCampaign: Bool = false
static let bwiHappyBirthdayCampaignIdentifier: String = "one_year_anniversary"
static let bwiDisableSecuritySettingsUntrustedDevices: Bool = true
static let bwiShowMatomoInfoScreen = true
static let bwiShowMatomoSettings = true
static let bwiMatomoTrackingDefaultState = true
static let bwiShowNewFeatures = true
static let bwiSendMessageThreshold = 10.0
static let pollsEnabled = true
// MARK: - Location Sharing
/// Overwritten by the home server's .well-known configuration (if any exists)
static let defaultTileServerMapStyleURL = URL(string: "https://msgpriv.example.com/")!
static let locationSharingEnabled = true
// MARK: - MXKAppSettings
static let enableBotCreation: Bool = false
static let maxAllowedMediaCacheSize: Int = 1073741824
static let presenceColorForOfflineUser: Int = 15020851
static let presenceColorForOnlineUser: Int = 3401011
static let presenceColorForUnavailableUser: Int = 15066368
static let showAllEventsInRoomHistory: Bool = false
static let showLeftMembersInRoomMemberList: Bool = false
static let showRedactionsInRoomHistory: Bool = true
static let showUnsupportedEventsInRoomHistory: Bool = false
static let sortRoomMembersUsingLastSeenTime: Bool = true
static let syncLocalContacts: Bool = false
// MARK: - New App Layout
static let newAppLayoutEnabled = false
// MARK: - Device manager
static let deviceManagerEnabled = false
// MARK: - Message Bubbles bwi show in our menu and only for beta builds
static let bwiShowMessageBubbles = true
}

View File

@@ -0,0 +1,25 @@
//
/*
* Copyright (c) 2022 BWI GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import Foundation
extension BWIBuildSettings {
func overrideTargetSpecificSettings() {
}
}

View File

@@ -1,6 +1,5 @@
//
// Copyright 2020 Vector Creations Ltd
// Copyright (c) 2021 BWI GmbH
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -88,7 +87,8 @@ final class BuildSettings: NSObject {
}
// Element-Web instance for the app
static let applicationWebAppUrlString = ""
static let applicationWebAppUrlString = "https://app.element.io"
// MARK: - Localization
@@ -99,25 +99,42 @@ final class BuildSettings: NSObject {
// MARK: - Server configuration
// Default servers proposed on the authentication screen
static let serverConfigDefaultHomeserverUrlString = ""
static let serverConfigDefaultIdentityServerUrlString = ""
static let serverConfigDefaultHomeserverUrlString = "https://matrix.org"
static let serverConfigDefaultIdentityServerUrlString = "https://vector.im"
static let serverConfigPreSelections = ["":""]
static let serverConfigSygnalAPIUrlString = "https://matrix.org/_matrix/push/v1/notify"
static let serverConfigSygnalAPIUrlString = ""
// MARK: - Legal URLs
// Note: Set empty strings to hide the related entry in application settings
static let applicationCopyrightUrlString = "https://messenger.bwi.de/copyright"
static let applicationPrivacyPolicyUrlString = ""
static let applicationCopyrightUrlString = "https://element.io/copyright"
static let applicationPrivacyPolicyUrlString = "https://element.io/privacy"
static let applicationTermsConditionsUrlString = "https://element.io/terms-of-service"
static let applicationHelpUrlString = "https://element.io/help"
// MARk: - Matrix permalinks
// Paths for URLs that will considered as Matrix permalinks. Those permalinks are opened within the app
static let permalinkSupportedHosts: [String: [String]] = [:]
static let applicationHelpUrlString =
"https://element.io/help"
// MARK: - Permalinks
// Hosts/Paths for URLs that will considered as valid permalinks. Those permalinks are opened within the app.
static let permalinkSupportedHosts: [String: [String]] = [
"app.element.io": [],
"staging.element.io": [],
"develop.element.io": [],
"mobile.element.io": [""],
// Historical ones
"riot.im": ["/app", "/staging", "/develop"],
"www.riot.im": ["/app", "/staging", "/develop"],
"vector.im": ["/app", "/staging", "/develop"],
"www.vector.im": ["/app", "/staging", "/develop"],
// Official Matrix ones
"matrix.to": ["/"],
"www.matrix.to": ["/"],
// Client Permalinks (for use with `BuildSettings.clientPermalinkBaseUrl`)
// "example.com": ["/"],
// "www.example.com": ["/"],
]
// For use in clients that use a custom base url for permalinks rather than matrix.to.
// This baseURL is used to generate permalinks within the app (E.g. timeline message permalinks).
// Optional String that when set is used as permalink base, when nil matrix.to format is used.
@@ -127,37 +144,24 @@ final class BuildSettings: NSObject {
// MARK: - VoIP
static var allowVoIPUsage: Bool {
#if canImport(JitsiMeetSDK)
return false
return true
#else
return false
#endif
}
static let stunServerFallbackUrlString: String? = ""
static let stunServerFallbackUrlString: String? = "stun:turn.matrix.org"
// MARK: - Public rooms Directory
// List of homeservers for the public rooms directory
static let publicRoomsDirectoryServers = [
"matrix.org"
"matrix.org",
"gitter.im"
]
// MARK: - Rooms Screen
static let roomsAllowToJoinPublicRooms: Bool = true
// MARK: - Analytics
// $$$
static let analyticsServerUrl = URL(string: "")
static let analyticsAppId = "0"
/// BWI: set host and key to nil to disable PostHog tracking
static let analyticsHost: String? = nil
static let analyticsKey: String? = nil
static let analyticsTermsURL = URL(string: "https://element.io/cookie-policy")!
static let bwiPresentAnalyticsPrompt = false
static let bwiAnalyticsServerUrlString = ""
static let bwiAnalyticsAppId = "1"
/// A type that represents how to set up the analytics module in the app.
///
@@ -174,45 +178,67 @@ final class BuildSettings: NSObject {
let termsURL: URL
}
#if DEBUG
/// The configuration to use for analytics during development. Set `isEnabled` to false to disable analytics in debug builds.
static let analyticsConfiguration = AnalyticsConfiguration(isEnabled: false,
host: "",
apiKey: "",
static let analyticsConfiguration = AnalyticsConfiguration(isEnabled: BuildSettings.baseBundleIdentifier.starts(with: "im.vector.app"),
host: "https://posthog.element.dev",
apiKey: "phc_VtA1L35nw3aeAtHIx1ayrGdzGkss7k1xINeXcoIQzXN",
termsURL: URL(string: "https://element.io/cookie-policy")!)
#else
/// The configuration to use for analytics. Set `isEnabled` to false to disable analytics.
static let analyticsConfiguration = AnalyticsConfiguration(isEnabled: BuildSettings.baseBundleIdentifier.starts(with: "im.vector.app"),
host: "https://posthog.hss.element.io",
apiKey: "phc_Jzsm6DTm6V2705zeU5dcNvQDlonOR68XvX2sh1sEOHO",
termsURL: URL(string: "https://element.io/cookie-policy")!)
#endif
// MARK: - Bug report
static let bugReportEndpointUrlString = ""
static let bugReportEndpointUrlString = "https://riot.im/bugreports"
// Use the name allocated by the bug report server
static let bugReportApplicationId = "riot-ios"
static let bugReportUISIId = "element-auto-uisi"
// MARK: - Integrations
static let integrationsUiUrlString = "https://scalar.vector.im/"
static let integrationsRestApiUrlString = "https://scalar.vector.im/api"
// Widgets in those paths require a scalar token
static let integrationsScalarWidgetsPaths = [""]
// Jitsi server used outside integrations to create conference calls from the call button in the timeline
static let jitsiServerUrl: URL = URL(string: "https://enter.jitsi.url")!
static let integrationsScalarWidgetsPaths = [
"https://scalar.vector.im/_matrix/integrations/v1",
"https://scalar.vector.im/api",
"https://scalar-staging.vector.im/_matrix/integrations/v1",
"https://scalar-staging.vector.im/api",
"https://scalar-staging.riot.im/scalar/api",
]
// Jitsi server used outside integrations to create conference calls from the call button in the timeline.
// Setting this to nil effectively disables Jitsi conference calls (given that there is no wellknown override).
// Note: this will not remove the conference call button, use roomScreenAllowVoIPForNonDirectRoom setting.
static let jitsiServerUrl: URL? = URL(string: "https://jitsi.riot.im")
// MARK: - Features
/// Setting to force protection by pin code
static let forcePinProtection: Bool = true
static let forcePinProtection: Bool = false
/// Max allowed time to continue using the app without prompting PIN
static let pinCodeGraceTimeInSeconds: TimeInterval = 180
static let pinCodeGraceTimeInSeconds: TimeInterval = 0
/// Force non-jailbroken app usage
static let forceNonJailbrokenUsage: Bool = true
static let allowSendingStickers: Bool = false
static let allowSendingStickers: Bool = true
static let allowLocalContactsAccess: Bool = false
static let allowInviteExernalUsers: Bool = false
static let allowLocalContactsAccess: Bool = true
static let allowInviteExernalUsers: Bool = true
static let allowBackgroundAudioMessagePlayback: Bool = true
// MARK: - Side Menu
static let enableSideMenu: Bool = false
static let sideMenuShowInviteFriends: Bool = false
static let sideMenuShowInviteFriends: Bool = true
/// Whether to read the `io.element.functional_members` state event and exclude any service members when computing a room's name and avatar.
static let supportFunctionalMembers: Bool = true
@@ -220,32 +246,7 @@ final class BuildSettings: NSObject {
// MARK: - Feature Specifics
/// Not allowed pin codes. User won't be able to select one of the pin in the list.
static let notAllowedPINs: [String] = [
"1234",
"1111",
"0000",
"1212",
"7777",
"1004",
"2000",
"4444",
"2222",
"6969",
"9999",
"3333",
"5555",
"6666",
"1122",
"1313",
"8888",
"4321",
"2001",
"1010",
"2580",
"4711",
"0815",
"0852"
]
static let notAllowedPINs: [String] = []
/// Maximum number of allowed pin failures when unlocking, before force logging out the user. Defaults to `3`
static let maxAllowedNumberOfPinFailures: Int = 3
@@ -253,26 +254,16 @@ final class BuildSettings: NSObject {
/// Maximum number of allowed biometrics failures when unlocking, before fallbacking the user to the pin if set or logging out the user. Defaults to `5`
static let maxAllowedNumberOfBiometricsFailures: Int = 5
static let allowLocalContactPresence: Bool = false
/// Indicates should the app log out the user when number of PIN failures reaches `maxAllowedNumberOfPinFailures`. Defaults to `false`
static let logOutUserWhenPINFailuresExceeded: Bool = true
static let logOutUserWhenPINFailuresExceeded: Bool = false
/// Indicates should the app log out the user when number of biometrics failures reaches `maxAllowedNumberOfBiometricsFailures`. Defaults to `false`
static let logOutUserWhenBiometricsFailuresExceeded: Bool = true
static let logOutUserWhenBiometricsFailuresExceeded: Bool = false
/// If force is enabled the dialog for asking if reseting the key backup is not shown.. already asked before in mandatory verfication
static let forceResetBackupIfLost: Bool = true
/// if skip is enabled the key backup dialogs are passed through
static let skipKeyBackupStep: Bool = true
static let showNotificationsV2: Bool = true
// MARK: - Main Tabs
static let homeScreenShowHomeTab: Bool = false
static let homeScreenShowFavouritesTab: Bool = true
static let homeScreenShowPeopleTab: Bool = true
static let homeScreenShowRoomsTab: Bool = true
@@ -281,54 +272,34 @@ final class BuildSettings: NSObject {
static let settingsScreenShowUserFirstName: Bool = false
static let settingsScreenShowUserSurname: Bool = false
static let settingsScreenAllowAddingLinkedEmails: Bool = false
static let settingsScreenAllowAddingPhoneNumbers: Bool = false
static let settingsScreenAllowAddingEmailThreepids: Bool = false
static let settingsScreenAllowAddingPhoneThreepids: Bool = false
static let settingsScreenShowThreepidExplanatory: Bool = false
static let settingsScreenShowDiscoverySettings: Bool = false
static let settingsScreenAllowIdentityServerConfig: Bool = false
static let settingsScreenShowConfirmMediaSize: Bool = false
static let settingsScreenShowAdvancedSettings: Bool = false
static let settingsScreenShowLabSettings: Bool = false
static let settingsScreenAllowChangingRageshakeSettings: Bool = false
static let settingsScreenAllowChangingCrashUsageDataSettings: Bool = false
static let settingsScreenAllowBugReportingManually: Bool = false
static let settingsScreenAllowDeactivatingAccount: Bool = false
static let settingsScreenEnableDecodedContentAndGlobalSettings: Bool = false
static let settingsScreenAllowAddingEmailThreepids: Bool = true
static let settingsScreenAllowAddingPhoneThreepids: Bool = true
static let settingsScreenShowThreepidExplanatory: Bool = true
static let settingsScreenShowDiscoverySettings: Bool = true
static let settingsScreenAllowIdentityServerConfig: Bool = true
static let settingsScreenShowConfirmMediaSize: Bool = true
static let settingsScreenShowAdvancedSettings: Bool = true
static let settingsScreenShowLabSettings: Bool = true
static let settingsScreenAllowChangingRageshakeSettings: Bool = true
static let settingsScreenAllowChangingCrashUsageDataSettings: Bool = true
static let settingsScreenAllowBugReportingManually: Bool = true
static let settingsScreenAllowDeactivatingAccount: Bool = true
static let settingsScreenShowChangePassword:Bool = true
static let settingsScreenShowLinkPreviews:Bool = false
static let settingsScreenShowInviteFriends:Bool = false
static let settingsScreenShowSettings:Bool = true
static let settingsScreenShowFeedback:Bool = false
static let settingsScreenShowHelp:Bool = false
static let settingsScreenShowEnableStunServerFallback: Bool = true
static let settingsScreenShowNotificationDecodedContentOption: Bool = false
static let settingsScreenShowSystemSettingsOption: Bool = false
static let settingsScreenShowNsfwRoomsOption: Bool = false
static let settingsScreenShowTACSetting: Bool = false
static let settingsScreenShowSupportSetting: Bool = true
static let settingsScreenShowNotificationDecodedContentOption: Bool = true
static let settingsScreenShowNsfwRoomsOption: Bool = true
static let settingsSecurityScreenShowSessions:Bool = true
static let settingsSecurityScreenShowSetupBackup:Bool = true
static let settingsSecurityScreenShowRestoreBackup:Bool = true
static let settingsSecurityScreenShowDeleteBackup:Bool = true
static let settingsSecurityScreenShowCryptographyInfo:Bool = true
static let settingsSecurityScreenShowCryptographyExport:Bool = true
static let settingsSecurityScreenShowAdvancedUnverifiedDevices:Bool = true
/// A setting to enable the presence configuration settings section.
static let settingsScreenPresenceAllowConfiguration: Bool = false
static let settingsSecurityScreenShowCryptographyInfo:Bool = false
static let settingsSecurityScreenShowCryptographyExport:Bool = false
static let settingsSecurityScreenShowAdvancedUnverifiedDevices:Bool = false
// MARK: - Notification Settings
static let settingsNotificationsBWIDefaultSet:Bool = true
static let settingsNotificationsShowDefault:Bool = true
static let settingsNotificationsShowMentions:Bool = false
static let settingsNotificationsShowAdvanced:Bool = false
// MARK: - Timeline settings
static let roomInputToolbarCompressionMode: MediaCompressionMode = .none
static let roomInputToolbarCompressionMode: MediaCompressionMode = .prompt
enum MediaCompressionMode {
case prompt, small, medium, large, none
@@ -336,7 +307,7 @@ final class BuildSettings: NSObject {
// MARK: - Room Creation Screen
static let roomCreationScreenAllowEncryptionConfiguration: Bool = false
static let roomCreationScreenAllowEncryptionConfiguration: Bool = true
static let roomCreationScreenRoomIsEncrypted: Bool = true
static let roomCreationScreenAllowRoomTypeConfiguration: Bool = true
static let roomCreationScreenRoomIsPublic: Bool = false
@@ -347,7 +318,7 @@ final class BuildSettings: NSObject {
static let roomScreenAllowVoIPForNonDirectRoom: Bool = true
static let roomScreenAllowCameraAction: Bool = true
static let roomScreenAllowMediaLibraryAction: Bool = true
static let roomScreenAllowStickerAction: Bool = false
static let roomScreenAllowStickerAction: Bool = true
static let roomScreenAllowFilesAction: Bool = true
// Timeline style
@@ -366,186 +337,79 @@ final class BuildSettings: NSObject {
static let roomContextualMenuShowMoreOptionForMessages: Bool = true
static let roomContextualMenuShowMoreOptionForStates: Bool = true
static let roomContextualMenuShowReportContentOption: Bool = true
static let roomContextualMenuShowEncryptionOption: Bool = false
// MARK: - Room Info Screen
static let roomInfoScreenShowIntegrations: Bool = false
static let roomInfoScreenShowIntegrations: Bool = true
// MARK: - Room Settings Screen
static let roomSettingsScreenShowLowPriorityOption: Bool = false
static let roomSettingsScreenShowDirectChatOption: Bool = false
static let roomSettingsScreenAllowChangingAccessSettings: Bool = false
static let roomSettingsScreenAllowChangingHistorySettings: Bool = false
static let roomSettingsScreenShowAddressSettings: Bool = false
static let roomSettingsScreenShowAdvancedSettings: Bool = false
static let roomSettingsScreenShowAccessSettingsBW: Bool = true
static let roomSettingsScreenRemoveLeave: Bool = true
static let roomSettingsScreenShowLowPriorityOption: Bool = true
static let roomSettingsScreenShowDirectChatOption: Bool = true
static let roomSettingsScreenAllowChangingAccessSettings: Bool = true
static let roomSettingsScreenAllowChangingHistorySettings: Bool = true
static let roomSettingsScreenShowAddressSettings: Bool = true
static let roomSettingsScreenShowAdvancedSettings: Bool = true
static let roomSettingsScreenAdvancedShowEncryptToVerifiedOption: Bool = true
static let roomSettingsScreenShowNotificationsV2: Bool = false
// MARK: - Room Member Screen
static let roomMemberScreenShowIgnore: Bool = true
// MARK: - Message
static let messageDetailsAllowShare: Bool = false
static let messageDetailsAllowPermalink: Bool = false
static let messageDetailsAllowViewSource: Bool = false
static let messageDetailsAllowSave: Bool = false
static let messageDetailsAllowCopyMedia: Bool = false
static let messageDetailsAllowPasteMedia: Bool = false
static let messageDetailsAllowShare: Bool = true
static let messageDetailsAllowPermalink: Bool = true
static let messageDetailsAllowViewSource: Bool = true
static let messageDetailsAllowSave: Bool = true
static let messageDetailsAllowCopyMedia: Bool = true
static let messageDetailsAllowPasteMedia: Bool = true
// MARK: - Notifications
static let decryptNotificationsByDefault: Bool = true
// MARK: - HTTP
/// Additional HTTP headers will be sent by all requests. Not recommended to use request-specific headers, like `Authorization`.
/// Empty dictionary by default.
static let httpAdditionalHeaders: [String: String] = [:]
// MARK: - Authentication Screen
static let authScreenShowRegister = false
static let authScreenShowPhoneNumber = false
static let authScreenShowForgotPassword = false
static let authScreenShowRegister = true
static let authScreenShowPhoneNumber = true
static let authScreenShowForgotPassword = true
static let authScreenShowCustomServerOptions = true
static let authScreenShowTestServerOptions = true
static let authScreenShowSocialLoginSection = false
static let authScreenShowSocialLoginSection = true
// MARK: - Authentication Options
static let authEnableRefreshTokens = false
// MARK: - Cross-signing (bwi=true)
static let disableSelfUserVerification = true
// MARK: - Antivirus scan (bwi=true)
static let enableAntivirusScan = false
// MARK: - Room Screen
static let enableRoomSearchItem = false
// MARK: - Matomo Analytics (bwi=false)
static let enableMatomoAnalytics = false
// MARK: Verification screen (bwi=false)
static let showDetailedVerificationElements : Bool = false
static let showRecoverWithKey : Bool = false
// MARK: Unified search screen (bwi=false)
static let showUnifiedSearchViewMessagesTab : Bool = false
static let showUnifiedSearchViewFilesTab : Bool = false
// MARK: - Onboarding
static let onboardingShowAccountPersonalization = false
static let onboardingEnableNewAuthenticationFlow = false
static let onboardingShowAccountPersonalization = true
static let onboardingEnableNewAuthenticationFlow = true
// MARK: - Unified Search
static let unifiedSearchScreenShowPublicDirectory = true
// MARK: - Secrets Recovery
static let secretsRecoveryAllowReset = true
// MARK: VoIP support (bwi=false)
static let enableVoIPSupport : Bool = false
// MARK: - UISI Autoreporting
static let cryptoUISIAutoReportingEnabled = false
// MARK: - Polls
// MARK: Last message timestamp support (bwi=false)
static let enableLastMessageTimestamp : Bool = false
// MARK: Room chat alert screen (bwi=false)
static let enableViewEncryptionAction : Bool = false
// MARK: JavaScript support in WKWebView (bwi=false)
static let enableJSInWebView : Bool = false
// MARK: Secure pin code description (bwi=false)
static let settingsSettingsSecureShowPinCodeDescription : Bool = false
// MARK: Invite friends in Direct Chat (bwi=false)
static let directChatShowInviteFriends : Bool = false
// MARK: Last admin is not allowed to leave the room (bwi=true)
static let lastAdminIsNotAllowedToLeaveRoom : Bool = true
// MARK: Room Member Details Screen (bwi=true)
static let roomMemberDetailsHideLeaveButton : Bool = true
// MARK: Room create options (bwi=false)
static let enableShowInRoomDirectory : Bool = false
// MARK: sticker in composer (bwi=false)
static let enableRoomComposerSticker : Bool = false
// Mark: Unified Search (bwi=true)
static let unifiedSearchScreenShowPublicDirectory = true
// MARK: Allows removal of uploaded avatar photos (bwi=true)
static let enableRemoveAvatarImage = true
// MARK: Add a toggle button to the login screen to make the password visible
static let passwordIndicatorOnLogin : Bool = true
// MARK: Displays the element base version on the settings screen
static let elementBaseVersion : String = "1.9.8"
static let showElementBaseVersion : Bool = true
// MARK: Bypasses the normal forgot password process by presenting the user an information alert
// (requires authScreenShowForgotPassword set to true)
static let forgotPasswordInformationAlert : Bool = true
// MARK: Promote new feature within a banner below the navigation view
static let showTopBanner : Bool = true
static let showCustomServerDisplayName : Bool = true
static let customServerDisplayName : String = ""
// MARK BWI show/hide developer menu
static let bwiShowDeveloperSettings : Bool = false
// MARK BWI personal notes room
static let bwiPersonalNotesRoom : Bool = false
static let bwiPersonalNotesRoomLeavable : Bool = false
static let bwiResetPersonalNotesAccountData : Bool = false
static let bwiShowTimelineSettings : Bool = false
// MARK BWI personal state
static let bwiPersonalState : Bool = false
// MARK BWI personal notes room
static let bwiRollsAndRights : Bool = true
// MARK: Timeline
static let settingsScreenShowSimpleTimeLineOptions : Bool = false
static let settingsScreenShowTimeStampOption : Bool = true
static let settingsScreenShowDeletedMessagesOption : Bool = false
static let settingsScreenShowNameChangeOption : Bool = false
static let settingsScreenShowChatEffectsOption : Bool = false
static let settingsScreenShowRoomAvatarChangeOption : Bool = false
static let settingsScreenShowUserAvatarChangeOption : Bool = true
static let settingsScreenShowEnterRoomOption : Bool = true
static let bwiLastAdminCanDowngradeHimself : Bool = false
static let bwiEnableErrorTracking : Bool = false
static let bwiEnableRegisterInfo : Bool = false
static let bwiShowHappyBirthdayCampaign: Bool = false
static let bwiHappyBirthdayCampaignIdentifier: String = "one_year_anniversary"
static let bwiDisableSecuritySettingsUntrustedDevices: Bool = true
static let bwiShowMatomoInfoScreen = false
static let bwiShowMatomoSettings = false
static let bwiMatomoTrackingDefaultState = false
static let bwiShowNewFeatures = true
static let bwiSendMessageThreshold = 10.0
static let pollsEnabled = true
// MARK: - Location Sharing
/// Overwritten by the home server's .well-known configuration (if any exists)
static let defaultTileServerMapStyleURL = URL(string: "https://msgpriv.example.com/")!
static let defaultTileServerMapStyleURL = URL(string: "https://api.maptiler.com/maps/streets/style.json?")!
static let locationSharingEnabled = true
// MARK: - Voice Broadcast
static let voiceBroadcastChunkLength: Int = 120
static let voiceBroadcastMaxLength: UInt64 = 144000
// MARK: - MXKAppSettings
static let enableBotCreation: Bool = false
@@ -562,11 +426,15 @@ final class BuildSettings: NSObject {
// MARK: - New App Layout
static let newAppLayoutEnabled = false
// MARK: - Device manager
// MARK: - QR Login
static let deviceManagerEnabled = false
/// Flag indicating whether the QR login enabled from login screen
static let qrLoginEnabledFromNotAuthenticated = true
/// Flag indicating whether the QR login enabled from Device Manager screen
static let qrLoginEnabledFromAuthenticated = false
/// Flag indicating whether displaying QRs enabled for the QR login screens
static let qrLoginEnableDisplayingQRs = false
// MARK: - Message Bubbles bwi show in our menu and only for beta builds
static let bwiShowMessageBubbles = false
static let rendezvousServerBaseURL = URL(string: "https://rendezvous.lab.element.dev/")!
}

View File

@@ -1,70 +0,0 @@
/*
* Copyright (c) 2021 BWI GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import Foundation
import MatrixSDK
import KeychainAccess
@objcMembers
final class BwiSettings : NSObject {
static let shared = BwiSettings()
private enum UserDefaultsKeys {
static let additionalBwiHeaderKey = "bwiHeader"
}
private struct BwiSettingsConstants {
static let bwiSettingsKeychainService: String = BuildSettings.baseBundleIdentifier + ".bwi-settings-service"
}
private let vault: KeyValueVault
override init() {
vault = KeychainVault(Keychain(service: BwiSettingsConstants.bwiSettingsKeychainService,
accessGroup: BuildSettings.keychainAccessGroup))
super.init()
}
func reset() {
additionalBwiHeader = UserAgentService().bwiUserAgentDict
let sdkOptions = MXSDKOptions.sharedInstance()
sdkOptions.httpAdditionalHeaders = UserAgentService().bwiUserAgentDict
}
// MARK: Servers
var additionalBwiHeader: Dictionary<String, String> {
get {
do {
guard let data = try vault.data(forKey: UserDefaultsKeys.additionalBwiHeaderKey) else {
return UserAgentService().bwiUserAgentDict
}
var dict = try JSONDecoder().decode(Dictionary<String,String>.self, from: data)
dict["User-Agent"] = UserAgentService().bwiUserAgent
return dict
} catch {
return UserAgentService().bwiUserAgentDict
}
} set {
do {
let data = try JSONEncoder().encode(newValue)
try vault.set(data, forKey: UserDefaultsKeys.additionalBwiHeaderKey)
} catch let error {
NSLog("[PinCodePreferences] Error when storing addional header to the vault: \(error)")
}
}
}
}

View File

@@ -46,15 +46,15 @@ class CommonConfiguration: NSObject, Configurable {
// Customize the default notification content
settings.notificationBodyLocalizationKey = "Notification"
settings.messageDetailsAllowSharing = BuildSettings.messageDetailsAllowShare
settings.messageDetailsAllowSaving = BuildSettings.messageDetailsAllowSave
settings.messageDetailsAllowCopyingMedia = BuildSettings.messageDetailsAllowCopyMedia
settings.messageDetailsAllowPastingMedia = BuildSettings.messageDetailsAllowPasteMedia
settings.messageDetailsAllowSharing = BWIBuildSettings.shared.messageDetailsAllowShare
settings.messageDetailsAllowSaving = BWIBuildSettings.shared.messageDetailsAllowSave
settings.messageDetailsAllowCopyingMedia = BWIBuildSettings.shared.messageDetailsAllowCopyMedia
settings.messageDetailsAllowPastingMedia = BWIBuildSettings.shared.messageDetailsAllowPasteMedia
// Enable link detection if url preview are enabled
settings.enableBubbleComponentLinkDetection = true
MXKContactManager.shared().allowLocalContactsAccess = BuildSettings.allowLocalContactsAccess
MXKContactManager.shared().allowLocalContactsAccess = BWIBuildSettings.shared.allowLocalContactsAccess
}
private func setupMatrixSDKSettings() {
@@ -162,7 +162,7 @@ class CommonConfiguration: NSObject, Configurable {
// Let's call invite be valid for 1 minute
callManager.inviteLifetime = 60000
if RiotSettings.shared.allowStunServerFallback, let stunServerFallback = BuildSettings.stunServerFallbackUrlString {
if RiotSettings.shared.allowStunServerFallback, let stunServerFallback = BWIBuildSettings.shared.stunServerFallbackUrlString {
callManager.fallbackSTUNServer = stunServerFallback
}
}
@@ -172,7 +172,7 @@ class CommonConfiguration: NSObject, Configurable {
func setupSettingsWhenLoaded(for matrixSession: MXSession) {
// Do not warn for unknown devices. We have cross-signing now
matrixSession.crypto.warnOnUnknowDevices = false
(matrixSession.crypto as? MXLegacyCrypto)?.warnOnUnknowDevices = false
}
}

25
Podfile
View File

@@ -16,7 +16,7 @@ use_frameworks!
# - `{ :specHash => {sdk spec hash}` to depend on specific pod options (:git => …, :podspec => …) for MatrixSDK repo. Used by Fastfile during CI
#
# Warning: our internal tooling depends on the name of this variable name, so be sure not to change it
$matrixSDKVersion = '= 0.24.0'
$matrixSDKVersion = '= 0.24.2'
# $matrixSDKVersion = :local
# $matrixSDKVersion = { :branch => 'develop'}
# $matrixSDKVersion = { :specHash => { git: 'https://git.io/fork123', branch: 'fix' } }
@@ -43,7 +43,7 @@ when String # specific MatrixSDK released version
$matrixSDKVersionSpec = $matrixSDKVersion
end
$matrixSDKVersionSpec = { :git => 'https://gitlab.opencode.de/bwi/bundesmessenger/clients/bundesmessenger-ios-matrix-sdk', :tag => 'v0.24.0_bwi_dev' }
$matrixSDKVersionSpec = { :git => 'https://gitlab.opencode.de/bwi/bundesmessenger/clients/bundesmessenger-ios-matrix-sdk', :tag => 'v0.24.2_bwi_beta' }
# Method to import the MatrixSDK
def import_MatrixSDK
@@ -63,6 +63,7 @@ end
def import_SwiftUI_pods
pod 'Introspect', '~> 0.1'
pod 'DSBottomSheet', '~> 0.3'
pod 'ZXingObjC', '~> 3.6.5'
end
abstract_target 'RiotPods' do
@@ -85,8 +86,9 @@ abstract_target 'RiotPods' do
pod 'zxcvbn-ios'
# Tools
pod 'SwiftGen', '~> 6.3'
pod 'SwiftLint', '~> 0.44.0'
pod 'SwiftGen'
pod 'SwiftLint'
pod 'SwiftFormat/CLI'
target "Riot" do
import_MatrixSDK
@@ -97,7 +99,6 @@ abstract_target 'RiotPods' do
pod 'UICollectionViewRightAlignedLayout', '~> 0.0.3'
pod 'UICollectionViewLeftAlignedLayout', '~> 1.0.2'
pod 'KTCenterFlowLayout', '~> 1.3.1'
pod 'ZXingObjC', '~> 3.6.5'
pod 'FlowCommoniOS', '~> 1.12.0'
pod 'DTTJailbreakDetection', '~> 0.4.0'
pod 'ReadMoreTextView', '~> 3.0.1'
@@ -105,7 +106,6 @@ abstract_target 'RiotPods' do
pod 'SwiftJWT', '~> 3.6.200'
pod 'SideMenu', '~> 6.5'
pod 'DSWaveformImage', '~> 6.1.1'
pod 'ffmpeg-kit-ios-audio', '4.5.1'
pod 'FLEX', '~> 4.5.0', :configurations => ['Debug'], :inhibit_warnings => true
@@ -127,7 +127,6 @@ abstract_target 'RiotPods' do
pod 'UICollectionViewLeftAlignedLayout', '~> 1.0.2'
pod 'UICollectionViewRightAlignedLayout', '~> 0.0.3'
pod 'KTCenterFlowLayout', '~> 1.3.1'
pod 'ZXingObjC', '~> 3.6.5'
pod 'FlowCommoniOS', '~> 1.12.0'
pod 'DTTJailbreakDetection', '~> 0.4.0'
pod 'ReadMoreTextView', '~> 3.0.1'
@@ -135,7 +134,6 @@ abstract_target 'RiotPods' do
pod 'SwiftJWT', '~> 3.6.200'
pod 'SideMenu', '~> 6.5'
pod 'DSWaveformImage', '~> 6.1.1'
pod 'ffmpeg-kit-ios-audio', '4.5.1'
pod 'FLEX', '~> 4.5.0', :configurations => ['Debug']
end
@@ -149,7 +147,6 @@ abstract_target 'RiotPods' do
pod 'UICollectionViewLeftAlignedLayout', '~> 1.0.2'
pod 'UICollectionViewRightAlignedLayout', '~> 0.0.3'
pod 'KTCenterFlowLayout', '~> 1.3.1'
pod 'ZXingObjC', '~> 3.6.5'
pod 'FlowCommoniOS', '~> 1.12.0'
pod 'DTTJailbreakDetection', '~> 0.4.0'
pod 'ReadMoreTextView', '~> 3.0.1'
@@ -157,7 +154,6 @@ abstract_target 'RiotPods' do
pod 'SwiftJWT', '~> 3.6.200'
pod 'SideMenu', '~> 6.5'
pod 'DSWaveformImage', '~> 6.1.1'
pod 'ffmpeg-kit-ios-audio', '4.5.1'
pod 'FLEX', '~> 4.5.0', :configurations => ['Debug']
end
@@ -198,6 +194,15 @@ post_install do |installer|
config.build_settings['WARNING_CFLAGS'] ||= ['$(inherited)','-Wno-nullability-completeness']
config.build_settings['OTHER_SWIFT_FLAGS'] ||= ['$(inherited)', '-Xcc', '-Wno-nullability-completeness']
end
# Fix Xcode 14 resource bundle signing issues
# https://github.com/CocoaPods/CocoaPods/issues/11402#issuecomment-1259231655
if target.respond_to?(:product_type) and target.product_type == "com.apple.product-type.bundle"
target.build_configurations.each do |config|
config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO'
end
end
end
Dir.glob("#{installer.sandbox.target_support_files_root}/**/*.pch") do |item|

View File

@@ -39,7 +39,6 @@ PODS:
- DTFoundation/UIKit (1.7.18):
- DTFoundation/Core
- DTTJailbreakDetection (0.4.0)
- ffmpeg-kit-ios-audio (4.5.1)
- FLEX (4.5.0)
- FlowCommoniOS (1.12.2)
- GBDeviceInfo (6.6.0):
@@ -60,9 +59,9 @@ PODS:
- MatomoTracker (7.4.1):
- MatomoTracker/Core (= 7.4.1)
- MatomoTracker/Core (7.4.1)
- MatrixSDK (0.24.0):
- MatrixSDK/Core (= 0.24.0)
- MatrixSDK/Core (0.24.0):
- MatrixSDK (0.24.2):
- MatrixSDK/Core (= 0.24.2)
- MatrixSDK/Core (0.24.2):
- AFNetworking (~> 4.0.0)
- GZIP (~> 1.3.0)
- libbase58 (~> 0.1.4)
@@ -70,12 +69,12 @@ PODS:
- OLMKit (~> 3.2.5)
- Realm (= 10.27.0)
- SwiftyBeaver (= 1.9.5)
- MatrixSDK/CryptoSDK (0.24.0):
- MatrixSDKCrypto (= 0.1.0)
- MatrixSDK/JingleCallStack (0.24.0):
- MatrixSDK/CryptoSDK (0.24.2):
- MatrixSDKCrypto (= 0.1.5)
- MatrixSDK/JingleCallStack (0.24.2):
- JitsiMeetSDK (= 5.0.2)
- MatrixSDK/Core
- MatrixSDKCrypto (0.1.0)
- MatrixSDKCrypto (0.1.5)
- OLMKit (3.2.12):
- OLMKit/olmc (= 3.2.12)
- OLMKit/olmcpp (= 3.2.12)
@@ -96,6 +95,7 @@ PODS:
- Sentry/Core (7.15.0)
- SideMenu (6.5.0)
- SwiftBase32 (0.9.0)
- SwiftFormat/CLI (0.50.2)
- SwiftGen (6.6.2)
- SwiftJWT (3.6.200):
- BlueCryptor (~> 1.0)
@@ -103,7 +103,7 @@ PODS:
- BlueRSA (~> 1.0)
- KituraContracts (~> 1.2)
- LoggerAPI (~> 1.7)
- SwiftLint (0.44.0)
- SwiftLint (0.49.1)
- SwiftyBeaver (1.9.5)
- UICollectionViewLeftAlignedLayout (1.0.2)
- UICollectionViewRightAlignedLayout (0.0.3)
@@ -120,7 +120,6 @@ DEPENDENCIES:
- DSWaveformImage (~> 6.1.1)
- DTCoreText (~> 1.6.25)
- DTTJailbreakDetection (~> 0.4.0)
- ffmpeg-kit-ios-audio (= 4.5.1)
- FLEX (~> 4.5.0)
- FlowCommoniOS (~> 1.12.0)
- GBDeviceInfo (~> 6.6.0)
@@ -129,8 +128,8 @@ DEPENDENCIES:
- KTCenterFlowLayout (~> 1.3.1)
- libPhoneNumber-iOS (~> 0.9.13)
- MatomoTracker (~> 7.4.1)
- MatrixSDK (from `https://gitlab.opencode.de/bwi/bundesmessenger/clients/bundesmessenger-ios-matrix-sdk`, tag `v0.24.0_bwi_dev`)
- MatrixSDK/JingleCallStack (from `https://gitlab.opencode.de/bwi/bundesmessenger/clients/bundesmessenger-ios-matrix-sdk`, tag `v0.24.0_bwi_dev`)
- MatrixSDK (from `https://gitlab.opencode.de/bwi/bundesmessenger/clients/bundesmessenger-ios-matrix-sdk`, tag `v0.24.2_bwi_beta`)
- MatrixSDK/JingleCallStack (from `https://gitlab.opencode.de/bwi/bundesmessenger/clients/bundesmessenger-ios-matrix-sdk`, tag `v0.24.2_bwi_beta`)
- OLMKit
- PostHog (~> 1.4.4)
- ReadMoreTextView (~> 3.0.1)
@@ -138,9 +137,10 @@ DEPENDENCIES:
- Sentry (~> 7.15.0)
- SideMenu (~> 6.5)
- SwiftBase32 (~> 0.9.0)
- SwiftGen (~> 6.3)
- SwiftFormat/CLI
- SwiftGen
- SwiftJWT (~> 3.6.200)
- SwiftLint (~> 0.44.0)
- SwiftLint
- UICollectionViewLeftAlignedLayout (~> 1.0.2)
- UICollectionViewRightAlignedLayout (~> 0.0.3)
- WeakDictionary (~> 2.0)
@@ -159,7 +159,6 @@ SPEC REPOS:
- DTCoreText
- DTFoundation
- DTTJailbreakDetection
- ffmpeg-kit-ios-audio
- FLEX
- FlowCommoniOS
- GBDeviceInfo
@@ -183,6 +182,7 @@ SPEC REPOS:
- Sentry
- SideMenu
- SwiftBase32
- SwiftFormat
- SwiftGen
- SwiftJWT
- SwiftLint
@@ -199,7 +199,7 @@ EXTERNAL SOURCES:
:git: https://github.com/matrix-org/matrix-analytics-events.git
MatrixSDK:
:git: https://gitlab.opencode.de/bwi/bundesmessenger/clients/bundesmessenger-ios-matrix-sdk
:tag: v0.24.0_bwi_dev
:tag: v0.24.2_bwi_beta
CHECKOUT OPTIONS:
AnalyticsEvents:
@@ -207,7 +207,7 @@ CHECKOUT OPTIONS:
:git: https://github.com/matrix-org/matrix-analytics-events.git
MatrixSDK:
:git: https://gitlab.opencode.de/bwi/bundesmessenger/clients/bundesmessenger-ios-matrix-sdk
:tag: v0.24.0_bwi_dev
:tag: v0.24.2_bwi_beta
SPEC CHECKSUMS:
AFNetworking: 7864c38297c79aaca1500c33288e429c3451fdce
@@ -221,7 +221,6 @@ SPEC CHECKSUMS:
DTCoreText: ec749e013f2e1f76de5e7c7634642e600a7467ce
DTFoundation: a53f8cda2489208cbc71c648be177f902ee17536
DTTJailbreakDetection: 5e356c5badc17995f65a83ed9483f787a0057b71
ffmpeg-kit-ios-audio: 662ce2064e56733ca7d8216705efbc38d9e1c3fe
FLEX: e51461dd6f0bfb00643c262acdfea5d5d12c596b
FlowCommoniOS: ca92071ab526dc89905495a37844fd7e78d1a7f2
GBDeviceInfo: ed0db16230d2fa280e1cbb39a5a7f60f6946aaec
@@ -236,8 +235,8 @@ SPEC CHECKSUMS:
LoggerAPI: ad9c4a6f1e32f518fdb43a1347ac14d765ab5e3d
Logging: beeb016c9c80cf77042d62e83495816847ef108b
MatomoTracker: 24a846c9d3aa76933183fe9d47fd62c9efa863fb
MatrixSDK: 196ae670143c5169ca9d02ff4d4a87f1e4dd8f08
MatrixSDKCrypto: 4b9146d5ef484550341be056a164c6930038028e
MatrixSDK: 1b64384084050652fcffafdf8641200f1ab25060
MatrixSDKCrypto: dcab554bc7157cad31c01fc1137cf5acb01959a4
OLMKit: da115f16582e47626616874e20f7bb92222c7a51
PostHog: 4b6321b521569092d4ef3a02238d9435dbaeb99f
ReadMoreTextView: 19147adf93abce6d7271e14031a00303fe28720d
@@ -246,9 +245,10 @@ SPEC CHECKSUMS:
Sentry: 63ca44f5e0c8cea0ee5a07686b02e56104f41ef7
SideMenu: f583187d21c5b1dd04c72002be544b555a2627a2
SwiftBase32: 9399c25a80666dc66b51e10076bf591e3bbb8f17
SwiftFormat: 710117321c55c82675c0dc03055128efbb13c38f
SwiftGen: 1366a7f71aeef49954ca5a63ba4bef6b0f24138c
SwiftJWT: 88c412708f58c169d431d344c87bc79a87c830ae
SwiftLint: e96c0a8c770c7ebbc4d36c55baf9096bb65c4584
SwiftLint: 32ee33ded0636d0905ef6911b2b67bbaeeedafa5
SwiftyBeaver: 84069991dd5dca07d7069100985badaca7f0ce82
UICollectionViewLeftAlignedLayout: 830bf6fa5bab9f9b464f62e3384f9d2e00b3c0f6
UICollectionViewRightAlignedLayout: 823eef8c567eba4a44c21bc2ffcb0d0d5f361e2d
@@ -256,6 +256,6 @@ SPEC CHECKSUMS:
zxcvbn-ios: fef98b7c80f1512ff0eec47ac1fa399fc00f7e3c
ZXingObjC: fdbb269f25dd2032da343e06f10224d62f537bdb
PODFILE CHECKSUM: 76f4286f10bb28fa143ae00ccb47a2bdd09e95a4
PODFILE CHECKSUM: 2a4c3677b5191c24b0cbe401539fc90087024f3c
COCOAPODS: 1.11.3

View File

@@ -9,6 +9,15 @@
"version" : "4.7.0"
}
},
{
"identity" : "lottie-ios",
"kind" : "remoteSourceControl",
"location" : "https://github.com/airbnb/lottie-ios.git",
"state" : {
"revision" : "b4bd0604ded9574807f41b4004b57dd1226a30a4",
"version" : "3.5.0"
}
},
{
"identity" : "maplibre-gl-native-distribution",
"kind" : "remoteSourceControl",
@@ -18,6 +27,14 @@
"version" : "5.12.2"
}
},
{
"identity" : "matrix-wysiwyg-composer-swift",
"kind" : "remoteSourceControl",
"location" : "https://github.com/matrix-org/matrix-wysiwyg-composer-swift",
"state" : {
"revision" : "d5ef7054fb43924d5b92d5d627347ca2bc333717"
}
},
{
"identity" : "ogg-swift",
"kind" : "remoteSourceControl",

View File

@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "Secure connection.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -0,0 +1,11 @@
<svg width="70" height="70" viewBox="0 0 70 70" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="70" height="70" rx="35" fill="#0DBD8B"/>
<g clip-path="url(#clip0_432_24662)">
<path d="M61.6666 34.9997C61.6666 33.533 60.4666 32.333 59 32.333H53.48C52.1733 23.293 44.4133 16.333 35 16.333C25.5866 16.333 17.8266 23.293 16.52 32.333H11C9.53331 32.333 8.33331 33.533 8.33331 34.9997C8.33331 36.4663 9.53331 37.6663 11 37.6663H16.52C17.8266 46.7063 25.5866 53.6663 35 53.6663C44.4133 53.6663 52.1733 46.7063 53.48 37.6663H59C60.4666 37.6663 61.6666 36.4663 61.6666 34.9997ZM43 41.6663C43 43.133 41.8 44.333 40.3333 44.333H29.6666C28.2 44.333 27 43.133 27 41.6663V33.6663C27 32.1997 28.2 30.9997 29.6666 30.9997V28.333C29.6666 25.1063 32.5466 22.5197 35.9066 23.0797C38.52 23.5063 40.3333 25.9597 40.3333 28.6263V30.9997C41.8 30.9997 43 32.1997 43 33.6663V41.6663ZM37 37.6663C37 38.7597 36.0933 39.6663 35 39.6663C33.9066 39.6663 33 38.7597 33 37.6663C33 36.573 33.9066 35.6663 35 35.6663C36.0933 35.6663 37 36.573 37 37.6663ZM37.6666 28.333V30.9997H32.3333V28.333C32.3333 26.8663 33.5333 25.6663 35 25.6663C36.4666 25.6663 37.6666 26.8663 37.6666 28.333Z" fill="white"/>
</g>
<defs>
<clipPath id="clip0_432_24662">
<rect width="64" height="64" fill="white" transform="translate(3 3)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -0,0 +1,274 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
data-name="Layer 1"
width="297mm"
height="210mm"
viewBox="0 0 1122.5197 793.70082"
version="1.1"
id="svg129"
sodipodi:docname="20221027_BwM_Bday_scaled.svg"
inkscape:export-filename="/Users/masterb/Desktop/20220922_BwM_Bday.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96"
inkscape:version="1.1.1 (c3084ef, 2021-09-22)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs133" />
<sodipodi:namedview
id="namedview131"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="false"
showgrid="false"
units="mm"
inkscape:zoom="0.58854462"
inkscape:cx="496.1391"
inkscape:cy="459.60831"
inkscape:window-width="1698"
inkscape:window-height="969"
inkscape:window-x="36"
inkscape:window-y="25"
inkscape:window-maximized="0"
inkscape:current-layer="svg129"
inkscape:document-units="mm" />
<path
d="M 272.19319,415.40121 C 219.37506,351.85165 197.06717,285.55351 209.3771,228.72127 225.17468,155.78911 295.35551,105.36267 401.92444,90.371865 l 0.39359,4.183519 C 297.23266,109.33651 228.12242,158.63122 212.70752,229.79849 c -11.98024,55.30893 10.00384,120.15875 61.90272,182.6033 z"
fill="#f0f0f0"
id="path42"
style="stroke-width:1.7606" />
<path
d="m 781.79896,520.30565 c -65.92027,0 -137.55436,-11.9729 -208.70745,-34.99568 C 485.1014,456.83937 404.4239,413.8662 339.78108,361.03451 l 1.91422,-3.49896 c 64.33158,52.57576 144.65166,95.35259 232.27762,123.70396 79.18639,25.62335 158.96654,37.49557 230.68641,34.36249 l 0.12454,4.2062 q -11.3612,0.49949 -22.98485,0.49745 z"
fill="#f0f0f0"
id="path44"
style="stroke-width:1.7606" />
<path
d="m 933.02817,614.50633 -1.1034,-3.98819 C 990.88145,586.15498 1027.7565,546.90898 1038.5635,497.0191 1052.3007,433.59703 1022.4564,359.9998 954.52782,289.78437 886.25273,219.21226 787.79873,160.65518 677.29807,124.90194 l 0.88138,-4.07046 c 110.98343,35.91051 209.91677,94.77082 278.57201,165.73866 69.00174,71.32351 99.23954,146.44509 85.14244,211.52621 -11.1165,51.32065 -48.7619,91.57399 -108.86573,116.40998 z"
fill="#f0f0f0"
id="path46"
style="stroke-width:1.7606" />
<path
d="M 391.66829,642.74256 C 262.13887,572.52918 162.32665,481.43612 110.61949,386.2419 l 2.86955,-2.3292 c 51.34971,94.5354 150.638,185.08875 279.57533,254.98143 z"
fill="#f0f0f0"
id="path48"
style="stroke-width:1.7606" />
<path
d="m 847.0834,764.38149 q -20.0405,0 -40.76558,-1.09367 l 0.14811,-4.20618 c 103.10983,5.45604 194.08557,-9.62521 263.10917,-43.62178 l 1.2884,3.90601 c -60.2115,29.65272 -136.95563,45.01562 -223.7801,45.01562 z"
fill="#f0f0f0"
id="path50"
style="stroke-width:1.7606" />
<path
d="M 771.92884,94.147329 C 750.52,85.628145 728.49894,77.695872 706.47785,70.570512 579.7549,29.56782 455.18494,15.00977 346.23003,28.478264 l -0.34649,-4.189706 c 109.36108,-13.512689 234.35745,1.080256 361.47567,42.211497 22.08331,7.145909 44.16662,15.100791 65.63599,23.644647 z"
fill="#f0f0f0"
id="path52"
style="stroke-width:1.7606" />
<path
d="M 191.24068,421.71657 C 138.42255,358.16703 116.11466,291.86889 128.42459,235.03663 144.22217,162.10447 214.40301,111.67805 320.97193,96.687252 l 0.39359,4.183518 c -105.08537,14.78113 -174.19561,64.07584 -189.61051,135.2431 -11.98023,55.30894 10.00384,120.15875 61.90274,182.60331 z"
fill="#f0f0f0"
id="path54"
style="stroke-width:1.7606" />
<path
d="m 700.84642,526.62104 c -65.92024,0 -137.55434,-11.97291 -208.70743,-34.99568 C 404.14887,463.15473 323.47136,420.18158 258.82856,367.34988 l 1.91422,-3.49894 c 64.33159,52.57575 144.65166,95.35258 232.27762,123.70396 79.18639,25.62333 158.96654,37.49556 230.68641,34.36249 l 0.12454,4.20619 q -11.3612,0.4995 -22.98485,0.49746 z"
fill="#f0f0f0"
id="path56"
style="stroke-width:1.7606" />
<path
d="m 852.07567,620.82175 -1.10342,-3.98819 C 909.92892,592.47041 946.80397,553.2244 957.61097,503.33455 971.34814,439.91246 941.5039,366.31524 873.5753,296.0998 805.3002,225.5276 706.84617,166.9705 596.34556,131.21729 l 0.88137,-4.07046 c 110.9834,35.91051 209.91679,94.77071 278.57202,165.73862 69.00173,71.32351 99.2395,146.44509 85.14244,211.52618 -11.11653,51.32074 -48.76193,91.57409 -108.86572,116.41012 z"
fill="#f0f0f0"
id="path58"
style="stroke-width:1.7606" />
<path
d="M 310.71576,649.05795 C 181.18635,578.84457 81.374123,487.75151 29.666982,392.55728 l 2.869532,-2.32921 C 83.886229,484.76349 183.1745,575.31684 312.11184,645.20952 Z"
fill="#f0f0f0"
id="path60"
style="stroke-width:1.7606" />
<path
d="m 766.13087,770.69695 q -20.04047,0 -40.76557,-1.09368 l 0.14793,-4.20619 c 103.10985,5.45606 194.08556,-9.62519 263.10917,-43.62176 l 1.28835,3.90599 c -60.2113,29.65266 -136.95538,45.01564 -223.77988,45.01564 z"
fill="#f0f0f0"
id="path62"
style="stroke-width:1.7606" />
<path
d="M 690.9763,100.46269 C 669.56748,91.943506 647.54642,84.011259 625.52533,76.885872 498.80238,35.883181 374.23241,21.325118 265.27751,34.793625 l -0.3465,-4.189693 c 109.36109,-13.512715 234.35743,1.080255 361.47565,42.211484 22.08332,7.145921 44.16663,15.100779 65.636,23.644647 z"
fill="#f0f0f0"
id="path64"
style="stroke-width:1.7606" />
<path
d="m 348.75867,292.40691 a 26.727034,32.666043 0 0 0 -26.69718,32.62954 1254.4728,1533.2289 0 0 0 -10.12832,275.70174 c 0.20268,5.87955 0.42724,11.25749 0.68798,16.4463 0.37846,8.56852 0.85952,17.61399 1.42889,26.8897 0.32715,5.47252 0.67195,10.96147 1.04958,16.43191 0.63245,8.90979 1.32712,17.96348 2.06638,26.90823 0.46423,5.46428 0.94613,10.95529 1.46166,16.42377 0.98989,10.74149 2.1101,21.75229 3.42631,33.66148 a 26.763216,32.710266 0 0 0 26.7047,32.77111 h 447.82245 a 26.727034,32.666043 0 0 0 26.69717,-32.62956 l 0.0203,-0.22612 c 1.99488,-11.10743 3.85268,-22.42649 5.52289,-33.64503 0.89316,-5.91451 1.66437,-11.28627 2.35736,-16.42164 1.25651,-9.34973 2.37419,-18.39937 3.31948,-26.89588 0.64674,-5.7048 1.23208,-11.22881 1.73838,-16.42572 0.83344,-8.5048 1.58783,-17.29535 2.30521,-26.8753 0.39276,-5.20732 0.75271,-10.58526 1.10174,-16.44015 v -0.003 a 783.09975,957.1122 0 0 0 -16.3453,-275.44578 l -0.0203,-0.22613 a 26.727034,32.666043 0 0 0 -26.69717,-32.62955 z"
fill="#3f3d56"
id="path66"
style="stroke-width:1.7606" />
<path
d="m 590.05614,432.09565 c -97.03268,0 -199.85152,-10.77643 -334.41856,-32.33548 h -0.0143 a 28.319628,34.612527 0 0 1 -28.11589,-30.88616 26.010651,31.790472 0 0 1 -0.17747,-3.84026 v -98.94093 a 4.1084728,5.0214157 0 0 1 0.0236,-0.63319 28.481254,34.810068 0 0 1 28.39597,-34.10139 c 234.11775,-38.90579 376.33636,-38.9017 633.94697,0.008 h 0.0111 a 28.476237,34.803937 0 0 1 28.28492,34.20628 3.1402623,3.8380594 0 0 1 0.0169,0.52009 v 98.94098 a 26.075052,31.869185 0 0 1 -0.17836,3.85049 28.358183,34.659649 0 0 1 -28.24059,30.88457 C 778.29083,421.317 687.06542,432.09556 590.05621,432.09556 Z"
fill="#f29100"
id="path68"
style="stroke-width:1.7606" />
<path
d="m 605.62078,500.81449 h -58.87343 a 28.295517,34.583059 0 0 1 -28.26307,-34.54343 v -261.4181 a 28.295533,34.583078 0 0 1 28.26307,-34.54341 h 58.87343 a 28.295709,34.583292 0 0 1 28.2639,34.54341 v 261.4181 a 28.295693,34.583273 0 0 1 -28.2639,34.54343 z"
fill="#3f3d56"
id="path70"
style="stroke-width:1.7606" />
<path
d="m 732.41981,123.08369 a 74.643477,91.22999 0 0 0 -2.24497,-14.50424 76.93954,94.03626 0 0 0 -4.3638,-13.884909 66.862376,81.719851 0 0 0 -30.10479,-38.205413 c -16.42173,-9.880366 -35.2068,-10.688944 -52.86334,-5.928507 a 104.47741,127.69332 0 0 0 -40.83852,23.36814 106.20032,129.79908 0 0 0 -17.0323,19.633553 c -5.23145,7.671936 -14.96328,28.750046 -15.6647,30.701516 a 104.56307,127.79801 0 0 0 -23.23937,-40.630907 109.25959,133.53813 0 0 0 -40.02984,-29.567619 100.85823,123.26991 0 0 0 -24.53466,-6.095155 78.084202,95.435278 0 0 0 -26.31759,2.806413 66.299225,81.031562 0 0 0 -37.52639,33.527191 69.198522,84.575112 0 0 0 -11.72035,51.587167 70.996663,86.772818 0 0 0 4.8272,26.93673 84.028751,102.70076 0 0 0 5.27505,13.52479 86.082509,105.21089 0 0 0 7.01257,12.28049 79.434158,97.085207 0 0 0 39.02446,31.76077 c 16.36275,6.18074 33.71957,6.38272 50.54532,3.48097 17.2785,-2.97994 33.91015,-9.81612 50.1838,-17.30292 2.17098,-0.99872 4.3328,-2.02651 6.49787,-3.04419 14.46732,6.80222 29.05731,13.36275 44.20143,17.52662 a 133.098,162.67368 0 0 0 52.03146,2.55034 83.493167,102.04617 0 0 0 43.14764,-25.75955 77.479598,94.696325 0 0 0 22.35305,-47.4427 67.008331,81.898239 0 0 0 1.38077,-27.31858 z m -224.28958,80.45388 a 116.00956,141.78802 0 0 1 -28.14,0.20122 87.336722,106.7438 0 0 1 -19.56848,-6.36574 61.522623,75.193552 0 0 1 -32.97117,-40.00975 65.856868,80.490909 0 0 1 -3.98997,-17.72707 60.046346,73.389233 0 0 1 -0.005,-16.26771 62.646836,76.567578 0 0 1 3.74178,-16.59932 64.003561,78.22578 0 0 1 7.02466,-14.698374 60.362926,73.776159 0 0 1 9.0617,-11.124118 55.163889,67.421845 0 0 1 10.1505,-7.269513 62.034652,75.81936 0 0 1 13.27508,-4.340162 78.569972,96.028991 0 0 1 18.50816,0.176729 95.709784,116.97744 0 0 1 21.31726,7.181777 100.60614,122.96182 0 0 1 20.52712,14.627455 98.539279,120.43567 0 0 1 15.86244,19.329016 97.199022,118.7976 0 0 1 11.54994,24.30829 100.75511,123.14388 0 0 1 6.20235,28.01449 l 0.0127,0.14053 a 104.46997,127.68423 0 0 0 -0.67649,14.53545 c 0.004,1.87104 0.07,3.73974 0.147,5.60742 a 9.1517129,11.185313 0 0 0 -1.79452,2.95199 289.40644,353.7154 0 0 1 -36.81323,14.26896 q -6.65519,1.87778 -13.42335,3.05849 z m 207.05808,-63.90184 a 65.84599,80.477616 0 0 1 -3.99061,17.72925 61.182569,74.777936 0 0 1 -32.97054,40.00811 87.338442,106.7459 0 0 1 -19.56868,6.36574 116.03873,141.82367 0 0 1 -28.19117,-0.20865 c -16.61715,-2.9042 -32.64706,-9.31492 -48.32691,-16.46943 -0.64558,-0.29464 -1.28613,-0.60518 -1.93098,-0.90211 a 8.987348,10.984425 0 0 0 -1.71703,-2.91961 103.12795,126.04399 0 0 0 -0.51448,-20.31697 100.76234,123.15272 0 0 1 6.19585,-27.9618 97.199214,118.79783 0 0 1 11.54931,-24.30738 98.534183,120.42945 0 0 1 15.86306,-19.329924 100.60614,122.96182 0 0 1 20.52713,-14.627455 95.71851,116.9881 0 0 1 21.31746,-7.181777 78.572488,96.032065 0 0 1 18.50775,-0.176729 62.042727,75.829229 0 0 1 13.27533,4.340161 55.162327,67.419938 0 0 1 10.15123,7.270154 60.354263,73.765572 0 0 1 9.06129,11.124118 64.012256,78.236407 0 0 1 7.02435,14.697732 62.647697,76.56863 0 0 1 3.74176,16.59932 60.047382,73.390499 0 0 1 -0.005,16.26717 z"
fill="#3f3d56"
id="path72"
style="stroke-width:1.7606" />
<ellipse
cx="396.98572"
cy="499.76193"
fill="#f29100"
id="circle74"
rx="10.334358"
ry="12.630754"
style="stroke-width:1.7606" />
<ellipse
cx="471.04865"
cy="468.185"
fill="#f29100"
id="circle76"
rx="10.334358"
ry="12.630754"
style="stroke-width:1.7606" />
<ellipse
cx="438.32315"
cy="567.12598"
fill="#f29100"
id="circle78"
rx="10.334358"
ry="12.630754"
style="stroke-width:1.7606" />
<ellipse
cx="744.90936"
cy="499.76193"
fill="#f29100"
id="circle80"
rx="10.334358"
ry="12.630754"
style="stroke-width:1.7606" />
<ellipse
cx="742.47461"
cy="522.05872"
fill="#f29100"
id="circle82"
rx="10.334358"
ry="12.630754"
style="stroke-width:1.7606" />
<ellipse
cx="703.57196"
cy="567.12598"
fill="#f29100"
id="circle84"
rx="10.334358"
ry="12.630754"
style="stroke-width:1.7606" />
<ellipse
cx="753.5213"
cy="720.80023"
fill="#f29100"
id="circle86"
rx="10.334358"
ry="12.630754"
style="stroke-width:1.7606" />
<ellipse
cx="779.35724"
cy="630.27985"
fill="#f29100"
id="circle88"
rx="10.334358"
ry="12.630754"
style="stroke-width:1.7606" />
<ellipse
cx="698.40479"
cy="670.27716"
fill="#f29100"
id="circle90"
rx="10.334358"
ry="12.630754"
style="stroke-width:1.7606" />
<ellipse
cx="457.26947"
cy="720.80023"
fill="#f29100"
id="circle92"
rx="10.334358"
ry="12.630754"
style="stroke-width:1.7606" />
<ellipse
cx="483.10544"
cy="630.27985"
fill="#f29100"
id="circle94"
rx="10.334358"
ry="12.630754"
style="stroke-width:1.7606" />
<ellipse
cx="402.15286"
cy="670.27716"
fill="#f29100"
id="circle96"
rx="10.334358"
ry="12.630754"
style="stroke-width:1.7606" />
<ellipse
cx="332.57251"
cy="71.152756"
fill="#fd6584"
id="circle101"
rx="13.77916"
ry="16.841024"
style="stroke-width:1.7606" />
<ellipse
cx="159.05939"
cy="327.4451"
fill="#fd6584"
id="circle103"
rx="13.77916"
ry="16.841024"
style="stroke-width:1.7606" />
<ellipse
cx="1041.161"
cy="473.08023"
fill="#fd6584"
id="circle105"
rx="13.77916"
ry="16.841024"
style="stroke-width:1.7606" />
<ellipse
cx="932.65021"
cy="666.75189"
fill="#e6e6e6"
id="circle109"
rx="13.77916"
ry="16.841024"
style="stroke-width:1.7606" />
<ellipse
cx="797.74304"
cy="137.02742"
fill="#e6e6e6"
id="circle111"
rx="13.77916"
ry="16.841024"
style="stroke-width:1.7606" />
<path
d="m 356.0393,319.21837 c -1.19108,2.30279 -4.0791,1.96815 -5.70082,0.52851 -2.25128,-1.99857 -1.52245,-5.8481 0.0279,-8.12262 4.92716,-7.22921 13.07613,0.40314 14.17532,7.58252 a 14.777692,18.06144 0 0 1 -6.95339,17.9847 c -5.62163,4.07142 -12.92366,2.02962 -17.75698,-2.84337 -10.08231,-10.16513 -7.33719,-30.5177 3.86179,-37.8718 7.14707,-4.69328 16.18262,-2.63338 23.22322,1.29808 7.92542,4.42555 14.74045,11.20881 22.06962,16.86297 a 123.0537,150.39744 0 0 0 53.15227,22.18268 c 3.30508,0.41194 3.28156,-5.9064 0,-6.31539 a 118.20176,144.46735 0 0 1 -30.54118,-8.988 134.21843,164.04309 0 0 1 -27.44338,-18.40996 c -8.62964,-7.22953 -17.64523,-14.25242 -28.32489,-15.44705 a 24.57215,30.032323 0 0 0 -22.65164,12.04644 25.093384,30.669381 0 0 0 -3.77124,26.90323 23.239074,28.403026 0 0 0 17.71492,18.64119 18.998088,23.219649 0 0 0 20.02862,-11.30979 c 3.93086,-8.30901 3.80298,-19.47025 -2.13416,-26.35912 a 13.706603,16.752346 0 0 0 -13.32788,-4.43035 11.725273,14.330744 0 0 0 -7.92845,12.33299 c -0.57287,10.78541 11.95381,16.17909 16.74199,6.92177 1.78204,-3.44542 -2.68751,-6.61778 -4.46172,-3.18749 z"
fill="#3f3d56"
id="path113"
style="stroke-width:1.7606" />
<path
d="m 797.91245,319.21837 c 1.19107,2.30279 4.07912,1.96815 5.70082,0.52851 2.2513,-1.99857 1.52246,-5.8481 -0.0279,-8.12262 -4.92717,-7.22921 -13.07613,0.40314 -14.17531,7.58252 a 14.777676,18.06142 0 0 0 6.95337,17.9847 c 5.62164,4.07142 12.92368,2.02962 17.75699,-2.84337 10.0823,-10.16513 7.33718,-30.5177 -3.86179,-37.8718 -7.14709,-4.69328 -16.18264,-2.63338 -23.22321,1.29808 -7.92543,4.42555 -14.74047,11.20881 -22.06962,16.86297 a 123.0537,150.39744 0 0 1 -53.15229,22.18268 c -3.30506,0.41194 -3.28154,-5.9064 0,-6.31539 a 118.20203,144.46768 0 0 0 30.54121,-8.988 134.21881,164.04356 0 0 0 27.44337,-18.40996 c 8.62963,-7.22953 17.64524,-14.25242 28.32487,-15.44705 a 24.572118,30.032284 0 0 1 22.65166,12.04644 25.093384,30.669381 0 0 1 3.77125,26.90323 23.239107,28.403064 0 0 1 -17.71493,18.64119 18.998104,23.219668 0 0 1 -20.02864,-11.30979 c -3.93086,-8.30901 -3.80296,-19.47025 2.13416,-26.35912 a 13.706619,16.752365 0 0 1 13.32789,-4.43035 11.725289,14.330764 0 0 1 7.92845,12.33299 c 0.57287,10.78541 -11.95381,16.17909 -16.74197,6.92177 -1.78205,-3.44542 2.68748,-6.61778 4.4617,-3.18749 z"
fill="#3f3d56"
id="path115"
style="stroke-width:1.7606" />
<ellipse
cx="214.2404"
cy="597.08728"
fill="#e6e6e6"
id="circle2791"
rx="13.77916"
ry="16.841024"
style="stroke-width:1.7606" />
</svg>

After

Width:  |  Height:  |  Size: 16 KiB

View File

@@ -1,7 +1,7 @@
{
"images" : [
{
"filename" : "undraw_Birthday_cake_BwM.svg",
"filename" : "20221027_BwM_Bday_scaled.svg",
"idiom" : "universal"
}
],

View File

@@ -1,758 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="b1da7443-2b43-4a55-9b6b-835488f8f109"
data-name="Layer 1"
width="1077.87045"
height="818.13939"
viewBox="0 0 1077.87045 818.13939"
version="1.1"
sodipodi:docname="undraw_Birthday_cake_BwM.svg"
inkscape:version="1.0.2 (e86c870879, 2021-01-15)">
<metadata
id="metadata373">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>Birthday cake</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs371" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1016"
id="namedview369"
showgrid="false"
inkscape:zoom="0.69142914"
inkscape:cx="781.85579"
inkscape:cy="344.59674"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="b1da7443-2b43-4a55-9b6b-835488f8f109" />
<title
id="title2">Birthday cake</title>
<path
d="M724.88913,132.77315C678.637,165.15693,618.64686,163.06077,566.0755,146.21272S465.2185,99.36712,413.9902,78.0458A494.18659,494.18659,0,0,0,280.38075,43.2116c-65.27725-7.46816-138.17815,1.629-183.6634,53.98071C46.06687,155.489,49.9558,260.63994,104.74175,314.16073c27.86523,27.22173,64.3542,40.58007,96.17591,61.83552s61.27768,56.54522,58.56766,97.56983c-2.50884,37.97919-31.67671,67.1203-61.86034,85.4044-23.33,14.13247-52.06519,29.56582-54.877,58.83474-2.72081,28.32129,21.43765,50.51207,44.50822,63.13276,75.26244,41.17208,167.99042,40.7761,242.96352-1.03754,26.75083-14.91935,51.33838-34.75613,79.39114-46.38368,73.6499-30.52707,154.80787.20352,232.79573,11.43993A465.4391,465.4391,0,0,0,940.40967,630.544c38.62329-11.40826,77.38928-28.84831,104.52167-61.3378,19.56546-23.42852,31.75437-53.07661,43.19758-82.35738q18.30444-46.83727,35.18876-94.3336c6.75709-19.00815,13.40626-38.38513,15.15148-58.71982,3.16313-36.85563-10.159-73.28074-28.30108-104.38505C1067.09817,155.56778,994.559,103.64386,916.0413,90.45336s-161.71258,12.571-222.64322,68.9421"
transform="translate(-61.06478 -40.93031)"
fill="#ff0000"
opacity="0.1"
id="path4" />
<path
d="m 850.13864,538.05009 -2.78768,-1.6121 c 2.606,-4.50561 -4.388,-23.6855 -10.16161,-33.34366 -4.00573,-6.70054 -6.51846,-12.79214 -7.68236,-18.62319 -1.85316,-9.28413 -0.0928,-17.33381 5.23238,-23.92538 11.04722,-13.6744 10.95161,-39.778 10.94925,-40.03985 l 3.22,-0.0288 c 0.0102,1.11657 0.11332,27.51363 -11.66457,42.0925 -7.82879,9.69069 -6.91723,22.76927 2.709,38.87274 4.53651,7.58822 14.22699,29.62004 10.18559,36.60779 z"
fill="#d4d5e0"
id="path6" />
<path
d="m 885.41237,392.72961 c 0.73072,-26.15292 -16.46834,-47.85115 -38.41521,-48.46435 -21.94687,-0.6132 -40.33063,20.09086 -41.06134,46.24379 -0.70948,25.39283 15.48424,46.58433 36.51445,48.356 a 13.88746,13.88746 0 0 1 -3.25839,7.15025 c -3.18843,3.25617 10.02792,0.28018 10.02792,0.28018 a 23.47942,23.47942 0 0 1 -1.4247,-7.4045 c 20.39429,-1.50966 36.92512,-21.38943 37.61727,-46.16137 z"
fill="#ff0000"
id="path8" />
<path
d="m 817.50885,410.18998 c -3.2502,-9.95233 -0.25316,-19.94507 6.68944,-22.9455 -0.32111,0.073 -0.64062,0.15961 -0.95767,0.26315 -7.59894,2.48164 -11.00956,12.91264 -7.61784,23.2983 3.29314,10.0838 11.78807,16.41654 19.23453,14.50467 0.15121,0.79026 -14.06082,-5.05367 -17.34846,-15.12062 z"
fill="#ffffff"
opacity="0.2"
id="path10" />
<path
d="m 866.63555,574.28524 3.21738,0.13587 c 0.2192,-5.20037 16.41432,-17.63033 26.46937,-22.68106 6.97606,-3.50395 12.36555,-7.29537 16.4771,-11.59083 6.54635,-6.83918 9.38122,-14.57609 8.42553,-22.9959 -1.9825,-17.46712 12.10769,-39.44145 12.25024,-39.66117 l -2.70147,-1.75247 c -0.60785,0.93668 -14.86191,23.15462 -12.7483,41.77705 1.40487,12.37844 -6.38342,22.92464 -23.14841,31.34612 -7.90035,3.96808 -27.90124,17.35729 -28.24144,25.42239 z"
fill="#d4d5e0"
id="path12" />
<path
d="m 914.86434,432.73574 c 13.41945,-22.45947 39.57686,-31.53743 58.42426,-20.27616 18.8474,11.26127 23.2476,38.5973 9.8282,61.05677 -13.0294,21.80671 -38.0667,30.99666 -56.76236,21.20489 a 13.88742,13.88742 0 0 0 -1.08811,7.782 c 0.94278,4.45868 -8.61172,-5.14548 -8.61172,-5.14548 a 23.47928,23.47928 0 0 0 5.17605,-5.48314 c -16.39805,-12.21928 -19.67717,-37.86537 -6.96632,-59.13888 z"
fill="#ff0000"
id="path14" />
<path
d="m 962.7891,483.91158 c 8.0838,-6.65322 10.918,-16.69337 6.6702,-22.9511 0.2318,0.23389 0.4549,0.47849 0.6669,0.736 5.08,6.17223 2.3595,16.80415 -6.0762,23.747 -8.1906,6.74111 -18.7571,7.5254 -24.01423,1.91576 -0.55171,0.58572 14.57643,3.28218 22.75333,-3.44766 z"
fill="#ffffff"
opacity="0.2"
id="path16" />
<path
d="m 294.69734,704.07757 -3.21738,0.13586 c -0.21921,-5.20037 -16.41432,-17.63032 -26.46938,-22.68106 -6.97606,-3.50394 -12.36555,-7.29536 -16.47709,-11.59082 -6.54636,-6.83918 -9.38122,-14.57609 -8.42554,-22.99591 1.9825,-17.46712 -12.10768,-39.44145 -12.25023,-39.66116 l 2.70146,-1.75248 c 0.60785,0.93668 14.86191,23.15462 12.74831,41.77705 -1.40487,12.37844 6.38342,22.92465 23.14841,31.34613 7.90032,3.96808 27.90123,17.35728 28.24144,25.42239 z"
fill="#d4d5e0"
id="path18" />
<path
d="m 246.46855,562.52807 c -13.41945,-22.45947 -39.57689,-31.53743 -58.4243,-20.27617 -18.84741,11.26126 -23.2476,38.5973 -9.82815,61.05677 13.02944,21.80672 38.06663,30.99667 56.76235,21.2049 a 13.8874,13.8874 0 0 1 1.08811,7.782 c -0.94278,4.45868 8.61172,-5.14547 8.61172,-5.14547 a 23.47942,23.47942 0 0 1 -5.17605,-5.48315 c 16.39805,-12.21926 19.67717,-37.86538 6.96632,-59.13888 z"
fill="#ff0000"
id="path20" />
<path
d="m 198.54375,613.7039 c -8.08377,-6.65321 -10.91793,-16.69336 -6.67021,-22.95109 -0.23179,0.23389 -0.45488,0.47849 -0.66683,0.736 -5.08,6.17223 -2.35956,16.80415 6.07618,23.74705 8.19057,6.74111 18.75713,7.5254 24.01422,1.91576 0.55172,0.58566 -14.57648,3.28213 -22.75336,-3.44772 z"
fill="#ffffff"
opacity="0.2"
id="path22" />
<path
d="m 400.69734,366.07757 -3.21738,0.13586 c -0.21921,-5.20037 -16.41432,-17.63032 -26.46938,-22.68106 -6.97606,-3.50394 -12.36555,-7.29536 -16.47709,-11.59082 -6.54636,-6.83918 -9.38122,-14.57609 -8.42554,-22.99591 1.9825,-17.46712 -12.10768,-39.44145 -12.25023,-39.66116 l 2.70146,-1.75248 c 0.60785,0.93668 14.86191,23.15462 12.74831,41.777 -1.40487,12.37844 6.38342,22.92465 23.14841,31.34613 7.90032,3.96813 27.90123,17.35733 28.24144,25.42244 z"
fill="#d4d5e0"
id="path24" />
<path
d="m 352.46855,224.52807 c -13.41945,-22.45947 -39.57689,-31.53743 -58.4243,-20.27617 -18.84741,11.26126 -23.2476,38.5973 -9.82815,61.05677 13.02944,21.80672 38.06663,30.99667 56.76235,21.2049 a 13.8874,13.8874 0 0 1 1.08811,7.782 c -0.94278,4.45868 8.61172,-5.14547 8.61172,-5.14547 a 23.47942,23.47942 0 0 1 -5.17605,-5.48315 c 16.39805,-12.21926 19.67717,-37.86538 6.96632,-59.13888 z"
fill="#ff0000"
id="path26" />
<path
d="m 304.54375,275.7039 c -8.08377,-6.65321 -10.91793,-16.69336 -6.67021,-22.95109 -0.23179,0.23389 -0.45488,0.47849 -0.66683,0.736 -5.08,6.17223 -2.35956,16.80415 6.07618,23.74705 8.19057,6.74111 18.75713,7.5254 24.01422,1.91576 0.55172,0.58566 -14.57648,3.28213 -22.75336,-3.44772 z"
fill="#ffffff"
opacity="0.2"
id="path28" />
<path
d="m 363.69734,509.07757 -3.21738,0.13586 c -0.21921,-5.20037 -16.41432,-17.63032 -26.46938,-22.68106 -6.97606,-3.50394 -12.36555,-7.29536 -16.47709,-11.59082 -6.54636,-6.83918 -9.38122,-14.57609 -8.42554,-22.99591 1.9825,-17.46712 -12.10768,-39.44145 -12.25023,-39.66116 l 2.70146,-1.75248 c 0.60785,0.93668 14.86191,23.15462 12.74831,41.777 -1.40487,12.37844 6.38342,22.92465 23.14841,31.34613 7.90032,3.96813 27.90123,17.35733 28.24144,25.42244 z"
fill="#d4d5e0"
id="path30" />
<path
d="m 315.46855,367.52807 c -13.41945,-22.45947 -39.57689,-31.53743 -58.4243,-20.27617 -18.84741,11.26126 -23.2476,38.5973 -9.82815,61.05677 13.02944,21.80672 38.06663,30.99667 56.76235,21.2049 a 13.8874,13.8874 0 0 1 1.08811,7.782 c -0.94278,4.45868 8.61172,-5.14547 8.61172,-5.14547 a 23.47942,23.47942 0 0 1 -5.17605,-5.48315 c 16.39805,-12.21926 19.67717,-37.86538 6.96632,-59.13888 z"
fill="#ff0000"
id="path32" />
<path
d="m 267.54375,418.7039 c -8.08377,-6.65321 -10.91793,-16.69336 -6.67021,-22.95109 -0.23179,0.23389 -0.45488,0.47849 -0.66683,0.736 -5.08,6.17223 -2.35956,16.80415 6.07618,23.74705 8.19057,6.74111 18.75713,7.5254 24.01422,1.91576 0.55172,0.58566 -14.57648,3.28213 -22.75336,-3.44772 z"
fill="#ffffff"
opacity="0.2"
id="path34" />
<path
d="m 807.62983,698.32458 -2.04355,-2.48874 c 4.0229,-3.30276 4.21344,-23.7172 2.20127,-34.78811 -1.39615,-7.68075 -1.60844,-14.26682 -0.64945,-20.135 1.52689,-9.34333 6.00319,-16.26135 13.30481,-20.5617 15.14731,-8.92134 24.22911,-33.39427 24.31892,-33.64034 l 3.02483,1.10431 c -0.38277,1.049 -9.56062,25.79936 -25.70982,35.31071 -10.73443,6.32229 -14.476,18.88733 -11.12136,37.34627 1.58124,8.69836 2.9132,32.73026 -3.32565,37.8526 z"
fill="#d4d5e0"
id="path36" />
<path
d="m 891.71207,574.66192 c 9.87277,-24.22886 1.39373,-50.58653 -18.93851,-58.8715 -20.33224,-8.28497 -44.81821,4.64011 -54.691,28.869 -9.58584,23.52469 -1.87,49.05471 17.197,58.10228 a 13.88748,13.88748 0 0 1 -5.56285,5.54959 c -4.12919,1.92835 9.29017,3.78556 9.29017,3.78556 a 23.47942,23.47942 0 0 1 1.26765,-7.433 c 19.62452,5.75192 42.0861,-7.05246 51.43754,-30.00193 z"
fill="#ff0000"
id="path38" />
<path
d="m 822.00304,567.15169 c 0.45369,-10.45977 6.77053,-18.76245 14.32471,-19.13236 -0.32627,-0.0445 -0.65586,-0.0756 -0.98908,-0.0901 -7.98639,-0.3464 -14.84443,8.22129 -15.31787,19.13648 -0.45968,10.598 5.26871,19.5116 12.91216,20.33787 -0.13608,0.79304 -11.38883,-9.67162 -10.92992,-20.25189 z"
fill="#ffffff"
opacity="0.2"
id="path40" />
<ellipse
cx="547.48303"
cy="706.71136"
rx="302.44354"
ry="22.4762"
fill="#ff0000"
opacity="0.1"
id="ellipse42" />
<polygon
points="580.006,156.496 583.71,156.496 583.71,119.458 580.006,121.167 "
fill="#53425a"
id="polygon44"
transform="translate(-58)" />
<path
d="m 543.66246,230.85469 -27.924,3.41892 v -83.19083 h 17.66724 c -0.11962,0.94018 -0.19657,2.00859 -0.23929,3.19668 a 140.553,140.553 0 0 0 1.10258,18.77838 c 0.59832,5.419 1.38466,11.23971 2.24794,17.02625 0.66672,4.48733 1.38466,8.949 2.0941,13.197 2.56419,15.23981 5.05143,27.5736 5.05143,27.5736 z"
fill="#ff0000"
id="path52" />
<path
d="m 529.03566,38.85702 c 0,0 2.07871,8.31482 -19.74771,31.18059 -21.82642,22.86577 -13.16514,68.94375 10.04708,67.55795 0,0 21.70014,3.57941 29.50612,-11.19363 a 19.78166,19.78166 0 0 0 -1.385,-20.27 C 540.28321,95.56868 526.44854,73.36947 529.03569,62.76214 Z"
fill="#ffc13d"
id="path64" />
<path
d="m 526.74691,80.12829 c 0,0 1.15975,4.639 -11.01769,17.39635 -12.17744,12.75735 -7.34513,38.46526 5.60549,37.69209 0,0 12.107,1.997 16.46212,-6.24517 a 11.03664,11.03664 0 0 0 -0.77274,-11.30909 c -4.00194,-5.89348 -11.72062,-18.27891 -10.27718,-24.197 z"
fill="#ffffff"
opacity="0.5"
id="path66" />
<path
d="m 534.26899,173.05784 a 199.17332,199.17332 0 0 0 -18.53053,16.85529 v -21.5563 a 99.76217,99.76217 0 0 1 17.428,-14.07737 140.553,140.553 0 0 0 1.10253,18.77838 z"
fill="#ffffff"
opacity="0.5"
id="path70" />
<path
d="m 538.61103,203.28111 c -6.8635,6.01728 -16.30825,14.57313 -22.87257,20.53913 v -15.42786 c 6.855,-6.30791 15.23984,-13.57311 20.77847,-18.30829 0.66672,4.48733 1.38466,8.94899 2.0941,13.19702 z"
fill="#ff0000"
id="path72" />
<rect
x="395.79425"
y="246.23978"
width="278.92389"
height="127.64532"
fill="#c99398"
id="rect76" />
<path
d="m 674.71814,246.23978 v 19.21435 c -5.3335,1.03419 -12.32518,-0.56415 -18.18011,-2.52146 a 24.1701,24.1701 0 0 0 -20.90665,2.63258 c -16.06895,10.5046 -28.61638,8.28233 -37.3688,3.05989 a 32.191,32.191 0 0 0 -29.12919,-2.24789 31.62676,31.62676 0 0 1 -12.91495,2.36757 27.26651,27.26651 0 0 0 -14.65858,4.0429 c -13.197,7.9917 -26.35133,3.36759 -34.61655,-1.4616 a 24.40043,24.40043 0 0 0 -17.898,-2.5813 25.785,25.785 0 0 1 -7.949,0.6496 29.82535,29.82535 0 0 0 -17.55613,3.78645 c -21.787,12.72693 -28.98385,-2.72659 -33.27461,-5.00015 -4.8463,-2.56419 -5.41045,6.26513 -6.83783,6.26513 -1.42738,0 -6.26519,-11.67558 -7.41049,-7.69257 -0.52993,1.87186 -5.01726,4.11981 -9.63282,5.98311 a 19.218,19.218 0 0 1 -10.59011,1.09408 v -27.59069 z"
opacity="0.1"
id="path78" />
<path
d="m 406.90784,220.79181 c 0,0 -45.71376,20.40038 -21.32,45.891 a 18.99689,18.99689 0 0 0 20.79823,4.34267 c 4.61229,-1.8591 9.09915,-4.10715 9.63391,-5.9788 1.13964,-3.98874 5.98311,7.69257 7.40766,7.69257 1.42455,0 1.99437,-8.83221 6.83783,-6.268 4.29018,2.27127 11.48632,17.73112 33.27042,4.99755 a 29.88085,29.88085 0 0 1 17.5643,-3.784 25.57433,25.57433 0 0 0 7.94279,-0.65068 24.42806,24.42806 0 0 1 17.9011,2.57955 c 8.26488,4.83 21.42127,9.45336 34.61417,1.4682 a 27.26077,27.26077 0 0 1 14.66319,-4.0486 31.46519,31.46519 0 0 0 12.90972,-2.36943 32.23663,32.23663 0 0 1 29.13319,2.24885 c 8.75173,5.2288 21.30162,7.44766 37.36683,-3.05448 a 24.1437,24.1437 0 0 1 20.90269,-2.63919 c 11.68411,3.91417 27.91865,6.40973 26.44662,-10.70267 -2.27927,-26.49666 -33.61932,-34.18922 -46.72517,-34.47413 -13.10585,-0.28491 -34.759,-2.56419 -59.26125,0 -24.50225,2.56419 -74.36146,2.27928 -74.36146,2.27928 0,0 -83.72051,-3.32416 -95.72477,2.47031 z"
fill="#f8f8fa"
id="path80" />
<rect
x="338.80945"
y="373.8851"
width="397.87659"
height="156.2702"
fill="#c99398"
id="rect82" />
<path
d="m 674.71814,347.22608 v 26.659 H 519.61041 q -0.39753,-0.0513 -0.79494,-0.077 a 20.86814,20.86814 0 0 0 -3.94029,0.077 H 395.79422 v -23.77 c 12.97478,1.58123 26.06069,3.58988 38.95858,3.5386 17.12026,-0.077 34.03534,-3.6326 51.18976,-2.67531 59.97636,3.33341 121.04679,4.32493 180.78385,-2.77787 2.65823,-0.31626 5.32498,-0.64961 7.99173,-0.97442 z"
opacity="0.1"
id="path84" />
<path
d="m 736.68603,373.8851 v 14.09448 c -4.32493,-0.547 -8.48745,-2.27356 -12.66709,-3.64116 -3.76934,-1.23081 -7.84641,-2.1881 -11.67559,-1.171 -2.0172,0.53848 -3.85483,1.59834 -5.84637,2.21377 -8.32506,2.59836 -17.00908,-2.81209 -25.73589,-2.84626 -8.64986,-0.0342 -16.38515,5.17966 -24.82988,7.07718 -13.05174,2.93172 -26.394,-2.21377 -38.89875,-6.98317 -5.06,-1.92315 -10.92347,-3.76078 -15.65009,-1.12825 -2.077,1.15391 -3.64116,3.05139 -5.66687,4.29931 -5.92326,3.65827 -13.67567,0.80345 -19.58188,-2.889 -3.73516,-2.33339 -8.25666,-5.07709 -12.197,-3.11123 -2.03426,1.00858 -3.3078,3.05139 -4.99164,4.56428 -5.33351,4.77791 -13.727,3.49582 -20.26561,0.58977 -6.53014,-2.9061 -12.73549,-7.19681 -19.86395,-7.72679 -10.05158,-0.76067 -18.85533,6.01733 -27.62482,10.9833 -8.76949,4.96597 -20.93236,7.90625 -28.08645,0.7949 -2.36756,-2.35051 -4.1198,-5.75232 -7.3592,-6.56432 -5.35917,-1.33338 -9.38492,5.29933 -14.78681,6.46175 -6.65838,1.43594 -12.07734,-5.64975 -18.75277,-7.043 -6.90623,-1.44449 -13.33381,3.35908 -19.428,6.90618 -6.09419,3.5471 -14.94926,5.54723 -19.36819,0.0513 -1.41028,-1.75224 -2.17955,-4.1113 -4.11125,-5.27372 a 8.23976,8.23976 0 0 0 -4.7523,-0.76072 48.28961,48.28961 0 0 0 -16.76123,4.00868 c -6.08567,2.68387 -11.97477,6.70966 -18.616,6.58143 -0.11962,0 -0.2393,-0.009 -0.359,-0.0171 V 373.8851 Z"
opacity="0.1"
id="path86" />
<path
d="m 434.74956,355.36259 c -30.52022,0.12919 -62.04306,-11.3139 -90.817,-1.13741 -10.4405,3.6925 -21.029,12.42945 -19.92809,23.44882 a 16.08175,16.08175 0 0 0 15.16183,13.99129 c 6.64583,0.12838 12.53348,-3.90136 18.61606,-6.582 a 48.23892,48.23892 0 0 1 16.76677,-4.01339 8.28854,8.28854 0 0 1 4.753,0.76727 c 1.928,1.15674 2.70008,3.52168 4.10938,5.27352 4.42088,5.49545 13.26969,3.49469 19.3653,-0.0532 6.09561,-3.54791 12.52636,-8.35316 19.43022,-6.91063 6.67,1.39365 12.08971,8.48267 18.75064,7.04643 5.39973,-1.1643 9.42524,-7.79193 14.78555,-6.45783 3.24447,0.8075 4.99258,4.20694 7.36357,6.56428 7.14781,7.10667 19.31229,4.16878 28.08228,-0.79943 8.76999,-4.96821 17.57221,-11.74161 27.62338,-10.98672 7.13314,0.53573 13.33311,4.828 19.87015,7.73241 6.53704,2.90441 14.93261,4.18424 20.26041,-0.58893 1.68926,-1.5134 2.96278,-3.56046 4.99346,-4.57057 3.93911,-1.9594 8.46274,0.78428 12.19394,3.11537 5.90792,3.691 13.66249,6.5482 19.5889,2.887 2.01867,-1.24709 3.588,-3.14367 5.661,-4.29821 4.72765,-2.633 10.59585,-0.79551 15.65211,1.13266 12.50125,4.76725 25.84952,9.9135 38.90289,6.97792 8.43711,-1.89742 16.17949,-7.106 24.82727,-7.07412 8.72291,0.0321 17.40825,5.44354 25.73608,2.84788 1.98918,-0.62 3.82748,-1.677 5.84081,-2.21343 3.83579,-1.022 7.90741,-0.0656 11.68031,1.16845 5.00614,1.63742 9.99053,3.7923 15.25762,3.80752 5.26709,0.0152 11.02793,-2.86 12.288,-7.97416 0.9646,-3.9149 -0.91453,-7.9726 -3.25943,-11.2526 -8.51489,-11.91046 -23.27858,-18.03985 -37.82877,-19.6692 -14.55019,-1.62935 -29.21245,0.64422 -43.75131,2.37166 -59.73875,7.09789 -120.8111,6.10982 -180.78208,2.77458 -17.15392,-0.95398 -34.07119,2.60231 -51.19425,2.67479 z"
fill="#f8f8fa"
id="path88" />
<rect
x="311.88547"
y="516.05225"
width="439.93784"
height="181.20265"
fill="#c99398"
id="rect90" />
<path
d="m 753.77207,511.08629 a 519.32412,519.32412 0 0 1 -66.72874,9.91484 45.84426,45.84426 0 0 0 -22.51355,1.718 c -0.13678,0.0427 -0.27352,0.0855 -0.4103,0.13673 -13.86369,4.90619 -25.79573,16.539 -40.49709,16.351 -11.73542,-0.15384 -21.88105,-7.90625 -33.15494,-11.15421 a 42.23114,42.23114 0 0 0 -9.89778,-1.61545 43.4249,43.4249 0 0 0 -6.82928,0.18807 c -13.63294,0.359 -27.26584,0.50426 -40.89878,0.22224 -20.00069,-0.40175 -39.95861,-1.72657 -59.91657,-3.04284 q -32.001,-2.11548 -64.0021,-4.23092 -30.10362,-1.98723 -60.2157,-3.97451 -7.38487,-0.4872 -14.78681,-0.98291 c -5.30789,-0.35047 -9.24818,0.79489 -11.39356,-3.94885 -2.54713,-5.67541 -0.29919,-11.32516 2.8206,-16.26552 2.68386,0.0513 5.37623,0.23935 8.05153,0.42736 q 60.97641,4.295 121.92719,8.88921 l -6.24807,1.10258 a 682.06118,682.06118 0 0 1 128.36326,-7.94042 c 20.04342,0.65811 40.1979,2.19666 60.096,-0.359 13.98336,-1.79491 27.6847,-5.58991 41.73646,-6.778 19.29975,-1.63251 38.64228,1.7009 57.737,5.02581 a 116.104,116.104 0 0 1 11.93205,2.53 c 1.01712,4.88903 2.15387,9.76955 4.82918,13.78679 z"
opacity="0.1"
id="path92" />
<path
d="m 751.82331,516.05227 v 17.03475 c -5.4874,-0.812 -10.86363,-1.61545 -14.1971,2.28211 -1.56411,1.83769 -2.171,4.33349 -3.69238,6.2139 -3.1369,3.8719 -9.26529,3.8634 -13.74407,1.66674 -4.47027,-2.19666 -7.88063,-6.043 -11.73547,-9.20546 a 46.66119,46.66119 0 0 0 -44.33481,-7.76951 c -13.86369,4.90619 -25.79573,16.539 -40.49709,16.351 -11.73542,-0.15385 -21.88105,-7.90625 -33.15494,-11.15421 a 44.78974,44.78974 0 0 0 -37.779,6.419 c -7.98314,5.66686 -15.52186,14.462 -25.24013,13.34231 -5.09421,-0.58976 -9.37641,-3.90612 -13.70134,-6.66688 A 72.89966,72.89966 0 0 0 485.0537,533.93319 c -4.45311,-0.6325 -9.17979,-0.82056 -13.28248,1.02568 -5.1711,2.3334 -8.51312,7.48744 -13.3167,10.51316 -11.15421,7.01735 -25.61621,0.68378 -37.11234,-5.75231 -11.50467,-6.43614 -25.73589,-13.02607 -37.12945,-6.41047 -2.68386,1.55561 -4.98308,3.77789 -7.82079,5.02581 -16.02623,7.03442 -31.76178,-20.06907 -48.20672,-14.07737 -3.70955,1.35049 -6.66688,4.26509 -10.3166,5.76943 a 12.36821,12.36821 0 0 1 -5.9831,0.83761 v -14.81246 z"
opacity="0.1"
id="path94" />
<path
d="m 455.33042,505.42518 q -60.95452,-4.58713 -121.93034,-8.885 c -7.05844,-0.49751 -14.29773,-0.97386 -21.08084,1.04075 -6.78311,2.01461 -13.12151,7.08092 -14.57243,14.00653 -2.19351,10.47014 10.23123,20.79764 20.124,16.72713 3.65133,-1.50239 6.60662,-4.41991 10.31685,-5.7703 16.44216,-5.98439 32.18,21.11323 48.20052,14.07749 2.84064,-1.24753 5.13753,-3.46238 7.82058,-5.02021 11.39733,-6.61752 25.6285,-0.0238 37.12917,6.41247 11.50067,6.43625 25.96162,12.76192 37.118,5.74583 4.80482,-3.02169 8.1408,-8.17553 13.31563,-10.50751 4.10424,-1.84954 8.82484,-1.663 13.28113,-1.02493 a 72.77513,72.77513 0 0 1 28.69594,10.63272 c 4.32394,2.75614 8.60687,6.07051 13.70048,6.66035 9.719,1.12546 17.25985,-7.676 25.23738,-13.34036 a 44.82021,44.82021 0 0 1 37.78062,-6.42169 c 11.27221,3.25 21.42144,11.00426 33.15182,11.157 14.70313,0.19145 26.63606,-11.44248 40.49649,-16.35242 a 46.685,46.685 0 0 1 44.34037,7.77212 c 3.85411,3.16471 7.25985,7.00548 11.73593,9.20416 4.47608,2.19868 10.60421,2.20775 13.74426,-1.66647 1.52069,-1.87624 2.12239,-4.37738 3.6922,-6.21272 6.41716,-7.50261 20.39158,2.41224 28.17191,-3.66523 a 10.65272,10.65272 0 0 0 3.5614,-5.86348 c 1.95046,-7.77429 -2.93317,-15.96775 -9.622,-20.384 -6.68883,-4.41625 -14.83663,-5.88933 -22.73286,-7.26531 -19.087,-3.32605 -38.429,-6.66492 -57.7346,-5.03172 -14.05,1.18858 -27.75122,4.98941 -41.73679,6.78385 -19.89389,2.55253 -40.04886,1.01561 -60.09508,0.35892 a 682.05255,682.05255 0 0 0 -128.36461,7.93591"
fill="#f8f8fa"
id="path96" />
<path
d="m 751.82331,647.91991 v 42.57407 q -25.25727,1.29494 -50.5231,2.57274 c -27.19745,1.38466 -54.42061,2.76932 -81.64372,2.23939 -23.00936,-0.453 -45.96738,-2.265 -68.96813,-2.983 -48.36061,-1.50433 -96.858,1.87186 -145.08177,-2 -15.43642,-1.23937 -30.82155,-3.21379 -46.28363,-4.09419 a 340.601,340.601 0 0 0 -47.43748,0.68377 v -40.11248 a 37.31411,37.31411 0 0 1 4.36765,-0.10256 55.84923,55.84923 0 0 1 22.0264,5.32495 c 5.39334,2.55568 10.50461,6.02588 16.38515,7.043 15.29968,2.64109 28.59071,-11.81236 44.0784,-12.96628 12.47053,-0.92307 23.676,6.81222 34.37725,13.28253 2.05988,1.23937 4.35055,2.48724 6.71816,2.13682 1.983,-0.29063 3.61549,-1.64962 5.23094,-2.83771 15.26546,-11.26532 38.52267,-9.89778 52.35218,3.08557 1.50434,1.40176 3.00011,2.983 4.98309,3.50437 3.92318,1.04279 7.44466,-2.359 10.55589,-4.97448 16.85524,-14.21416 42.83048,-9.94051 62.173,0.6581 3.58132,1.95737 7.54728,4.1882 11.50468,3.16251 2.64964,-0.68377 4.69246,-2.718 6.81217,-4.45316 16.47065,-13.51327 41.2407,-11.00036 60.51484,-1.91458 1.86335,0.88039 3.82922,1.82913 5.872,1.59834 2.45307,-0.29058 4.33343,-2.17955 6.2224,-3.76078 a 31.73577,31.73577 0 0 1 33.37718,-4.13692 c 3.04283,1.46161 5.86348,3.436 9.09433,4.4275 9.20545,2.81209 18.5562,-2.90605 27.74454,-5.8036 a 47.66956,47.66956 0 0 1 15.54758,-2.15392 z"
opacity="0.1"
id="path98" />
<path
d="m 798.18383,689.84438 q -48.43756,2.47451 -96.88362,4.9318 c -27.19745,1.38466 -54.42061,2.76932 -81.64372,2.23939 -23.00936,-0.453 -45.96738,-2.265 -68.96813,-2.983 -48.36061,-1.50433 -96.858,1.87186 -145.08177,-2 -15.43642,-1.23937 -30.82155,-3.2138 -46.28363,-4.09419 a 344.33108,344.33108 0 0 0 -52.18978,1.10263 c -3.70954,0.35042 -9.41913,2.20517 -13.009,1.47867 -3.87189,-0.78634 -2.39323,-1.23081 -1.12819,-4.89759 a 32.43645,32.43645 0 0 0 0.95729,-3.32491 c 1.05986,-4.48733 1.25643,-9.01738 1.69235,-13.67567 0.5641,-5.94893 1.43594,-12.49614 6.35919,-16.539 3.8719,-3.18813 9.23107,-3.83773 14.24832,-3.67533 a 55.84906,55.84906 0 0 1 22.0264,5.325 c 5.39334,2.55568 10.50461,6.02588 16.38515,7.043 15.29968,2.64109 28.59071,-11.81237 44.0784,-12.96628 12.47053,-0.92307 23.676,6.81222 34.37725,13.28253 2.05988,1.23937 4.35055,2.48724 6.71816,2.13682 1.983,-0.29063 3.61549,-1.64962 5.23094,-2.83771 15.26546,-11.26533 38.52267,-9.89778 52.35218,3.08556 1.50434,1.40177 3.00011,2.983 4.98309,3.50437 3.92318,1.0428 7.44466,-2.359 10.55589,-4.97448 16.85524,-14.21415 42.83048,-9.9405 62.173,0.65811 3.58132,1.95736 7.54728,4.1882 11.50468,3.16251 2.64964,-0.68377 4.69246,-2.718 6.81217,-4.45316 16.47065,-13.51327 41.2407,-11.00036 60.51484,-1.91458 1.86335,0.88039 3.82922,1.82913 5.872,1.59834 2.45307,-0.29058 4.33343,-2.17955 6.2224,-3.76078 a 31.73577,31.73577 0 0 1 33.37718,-4.13692 c 3.04283,1.46161 5.86348,3.436 9.09433,4.4275 9.20545,2.81209 18.5562,-2.906 27.74454,-5.8036 a 48.03718,48.03718 0 0 1 60.002,30.51385 45.82008,45.82008 0 0 1 1.90609,7.54712 z"
fill="#f8f8fa"
id="path100" />
<path
d="m 798.18383,689.84438 q -48.43756,2.47451 -96.88362,4.9318 c -27.19745,1.38466 -54.42061,2.76932 -81.64372,2.23939 -23.00936,-0.453 -45.96738,-2.265 -68.96813,-2.983 -48.36061,-1.50433 -96.858,1.87186 -145.08177,-2 -15.43642,-1.23937 -30.82155,-3.2138 -46.28363,-4.09419 a 344.33108,344.33108 0 0 0 -52.18978,1.10263 c -3.70954,0.35042 -9.41913,2.20517 -13.009,1.47867 -3.87189,-0.78634 -2.39323,-1.23081 -1.12819,-4.89759 a 32.43645,32.43645 0 0 0 0.95729,-3.32491 h 502.32447 a 45.82008,45.82008 0 0 1 1.90608,7.5472 z"
opacity="0.1"
id="path102" />
<path
d="m 281.48168,683.15189 h 522.36153 a 17.03368,17.03368 0 0 1 17.03368,17.03368 v 2.19773 H 264.448 v -2.19773 a 17.03368,17.03368 0 0 1 17.03368,-17.03368 z"
fill="#d4d5e0"
id="path104" />
<rect
x="458.60144"
y="107.35271"
width="3.1340101"
height="8.6578197"
rx="1.38793"
transform="rotate(16.71337)"
fill="#ff0000"
id="rect106" />
<rect
x="451.04474"
y="240.62312"
width="3.1340101"
height="8.6578197"
rx="1.38793"
transform="rotate(16.7134)"
fill="#ff0000"
id="rect108" />
<rect
x="446.08771"
y="393.80121"
width="3.1340101"
height="8.6578197"
rx="1.38793"
transform="rotate(16.7134)"
fill="#ff0000"
id="rect110" />
<rect
x="565.72491"
y="367.95346"
width="3.1340101"
height="8.6578197"
rx="1.38793"
transform="rotate(16.71339)"
fill="#ff0000"
id="rect112" />
<rect
x="633.54791"
y="341.91098"
width="3.1340101"
height="8.6578197"
rx="1.38793"
transform="rotate(16.71339)"
fill="#ff0000"
id="rect114" />
<rect
x="734.52704"
y="323.09839"
width="3.1340101"
height="8.6578197"
rx="1.38793"
transform="rotate(16.71336)"
fill="#ff0000"
id="rect116" />
<rect
x="796.78986"
y="287.58524"
width="3.1340101"
height="8.6578197"
rx="1.38793"
transform="rotate(16.71341)"
fill="#ff0000"
id="rect118" />
<rect
x="504.96783"
y="382.38846"
width="3.1340101"
height="8.6578197"
rx="1.38793"
transform="rotate(16.71339)"
fill="#ff0000"
id="rect120" />
<rect
x="651.00446"
y="353.8197"
width="3.1340101"
height="8.6578197"
rx="1.38793"
transform="rotate(16.71336)"
fill="#ff0000"
id="rect122" />
<rect
x="704.80426"
y="320.51514"
width="3.1340101"
height="8.6578197"
rx="1.38793"
transform="rotate(16.71337)"
fill="#ff0000"
id="rect124" />
<rect
x="826.94171"
y="278.53192"
width="3.1340101"
height="8.6578197"
rx="1.38793"
transform="rotate(16.71338)"
fill="#ff0000"
id="rect126" />
<rect
x="143.97374"
y="594.66351"
width="3.1340101"
height="8.6578197"
rx="1.38793"
transform="rotate(-53.67407)"
fill="#ff0000"
id="rect128" />
<rect
x="123.72319"
y="562.32275"
width="3.1340101"
height="8.6578197"
rx="1.38793"
transform="rotate(-53.67411)"
fill="#ff0000"
id="rect130" />
<rect
x="87.124039"
y="512.54572"
width="3.1340101"
height="8.6578197"
rx="1.38793"
transform="rotate(-53.67408)"
fill="#ff0000"
id="rect132" />
<rect
x="-63.003796"
y="520.77222"
width="3.1340101"
height="8.6578197"
rx="1.38793"
transform="rotate(-53.67407)"
fill="#ff0000"
id="rect134" />
<rect
x="-70.465736"
y="532.08289"
width="3.1340101"
height="8.6578197"
rx="1.38793"
transform="rotate(-53.67409)"
fill="#ff0000"
id="rect136" />
<rect
x="-0.87182206"
y="606.97858"
width="3.1340101"
height="8.6578197"
rx="1.38793"
transform="rotate(-53.67407)"
fill="#ff0000"
id="rect138" />
<rect
x="-158.01865"
y="672.51807"
width="3.1340101"
height="8.6578197"
rx="1.38793"
transform="rotate(-53.67409)"
fill="#ff0000"
id="rect140" />
<rect
x="59.01112"
y="699.48578"
width="3.1340101"
height="8.6578197"
rx="1.38793"
transform="rotate(-53.67408)"
fill="#ff0000"
id="rect142" />
<rect
x="80.974785"
y="739.49146"
width="3.1340101"
height="8.6578197"
rx="1.38793"
transform="rotate(-53.67409)"
fill="#ff0000"
id="rect144" />
<rect
x="-35.942822"
y="808.46613"
width="3.1340101"
height="8.6578197"
rx="1.38793"
transform="rotate(-53.67402)"
fill="#ff0000"
id="rect146" />
<rect
x="6.3373632"
y="893.10767"
width="3.1340101"
height="8.6578197"
rx="1.38793"
transform="rotate(-53.67405)"
fill="#ff0000"
id="rect148" />
<rect
x="-173.57845"
y="632.88159"
width="3.1340101"
height="8.6578197"
rx="1.38793"
transform="rotate(-53.67407)"
fill="#ff0000"
id="rect150" />
<rect
x="-208.95927"
y="574.62866"
width="3.1340101"
height="8.6578197"
rx="1.38793"
transform="rotate(-53.67404)"
fill="#ff0000"
id="rect152" />
<rect
x="-137.61473"
y="689.3941"
width="3.1340101"
height="8.6578197"
rx="1.38793"
transform="rotate(-53.67406)"
fill="#ff0000"
id="rect154" />
<rect
x="-90.925537"
y="745.29285"
width="3.1340101"
height="8.6578197"
rx="1.38793"
transform="rotate(-53.67405)"
fill="#ff0000"
id="rect156" />
<rect
x="566.99335"
y="-389.09595"
width="3.1340101"
height="8.6578197"
rx="1.38793"
transform="rotate(54.67721)"
fill="#ff0000"
id="rect158" />
<rect
x="530.26068"
y="-316.85919"
width="3.1340101"
height="8.6578197"
rx="1.38793"
transform="rotate(54.67719)"
fill="#ff0000"
id="rect160" />
<rect
x="548.32477"
y="-141.5455"
width="3.1340101"
height="8.6578197"
rx="1.38793"
transform="rotate(54.67721)"
fill="#ff0000"
id="rect162" />
<rect
x="574.7215"
y="-171.97626"
width="3.1340101"
height="8.6578197"
rx="1.38793"
transform="rotate(54.6772)"
fill="#ff0000"
id="rect164" />
<rect
x="619.52966"
y="-235.20763"
width="3.1340101"
height="8.6578197"
rx="1.38793"
transform="rotate(54.67718)"
fill="#ff0000"
id="rect166" />
<rect
x="626.82996"
y="-259.72891"
width="3.1340101"
height="8.6578197"
rx="1.38793"
transform="rotate(54.67719)"
fill="#ff0000"
id="rect168" />
<rect
x="662.49255"
y="-304.74033"
width="3.1340101"
height="8.6578197"
rx="1.38793"
transform="rotate(54.67719)"
fill="#ff0000"
id="rect170" />
<rect
x="681.33765"
y="-342.66898"
width="3.1340101"
height="8.6578197"
rx="1.38793"
transform="rotate(54.67719)"
fill="#ff0000"
id="rect172" />
<rect
x="717.02673"
y="-387.01089"
width="3.1340101"
height="8.6578197"
rx="1.38793"
transform="rotate(54.67719)"
fill="#ff0000"
id="rect174" />
<rect
x="595.41364"
y="59.630775"
width="3.1340101"
height="8.6578197"
rx="1.38793"
transform="rotate(16.71337)"
fill="#ff0000"
id="rect176" />
<rect
x="639.8175"
y="44.12019"
width="3.1340101"
height="8.6578197"
rx="1.38793"
transform="rotate(16.71339)"
fill="#ff0000"
id="rect178" />
<rect
x="583.4975"
y="80.867691"
width="3.1340101"
height="8.6578197"
rx="1.38793"
transform="rotate(16.71339)"
fill="#ff0000"
id="rect180" />
<rect
x="496.44278"
y="110.52627"
width="3.1340101"
height="8.6578197"
rx="1.38793"
transform="rotate(16.71337)"
fill="#ff0000"
id="rect182" />
<rect
x="650.97314"
y="56.208157"
width="3.1340101"
height="8.6578197"
rx="1.38793"
transform="rotate(16.7134)"
fill="#ff0000"
id="rect184" />
<rect
x="483.25769"
y="93.30764"
width="3.1340101"
height="8.6578197"
rx="1.38793"
transform="rotate(16.71338)"
fill="#ff0000"
id="rect186" />
<rect
x="531.93488"
y="87.553413"
width="3.1340101"
height="8.6578197"
rx="1.38793"
transform="rotate(16.71337)"
fill="#ff0000"
id="rect188" />
<rect
x="539.16327"
y="214.1637"
width="3.1340101"
height="8.6578197"
rx="1.38793"
transform="rotate(16.71339)"
fill="#ff0000"
id="rect190" />
<rect
x="608.24188"
y="193.4239"
width="3.1340203"
height="8.6578474"
rx="1.3879346"
transform="rotate(16.713074)"
fill="#ff0000"
id="rect192"
style="stroke-width:1" />
<rect
x="769.59155"
y="148.47212"
width="3.1340101"
height="8.6578197"
rx="1.38793"
transform="rotate(16.71335)"
fill="#ff0000"
id="rect194" />
<rect
x="786.37939"
y="143.43382"
width="3.1340203"
height="8.6578474"
rx="1.3879346"
transform="rotate(16.713074)"
fill="#ff0000"
id="rect196"
style="stroke-width:1" />
<rect
x="553.78607"
y="93.307686"
width="3.1340101"
height="8.6578197"
rx="1.38793"
transform="rotate(16.71338)"
fill="#ff0000"
id="rect198" />
<ellipse
cx="140.97244"
cy="702.9892"
rx="28.598101"
ry="2.8970201"
fill="#ff0000"
opacity="0.1"
id="ellipse202" />
<ellipse
cx="64"
cy="775.50677"
rx="28.598101"
ry="2.8970201"
fill="#ff0000"
opacity="0.1"
id="ellipse204" />
<ellipse
cx="849.92664"
cy="766.80573"
rx="28.598101"
ry="2.8970201"
fill="#ff0000"
opacity="0.1"
id="ellipse206" />
<ellipse
cx="838.42141"
cy="797.49528"
rx="28.5981"
ry="2.89702"
fill="#ff0000"
opacity="0.1"
id="ellipse208" />
<ellipse
cx="698.20782"
cy="747.95856"
rx="28.598101"
ry="2.8970201"
fill="#ff0000"
opacity="0.1"
id="ellipse210" />
<ellipse
cx="626.7996"
cy="815.24236"
rx="28.5981"
ry="2.89702"
fill="#ff0000"
opacity="0.1"
id="ellipse212" />
<path
d="m 273.47467,742.52714 c 0,0 -0.0322,0.29995 -0.0535,0.79282 v 0.375 l -3.09636,5.2606 -9.8461,-1.36069 -5.08915,-3.4606 a 16.50825,16.50825 0 0 0 1.10358,-2.1 c 2.47486,-0.7071 8.14248,1.29642 8.14248,1.29642 0,0 6.11778,1.16778 8.68916,-0.70716 a 0.589,0.589 0 0 0 0.14989,-0.0964 z"
opacity="0.1"
id="path258" />
<path
d="m 424.7403,543.91642 c 0,0 -13.12465,6.86986 -15.66923,7.23194 -2.54458,0.36208 11.11578,-1.47317 11.11578,-1.47317 z"
opacity="0.1"
id="path320" />
<path
d="m 435.45429,549.27341 c 0,0 -17.41024,5.8927 -25.044,4.8213 3e-5,-2e-5 19.01738,3.61598 25.044,-4.8213 z"
opacity="0.1"
id="path322" />
<path
d="m 591.62983,509.32458 -2.04355,-2.48874 c 4.0229,-3.30276 4.21344,-23.7172 2.20127,-34.78811 -1.39615,-7.68075 -1.60844,-14.26682 -0.64945,-20.135 1.52689,-9.34333 6.00319,-16.26135 13.30481,-20.5617 15.14731,-8.92134 24.22911,-33.39427 24.31892,-33.64034 l 3.02483,1.10431 c -0.38277,1.049 -9.56062,25.79936 -25.70982,35.31071 -10.73443,6.32229 -14.476,18.88733 -11.12136,37.34627 1.58124,8.69836 2.9132,32.73026 -3.32565,37.8526 z"
fill="#d4d5e0"
id="path350" />
<path
d="m 675.71207,385.66192 c 9.87277,-24.22886 1.39373,-50.58653 -18.93851,-58.8715 -20.33224,-8.28497 -44.81821,4.64011 -54.691,28.869 -9.58584,23.52469 -1.87,49.05471 17.197,58.10228 a 13.88748,13.88748 0 0 1 -5.56285,5.54959 c -4.12919,1.92835 9.29017,3.78556 9.29017,3.78556 a 23.47942,23.47942 0 0 1 1.26765,-7.433 c 19.62452,5.75192 42.0861,-7.05246 51.43754,-30.00193 z"
fill="#ff0000"
id="path352" />
<path
d="m 606.00304,378.15169 c 0.45369,-10.45977 6.77053,-18.76245 14.32471,-19.13236 -0.32627,-0.0445 -0.65586,-0.0757 -0.98908,-0.0901 -7.98639,-0.3464 -14.84443,8.22129 -15.31787,19.13648 -0.45968,10.598 5.26871,19.5116 12.91216,20.33787 -0.13608,0.79304 -11.38883,-9.67162 -10.92992,-20.25189 z"
fill="#ffffff"
opacity="0.2"
id="path354" />
<path
d="m 714.62983,673.32458 -2.04355,-2.48874 c 4.0229,-3.30276 4.21344,-23.7172 2.20127,-34.78811 -1.39615,-7.68075 -1.60844,-14.26682 -0.64945,-20.135 1.52689,-9.34333 6.00319,-16.26135 13.30481,-20.5617 15.14731,-8.92134 24.22911,-33.39427 24.31892,-33.64034 l 3.02483,1.10431 c -0.38277,1.049 -9.56062,25.79936 -25.70982,35.31071 -10.73443,6.32229 -14.476,18.88733 -11.12136,37.34627 1.58124,8.69836 2.9132,32.73026 -3.32565,37.8526 z"
fill="#d4d5e0"
id="path356" />
<path
d="m 798.71207,549.66192 c 9.87277,-24.22886 1.39373,-50.58653 -18.93851,-58.8715 -20.33224,-8.28497 -44.81821,4.64011 -54.691,28.869 -9.58584,23.52469 -1.87,49.05471 17.197,58.10228 a 13.88748,13.88748 0 0 1 -5.56285,5.54959 c -4.12919,1.92835 9.29017,3.78556 9.29017,3.78556 a 23.47942,23.47942 0 0 1 1.26765,-7.433 c 19.62452,5.75192 42.0861,-7.05246 51.43754,-30.00193 z"
fill="#ff0000"
id="path358" />
<path
d="m 729.00304,542.15169 c 0.45369,-10.45977 6.77053,-18.76245 14.32471,-19.13236 -0.32627,-0.0445 -0.65586,-0.0756 -0.98908,-0.0901 -7.98639,-0.3464 -14.84443,8.22129 -15.31787,19.13648 -0.45968,10.598 5.26871,19.5116 12.91216,20.33787 -0.13608,0.79304 -11.38883,-9.67162 -10.92992,-20.25189 z"
fill="#ffffff"
opacity="0.2"
id="path360" />
<path
d="m 541.00304,225.15169 c 0.45369,-10.45977 6.77053,-18.76245 14.32471,-19.13236 -0.32627,-0.0445 -0.65586,-0.0756 -0.98908,-0.0901 -7.98639,-0.3464 -14.84443,8.22129 -15.31787,19.13648 -0.45968,10.598 5.26871,19.5116 12.91216,20.33787 -0.13608,0.79304 -11.38883,-9.67162 -10.92992,-20.25189 z"
fill="#ffffff"
opacity="0.2"
id="path366" />
</svg>

Before

Width:  |  Height:  |  Size: 38 KiB

View File

@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "exclamation_circle.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -0,0 +1,3 @@
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M20 40C31.0457 40 40 31.0457 40 20C40 8.9543 31.0457 0 20 0C8.9543 0 0 8.9543 0 20C0 31.0457 8.9543 40 20 40ZM18.0843 14.6883C18.0072 13.8089 18.6552 13.0374 19.5346 12.9757C20.3986 12.914 21.17 13.562 21.2626 14.4414V14.6883L20.7689 20.8597C20.7226 21.4306 20.2443 21.8626 19.6735 21.8626H19.5809C19.0409 21.8163 18.6243 21.3997 18.578 20.8597L18.0843 14.6883ZM21.015 24.8868C21.015 25.6366 20.4071 26.2445 19.6573 26.2445C18.9075 26.2445 18.2996 25.6366 18.2996 24.8868C18.2996 24.1369 18.9075 23.5291 19.6573 23.5291C20.4071 23.5291 21.015 24.1369 21.015 24.8868Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 735 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 470 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 737 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,23 @@
{
"images" : [
{
"filename" : "Bold.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Bold@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Bold@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 591 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 894 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,23 @@
{
"images" : [
{
"filename" : "Code.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Code@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Code@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -0,0 +1,23 @@
{
"images" : [
{
"filename" : "Indent increase.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Indent increase@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Indent increase@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 275 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 445 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 584 B

View File

@@ -0,0 +1,23 @@
{
"images" : [
{
"filename" : "Italic.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Italic@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Italic@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 435 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 660 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 940 B

View File

@@ -0,0 +1,23 @@
{
"images" : [
{
"filename" : "Link.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Link@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Link@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 682 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -0,0 +1,23 @@
{
"images" : [
{
"filename" : "Numbered list.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Numbered list@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Numbered list@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 287 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 465 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 719 B

View File

@@ -0,0 +1,23 @@
{
"images" : [
{
"filename" : "Quote.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Quote@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Quote@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 474 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 848 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,23 @@
{
"images" : [
{
"filename" : "Strikethrough.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Strikethrough@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Strikethrough@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 585 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 962 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -0,0 +1,23 @@
{
"images" : [
{
"filename" : "Underlined.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Underlined@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Underlined@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 410 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 662 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 980 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 347 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 586 B

View File

@@ -0,0 +1,23 @@
{
"images" : [
{
"filename" : "Bullet list.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Bullet list@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Bullet list@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -0,0 +1,23 @@
{
"images" : [
{
"filename" : "Indent decrease.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Indent decrease@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Indent decrease@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 274 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 449 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 597 B

View File

@@ -0,0 +1,23 @@
{
"images" : [
{
"filename" : "maximise_composer.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "maximise_composer@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "maximise_composer@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 320 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 450 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 553 B

View File

@@ -0,0 +1,23 @@
{
"images" : [
{
"filename" : "minimise_composer.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "minimise_composer@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "minimise_composer@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 348 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 488 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 638 B

View File

@@ -0,0 +1,23 @@
{
"images" : [
{
"filename" : "start_compose_module.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "start_compose_module@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "start_compose_module@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 292 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 372 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 502 B

View File

@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "user_other_sessions_filter.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M11 18H13C13.55 18 14 17.55 14 17C14 16.45 13.55 16 13 16H11C10.45 16 10 16.45 10 17C10 17.55 10.45 18 11 18ZM3 7C3 7.55 3.45 8 4 8H20C20.55 8 21 7.55 21 7C21 6.45 20.55 6 20 6H4C3.45 6 3 6.45 3 7ZM7 13H17C17.55 13 18 12.55 18 12C18 11.45 17.55 11 17 11H7C6.45 11 6 11.45 6 12C6 12.55 6.45 13 7 13Z" fill="#0DBD8B"/>
</svg>

After

Width:  |  Height:  |  Size: 429 B

View File

@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "user_other_sessions_filter_selected.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -0,0 +1,6 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M13 6H4C3.45 6 3 6.45 3 7C3 7.55 3.45 8 4 8H13.3414C13.1203 7.37444 13 6.70127 13 6Z" fill="#0DBD8B"/>
<path d="M15.6822 11C16.3676 11.4557 17.1521 11.7743 17.9965 11.9165C17.9988 11.944 18 11.9719 18 12C18 12.55 17.55 13 17 13H7C6.45 13 6 12.55 6 12C6 11.45 6.45 11 7 11H15.6822Z" fill="#0DBD8B"/>
<path d="M11 18H13C13.55 18 14 17.55 14 17C14 16.45 13.55 16 13 16H11C10.45 16 10 16.45 10 17C10 17.55 10.45 18 11 18Z" fill="#0DBD8B"/>
<path d="M19 9C20.6569 9 22 7.65685 22 6C22 4.34315 20.6569 3 19 3C17.3431 3 16 4.34315 16 6C16 7.65685 17.3431 9 19 9Z" fill="#0DBD8B"/>
</svg>

After

Width:  |  Height:  |  Size: 686 B

View File

@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "user_other_sessions_inactive.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -0,0 +1,3 @@
<svg width="12" height="20" viewBox="0 0 12 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M2 0C0.9 0 0 0.9 0 2L0.0100002 5.18C0.0100002 5.71 0.22 6.21 0.59 6.59L4 10L0.59 13.43C0.22 13.8 0.0100002 14.31 0.0100002 14.84L0 18C0 19.1 0.9 20 2 20H10C11.1 20 12 19.1 12 18V14.84C12 14.31 11.79 13.8 11.42 13.43L8 10L11.41 6.6C11.79 6.22 12 5.71 12 5.18V2C12 0.9 11.1 0 10 0H2ZM10 14.91V17C10 17.55 9.55 18 9 18H3C2.45 18 2 17.55 2 17V14.91C2 14.64 2.11 14.39 2.29 14.2L6 10.5L9.71 14.21C9.89 14.39 10 14.65 10 14.91Z" fill="#737D8C"/>
</svg>

After

Width:  |  Height:  |  Size: 552 B

View File

@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "user_other_sessions_unverified.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -0,0 +1,5 @@
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M9.21228 17.436C9.12341 17.4591 9.05182 17.4763 9 17.4883C8.94819 17.4763 8.87659 17.4591 8.78772 17.436C8.58344 17.3827 8.28861 17.2983 7.9335 17.175C7.22166 16.9279 6.27643 16.5277 5.33499 15.9158C3.45846 14.696 1.625 12.6603 1.625 9.30375V2.68082L9 0.521L16.375 2.68082V9.30375C16.375 12.6603 14.5415 14.696 12.665 15.9158C11.7236 16.5277 10.7783 16.9279 10.0665 17.175C9.71139 17.2983 9.41656 17.3827 9.21228 17.436Z" fill="#FF4B55" stroke="white"/>
<path d="M1.125 9.30375V2.30625L9 0L16.875 2.30625V9.30375C16.875 16.4587 9 18 9 18C9 18 1.125 16.4587 1.125 9.30375Z" fill="#FF4B55"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M8.13964 6.05402C8.09745 5.57308 8.45183 5.15121 8.93276 5.11746C9.40526 5.08371 9.82714 5.43808 9.87776 5.91902V6.05402L9.60776 9.42902C9.58245 9.74121 9.32089 9.97746 9.0087 9.97746H8.95808C8.66276 9.95215 8.43495 9.72433 8.40964 9.42902L8.13964 6.05402ZM9.74171 11.6303C9.74171 12.0404 9.40929 12.3728 8.99921 12.3728C8.58914 12.3728 8.25671 12.0404 8.25671 11.6303C8.25671 11.2202 8.58914 10.8878 8.99921 10.8878C9.40929 10.8878 9.74171 11.2202 9.74171 11.6303Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "user_other_sessions_verified.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -0,0 +1,4 @@
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1.125 9.30375V2.30625L9 0L16.875 2.30625V9.30375C16.875 16.4587 9 18 9 18C9 18 1.125 16.4587 1.125 9.30375Z" fill="#0DBD8B"/>
<path d="M13.0617 5.10705C12.8592 4.8933 12.5217 4.88205 12.3079 5.08455L7.50415 9.58455L5.7379 8.34705C5.50165 8.18955 5.1754 8.18955 4.9504 8.39205C4.6804 8.61705 4.6579 9.02205 4.8829 9.29205L6.91915 11.6321C6.9529 11.6658 6.98665 11.7108 7.03165 11.7333C7.41415 12.0483 7.9879 11.9921 8.3029 11.6096L8.33665 11.5646L13.0842 5.8158C13.2417 5.6133 13.2417 5.30955 13.0617 5.10705Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 638 B

View File

@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "user_session_list_item_inactive_session.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -0,0 +1,3 @@
<svg width="8" height="15" viewBox="0 0 8 15" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1.33333 0.833984C0.6 0.833984 0 1.43398 0 2.16732L0.00666682 4.28732C0.00666682 4.64065 0.146667 4.97398 0.393333 5.22732L2.66667 7.50065L0.393333 9.78732C0.146667 10.034 0.00666682 10.374 0.00666682 10.7273L0 12.834C0 13.5673 0.6 14.1673 1.33333 14.1673H6.66667C7.4 14.1673 8 13.5673 8 12.834V10.7273C8 10.374 7.86 10.034 7.61333 9.78732L5.33333 7.50065L7.60667 5.23398C7.86 4.98065 8 4.64065 8 4.28732V2.16732C8 1.43398 7.4 0.833984 6.66667 0.833984H1.33333ZM6.66667 10.774V12.1673C6.66667 12.534 6.36667 12.834 6 12.834H2C1.63333 12.834 1.33333 12.534 1.33333 12.1673V10.774C1.33333 10.594 1.40667 10.4273 1.52667 10.3007L4 7.83398L6.47333 10.3073C6.59333 10.4273 6.66667 10.6007 6.66667 10.774Z" fill="#737D8C"/>
</svg>

After

Width:  |  Height:  |  Size: 828 B

View File

@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "user_session_list_item_not_selected.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -0,0 +1,3 @@
<svg width="20" height="21" viewBox="0 0 20 21" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M10 0.5C4.5 0.5 0 5 0 10.5C0 16 4.5 20.5 10 20.5C15.5 20.5 20 16 20 10.5C20 5 15.5 0.5 10 0.5ZM10 18.5C5.6 18.5 2 14.9 2 10.5C2 6.1 5.6 2.5 10 2.5C14.4 2.5 18 6.1 18 10.5C18 14.9 14.4 18.5 10 18.5Z" fill="#C1C6CD"/>
</svg>

After

Width:  |  Height:  |  Size: 368 B

View File

@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "user_session_list_item_selected.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -0,0 +1,4 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M10 0C4.5 0 0 4.5 0 10C0 15.5 4.5 20 10 20C15.5 20 20 15.5 20 10C20 4.5 15.5 0 10 0Z" fill="#0DBD8B"/>
<path d="M4.54541 10.8887L7.80299 14.243L15.4545 6.36426" stroke="white" stroke-width="1.66667" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 400 B

Some files were not shown because too many files have changed in this diff Show More