From 168dd704c21e535665a11681869d0f5d9991674a Mon Sep 17 00:00:00 2001 From: dufflink Date: Wed, 27 Apr 2022 18:02:03 +0400 Subject: [PATCH] Added basic Swift UI support --- VFont.xcodeproj/project.pbxproj | 189 +++++++++++++++++- VFont/Source/VFont.swift | 41 +++- .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 98 +++++++++ .../Assets.xcassets/Contents.json | 6 + VFontDemoSwiftUI/ContentView.swift | 42 ++++ VFontDemoSwiftUI/Info.plist | 10 + VFontDemoSwiftUI/Martian Mono.ttf | Bin 0 -> 45944 bytes .../Preview Assets.xcassets/Contents.json | 6 + .../VFontDemoSwiftUI.entitlements | 10 + VFontDemoSwiftUI/VFontDemoSwiftUIApp.swift | 17 ++ 11 files changed, 421 insertions(+), 9 deletions(-) create mode 100644 VFontDemoSwiftUI/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 VFontDemoSwiftUI/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 VFontDemoSwiftUI/Assets.xcassets/Contents.json create mode 100644 VFontDemoSwiftUI/ContentView.swift create mode 100644 VFontDemoSwiftUI/Info.plist create mode 100644 VFontDemoSwiftUI/Martian Mono.ttf create mode 100644 VFontDemoSwiftUI/Preview Content/Preview Assets.xcassets/Contents.json create mode 100644 VFontDemoSwiftUI/VFontDemoSwiftUI.entitlements create mode 100644 VFontDemoSwiftUI/VFontDemoSwiftUIApp.swift diff --git a/VFont.xcodeproj/project.pbxproj b/VFont.xcodeproj/project.pbxproj index a9b0eba..cdad9d3 100644 --- a/VFont.xcodeproj/project.pbxproj +++ b/VFont.xcodeproj/project.pbxproj @@ -10,6 +10,13 @@ B0495C322817F1F200FF95F0 /* InfoPlistReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0495C312817F1F200FF95F0 /* InfoPlistReader.swift */; }; B05E31E628195485008C6B4B /* Martian Mono.ttf in Resources */ = {isa = PBXBuildFile; fileRef = B05E31E528195485008C6B4B /* Martian Mono.ttf */; }; B05E31E828195596008C6B4B /* Inter.ttf in Resources */ = {isa = PBXBuildFile; fileRef = B05E31E728195596008C6B4B /* Inter.ttf */; }; + B05E320428195A8A008C6B4B /* VFontDemoSwiftUIApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = B05E320328195A8A008C6B4B /* VFontDemoSwiftUIApp.swift */; }; + B05E320628195A8A008C6B4B /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B05E320528195A8A008C6B4B /* ContentView.swift */; }; + B05E320828195A8B008C6B4B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B05E320728195A8B008C6B4B /* Assets.xcassets */; }; + B05E320B28195A8B008C6B4B /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B05E320A28195A8B008C6B4B /* Preview Assets.xcassets */; }; + B05E320F28195A93008C6B4B /* VFont.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B084D635280FE67D007D5DA5 /* VFont.framework */; }; + B05E321028195A93008C6B4B /* VFont.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = B084D635280FE67D007D5DA5 /* VFont.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + B05E321628195C6E008C6B4B /* Martian Mono.ttf in Resources */ = {isa = PBXBuildFile; fileRef = B05E321528195BA4008C6B4B /* Martian Mono.ttf */; }; B0621E312816B45F00DFE8FA /* FontRow.xib in Resources */ = {isa = PBXBuildFile; fileRef = B0621E302816B45F00DFE8FA /* FontRow.xib */; }; B0621E332816B5E500DFE8FA /* FontRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0621E322816B5E500DFE8FA /* FontRow.swift */; }; B084D63A280FE67D007D5DA5 /* VFont.docc in Sources */ = {isa = PBXBuildFile; fileRef = B084D639280FE67D007D5DA5 /* VFont.docc */; }; @@ -37,6 +44,13 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ + B05E321128195A93008C6B4B /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = B084D62C280FE67D007D5DA5 /* Project object */; + proxyType = 1; + remoteGlobalIDString = B084D634280FE67D007D5DA5; + remoteInfo = VFont; + }; B084D641280FE67D007D5DA5 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = B084D62C280FE67D007D5DA5 /* Project object */; @@ -54,6 +68,17 @@ /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ + B05E321328195A93008C6B4B /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + B05E321028195A93008C6B4B /* VFont.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; B084D671280FEA2D007D5DA5 /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -71,6 +96,13 @@ B0495C312817F1F200FF95F0 /* InfoPlistReader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InfoPlistReader.swift; sourceTree = ""; }; B05E31E528195485008C6B4B /* Martian Mono.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Martian Mono.ttf"; sourceTree = ""; }; B05E31E728195596008C6B4B /* Inter.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = Inter.ttf; sourceTree = ""; }; + B05E320128195A8A008C6B4B /* VFontDemoSwiftUI.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = VFontDemoSwiftUI.app; sourceTree = BUILT_PRODUCTS_DIR; }; + B05E320328195A8A008C6B4B /* VFontDemoSwiftUIApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VFontDemoSwiftUIApp.swift; sourceTree = ""; }; + B05E320528195A8A008C6B4B /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + B05E320728195A8B008C6B4B /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + B05E320A28195A8B008C6B4B /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + B05E321428195B94008C6B4B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; + B05E321528195BA4008C6B4B /* Martian Mono.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Martian Mono.ttf"; sourceTree = ""; }; B0621E302816B45F00DFE8FA /* FontRow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = FontRow.xib; sourceTree = ""; }; B0621E322816B5E500DFE8FA /* FontRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FontRow.swift; sourceTree = ""; }; B084D635280FE67D007D5DA5 /* VFont.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = VFont.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -100,6 +132,14 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + B05E31FE28195A8A008C6B4B /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + B05E320F28195A93008C6B4B /* VFont.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; B084D632280FE67D007D5DA5 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -137,6 +177,27 @@ path = Application; sourceTree = ""; }; + B05E320228195A8A008C6B4B /* VFontDemoSwiftUI */ = { + isa = PBXGroup; + children = ( + B05E321528195BA4008C6B4B /* Martian Mono.ttf */, + B05E321428195B94008C6B4B /* Info.plist */, + B05E320328195A8A008C6B4B /* VFontDemoSwiftUIApp.swift */, + B05E320528195A8A008C6B4B /* ContentView.swift */, + B05E320728195A8B008C6B4B /* Assets.xcassets */, + B05E320928195A8B008C6B4B /* Preview Content */, + ); + path = VFontDemoSwiftUI; + sourceTree = ""; + }; + B05E320928195A8B008C6B4B /* Preview Content */ = { + isa = PBXGroup; + children = ( + B05E320A28195A8B008C6B4B /* Preview Assets.xcassets */, + ); + path = "Preview Content"; + sourceTree = ""; + }; B0621E2F2816B44B00DFE8FA /* View */ = { isa = PBXGroup; children = ( @@ -156,6 +217,7 @@ B084D637280FE67D007D5DA5 /* VFont */, B084D643280FE67D007D5DA5 /* VFontTests */, B084D657280FE908007D5DA5 /* VFontDemo */, + B05E320228195A8A008C6B4B /* VFontDemoSwiftUI */, B084D636280FE67D007D5DA5 /* Products */, B084D66C280FEA2D007D5DA5 /* Frameworks */, ); @@ -167,6 +229,7 @@ B084D635280FE67D007D5DA5 /* VFont.framework */, B084D63F280FE67D007D5DA5 /* VFontTests.xctest */, B084D656280FE908007D5DA5 /* VFontDemo.app */, + B05E320128195A8A008C6B4B /* VFontDemoSwiftUI.app */, ); name = Products; sourceTree = ""; @@ -247,6 +310,25 @@ /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ + B05E320028195A8A008C6B4B /* VFontDemoSwiftUI */ = { + isa = PBXNativeTarget; + buildConfigurationList = B05E320E28195A8B008C6B4B /* Build configuration list for PBXNativeTarget "VFontDemoSwiftUI" */; + buildPhases = ( + B05E31FD28195A8A008C6B4B /* Sources */, + B05E31FE28195A8A008C6B4B /* Frameworks */, + B05E31FF28195A8A008C6B4B /* Resources */, + B05E321328195A93008C6B4B /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + B05E321228195A93008C6B4B /* PBXTargetDependency */, + ); + name = VFontDemoSwiftUI; + productName = VFontDemoSwiftUI; + productReference = B05E320128195A8A008C6B4B /* VFontDemoSwiftUI.app */; + productType = "com.apple.product-type.application"; + }; B084D634280FE67D007D5DA5 /* VFont */ = { isa = PBXNativeTarget; buildConfigurationList = B084D649280FE67D007D5DA5 /* Build configuration list for PBXNativeTarget "VFont" */; @@ -312,6 +394,9 @@ LastSwiftUpdateCheck = 1330; LastUpgradeCheck = 1330; TargetAttributes = { + B05E320028195A8A008C6B4B = { + CreatedOnToolsVersion = 13.3; + }; B084D634280FE67D007D5DA5 = { CreatedOnToolsVersion = 13.3; }; @@ -339,11 +424,22 @@ B084D634280FE67D007D5DA5 /* VFont */, B084D63E280FE67D007D5DA5 /* VFontTests */, B084D655280FE908007D5DA5 /* VFontDemo */, + B05E320028195A8A008C6B4B /* VFontDemoSwiftUI */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + B05E31FF28195A8A008C6B4B /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B05E320B28195A8B008C6B4B /* Preview Assets.xcassets in Resources */, + B05E321628195C6E008C6B4B /* Martian Mono.ttf in Resources */, + B05E320828195A8B008C6B4B /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; B084D633280FE67D007D5DA5 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -377,6 +473,15 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + B05E31FD28195A8A008C6B4B /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B05E320628195A8A008C6B4B /* ContentView.swift in Sources */, + B05E320428195A8A008C6B4B /* VFontDemoSwiftUIApp.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; B084D631280FE67D007D5DA5 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -415,6 +520,11 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ + B05E321228195A93008C6B4B /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = B084D634280FE67D007D5DA5 /* VFont */; + targetProxy = B05E321128195A93008C6B4B /* PBXContainerItemProxy */; + }; B084D642280FE67D007D5DA5 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = B084D634280FE67D007D5DA5 /* VFont */; @@ -447,6 +557,68 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ + B05E320C28195A8B008C6B4B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"VFontDemoSwiftUI/Preview Content\""; + DEVELOPMENT_TEAM = CX6AZ34SLQ; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = VFontDemoSwiftUI/Info.plist; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = evilmartians.VFontDemoSwiftUI; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + B05E320D28195A8B008C6B4B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"VFontDemoSwiftUI/Preview Content\""; + DEVELOPMENT_TEAM = CX6AZ34SLQ; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = VFontDemoSwiftUI/Info.plist; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = evilmartians.VFontDemoSwiftUI; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; B084D647280FE67D007D5DA5 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -571,7 +743,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = CX6AZ34SLQ; DYLIB_COMPATIBILITY_VERSION = 1; @@ -585,7 +757,7 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MARKETING_VERSION = 0.1.0; + MARKETING_VERSION = 0.2.0; PRODUCT_BUNDLE_IDENTIFIER = evilmartians.VFont; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; @@ -599,7 +771,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = CX6AZ34SLQ; DYLIB_COMPATIBILITY_VERSION = 1; @@ -613,7 +785,7 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MARKETING_VERSION = 0.1.0; + MARKETING_VERSION = 0.2.0; PRODUCT_BUNDLE_IDENTIFIER = evilmartians.VFont; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; @@ -718,6 +890,15 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + B05E320E28195A8B008C6B4B /* Build configuration list for PBXNativeTarget "VFontDemoSwiftUI" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B05E320C28195A8B008C6B4B /* Debug */, + B05E320D28195A8B008C6B4B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; B084D62F280FE67D007D5DA5 /* Build configuration list for PBXProject "VFont" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/VFont/Source/VFont.swift b/VFont/Source/VFont.swift index 6a837c8..058fd49 100644 --- a/VFont/Source/VFont.swift +++ b/VFont/Source/VFont.swift @@ -5,17 +5,20 @@ // Created by Maxim Skorynin on 20.04.2022. // -import UIKit +import SwiftUI open class VFont { private(set) public var uiFont: UIFont + private(set) public var ctFont: CTFont + + private(set) public var name: String + private(set) public var size: CGFloat + private(set) public var axes: [Int: Axis] public var updated: ((UIFont?) -> Void)? - public var name: String - public var variableFontName: String { return uiFont.fontName } @@ -36,7 +39,10 @@ open class VFont { } self.name = name + self.size = size + self.uiFont = uiFont + self.ctFont = ctFont self.axes = variationAxes.reduce(into: [Int: Axis]()) { result, axis in let axisDict = axis as? [String: Any] ?? [:] @@ -93,10 +99,35 @@ open class VFont { } let key = kCTFontVariationAttribute as UIFontDescriptor.AttributeName - let fontDescriptor = UIFontDescriptor(fontAttributes: [.name: uiFont.fontName, key: variations]) - uiFont = UIFont(descriptor: fontDescriptor, size: uiFont.pointSize) + let uiFontDescriptor = UIFontDescriptor(fontAttributes: [.name: uiFont.fontName, key: variations]) + uiFont = UIFont(descriptor: uiFontDescriptor, size: uiFont.pointSize) + + let originalCTFontDescriptor = CTFontCopyFontDescriptor(ctFont) as CTFontDescriptor + let ctFontAttributes = [key: variations] as CFDictionary + + let ctFontDescriptor = CTFontDescriptorCreateCopyWithAttributes(originalCTFontDescriptor, ctFontAttributes) + ctFont = CTFont(ctFontDescriptor, size: size) } } +// MARK: - SwiftUI Support + +@available(iOS 13.0, *) +public extension Font { + + init(vFont: VFont, value: CGFloat, axisID: Int) { + vFont.setValue(value, axisID: axisID) + self.init(vFont.ctFont) + } + + init(vFont: VFont, axes: [Int: CGFloat]) { + axes.forEach { axisID, value in + vFont.setValue(value, axisID: axisID) + } + + self.init(vFont.ctFont) + } + +} diff --git a/VFontDemoSwiftUI/Assets.xcassets/AccentColor.colorset/Contents.json b/VFontDemoSwiftUI/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/VFontDemoSwiftUI/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/VFontDemoSwiftUI/Assets.xcassets/AppIcon.appiconset/Contents.json b/VFontDemoSwiftUI/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..9221b9b --- /dev/null +++ b/VFontDemoSwiftUI/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/VFontDemoSwiftUI/Assets.xcassets/Contents.json b/VFontDemoSwiftUI/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/VFontDemoSwiftUI/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/VFontDemoSwiftUI/ContentView.swift b/VFontDemoSwiftUI/ContentView.swift new file mode 100644 index 0000000..975b8bd --- /dev/null +++ b/VFontDemoSwiftUI/ContentView.swift @@ -0,0 +1,42 @@ +// +// ContentView.swift +// VFontDemoSwiftUI +// +// Created by Maxim Skorynin on 27.04.2022. +// + +import SwiftUI +import VFont + +struct ContentView: View { + + @State private var widthAxisValue = 0.0 + @State private var weightAxisValue = 0.0 + + private let font = VFont(name: "Martian Mono", size: 20)! + + var body: some View { + VStack { + Text("Hello, world!") + .padding() + .font(.init(vFont: font, axes: [ + 2003072104: CGFloat(widthAxisValue), + 2003265652: CGFloat(weightAxisValue) + ])) + + Slider(value: $widthAxisValue, in: 75...112) + .padding() + Slider(value: $weightAxisValue, in: 100...800) + .padding() + } + .onAppear { + print(font.getAxesDescription()) + } + } +} + +struct ContentView_Previews: PreviewProvider { + static var previews: some View { + ContentView() + } +} diff --git a/VFontDemoSwiftUI/Info.plist b/VFontDemoSwiftUI/Info.plist new file mode 100644 index 0000000..95c43cc --- /dev/null +++ b/VFontDemoSwiftUI/Info.plist @@ -0,0 +1,10 @@ + + + + + UIAppFonts + + Martian Mono.ttf + + + diff --git a/VFontDemoSwiftUI/Martian Mono.ttf b/VFontDemoSwiftUI/Martian Mono.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ed992771385e01eaa0437616caf4a10427d86d83 GIT binary patch literal 45944 zcmdSCd0-Sp+6P?K-E;L!CNs(8APK`HlN$&jHxMD=2!~v9i->?h0vjSC0=md%W)g7K zRabpIcGXp1*Y#CbeGyz1Sw9w$%_1ToL<}KdxB`R_lF8(n>G^)u-GSh)y!-w6&7``k ztLu2`d7gT%ssTa?Az`=(#4&#M4O-*H0Wjp=8ghB8iZXHsSf)#F;Z@fBEgS zVnRM%g6Fo0v*(UIGxVWpgnTlG5bli`vxjA^PDoBBB>f${Uov}6@tk}9GP;bAZC*T& zT)KYg+OM^H^yohm&qepIUb-gmk>nv{uz+E!9>Dv#o+7j_coWZiR+K;b0Jr$A1;`H} zB0)_yq=$+BPp{g|Icc%mal5=91*6f&3$CwGuZgiMIH#?y%GT%9vFI|cXb2xqPn z_ml|bif2}uo1(sV;*C;_$0a2z zOIA9aB_EfRO~9q(<0(@<{>9{k8X+c-vth%W;XjOu9zJKohRPD>$}!HAgvrjLWasL{ z$xk4kkmB@TaSnIl4-+LEVe|QncgV9K#ZKNCo*nMwBjR)EqvHOD8h15rG)PrkO`w2x z_|MQ^mX~A3z&rOI+Jus55>LqN_^ikXn^qSQ$!^a0#Jt>`WG7}A)|YWp@$ui@k$=a8 zSE?i*U9@1qtXE!{K5N$WS6<;Ak1QWK*J=r0I)255RmG!56?f4^qeqS$-3soT6Kn-+ znIx8wdC9psdD&T!kx|a%WM_gl!WNmGm6xAw=A5msz4hjt&6BmOLhqZrYWb4oC3l-w zX-giv%W~w~Z;zC0S#* zG3W8g`f}@{$z{v$Uy(6$*j}1kY7f8X4omHULr2GMnm2R7%dfxryMp`j%cV6XsTmlA zm*@W^;8*yT%(gnMlu;Y^+O>4M^ab4xp!{cehx9+?<#ayFv3WDRv38jEhHQWkAK|oS zN5q%b)p5ynb%DBatg7ia_10jYWW!lX1OEh85T=287`>n^Gs$uboDxJt=)g zM?a^6dOv+#S|L4(vABZOnrFFn1`qCT}wAio;+s% ze%>+i7ZXcXjRfkpO(-m!AVH#o6AFW=H{crh^N{JXBcdXbehQzxutWOxUxA#JI{Be{ z&^Po2w^xSKLI(T>n0SoW5|(9S^Ko zJIOt7u6wGc!n$Pgti>pK=%JEd&7R}FQ?ur!krVI89HBFrAG&{1Md8TuDPtx~8qEqq z*4{sHbzyGlIE-J2c`-Sn180J*Bd{##Xi4JMOVV0yJC?#!fQfnw0Vk6ejNh#4GRVdv za3&<@S`XecYt}s#&p-7PxJlyfUAgjJDh0Zpd*zkqI6d0ll+9#0_zX;%O&?LE@&c|# zS(>O94OnWGF*Zb@Vt97GT${0V_FX?p2{?-h$Be|qp2H5)m7plc(y0L&Q| zIERMlBNu)ARq3Oc&km20yMQK0aq4&{9dz0Av1k-Ot-M@U{W>ylxoIVRQ`(=AK}Sj} zr47`cks&p*en1cIOY{RdQ7m`DBny`9FGNxN>JjPcTIuR$`oqA1bfQ!!y+aq#eF~l` z(5_Nxw}Iv|j6y6$#8=Q7selWU3TREBWgopDmhY2dM66^s7Lzk;xiXT5v21hRnv*!(;F>%UbXo@M7a~`WIw+~!!$EXFvmfiCs zjdJMHosPjnXAFCEOi9tG2@mA2uaGtsCMOS>kvrwSkOVe1M=CJ(NBm4;BMv6zQk+a4 zTC)}Ilb2$$%9c!9(N*_E*efdR5%=WH{N=cDznodKWX_x=ELqYM3i+AR!G!b~&n{m4 z?2Nj#YnLrUV)I*uG2X`fuqK%t{TJ5m(||OiYSNugES&jR3BTODxMacoOXu8ici3|6 zqz#iS)1SHbzUO9+UNdFfw1-QVt{FFKeA!3_e-Zkw?1O*ajoza$2Nh#sH}!0;BmMuS=7r9EUYTQ5}mnW3?~hzt41uZcxc(mbvc;}E2jPS{(FBjZOYU4g~kC(3{OlJ z*6>T1R9y<-vlUaJ&r)EPm6h6`e|}BreGh3Luok3b=1CH5EgQLX^`cpciG_KYWs-&A zWDexu7QmZ8pex5KFs5Wj%5;=Ts42emMO`Oyuj}7R;;-DZX^cB zMqJ#W4NoGO)NopfObX0QWiJ$6sGzS+pFDZGy>P(Hj0r18RPZzXpMa6>o;!EOA$vmM z>WR`5bRp0a43giYzgPL0LIO#GdC!yQD6_h$QqCMKKgj(msJ+5yC~VNc75i%L;55DHd>ANyy%m{H7+95%R6S6o@h7Y`pbxgs7P z<-#q4q_H&`tOc=mx~R$1V8yR^a6@TtBX+tv|Q$xw5{MFZp=~R=&ifmLj>>I7Jwz^5!`5dchd|7Jj6R97QG4 zsvDx^C-RXigMfqyCj5(lRBY1sFh&gcPX-<09-fv$SuA^%p%>Z1#}A&lXl-W3$dQMo z@tdFL7G&5REAN?El$*cwz7sN+%ly0!^6DA%2cG$fO#wyHCr)gUszm__mXh5xcU(!y zh!OKvEqij)re`&!p$jHXnJPb5Z+P@+&GIL+($ixS^rq0+Qx}%5Da|S9_qg&t@G0|g zp5?qub`>)#LiKB8Jmt#5ESt`u$x>Zb*02KeGVR*?@BhW~&sT5@%A^zdBML{aeq>D< zO)Yzkt@Cp9wVqobgp$Er3%6hoTjM1l2KbBFDYKbn0F&U0o#I~}s(-&8OWZ&^8TX+c zWHk4UvX)`f{=|xiUpFFL9P`c?F>KVz^{cYT*7o=~c9}W*32zQ(# zlOR(VL>k$y4bRp&d7_n3Ez4nM*!=zD$?=bVPZ!L|o4Ht98X6xHJ;;1^O&dTOUCJc~ zY~$z7a1OL5a8CzjfvkY53LURPpUfsv%!*uQVsNXZMf4ph25AwuV6Rj!mhGj9B9l$b zCcbH__wzr0YORMy(A=L|#FwQZ|7s6&mS0L={!)R5**eUB20Y6ZE{)RU=4aExCj$Fh z2TJXqeOO*z&OH(S!J`k!@GnOFmtgAxjw01lP^}x;@76FwDL08;9=TxZ#JjBz2{YW& zW^bObV4l=UKMJ(c0{YtB`4jJ&K4sea;^OtwX8k(%U9tS58U>cQnCGkL8yc_l7LBLa z<++M!ebb(jM`WHp_g@n?&zS9*#;*~VOc^#MZT5un@`>{oO`f_ebd6@_mN~N?FPVJD zsEIGE9C^n>Q^(!u7@1r+W!1R6f{8OG&saaEplm|XJ!Xq#`9#n>AM^VQ@F7Clkzy7I zfq$6`qcPr^O}P=9H?M`D%{e43qeC3hb~>lLspLId#G}?lx&(l#yyRON$nQhgh!`N-&Atu&a|{UGc)BY zn`0>kW*aEc*h+`KpW%})5&k}nUGJTxfb5B z2lJw~U>B_;+u2$e&)`ubGIUZ-&ah!f`r$)|4rhsQR2!U1&&hRR7xk~L&CAbKVo=T- z4X2DT=I131eCfT?eCeRm9nc@7Nr&?BHVFRuqE z=CJ;~ezMj)Y}nwzNQg1)=SKSLQWBF=Qj!v(wm9g39&QtOz(IyUx-g$1e>B(U5#3+{ zteWo8rt$O-PHKIjVS$c}?gG4^LWKoR~G(nHG1SI@$$G&Xi&H0f{*Y!-^-2 zS-W}U@;eHqW!R$DXD7VC5=DY~dAT}r$zB|o3$=SS(XQ}Uyt=%=>SRNL$Sw4@!U{^Mzue@e@r z%L-kycTH&4b9`o<-CnnL{;+|=hYuV!UpoE{&D^~^lfHwVVeQJX5+&vZ8S}6l$rV_78MB!nmx6dCyT18DJG~Oa%Sj<8eLq$Jw+0_!w_$*tV@9 zwKVqWhL>M%csiDWh`wGzTRr~@=DpzNyup7p!7|9H=U|gD2_*L_8<{%DbY`|HF`E1c zjxk0)6Ur%w4=Pn;7d|S2iUTPN1~F&8Coz(hoBvU zdn4dW=AQ%H3;V%MsX4d~xTuojIdWvv8qY0gXh5WF3fN(1sbJ}w_d0rpuR{ApH{18g z4YFO47Z_)Ca4J`dXD68uTp@c+6G$bxU@$yMn>ZKzsZeqs?6lYRu(H*(i!0@qKoZ>t zZiQ!rK1JF@o8)>E`sz_F?V{)8dXP)39&rA9lEcl0-Kt}hoSmB=q05bmNKx;<@2RV^ z9sTSxYN|T%*zP-a|LV-T->t4Lu7)?j##P$_meRg4$R2ut%aHxO6=?>c*8(hxE=oa>#BO_tELB1>6=cdo1gkYd=Wbq!A-9Hi#0cELd6DZM7 zn)}}i=Ki7l@vVr+jGH!l_Ox*W?bGhu=-&Ex(zLj^X-Q@2=@}VFCpKOB!yhhfdig0S zCL!zD>gs2+?z#8)R|o3Ct&78Kbl$8*i)OJT!%b#EFYWMZ8}Sd> zXkfz8rf6_^hrzdU)adyoxrHfdiAjS8IqAG=>AS&$Gv|-Un>93d`j~>TL+yEqB}?xJ ztB6?k;=PuFWuqr7FG?GfmKUFxJ}k{SE>lXTZx!C3RWN_pkh^k6&Ks2+pEYi9e0JQp zEh{$ddO*hA2H!#m5I{!Dqn7i&8BRr)|P0K4CyYeyZ15)p8Uvn?yrYFRug(MAl zaN?+?G3mm@{QQYSB4Z{F&Yzv}i~9rj-}W`;23wlg5Gyr-J7bwtD7`TS#YF4x&E_$? zMCOxz4woF~qLI%`o%+nurSi36!-fi$UY|Ywt_63`zH=78fKPNJrKULJocsdYq7NQ< z6GL`OT{=y+6NV`2!XA%uO3SdgO@FNeMD<&`H64^j&_DEKjlS>AQ;;7eXY; zG+7pWje8qfe<1UYZu0X_A;TUNkI2bwqHyUmXa3tj9Cy%vhG-G*xetEZy}-{P*cNOb zaoE3NN!H?wFPKb?%%)I{@lcUgD93mxM>=|GLBY}yBjl^2z;WY`1m}*JE3Lx?fAncw zp1x5JwHMx~hzuRARO_pbHN5~hcpq|6hH3q+49ASMe#p2r($02P{*!3?b2DfD-vM`S zryqs^Ow}SQOYsm{LA+=Asv0Tr_hLt&+A( z8a;ZF#CF3Glfh*-=9EZao3592;*BNJFYKV|QReKi4Tq1$hFZdHaOfU;T3=zBIey$- zmawp}NhNe|ppNd8CjI%2oIyEBLndY3`C#GJ$EQx6JSwpuJ*_D1&bv*f@^^cdDEJ(V zv6XmzD6FqrWA=Rryd`#DBblfd>6RG2RHh(|hc9+>%^=!%+f@?|n}DU;teoVTKf81) zDgx6hfI9vb9?kxj*v;*^R0ZKb;nXvLw@D>OGLZEccZkrSk6%NV z351gNQf(>UkdTlt4mu2LG`O5EBSF4No(~z@k8Ar! zK-MAL%R;_q)jMC7V7DjqPx3kxx$R^ZdK>l(Ha?3l;mi1^`S2?x+%Ijx-#99x({`=x>mhipQkU?zpLM`mkb4lDTdz}-jTn%3}+0@ zhAuHfoGLyez9ZI(KBHi?7^962V}`NNIK?>2xX`%FSZRFPSZ{1H`b~P1#bh_7nzBrV zrV>-BslxP_=}A*eZ~5w^+W4+>uy*JOTr!tdo%2_u>C3?$%O}cK74r2 zeW8UNga@VZIeGEgf3bVR1FO4(%i*Qef@=t59m6a>TnJglRxnZlk{f9b61+)7fm+D> zNK@2jRyGrfm4Bh;nHOD%^t5_slAJ{pSQ+!sS)b8Jxk%X6AQecg4|Zqc79p{IS$j6_ zMx@`XX*KRFeTc-~vv%x#U;Dnc>rlqpmLruQ#Urt3&LpHNBnAr`Z!ywbq;^W%FY2Gh8e{Vq*eEd5#Rn>>Vp-tF_m|c#9CCV7!?HUKO z2k=4M2U+5PUd96wyW4POZ*4@NYj7{ZSA+X7G6K1UWC>YGRzcToCU4^0=%2{{kPpb` zE&neCYUFLRiA2geB0UY@AFok`$AB$Wrw13+Tr;$=m3yfS zH!N?+Yly|1icrdeVGkg|d?w{cY=*af9w22XD3jmb`i7FpXgiHONL;|d3bKIQO{T(X zm_Y7A%zQd5iHYQKU}h7Ug7%9*hkHpSnL~by*v3NicMmlAYO)q%KTMt@&ysPV(lT;C zSqz*mWzjD(nO`g8p3%pIXGRA`86BRKya2j{t9cD##wluEi_$TSa)JRR(TIC0c@DAV zRcfBaBQ~me0UpealKBvX@`xAg1B+OMAhB$8$+bpVu!PEzxfh;)vc=a65l z=6T|v>}&vFqXNpGQ1cp;Kdh6iJ5yq&4-diZk?L9p#Cdr-irF~sQECg&HZXVoH)3{YTkzORy7}i z@*XuGNlbi?dt8}3;C||4AiADJ)H6Mra*VOz#l)tOy?dZP` zo}uXg973v^PegeiJV_|;gD07ogg$suNP@6gt)Ghe zZ>sq;)PG;ir=$FUnjehvV`_c~%KP9Mit;{qGKfjj2hT8)ph;KjXA)5}Rm~444$V9@ zpN0DC)qFPUyVZOS%KK=Pi}Fv@@;qYJ^x-6*Bx?G2rhu5Vf?8(;Nzhu<{795%OuoNqN9puAOtaFDfEh-=}W|8HP7>_^-u=i}&c?7PRWE7c8?j-XeJx2YcEt4~> z<cH9k47|Oy-~Vj%zFPA!7L$l& z=x;u9rMQ45b1HCYW-b2fS|{Xgm|by)5B|7TrRgVj`E-3WQU z?zYe>H57PnUz^oYYV^T;`}#^PrH%sk?d!8TN(}|}{|j>VUV-~|HCYYzz7OWx)m7@S z8VbC(tIKMz_X@1Dz$>@o3HDxr^>#H`4fehd*4x!p>aZFLthcMnYOwbTtkdvxJ6PF! z1=icuWHs3PK3H#8SE<8lD6rnHE~~-bE3l50pZZInz7;xDuEE|bu->jFtHIv)!Fs#8 zN*z{1f%SHESq=7Hfpw#tza3_k8VbC(ug&TxHTqz_eSM{tQb&RN_VrmErN(6N@KQ+e zm9X15**YV^*I2Cl-+Z1&8IRa@670Ve*js5N9Z{Phkmwn(rZXXTvk)1{!Ol<~VmSrS z2qU2d3h_&-@sQ8Vnw$iSa|-12RM^+kCNA-wF zm}F~oG;HO4w^#2%FJNu8~%< z6SDbP>>3S%UB47MMo&YinTApewbC#ejwnO~jigaDnhu~bG?t9hJyNkUGb=lv-Lojat4_0K{zx3hd#t|@<1>9KU>`jw^2l}gJWdSq$2 zoDHdXaNW%((~7mrm#$mBR(@qDU;ePtsb%S!HESQ-c(Y#U(ueO~xpLjgahE=#&jToKS+3oQei{s zx-#$y{FzE6VbdD?qQrtwE^~qMG{2Hi4b`geSU-&N$~&}{X-eP^z{kWpMp@;FwF52H zC)N&BRi9Wp&=+NM)OMh>`o!9S=IRq`2kNU&tR46OPne55UM!7MpIEzr)UH0Uc7v!x zePZq6X#!lMkk3xa?VL1GePZpBXtMgm+NID`^@+7hqv?2h>Evp;-C)^!W>2i$P@18> zW9^2q)8cYX)^0d_9tGbFFWEFlePZo$X`cGT+T~OD@-k&uyAiU7#xWn7jzqi;A3B{~ z@k_ipBuM|r*|>nU#XUw7 zVq9uHND&aV2dM~G_N}DA zn-&F?MZr}r52<8ca3tiK17*>Wx6y<{!r3K#Ai(oP6n#Dq_4})Nii0H{&5j+{J3iZ9 z9DF4BsNnHjyomGKt6WsCujYf420ccO6ScbT9Im+RW zasrPFk6f7MN_%@xu z(cnfTeCZ2Yi-M2xTVJ^NLQ(LSoP1m561bq`?|zE4XYJIBpy4=<59`%vLPJABLQJ8d zT8*(+XVCS!b-lqL$LV;DTksP>An~cb&eqn}ACDeA)7;$L;Y$tA$;k=#ojKzR&&|!1 zGak1=FZ#V*5*PG!x~;owTl8S2-Mbt8Vd>+?j|VE_PuQXncO782$J%VRnCKI2hYlTT zi%dv}Y&&-BSX)>^LKr#`h|VmEdQs%u){?L&fnD=;It-BB^M;rO@oq)?~)|R&13F57qC&S z`?jmA>(KkJRgMd;4weVk1Rv7B^!{O#9r^H;al!TYt_?oSSN-8bnNKRYUZQb_X-%SN zK^I!mgWj(Dd>uX2v0Xl&uTzU*wW5*N`tcOdqoP)$(dq#}H_^Ez7lF)?D-^|SS-9ZqZ4rK3lWUg`=G@c?>=vC{#-_uo70hQw_fT*Xp%!KkJZ;MX*3$C-3PAI z^tSta?dTWtbL-VvVoFwf*CkN>QkUJ7o}O;%s;%upC5CqWuCrudNlD4BT^^&T@-mp1 zij88Z-5x3)6NiXy+M{*xr@t6GR*?%>f6zQ666-J0!68wd7Hf}vv>GL&@rmqPNhB9E zW=U{eu<=G(RY^D(UfifFSM^m2k|1#8MrrdId{Zlhk~5B7H%n~^_@1Z~4n~}Uu7LcH zCZP--2O;5rCmisEJFvU~2G93_purNy-ZaLc6}C$Qmtl{_awov?~1@?G{_&Z^`~ zevH3SBu0zThbsA<)+5S#84nsS1OyX6<4K@#3D!%c10;Y%gwXQ`{6T^ze^=|3%a{HB zwzkWcFJJBEJiNb0UNu1%&-mP}#duWe>G23%T|M9+-I31D&Tl_@!#xgMP>zN2h~brw zSlRI%e|ow&xGA`a?%OvWw^eHt#ZX2Gc^L&ct=1znH~YW@ z@sL14NpCb;!eXLKdKw4>C=skNF|*pnnwTZvp*npudgLpJ+JBGs;3rQ4onD{8Juji zC)pb{lXjAwlN4x%fFFke3xk1$Oz`7i$eakh0l$;QN2>{fj!c{Sx`G-APF^p%v;d3a zG@^$S^?bECgvi>HQ61WhHyuJ{U)?)T_?~#;%sV=L$jW9E>aL zK91*1Qa4z%Qxc5EPNTlk$XiH^MUpHr#KK4Dq6Q5bbmGK`t9}cUJ|-rKynYWa_^&p) z^e4W7?EU6MNr_8nyb5xALQGKLO2-T$(~oIsX_n^izB@f|V5H83Sh2mZ&@S%6DL}t0 zkHRr?{H7It8rDB%&La6xT#$*EygKhykB3l*n`+_Y$y2A!jSKz?I_bOML$p#}H69Xl z5w67U?JkABvmt8h2stqTP58^l!s{X zP$gBVnu4BFFt?sOP)x7&|bMw3JBBx+#5StG$6^r@AVm^Z~pAa#&wFSfa&a)F|Y%V=L zMZpyws?`>em#PhV@B&y3iK};SDT2s*rs-S@<47VFkvCn$R}@?VdDR+iGn)m$($w76 z=J&WbQGDLR`Fs`CA@=`H!p~D08}B{YP*-Qis}m=xJzQ$)=IW5fl7=Q`eeOz#hH;9q zOG=8!Q4igDFttwbzV-a*5zYsyI*J}lzpw|ny0u?YtQJL3jB`Lz*)!h!e zy1g5=jy(#db(CWC=(Oh0(8##BI0&Bh(7~{LPMq*W9BS(|SS%JpZ(DTqp;PRC^tLx&Y&>)3j7y&&T&>-?b7w+=YU43^dl$h!;RCM72UipU7a|WTffUTnb8)!B zz|&}+ddkRA0-lgyFLSc#LnMzDywH1W$4jb-$Gx=U1vM+aume2N`~41l>|q_aA`l5VUnL(`tuD;2cON-pLvM*cVY6tpWz_r zI&hWG^RtZP;-w`2k$yNF3x3J~4)ee)dBEWSGe-k(6#^XNrw+gOdJs=Rg{K5c!RWu% zFhd5yGtA0F1NfhTt#Ac59^SCWMm(QE61D;cD;bK%0=i_UV^XZj>Zp7 zc`!T-Pp{WID2g+~2*v)I*IVTlKs8BvLhps4q}6J@UeAD-%U3QpH8ovnzI^m(Ozbxe z!_1kPndX+GM;Wg`ryAh#g+d5uT>8UTjcMSn!-qWsjtK^9WMpI*HV^H`jwVF@{p!Jk z2d{E=J6k1PS1+DzIC=7{p~0}-{J=?1 zkHsW|9`yJ0`a7W6DIO`;d>t>l{ZymZ^6=6^z$Y33>M+pV+0zqnGZr*6^!4;W!0=c- zTAq1v)%?|ipS?Dg=?iF#r{1VJ4gG)N;O-BeDGojs+-R(L3 z_SKIaUDss(G&A?B*YE8PP-Cc8%Wp9Q!>~U?bbQd;=I;$ai&hW5;%#pQs@s~|ny@~v zwO(s!^|tvsuU)?m1Nll@b0^eV>ovH4aMwNfhYLhr(x4v!f-xvNoA7MJ0M`qF63`Nm z5VlJ7;G-7}17KSW;5e(p;fT}){mp02Bn`6%Tk7iSu5er%T)J!2AVwu5ob-e@z~VU3 zD#j-!#t*QV;J5jy;0kxbR86(`PS@8rTx@NJCnyB{)q{seYT97Cv}nB@%!2QvAO+TRo~Lq!{|YL&CT^SH8p3uLK2dk z&M>o9!g$001uV-{=Do0pUnpd%1#-mVpnYBlb7J6$`LJe)M3|aeM|bRiuHaxe!g!Tm zGuMnoF_lLi)?y+LTe0u?a%9p;9#$ezti)vS6C!Sio%66I`s@i&gdYmh;sf~rd(l&= z6?GU~C%UKz?%>5L4T2R%cDy9ESwdqhxXG6bW#ei64g$Hq23QI{zflj(ctk6lQb>aX>bl`+b+vo)jy^U2? z=%+}o1(ZMqBk4e824p;Z??j7BYcm0#)_B>6Rv zSd7TdBf|F2I!jT zIDReDjbRcIP{jXvl7KOiF@{y}_q2uSwcXu*ZC8-j^$0o`K}9h3FkKNj4-E_3sylqN zcHi5-{jb-G;lowvU-<9Ow*BLKf42-s5!q9XxDYuHef#aLH~C_?$`{EuX469;`uu*aUkFer87<-)2=)Ym z!GMcsT)d7_UA6Yp?p8>wzcR<>q2ON-0{oSB`?gR2x2Z#(5EzvgDHUBXj`-`r;Pq;& zfM8=#@^%MlufJR1&7wx`*4)!$X5Erj{8d|X(tijMg1+S1gSDycek%Tu4r$=x|9a}w zUtKVK_!6fRrsu(?Og|CLC!>eQ9pj{q>+$D21Ph`dF|hy!yNj=>udh+8xMlEXo`olObK@@Ov2mn`(hVq!(X+L z@9w7!TsFTA@LtLm-13ia*&0p;iMChmS_=5`B7~hDs!elS@qS;lq>W3D9cH zp>0E2C3JB_&pb-CkuS<8UJ}(tMq6~W&DPx91i5ST@SZ8~xcJ9E+qJ9O*t~Zy%50-Y zhJYl0q9+l>N9Ix zI;Q`n_Nyk3F$jGVgq{Y>BdOKJ2?FoY^mx0wJN=%tckJevmzI+a5>Sb@8 z$J*`>iczu9hOxnGr1Sjw^KCAzK0G=)+G=t^9rJE2Z!lS-2EYT9B^itS&IEmP9XuK5 zfK~6H#L>f)i~ONI-i~e{w7bI#D?zqxB?Pz-MDVq=csO`$PqKP$7Q(DH*T8{PK9_2C zzUv-~5Ei~#_q#h=YCeM9P{F>M7eA_L!C_kv4863qd0^d%Zb5_4X0J-YgsqR=q zV#BezOWyXYO-)zZy{DsxdO5*rcZJs0o(1ANdU}F_aC%QfPN-SwfkQ)yh3d}cxWkg*frmcE&oC^?F8}^^??(ROfZ~NO-dyU` z5M!wfHAh6#uB%|;fjLRh(Q0gm@#Z|>G*9Ktp^P_;OqS@3CM~mK_M#cAEXJM$ zY^ty*!-&FX?9Ny;1nV?B#1xf0B%wZGNOF`ZzUe!Y0TQhT+YPN}Yh8M~-6{wXIj8r8 znq|+2@i}nHShV4Exr>?aP@H#VB>ZGtWgbgSk&>IW4l96DCTW-&OF#jGb0O5%G# zXQ;to5Zuw-DPneDjk%XTSt!{=V&xza9rgC4afAS7mHL#RTwqAH?Od5lKr9cl%$o4@lmY}j(-^6+jSL6;{q&5)A11d@ZrO4y{EtY^2@WXFc$kD zJ-srryR=3~;p3io>FU)U$%LIZQEEML*b&BewOs_8Hg!sdn53j6{1(L%Z`S+a7xwCH z%n1=i*~HiAO-$;B8@26TuUWD7*}qIN0{lE26vzSvSS%?j7}V<-{=0g6x;xt1yI^2} z;9%oQL)7)TJ@Kp{*R78B+=F_IuuMLC^z zJM@lK@Ljl=oEayyo;r1^vGLR?Po=(~!0Qz?AdlM+H+uBwG@I93P*4@6yg${ZkITqx zx<>S2XwLfZR7TX-+iWd8z;JhS^BH+V&StBxuab2TvoY2KFY|$yrNGM)tn&K1xB5K{;9f+c%!LtF-;LI>6sne>H3#@M>5486&W{ml>y zk|{)wk2c_wP|c*1uyH4{62(zcuCR!~*o^7|FKV@%8-6`JJghmeJ;$)lBusTi!}+!z z-WC&iq~>%_NMd4QM%n7EFP@rWMJAUjt2&5xo}5n;p!J~_U2M>w4O%coBy zCK|mL>kc0~SzmXeuD<^G;W|fiy*^qCSKRLp1YO!l?4x3f!EF>El`LkPn4_=PD{?8( zfw&^5&*DJCK>cA@71)i$oUu8Nk>EUaO7KgKq}|u)LTHl2gt#E*c|;JJA+}AgZ9mAe z&F2n&`SCO3ZwmKHW@2~@F_?2qYATTK=1hZ9T_n|G2EBX+7&Pqe>kPUyS_AudJcbrX zv8ydD2(Y+uZUGj5izkw~orA-;>nBb$HXb_M&~)h{?5e?oJ)Tge?+`vebLJvAr`-$h zK=eeW;zYyo=AacDVp&-kLxvA?#4RBwSHc&(>LugC6kbcCS?zKkLnG*|)nR|ts) zIM4$J&=sVTw0Wv4>0jkVU9CKkd?;%#(iM;DH-rOwVQATJ|MSL17Ep*!C3Zq_gq*{6 z6CocUjKDR1&HNZYV*iCj9c>9V{ofjJ~3I(K~ z-X^cye-C#PgIn3&?}NKQh5JGu+-#Q|r-rbvp~Te_u;y9Jz~6nH9eL>PW}E+rY6C@X zc#k?cgbXXGD(sCn-uPhmH}ws5$M^642oH62s@U^ET=Fiqm>@zpt=<5` z2obzW+S1PSjgAGXJFzQTg_t?xG5N!B##5ZlG2n;Vt6aD-`I^}0QH=@z+X7!*+OWwh8gka zo*fHDJrdkZe=9@(8v_=K-#|D$r;%$JT3T{)v=duDZk_DG#;n)dTWtsnJ9tokF>YL3 z1B&!GbnqYZfY5tg(~C&jZFxY@g!XEBZ{>kgjdrJ<@xb^SY~i#wo@!(~P@}BhNtp8- z2f>+H9$q5;ykXmZR>z&W;n{mqjG2FxSV)XyH>dN-R_-#|LVw*oi7$6?7Kl< zUH!_R|Ms_|=i9;FmDFr-Y0Qy=AnIHOo1LWUQ(1DQoIQKw;MYe_G+t}Hc;vgor!KU^ ze8S?_%bWMelK``ip@H4Bt;?mae)s8<_k5z4i>ObyyRkacHukJVk z9zLS(+o%qN>fajsoLlBVuq`_rI>4X2n`jJTIN5oHYg0|+n35%w72Nm(cZTY0cDqg2 z-Q3vN+#QzE@W3vivLeNaT@6t3j9zELJ>wFuWafSdGGTdo}V`1#7p%4goHISq^Z@JBCL&a}6}f2S6`;cg#A# z*mL#x@#Bryx`bA|++&D~srRJR!_7I>s*Q<@i!lq`(8buFvcZ;*!nWK z2vS9gVmF$0iZ|_7wR~Ig_J;}^qAG4XE zMFMWV3-<8VD8yV)f}`FV9kT`53Bo&V=ZRAjHMhdZL)K-&_k6!j0~Lch%9%;sJ=LgqXnYvVRCG4S|~&heK-n@y9`= z&Rgd&+3M{%Iq9jXetW$wnp9%PQ}%gqd;z$i4D3oIS5*~kpsGHbB^2+XfG4(_XG2Xy zcZn{X(rZ4611hP}_yl)#J5HbDC<*`RUwrcHE2&QR1d9$((ygniq=N=Mq5Ce_o7(tI zw%sFmzxcxIbzu;l!>>DMANxh4N3dC~HaL5IQE_%sDH)?O?_>x@mG}38p`pCcVd?I< z?j@ZUgF&+%hlxHwumw|n|0%Ka+~M!P|LUz5UwqY56nt3w!uy|nR`b0=46?AAER>JT zV>={7qv;5NNht)bwxE-6bh1zBWS@t|#8g|OzR_~Q!Qb?Dbqu|9d}xp!AMAnmQWU&T zbKrp2d*A>LJmJ|zQ&X$09YaI#4`!QTw|{TUZ`TDv{^>E=Y^5b7Hd{$aDW*jC>`}c0 zC+5WVEE6%OYY|N6U|Y*|zP^TiB}p zD7abo>pySX_LtMjQ8G7=D3VkSTWO2c;_E?}P6KaU)ML+{^!Pk(66<1r2q<3=gbUTy z0{bB&4Ya2>9%#(zq?*w0>>h*Q_5Snp>3<4LJ21Mw_J=b+HeDWk;S&$%-LnUFZ3~tVwup`*3c3FuUT=dZ0tdB|Y8$2(46^Xj zsN5k*j+n?R$+JB0P93mnMRaU(I8qT(83Ke1^e88x*$!fyL)k%$b8yI0L;~QjQeM-> zx0wTGO$$fDBy1BX8j0iG*WFDlfZK%KLxV&*xtj-G4HpcZF`XK@l<0M`Sqe?2yL`Fj zGETEZ>bz@q?j}`*1^wQ|#umh$KVNfRXWKP8hb*i;BTKqrfD8W)rF?>p+1mM_5!55w z73lkea=v+rPNO00v}(0MIZ4+g=>0!`TuRq>T&g(ui{LLf*zHV&^gHwvD)l=oC3g6X zKYLW_iGHnaIa#-rL5mNwIpi;;q5V%uv3=Fh{)eQ_<-{HQxl?ve#QxkVJN!BZhaZ@3 zhyho#-Rc2YseOCFMr=OdWF04%%|6Zp0y1`F@x*HKNiojPtuy$1pM0{@=R5d`i~__v zT^j6PwueVlBe(;f69-9rK7Cc+i`HguwXvS<{3a&i_ame0*|A5LX4kHS+^h@L#$-0D z`ubDN%}0|xbkZc3X40h3|NfO#S$CrVA*1OnzZZ#OTTC#0LYU(6v%SJzQ(90w$+@w)OP*k?rnd-_Mu$HKl!^0 z7vw4OO-)D4-8I7QP3yzsw{IRySu`x0- z;L$Z(V}{_6&>&ZchS@4wTZ}Vaiyd?qeeoZj*b6wE(k6r_rd?>d)Gma^!S#=n7B9Bj z&zF9qo}8vHJXGDJg$BV>k+#45;IIRb|N{E4sD_V}5S$Eo06 z1jmCtzAnkd;U`>BQ0qi1;8CcsHFsTV&YgB8Mvgd-I44_8Ppwn2L(K@*gBOna~q4 z0^ZmlY&rqSjh%ONg{}q8lhJskThc_u#~rV|M9c{=#B7iuBog$D<}QEty*(ishb7@L zH=aLt?ko%yoU}!ERC3u)1e3C>&2p8$LW8n?gg`UMo(g*lYm~>@Pd00r6mbu;QuS5HJ`* z1EGeHN*27;xTwK^$fW$5c^U-2ReM;wb!+g|ty}z{4vb|@H-5wsAbp*nmR{4L3F$S2 zh*U2LM7Ttx_FG^CA2aoJcfnEX;;;{5j*1S^;#2`135*ZC2LH1IzGefs zh4coXYJ+b4W)Q#rQ1>FY6tf_Uj_ukt?A!U)cv!shL4x3~46nZTd1G_q_q*Qz-FO`I zR7yANUj6WIr%+iI6_pT^z%+h(gS~cn3sZJQB$P1|mEV%cP7EWA)+u@PL zC1My5{p~+5a$)IUfx$NY^`nO(BR!SYl9H^Nnpy<%np)bt@=-&V`A5cwXWN2N*i;Ph z`Kl6QV!%wPnelPB+3f>Fsqt`KoK5F%I}PWr0S-!({n#;2Wx}34yResl<2Yus2};QC z$5u-=#v2lCk}hGt;R1e%AX8`>D0B}f#Qeh&@K%Wf6cR+7SsgT@r9-dPU2a8$_IhWK z3xxwMb+SBun`Q_NRVZW|Hp^u&g<#hT91D?Y#&U-fhkuR+)*kk!s?1+qgebcF{hxmS zHL&mrWQzP-Hog1pPkS%b?0DOy7U*1W@2I)d+pE$C#~ymGUv(L-UISBf25`jJWtNc~ zP>+xkuIm4-?OdSaD6c$U)m{CneoAV|Em>-{9=2s;Z14j(KCpq1;q31C?BQ&fIXiRa zaFR{-?1V`snJhEOOm-*gF3FAoFIgsRNMK2rkdTA3%Vdl~FfcZc5aSs90E~<+TWZTv zOKwT6S9hx)>iyj+wGbExK4-V2s;;i8{_1<&?|%2Y_x|tK-67nsST5wo$L6QA&^_u} zEw`Y6W#QZfgMix`hRxFwiDSz#J9m#0m6bG29N!~awzr`ksbhI#L?_>})jPuB%HTEU zjvRg?JCiP+QPyl*qntUaY5CME561%|DQrS{?TvqVBj3KYJ>O7YO+<`xY$6zNs81%( z^}p41>%VS@x)(RLdC$G|*7^DNjrMSzuEm2J*2Ti5QtOr*x3qe)>8!`no!8Reo9OSg z^!KX0z`tDx}N0)qmzR25mK@oomMSP7u`!)J( z46uoaWu~}e)|Jh^Y$7q`wbpXJYAB;3U0(;FEL_jrEE!SwFEb`nG16Z zs_OQO-T@qkd=r9MRH}aO{{Pu$Il>o5p%26WlVB>}w(Z%&=>OO9SF`K!zE_9m=jT&H zLzjxh+2eiSBGL6%zTx;`-|^X5lZgB)fe<)+X?Fb4oN=vOB#S_9^MF?4elAJhU2=l& z*r(w}Rp@nnjJR*3g9q1HfM~RFQTDQ*F z9wCxywbG+f|21n`o zojYqvR!;vM`O}i!P_3 zj$1B7!YxvS?g{E@ZxAI2o7pSPLqLkQDeO}&^5Qq&xjrDJ411JEAAR=Zm|xc$#@~GN z&2gpS>Z`AAP)4A`M(j#$;bTTasiu>{@4UXV#-#3@J2!{IPI1weHgQlFRckcfqAr_)P&m_JgoJ-z0B2cJiKtU4Euq|fq; zYh#uT_*&Y&qXeTbDIgQvcBMeSFDwEDa{}w8H&*OU%!f`p)gzo8-rjTB$*!8`f$%)v z_tZ~+`qQWS?tSpV2k-3>_heIgt^B>e2TV&geepcq?mQfwz_UUn`OiVuHR4N|M z1s|*)1VRCWzz%`Pi{BhL3pWm4%ZDW_mb4a|HyE29tZAQ3`lD0lywXP1-E2{~s&HHL z5GZD$-f|w=Uznp30?_CUq4y5m(mpNJTW8F|1qudRZ0ClKWWtCk@3Z$9UbR#(skczV zTN5D>mAMR4jF)}S9Xj;fQ%^qml=L2VMGs&|)+;1X;g`bpa5wM4RUb`Tg&u{XP#iwR zsX+Y99A`Vj8`7tgSK_u4FJ^QPSFM!oo;7FE{r%~>t}ewBRZ6X!Z@Fc2>r(If6LS1H zTKZ3+jX#5;?u4Q?!g$d{x=ecZ25M@(-hdykayG_QnbklExm>|4SHXz;y!8!rHQ?pN zwFWq58J)Z0_SXd6K*d&;_Gge)jAl`AVp7z5x)s)SQG0y{c{vR7kw+fcXPHO6 zjk=QMz2FfW8&N$b%&-#7W4p~0S;eWxiXmvO9RUU}dXl zG8qpR4e;z@Hc)NiO^0HcsXr!Oy0ZDnrN)28&HvZGGh#LT>R6Hr9l5hYurfD zxeF~GC3(S!l*aixJy`NbqyEz1>5+1&v8JZ6R30%R(Xf(EdS;c;tlp^jbECtG7D<(q z=0+o;$zLq0C&~!&+m4{m>A1$(SeJ$@X{78a^WHuXb%-^NDh~=Te~p2+c2wjH+q6n!PspdTpN3r zkJj@;ZN~2I%cTgh6F5n&I;O-;;i5;uD#9RS$sKavx^9guk^?{WAUV+Cka~<9NMU#p z49g}nkz(bpgsB)acAFe58CBcPn`hCanu?fIwX!51NavQyT_hlR*}XEAbhw&II4!A2 z?jcJ`XV7*=f5!{uaxSKZha6EqeJ!z?0j;gfuQQu`GXs4W4Q+B~22|~PsHv~(J zW!SC?WJ|Z>Eo*2*u+5biGr<`#qwUr9A^Yt!Rcg+MUgP|=hs-bCQW_*a=DBfaxxirJ zwD)3iLSxSOOLqZBj}Sr37ep)pjTL)?LkP4($>c&ElhnEeR4X8Y6_=`f=GN<0E2FO; ze7+~Rnp;dt>P*>};Q^l?zcL$lzw*KnB;D(7z0oSWNE|XGnayj~{$EhKZ*cWXl&(5I zsTB!{I^|9|1oF`l#kwcKgihWn)2ZYFZmcIiBetY;Zu7A%z|NILtaQKl~Tah1CzrT@8 z9zOir<%fUpUS;Zw2+B^oy|9o2%;IYyh2D0Amw0ts&IxLx-92tocUwUb)B$Jiuc`OyS5vcd zQ|XCRdJIBYm3$Y2#-&MoM;UK!Y}0+U^{ugWYol?$rmYG`>cTZXy;4$cG`6qBXxhPF zXXm=6rvCoZpfk^$;o$7*a#qhz_xCq7ty_L@E#%@|udV!RLcB66h(c2pibdINN-CUVTp)MWCV&X#i{2DilZz(PsN^4fB%64vL86`zyq?I zH4#8znVUmiE!vfQS#kFSt>0HuD;CX^D$Wwqk}?<<2an)E=qQ)v!E}0j9A}B(H3KJB z*X5>e?7BGAu{txl(FhI<6pLdhof;cEI&QiNm-OJ9Ykfykk!=$rb*tYVZMy25@o_ce zrxF*eTK~}2TyW8vVaq7mi-#W#$xzv=_IJ^mLUq;g&`S;BpQUK~_doNDS!6~e^x6ze z=Teb&h__zZJQj4Yun+(>$O%`yLQyN&JU4BqRu zO{2!ekHDjgNx=!io};aTcA&giru5hmBs@_*J4+sB=@n=zlwv8NI_lzTF87_F#}sg# zN=5ExG<)1z$SESByA|N@#&){^xa;ku86X`Jzo?@b6@7EZ`Yq^cO5!~@S;Fuf4(TPo z=w*vzCr+FgD*}4ry@W+8m2#yM0_9XdBmlMSC6Iy*8lk=KyLwY)&khbAUV+$iadi2IGYp@+OK z-7i|r%0j%W1`H6ufEsk?cKaxmJflYeVQjxfBaFqy7CnzfCa(?F)%ijEmjgZe_+*Nj!1eKXfUuLHk5nA$1g}B-#+}pQ%^kc#Qx`B zIez^3OZ#uGe6u~i|0O0eM_)Yf^pi~1_rLbeV2US4P9Hz?#P{w?-1qo%uUN$6E#|A3<7z zZ=RZxs}(;geujGj1O4pO#KaWMHk(C<>8~kFUYeORXw6CienSlv3q_0)nrl8Ccbv`O z87;4KIZJf0xq^b_$tt_0D?a9AKT17;yGlP5gf^PM_U$RR=?9lV2-N02&y* zlpa2d&1f)_FV?T`JU?=2wq%3}CpR?#-zhLP(Rh=mepMtSNIYAhA+ox; zx!zxz9Qqy8*LN1;c3drZ=fnsD@@RT;Y-nI$U~171HP_mkPyFsU!|BjeUJb62h4dn= z>(TqHTjeWGjSn@%YH~9My6DA~?;T4m82@)Q+eo#o_eN}b`VS;Q8n>D>Aijy(OVd zK=BiC-@%tpLX@eTR=>7m#Q0PP1l=AekBy9v=kily86G-|UYZm`4%J;tt>Jd2>jN*n z^wPN*`>Ljf1`jan5cfM#m!CcBKbt95@{`mZh-d`);F-w=@d z8ktiYnrlOKpSrbh+Ac9M7%n>P73 zAtBd?&_J2RSel1_h5qp^`o~x4A76=K&5x1m&bKUZ(c!Z74`xj z9^vB1t9_66R9)129`7T-i|Lu!{z%^&aN0Ne?)e$UmEqx6_y1(i?gzjB^QT{eH@(=m z?+4%CV{u*$UreSA0^MII#2e-q#K{;DIOgU+zGY_=LW}CYxLzx2Bt@d*O!jU!E#GCd z@xr5!r@`&{5G}|vjfiHCjA6L2Gc&SPq$K5v;_}!jCqoV-Xd*e)_?kSgroMP{J})n$ zz`Tqh)yKex)(E~$EE%Jtok7Q(wwp&&!H@M!1~9J62MR`(Z=;o*g-f()!4vl6(z!`{ z#GcPguUTV*$TMx7)9omk$xxwUL*x8b{l<-#-l}*&_ANS{kxdlt1T`v%I0iV?!GUD0 z#Ft)WevRU7kNb0B>_z%UHb&nr~z@s|I5+zmiLhMhTFGMAkWVw#H6>E@C=Uvx0k` z^${j-Rc*IO>3U2w7na_H4(w1Q>`UB!p{3;lVj?b9tBu{3TzE5dCg}Z}p)daOI-`&{7~fio==86cY!>AmTienJ{o<#r|sj>=XBdo_%K+}|pfS3V}URz7B6 zfn7n+X5avmwB9?kW=97GL_3IwqdvgItGQXCV$zY#V{>!s@?D-(ctUQhe8{4nKZAO{ z1oenk{!YsEIYm`AUrBr^Ml5_DKWU7qJy#xM%2$ms^$eRyYM&&|)Sk^(5@(9xeU|7l zpD5PUp3PShYbugXN3JB^)Sk^(5^pNi*_pbsm{Yq=t--Cd`k&D1e@LtU8(MuQt-jg= zKXW_Xn9a+G*TUU2!t^ZQ2jFtw+l^4Sn5ea(0~ho$0t1A@X}1lzo8Zr0w_5_9 z5DtLk31Eh@(q#^k9E{Z_;Gej;cz)s6Clfv_KQ_dB=FPYdg8mVwdK;r-qE;jBjBq$j zLL%bT0|Q=>#}*Iri_UDX|4b`Vj)VtG7eXEDE}S2pDRgzk#ibf~6O6IM1k*cZE@wuE zJ{$Lz5kPR@N}?zmF*>GU+4BxxBo<4apLIkKE$S^CcPq2^JF(VP*RAAzBoQO z_%<`bb7r*YYc_0X!KmxYWPDmGr7cMe*U~EM;4iV*is%eEb9S3UL9eRf;G+|TLiPfa zS9VU|?a;e0DS#+s1F;Oz~!hE{m@Osc9pwZS6LC6EY2F-0Nrsrkqf$BpH zoqq5(C*MAO1~K*6v-{BHeyj4$PRxD?D=yJb3TY?Q@$p{d-|E&Hau+AkTedg5b4cG8FN#_hENV6@ z6t72(z|RgGdE?#TDRE^X1H@`+fx4s0%;}@AzWB<^2gQ+9dnikr7+s?>l3X}X?--t| z1ftQiXQnE3_)>1VW()0q%k8&|DJWSeB#pMuY-(?CE*9r9SrL@;>GWyn{Pg%Fk@o|U zYya&|TwHCpZCZ+@+D;2reJli3aTP7NA_~{NE240%=(O*};|jCKK^ZfvkIN)TTakX<%9vft2Co&dyW+0peqXmTiWl8ax?o{tG%tcJ zrPFR@c-Zo}`wS(%1DgE|G0vJx zd-!|y;=!0Xjlf)~#D!f5UL)3vSm!-i0{jax?Gco8fAj9tlo21xE~5aAdkkz8S7}3hRM=&zzcqY2x8K8*SRl@s73O0wC#HaB9=p&AbB!UybsoJ&U#{IkP=g+sb8OurT z#P_vpeeVjbc|kg&c}g_nv}nl@_ZV~m)KS}P@Wqo z4@#bLftY?s;}tPs+no+DNhosd8uGg69YL!w?KhQ_X27G~+V4K`%;D3?OGQy_4|6BFa(N@ad* zEUS2G>*^XBSa)lc5oZpakQbps6=kPH*6MAHG&cB()5#;R;G{C08Xcc=1f$p8sFWQ+ zg8(=UtgjPo42R2zJfq{Ia!jY~AUxa`F3nYftH8L%b>Hfidhj7*BLoXq=PnwJBbO#5 z;66%y4U1BJ9RhSyLpWR-8Cl{uRa`63GU#jx*P01AB$j*;8(m#pulu#f?zw0GGlPR> ziQ|s0u8|SU;W!GQNzbB+H`K|=Ue`6pUk`>d(_0N-3!zY%Kq`i7VEwkqnQ-K!0kD@q zBiJ~sR{8?1^tZIq7h^>8jM>;32QkkU#rx2P5)uKaBCdDn@mK=;K*=a%Yq^Gk9cWxSuUh>j(F5%XL z#Knk)gL=a435qGEKIrK+btyFZ5~o4=10SsZncARMF;8P63dpKLk#%};qBt`>J%a(L zFnW4atIImw*}P690Yc2%lr(srY+B+b$+|t9a-o@pu-PmIYjN2X=c|Fyg)4exA~~Tm zSv-1F&8l@#S>cJfl;d=IU6^o-9=rC+#nzi!FA{XoRW9AQdg##5>ZNp-b4z=yIA1OG z59WH#7mfO+2ZJ&Bl<(qe>a5omuCYA`(k=Xmf zuV#w^I$8oJgqJAwBy@RlAVp461OFQU`Zp?H^;r~qj626HitVl>xSY3-f?sPF6E~c4Z#p$>`j<6%0b_lIX1q!_`QR>QX-A#Hrd7UyG z^~PdD1QN)GqeqnH$YupKNI}X^U84S=GZVgpt9k(v3c;&V6*hGYM+vRASu58 zdn;4Y9I6-3bIRsqW-t_!bGh~h%86(wmKn5_w0xZC9VNqg&BdduG-BY|+$GJhA78y~ z%$oiGC#d1SevorrDc2HCw>0vYW6sBNt+?IhTr3#QkK|dczmI3JavUqOaO@V5soVX@ z8CTpst~HcQRq#i%E@{Npk7HfJ+Pd*+`T*O$m)a*P(w4Lr}(*I zmQjdpfpDg{L4z&i@;$pyS+ektKZ3O?l^PtJ#_=o0$_jGzKDdEsRlo+Lo3Y`@fDnOZ zK#UN*{z1%Iu^6ksDc*Dxb$~#=&))#b z*U=f}UD=oFmAuPpYO<=8NTq_tSw_vc6?eEf>~LdR*4)ci^GZHFoOW=D8_QSU_pCCQ za19>*r|*9EyZ>|;fs-O&y5rcpBu?8LKE>Cyt*cwZEL^K}i{vdfFekaF%I-ASk{wK? z-7DSpp<~`_ago}wqsJcIFmsC2=br~ft3U~MGa{m#%SPNusKse|-^TDy2la@*nyUPF z<-0s7sj-?B$DKUqIHVlnw0cx9tXb!BRy}|3E{`rpK`QQ2lrD8v@w4%>cv`D+0N4e zcA3eFXYnuWG44uATR205V*3xgUDmB|cXLo&9G(246A%0yAb`ODt3TpN>lwv-M&)Q% zyKR5Ibk$~FwVPKTFw=`EilTMPQ-jOtJNZrxnn#uQ2WZV61!suM%I)I0YP~zijqCHD z|MK0+#xKZmn=E;(?D)bLzVbEYW?3p&xsBr%W#`ww{H6blKA8l~UrP#BI#%6TSEV+j z4rTMIw^J*d(B<99`q*Dr?o)49cW}*mM(S6rDIm7-jM+;r#Jt!vgY(!>iplaes+TQsH}#o zveK~iX{|}75|dn24ztT=_1ayWKh55?;u^K8{FwcZm#*3Pw6RhbZNiz%=&Y!La%QCi zhrkD2g%7Ldr(BhM-)K`XP?1?y^m zN7{!c%kTb1`8I7Lzn9!8N{n6NiT*40o$PnAf0JKHyc@;LkGx4* zL^MExX%laJp<9lt|MF(JyYdNPH}Y$p-E1|_8uJ + + + + com.apple.security.app-sandbox + + com.apple.security.network.client + + + diff --git a/VFontDemoSwiftUI/VFontDemoSwiftUIApp.swift b/VFontDemoSwiftUI/VFontDemoSwiftUIApp.swift new file mode 100644 index 0000000..f258ccd --- /dev/null +++ b/VFontDemoSwiftUI/VFontDemoSwiftUIApp.swift @@ -0,0 +1,17 @@ +// +// VFontDemoSwiftUIApp.swift +// VFontDemoSwiftUI +// +// Created by Maxim Skorynin on 27.04.2022. +// + +import SwiftUI + +@main +struct VFontDemoSwiftUIApp: App { + var body: some Scene { + WindowGroup { + ContentView() + } + } +}