Title: [228877] trunk
Revision
228877
Author
[email protected]
Date
2018-02-21 09:34:45 -0800 (Wed, 21 Feb 2018)

Log Message

[Cocoa] Make system-ui obey the user-installed-font policy
https://bugs.webkit.org/show_bug.cgi?id=182860
<rdar://problem/36158249>

Reviewed by Antti Koivisto.

Source/WebCore:

We have a completely different codepath for system-ui which makes it follow the system's
font cascade list. This codepath (along with all the other relevant places which create
system fonts) needs to obey the AllowUserInstalledFonts enum. This patch is fairly
mechanical; we simply are hooking up the flag across SystemFontDatabase.

There are a few places which creates system fonts which this patch doesn't touch. This is
not a problem because all the remaining places either:
1) Simply pull out some attributes of the font (name, weight, size, etc.) and then throw
away the font object itself, or
2) Use the font in an environment where script cannot access the characters rendered (such
as DragImages or the fullscreen placeholder view or the inside of the attachment element).

Test: fast/text/user-installed-fonts/system-ui.html

* platform/graphics/cocoa/FontCacheCoreText.cpp:
(WebCore::FontDatabase::collectionForFamily):
(WebCore::FontDatabase::fontForPostScriptName):
(WebCore::fontWithFamily):
(WebCore::installedFontMandatoryAttributes):
(WebCore::createSpecificFontForInstalledFonts):
* platform/graphics/cocoa/FontCacheCoreText.h:
* platform/graphics/cocoa/FontDescriptionCocoa.cpp:
(WebCore::SystemFontDatabase::CoreTextCascadeListParameters::operator== const):
(WebCore::SystemFontDatabase::CoreTextCascadeListParameters::hash const):
(WebCore::SystemFontDatabase::systemFontCascadeList):
(WebCore::SystemFontDatabase::removeCascadeList):
(WebCore::SystemFontDatabase::computeCascadeList):
(WebCore::systemFontParameters):
(WebCore::systemFontCascadeList):
(WebCore::FontCascadeDescription::effectiveFamilyCount const):
(WebCore::FontCascadeDescription::effectiveFamilyAt const):
* platform/graphics/ios/FontCacheIOS.mm:
(WebCore::platformFontWithFamilySpecialCase):
* platform/graphics/mac/FontCacheMac.mm:
(WebCore::platformFontWithFamilySpecialCase):

Tools:

Create a font, FakeHelvetica-ArmenianCharacter.ttf, which supports a particular Armenian
character which isn't isn't supported by any other font on the system.

* WebKitTestRunner/FakeHelvetica-ArmenianCharacter.ttf:
* WebKitTestRunner/WebKitTestRunner.xcodeproj/project.pbxproj:

LayoutTests:

FakeHelvetica-ArmenianCharacter.ttf is a font which supports a particular Armenian character which
isn't supported by any other font on the system. Installing this font will cause it to be added to
the 'system-ui' font cascade list. When we disable user-installed-fonts, this font should not be
used to render the character.

* fast/text/user-installed-fonts/system-ui-expected-mismatch.html:
* fast/text/user-installed-fonts/system-ui.html:

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (228876 => 228877)


--- trunk/LayoutTests/ChangeLog	2018-02-21 17:08:45 UTC (rev 228876)
+++ trunk/LayoutTests/ChangeLog	2018-02-21 17:34:45 UTC (rev 228877)
@@ -1,3 +1,19 @@
+2018-02-21  Myles C. Maxfield  <[email protected]>
+
+        [Cocoa] Make system-ui obey the user-installed-font policy
+        https://bugs.webkit.org/show_bug.cgi?id=182860
+        <rdar://problem/36158249>
+
+        Reviewed by Antti Koivisto.
+
+        FakeHelvetica-ArmenianCharacter.ttf is a font which supports a particular Armenian character which
+        isn't supported by any other font on the system. Installing this font will cause it to be added to
+        the 'system-ui' font cascade list. When we disable user-installed-fonts, this font should not be
+        used to render the character.
+
+        * fast/text/user-installed-fonts/system-ui-expected-mismatch.html:
+        * fast/text/user-installed-fonts/system-ui.html:
+
 2018-02-20  Nan Wang  <[email protected]>
 
         AX: Keyboard focus not following VoiceOver cursor into web content or within web content.

Added: trunk/LayoutTests/fast/text/user-installed-fonts/system-ui-expected-mismatch.html (0 => 228877)


--- trunk/LayoutTests/fast/text/user-installed-fonts/system-ui-expected-mismatch.html	                        (rev 0)
+++ trunk/LayoutTests/fast/text/user-installed-fonts/system-ui-expected-mismatch.html	2018-02-21 17:34:45 UTC (rev 228877)
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<script>
+if (window.testRunner)
+    testRunner.installFakeHelvetica("ArmenianCharacter");
+</script>
+</head>
+<body>
+<div style="font: 48px 'Helvetica2';">&#x58d;</div>
+</html>

Added: trunk/LayoutTests/fast/text/user-installed-fonts/system-ui.html (0 => 228877)


--- trunk/LayoutTests/fast/text/user-installed-fonts/system-ui.html	                        (rev 0)
+++ trunk/LayoutTests/fast/text/user-installed-fonts/system-ui.html	2018-02-21 17:34:45 UTC (rev 228877)
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<script>
+if (window.internals)
+    internals.settings.setShouldAllowUserInstalledFonts(false);
+if (window.testRunner)
+    testRunner.installFakeHelvetica("ArmenianCharacter");
+</script>
+</head>
+<body>
+<div style="font: 48px 'system-ui';">&#x58d;</div>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (228876 => 228877)


--- trunk/Source/WebCore/ChangeLog	2018-02-21 17:08:45 UTC (rev 228876)
+++ trunk/Source/WebCore/ChangeLog	2018-02-21 17:34:45 UTC (rev 228877)
@@ -1,3 +1,47 @@
+2018-02-21  Myles C. Maxfield  <[email protected]>
+
+        [Cocoa] Make system-ui obey the user-installed-font policy
+        https://bugs.webkit.org/show_bug.cgi?id=182860
+        <rdar://problem/36158249>
+
+        Reviewed by Antti Koivisto.
+
+        We have a completely different codepath for system-ui which makes it follow the system's
+        font cascade list. This codepath (along with all the other relevant places which create
+        system fonts) needs to obey the AllowUserInstalledFonts enum. This patch is fairly
+        mechanical; we simply are hooking up the flag across SystemFontDatabase.
+
+        There are a few places which creates system fonts which this patch doesn't touch. This is
+        not a problem because all the remaining places either:
+        1) Simply pull out some attributes of the font (name, weight, size, etc.) and then throw
+        away the font object itself, or
+        2) Use the font in an environment where script cannot access the characters rendered (such
+        as DragImages or the fullscreen placeholder view or the inside of the attachment element).
+
+        Test: fast/text/user-installed-fonts/system-ui.html
+
+        * platform/graphics/cocoa/FontCacheCoreText.cpp:
+        (WebCore::FontDatabase::collectionForFamily):
+        (WebCore::FontDatabase::fontForPostScriptName):
+        (WebCore::fontWithFamily):
+        (WebCore::installedFontMandatoryAttributes):
+        (WebCore::createSpecificFontForInstalledFonts):
+        * platform/graphics/cocoa/FontCacheCoreText.h:
+        * platform/graphics/cocoa/FontDescriptionCocoa.cpp:
+        (WebCore::SystemFontDatabase::CoreTextCascadeListParameters::operator== const):
+        (WebCore::SystemFontDatabase::CoreTextCascadeListParameters::hash const):
+        (WebCore::SystemFontDatabase::systemFontCascadeList):
+        (WebCore::SystemFontDatabase::removeCascadeList):
+        (WebCore::SystemFontDatabase::computeCascadeList):
+        (WebCore::systemFontParameters):
+        (WebCore::systemFontCascadeList):
+        (WebCore::FontCascadeDescription::effectiveFamilyCount const):
+        (WebCore::FontCascadeDescription::effectiveFamilyAt const):
+        * platform/graphics/ios/FontCacheIOS.mm:
+        (WebCore::platformFontWithFamilySpecialCase):
+        * platform/graphics/mac/FontCacheMac.mm:
+        (WebCore::platformFontWithFamilySpecialCase):
+
 2018-02-21  Chris Dumez  <[email protected]>
 
         Unreviewed attempt to fix build after r228867.

Modified: trunk/Source/WebCore/platform/graphics/cocoa/FontCacheCoreText.cpp (228876 => 228877)


--- trunk/Source/WebCore/platform/graphics/cocoa/FontCacheCoreText.cpp	2018-02-21 17:08:45 UTC (rev 228876)
+++ trunk/Source/WebCore/platform/graphics/cocoa/FontCacheCoreText.cpp	2018-02-21 17:34:45 UTC (rev 228877)
@@ -893,7 +893,7 @@
             CFDictionaryAddValue(attributes.get(), kCTFontFamilyNameAttribute, familyNameString.get());
             addAttributesForInstalledFonts(attributes.get(), m_allowUserInstalledFonts);
             auto fontDescriptorToMatch = adoptCF(CTFontDescriptorCreateWithAttributes(attributes.get()));
-            RetainPtr<CFSetRef> mandatoryAttributes = installedFontMandatoryAttributes(m_allowUserInstalledFonts);
+            auto mandatoryAttributes = installedFontMandatoryAttributes(m_allowUserInstalledFonts);
             if (auto matches = adoptCF(CTFontDescriptorCreateMatchingFontDescriptors(fontDescriptorToMatch.get(), mandatoryAttributes.get()))) {
                 auto count = CFArrayGetCount(matches.get());
                 Vector<InstalledFont> result;
@@ -923,7 +923,7 @@
             CFDictionaryAddValue(attributes.get(), nameAttribute, postScriptNameString.get());
             addAttributesForInstalledFonts(attributes.get(), m_allowUserInstalledFonts);
             auto fontDescriptorToMatch = adoptCF(CTFontDescriptorCreateWithAttributes(attributes.get()));
-            RetainPtr<CFSetRef> mandatoryAttributes = installedFontMandatoryAttributes(m_allowUserInstalledFonts);
+            auto mandatoryAttributes = installedFontMandatoryAttributes(m_allowUserInstalledFonts);
             auto match = adoptCF(CTFontDescriptorCreateMatchingFontDescriptor(fontDescriptorToMatch.get(), mandatoryAttributes.get()));
             return InstalledFont(match.get());
         }).iterator->value;
@@ -1201,7 +1201,7 @@
 
     const auto& request = fontDescription.fontSelectionRequest();
     FontLookup fontLookup;
-    fontLookup.result = platformFontWithFamilySpecialCase(family, request, size);
+    fontLookup.result = platformFontWithFamilySpecialCase(family, request, size, fontDescription.shouldAllowUserInstalledFonts());
     if (!fontLookup.result)
         fontLookup = platformFontLookupWithFamily(family, request, size, fontDescription.shouldAllowUserInstalledFonts());
     return preparePlatformFont(fontLookup.result.get(), fontDescription, fontFaceFeatures, fontFaceVariantSettings, fontFaceCapabilities, size, !fontLookup.createdFromPostScriptName);
@@ -1428,6 +1428,28 @@
 #endif
 }
 
+RetainPtr<CTFontRef> createFontForInstalledFonts(CTFontDescriptorRef fontDescriptor, CGFloat size, AllowUserInstalledFonts allowUserInstalledFonts)
+{
+    auto attributes = adoptCF(CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks));
+    addAttributesForInstalledFonts(attributes.get(), allowUserInstalledFonts);
+    if (CFDictionaryGetCount(attributes.get())) {
+        auto resultFontDescriptor = adoptCF(CTFontDescriptorCreateCopyWithAttributes(fontDescriptor, attributes.get()));
+        return adoptCF(CTFontCreateWithFontDescriptor(resultFontDescriptor.get(), size, nullptr));
+    }
+    return adoptCF(CTFontCreateWithFontDescriptor(fontDescriptor, size, nullptr));
+}
+
+RetainPtr<CTFontRef> createFontForInstalledFonts(CTFontRef font, AllowUserInstalledFonts allowUserInstalledFonts)
+{
+    auto attributes = adoptCF(CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks));
+    addAttributesForInstalledFonts(attributes.get(), allowUserInstalledFonts);
+    if (CFDictionaryGetCount(attributes.get())) {
+        auto modification = adoptCF(CTFontDescriptorCreateWithAttributes(attributes.get()));
+        return adoptCF(CTFontCreateCopyWithAttributes(font, CTFontGetSize(font), nullptr, modification.get()));
+    }
+    return font;
+}
+
 void addAttributesForWebFonts(CFMutableDictionaryRef attributes, AllowUserInstalledFonts allowUserInstalledFonts)
 {
 #if CAN_DISALLOW_USER_INSTALLED_FONTS
@@ -1451,8 +1473,8 @@
     }
 #else
     UNUSED_PARAM(allowUserInstalledFonts);
+    return nullptr;
 #endif
-    return nullptr;
 }
 
 Ref<Font> FontCache::lastResortFallbackFont(const FontDescription& fontDescription)

Modified: trunk/Source/WebCore/platform/graphics/cocoa/FontCacheCoreText.h (228876 => 228877)


--- trunk/Source/WebCore/platform/graphics/cocoa/FontCacheCoreText.h	2018-02-21 17:08:45 UTC (rev 228876)
+++ trunk/Source/WebCore/platform/graphics/cocoa/FontCacheCoreText.h	2018-02-21 17:34:45 UTC (rev 228877)
@@ -52,11 +52,13 @@
 
 RetainPtr<CTFontRef> preparePlatformFont(CTFontRef, const FontDescription&, const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings, FontSelectionSpecifiedCapabilities fontFaceCapabilities, float size, bool applyWeightWidthSlopeVariations = true);
 SynthesisPair computeNecessarySynthesis(CTFontRef, const FontDescription&, bool isPlatformFont = false);
-RetainPtr<CTFontRef> platformFontWithFamilySpecialCase(const AtomicString& family, FontSelectionRequest, float size);
+RetainPtr<CTFontRef> platformFontWithFamilySpecialCase(const AtomicString& family, FontSelectionRequest, float size, AllowUserInstalledFonts);
 RetainPtr<CTFontRef> platformFontWithFamily(const AtomicString& family, FontSelectionRequest, TextRenderingMode, float size);
 bool requiresCustomFallbackFont(UChar32 character);
 FontSelectionCapabilities capabilitiesForFontDescriptor(CTFontDescriptorRef);
 void addAttributesForInstalledFonts(CFMutableDictionaryRef attributes, AllowUserInstalledFonts);
+RetainPtr<CTFontRef> createFontForInstalledFonts(CTFontDescriptorRef, CGFloat size, AllowUserInstalledFonts);
+RetainPtr<CTFontRef> createFontForInstalledFonts(CTFontRef, AllowUserInstalledFonts);
 void addAttributesForWebFonts(CFMutableDictionaryRef attributes, AllowUserInstalledFonts);
 RetainPtr<CFSetRef> installedFontMandatoryAttributes(AllowUserInstalledFonts);
 

Modified: trunk/Source/WebCore/platform/graphics/cocoa/FontDescriptionCocoa.cpp (228876 => 228877)


--- trunk/Source/WebCore/platform/graphics/cocoa/FontDescriptionCocoa.cpp	2018-02-21 17:08:45 UTC (rev 228876)
+++ trunk/Source/WebCore/platform/graphics/cocoa/FontDescriptionCocoa.cpp	2018-02-21 17:34:45 UTC (rev 228877)
@@ -65,6 +65,7 @@
                 && locale == other.locale
                 && weight == other.weight
                 && size == other.size
+                && allowUserInstalledFonts == other.allowUserInstalledFonts
                 && italic == other.italic;
         }
 
@@ -76,6 +77,7 @@
             hasher.add(locale.isNull() ? 0 : locale.existingHash());
             hasher.add(weight);
             hasher.add(size);
+            hasher.add(static_cast<unsigned>(allowUserInstalledFonts));
             hasher.add(italic);
             return hasher.hash();
         }
@@ -96,6 +98,7 @@
         AtomicString locale;
         CGFloat weight { 0 };
         float size { 0 };
+        AllowUserInstalledFonts allowUserInstalledFonts { AllowUserInstalledFonts::No };
         bool italic { false };
     };
 
@@ -116,8 +119,8 @@
             if (clientUse == ClientUse::ForSystemUI) {
                 systemFont = adoptCF(CTFontCreateUIFontForLanguage(kCTFontUIFontSystem, parameters.size, localeString.get()));
                 ASSERT(systemFont);
-                // FIXME: Use applyWeightAndItalics() in both cases once <rdar://problem/33046041> is fixed.
-                systemFont = applyWeightAndItalics(systemFont.get(), parameters.weight, parameters.italic, parameters.size);
+                // FIXME: Use applyWeightItalicsAndFallbackBehavior() in both cases once <rdar://problem/33046041> is fixed.
+                systemFont = applyWeightItalicsAndFallbackBehavior(systemFont.get(), parameters.weight, parameters.italic, parameters.size, parameters.allowUserInstalledFonts);
             } else {
 #if PLATFORM(IOS)
                 ASSERT(clientUse == ClientUse::ForTextStyle);
@@ -125,7 +128,7 @@
                 CTFontSymbolicTraits traits = (parameters.weight >= kCTFontWeightSemibold ? kCTFontTraitBold : 0) | (parameters.italic ? kCTFontTraitItalic : 0);
                 if (traits)
                     fontDescriptor = adoptCF(CTFontDescriptorCreateCopyWithSymbolicTraits(fontDescriptor.get(), traits, traits));
-                systemFont = adoptCF(CTFontCreateWithFontDescriptor(fontDescriptor.get(), parameters.size, nullptr));
+                systemFont = createFontForInstalledFonts(fontDescriptor.get(), parameters.size, parameters.allowUserInstalledFonts);
 #else
                 ASSERT_NOT_REACHED();
 #endif
@@ -147,7 +150,7 @@
     {
     }
 
-    static RetainPtr<CTFontRef> applyWeightAndItalics(CTFontRef font, CGFloat weight, bool italic, float size)
+    static RetainPtr<CTFontRef> applyWeightItalicsAndFallbackBehavior(CTFontRef font, CGFloat weight, bool italic, float size, AllowUserInstalledFonts allowUserInstalledFonts)
     {
         auto weightNumber = adoptCF(CFNumberCreate(kCFAllocatorDefault, kCFNumberCGFloatType, &weight));
         const float systemFontItalicSlope = 0.07;
@@ -156,9 +159,9 @@
         CFTypeRef traitsKeys[] = { kCTFontWeightTrait, kCTFontSlantTrait, kCTFontUIFontDesignTrait };
         CFTypeRef traitsValues[] = { weightNumber.get(), italicsNumber.get(), kCFBooleanTrue };
         auto traitsDictionary = adoptCF(CFDictionaryCreate(kCFAllocatorDefault, traitsKeys, traitsValues, WTF_ARRAY_LENGTH(traitsKeys), &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks));
-        CFTypeRef modificationKeys[] = { kCTFontTraitsAttribute };
-        CFTypeRef modificationValues[] = { traitsDictionary.get() };
-        auto attributes = adoptCF(CFDictionaryCreate(kCFAllocatorDefault, modificationKeys, modificationValues, WTF_ARRAY_LENGTH(modificationKeys), &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks));
+        auto attributes = adoptCF(CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks));
+        CFDictionaryAddValue(attributes.get(), kCTFontTraitsAttribute, traitsDictionary.get());
+        addAttributesForInstalledFonts(attributes.get(), allowUserInstalledFonts);
         auto modification = adoptCF(CTFontDescriptorCreateWithAttributes(attributes.get()));
         return adoptCF(CTFontCreateCopyWithAttributes(font, size, nullptr, modification.get()));
     }
@@ -241,7 +244,7 @@
 }
 #endif
 
-static inline SystemFontDatabase::CoreTextCascadeListParameters systemFontParameters(const FontCascadeDescription& description, const AtomicString& familyName, SystemFontDatabase::ClientUse clientUse)
+static inline SystemFontDatabase::CoreTextCascadeListParameters systemFontParameters(const FontCascadeDescription& description, const AtomicString& familyName, SystemFontDatabase::ClientUse clientUse, AllowUserInstalledFonts allowUserInstalledFonts)
 {
     SystemFontDatabase::CoreTextCascadeListParameters result;
     result.locale = description.locale();
@@ -279,6 +282,8 @@
         result.fontName = familyName;
     }
 
+    result.allowUserInstalledFonts = allowUserInstalledFonts;
+
     return result;
 }
 
@@ -287,9 +292,9 @@
     SystemFontDatabase::singleton().clear();
 }
 
-static inline Vector<RetainPtr<CTFontDescriptorRef>> systemFontCascadeList(const FontCascadeDescription& description, const AtomicString& cssFamily, SystemFontDatabase::ClientUse clientUse)
+static inline Vector<RetainPtr<CTFontDescriptorRef>> systemFontCascadeList(const FontCascadeDescription& description, const AtomicString& cssFamily, SystemFontDatabase::ClientUse clientUse, AllowUserInstalledFonts allowUserInstalledFonts)
 {
-    return SystemFontDatabase::singleton().systemFontCascadeList(systemFontParameters(description, cssFamily, clientUse), clientUse);
+    return SystemFontDatabase::singleton().systemFontCascadeList(systemFontParameters(description, cssFamily, clientUse, allowUserInstalledFonts), clientUse);
 }
 
 unsigned FontCascadeDescription::effectiveFamilyCount() const
@@ -299,10 +304,10 @@
     for (unsigned i = 0; i < familyCount(); ++i) {
         const auto& cssFamily = familyAt(i);
         if (isSystemFontString(cssFamily))
-            result += systemFontCascadeList(*this, cssFamily, SystemFontDatabase::ClientUse::ForSystemUI).size();
+            result += systemFontCascadeList(*this, cssFamily, SystemFontDatabase::ClientUse::ForSystemUI, shouldAllowUserInstalledFonts()).size();
 #if PLATFORM(IOS)
         else if (isUIFontTextStyle(cssFamily))
-            result += systemFontCascadeList(*this, cssFamily, SystemFontDatabase::ClientUse::ForTextStyle).size();
+            result += systemFontCascadeList(*this, cssFamily, SystemFontDatabase::ClientUse::ForTextStyle, shouldAllowUserInstalledFonts()).size();
 #endif
         else
             ++result;
@@ -322,7 +327,7 @@
     for (unsigned i = 0; i < familyCount(); ++i) {
         const auto& cssFamily = familyAt(i);
         if (isSystemFontString(cssFamily)) {
-            auto cascadeList = systemFontCascadeList(*this, cssFamily, SystemFontDatabase::ClientUse::ForSystemUI);
+            auto cascadeList = systemFontCascadeList(*this, cssFamily, SystemFontDatabase::ClientUse::ForSystemUI, shouldAllowUserInstalledFonts());
             if (index < cascadeList.size())
                 return FontFamilySpecification(cascadeList[index].get());
             index -= cascadeList.size();
@@ -329,7 +334,7 @@
         }
 #if PLATFORM(IOS)
         else if (isUIFontTextStyle(cssFamily)) {
-            auto cascadeList = systemFontCascadeList(*this, cssFamily, SystemFontDatabase::ClientUse::ForTextStyle);
+            auto cascadeList = systemFontCascadeList(*this, cssFamily, SystemFontDatabase::ClientUse::ForTextStyle, shouldAllowUserInstalledFonts());
             if (index < cascadeList.size())
                 return FontFamilySpecification(cascadeList[index].get());
             index -= cascadeList.size();

Modified: trunk/Source/WebCore/platform/graphics/ios/FontCacheIOS.mm (228876 => 228877)


--- trunk/Source/WebCore/platform/graphics/ios/FontCacheIOS.mm	2018-02-21 17:08:45 UTC (rev 228876)
+++ trunk/Source/WebCore/platform/graphics/ios/FontCacheIOS.mm	2018-02-21 17:34:45 UTC (rev 228877)
@@ -132,7 +132,7 @@
     return adoptCF(CTFontDescriptorCreateCopyWithAttributes(fontDescriptor.get(), static_cast<CFDictionaryRef>(attributes.get())));
 }
 
-RetainPtr<CTFontRef> platformFontWithFamilySpecialCase(const AtomicString& family, FontSelectionRequest request, float size)
+RetainPtr<CTFontRef> platformFontWithFamilySpecialCase(const AtomicString& family, FontSelectionRequest request, float size, AllowUserInstalledFonts allowUserInstalledFonts)
 {
     // FIXME: See comment in FontCascadeDescription::effectiveFamilyAt() in FontDescriptionCocoa.cpp
     if (family.startsWith("UICTFontTextStyle")) {
@@ -141,18 +141,18 @@
         RetainPtr<CTFontDescriptorRef> fontDescriptor = adoptCF(CTFontDescriptorCreateWithTextStyle(familyNameStr.get(), RenderThemeIOS::contentSizeCategory(), nullptr));
         if (traits)
             fontDescriptor = adoptCF(CTFontDescriptorCreateCopyWithSymbolicTraits(fontDescriptor.get(), traits, traits));
-
-        return adoptCF(CTFontCreateWithFontDescriptor(fontDescriptor.get(), size, nullptr));
+        return createFontForInstalledFonts(fontDescriptor.get(), size, allowUserInstalledFonts);
     }
 
     if (equalLettersIgnoringASCIICase(family, "-webkit-system-font") || equalLettersIgnoringASCIICase(family, "-apple-system") || equalLettersIgnoringASCIICase(family, "-apple-system-font") || equalLettersIgnoringASCIICase(family, "system-ui")) {
-        return adoptCF(CTFontCreateWithFontDescriptor(systemFontDescriptor(request.weight, isFontWeightBold(request.weight), isItalic(request.slope), size).get(), size, nullptr));
+        auto fontDescriptor = systemFontDescriptor(request.weight, isFontWeightBold(request.weight), isItalic(request.slope), size);
+        return createFontForInstalledFonts(fontDescriptor.get(), size, allowUserInstalledFonts);
     }
 
     if (equalLettersIgnoringASCIICase(family, "-apple-system-monospaced-numbers")) {
         RetainPtr<CTFontDescriptorRef> systemFontDescriptor = adoptCF(CTFontDescriptorCreateForUIType(kCTFontUIFontSystem, size, nullptr));
         RetainPtr<CTFontDescriptorRef> monospaceFontDescriptor = adoptCF(CTFontDescriptorCreateCopyWithFeature(systemFontDescriptor.get(), (CFNumberRef)@(kNumberSpacingType), (CFNumberRef)@(kMonospacedNumbersSelector)));
-        return adoptCF(CTFontCreateWithFontDescriptor(monospaceFontDescriptor.get(), size, nullptr));
+        return createFontForInstalledFonts(monospaceFontDescriptor.get(), size, allowUserInstalledFonts);
     }
 
     if (equalLettersIgnoringASCIICase(family, "lastresort")) {

Modified: trunk/Source/WebCore/platform/graphics/mac/FontCacheMac.mm (228876 => 228877)


--- trunk/Source/WebCore/platform/graphics/mac/FontCacheMac.mm	2018-02-21 17:08:45 UTC (rev 228876)
+++ trunk/Source/WebCore/platform/graphics/mac/FontCacheMac.mm	2018-02-21 17:34:45 UTC (rev 228877)
@@ -73,7 +73,7 @@
     return NSFontWeightBlack;
 }
 
-RetainPtr<CTFontRef> platformFontWithFamilySpecialCase(const AtomicString& family, FontSelectionRequest request, float size)
+RetainPtr<CTFontRef> platformFontWithFamilySpecialCase(const AtomicString& family, FontSelectionRequest request, float size, AllowUserInstalledFonts allowUserInstalledFonts)
 {
     // FIXME: See comment in FontCascadeDescription::effectiveFamilyAt() in FontDescriptionCocoa.cpp
     if (equalLettersIgnoringASCIICase(family, "-webkit-system-font") || equalLettersIgnoringASCIICase(family, "-apple-system") || equalLettersIgnoringASCIICase(family, "-apple-system-font") || equalLettersIgnoringASCIICase(family, "system-ui")) {
@@ -85,7 +85,7 @@
             if (auto italicizedFont = adoptCF(CTFontCreateCopyWithSymbolicTraits(result.get(), size, nullptr, desiredTraits, desiredTraits)))
                 result = italicizedFont;
         }
-        return result;
+        return createFontForInstalledFonts(result.get(), allowUserInstalledFonts);
     }
 
     if (equalLettersIgnoringASCIICase(family, "-apple-system-monospaced-numbers")) {
@@ -98,19 +98,23 @@
         RetainPtr<CFDictionaryRef> featureIdentifier = adoptCF(CFDictionaryCreate(kCFAllocatorDefault, featureKeys, featureValues, WTF_ARRAY_LENGTH(featureKeys), &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks));
         CFTypeRef featureIdentifiers[] = { featureIdentifier.get() };
         RetainPtr<CFArrayRef> featureArray = adoptCF(CFArrayCreate(kCFAllocatorDefault, featureIdentifiers, 1, &kCFTypeArrayCallBacks));
-        CFTypeRef attributesKeys[] = { kCTFontFeatureSettingsAttribute };
-        CFTypeRef attributesValues[] = { featureArray.get() };
-        RetainPtr<CFDictionaryRef> attributes = adoptCF(CFDictionaryCreate(kCFAllocatorDefault, attributesKeys, attributesValues, WTF_ARRAY_LENGTH(attributesKeys), &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks));
-
+        auto attributes = adoptCF(CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks));
+        CFDictionaryAddValue(attributes.get(), kCTFontFeatureSettingsAttribute, featureArray.get());
+        addAttributesForInstalledFonts(attributes.get(), allowUserInstalledFonts);
         RetainPtr<CTFontRef> result = toCTFont([NSFont systemFontOfSize:size]);
-        return adoptCF(CTFontCreateCopyWithAttributes(result.get(), size, nullptr, adoptCF(CTFontDescriptorCreateWithAttributes(attributes.get())).get()));
+        auto modification = adoptCF(CTFontDescriptorCreateWithAttributes(attributes.get()));
+        return adoptCF(CTFontCreateCopyWithAttributes(result.get(), size, nullptr, modification.get()));
     }
 
-    if (equalLettersIgnoringASCIICase(family, "-apple-menu"))
-        return toCTFont([NSFont menuFontOfSize:size]);
+    if (equalLettersIgnoringASCIICase(family, "-apple-menu")) {
+        RetainPtr<CTFontRef> result = toCTFont([NSFont menuFontOfSize:size]);
+        return createFontForInstalledFonts(result.get(), allowUserInstalledFonts);
+    }
 
-    if (equalLettersIgnoringASCIICase(family, "-apple-status-bar"))
-        return toCTFont([NSFont labelFontOfSize:size]);
+    if (equalLettersIgnoringASCIICase(family, "-apple-status-bar")) {
+        RetainPtr<CTFontRef> result = toCTFont([NSFont labelFontOfSize:size]);
+        return createFontForInstalledFonts(result.get(), allowUserInstalledFonts);
+    }
 
     if (equalLettersIgnoringASCIICase(family, "lastresort")) {
 #if __MAC_OS_X_VERSION_MIN_REQUIRED >= 101300

Modified: trunk/Tools/ChangeLog (228876 => 228877)


--- trunk/Tools/ChangeLog	2018-02-21 17:08:45 UTC (rev 228876)
+++ trunk/Tools/ChangeLog	2018-02-21 17:34:45 UTC (rev 228877)
@@ -1,3 +1,17 @@
+2018-02-21  Myles C. Maxfield  <[email protected]>
+
+        [Cocoa] Make system-ui obey the user-installed-font policy
+        https://bugs.webkit.org/show_bug.cgi?id=182860
+        <rdar://problem/36158249>
+
+        Reviewed by Antti Koivisto.
+
+        Create a font, FakeHelvetica-ArmenianCharacter.ttf, which supports a particular Armenian
+        character which isn't isn't supported by any other font on the system.
+
+        * WebKitTestRunner/FakeHelvetica-ArmenianCharacter.ttf:
+        * WebKitTestRunner/WebKitTestRunner.xcodeproj/project.pbxproj:
+
 2018-02-20  Timothy Horton  <[email protected]>
 
         Try to fix the 32-bit build after r228857

Added: trunk/Tools/WebKitTestRunner/FakeHelvetica-ArmenianCharacter.ttf (0 => 228877)


--- trunk/Tools/WebKitTestRunner/FakeHelvetica-ArmenianCharacter.ttf	                        (rev 0)
+++ trunk/Tools/WebKitTestRunner/FakeHelvetica-ArmenianCharacter.ttf	2018-02-21 17:34:45 UTC (rev 228877)
@@ -0,0 +1,49 @@
+����������\x80����0OS/2sf\xF8������\xBC������`cmap88\xDE#��������gasp����	����(������glyf0*	\xFD����8����\xA8head\xDBP͵���� \xE0������6hhea
+7����!������$hmtx+����!<����Xloca\xBEԸ7����%\x94����.maxp��	����'\xC4������ name\x8D\xBBX\xEB����'\xE4����*>postc\xA1[#����R$������\xD6\x90������\xBC\x8A������\x8F\xBC\x8A����\xC5��2��������������������\x80����\xAF�� H����������������W3C ��@�� \xFE\xFF \xFF8���� ��\xC8\xFF\xFC����\xFF\xFF  ������ ����������������������������������\xF8����:������:��&��~��\xA0��\xA1��\xA3��\xA4��\xA5��\xA6��\xA7��\xA8��\xA9��\xAA��\xAB��\xAC��\xAD��\xAE��\xAF��\xB0��\xB1��\xB3��\xB4��\xB5��\xB6��\xB7��\xB8��\xB9��\xBA��\xBB��\xBC��\xBD��\xBE��\xBF��\xC0��\xC1��\xC2��\xC3��\xC5��\xC6��\xC7��\xC8��\xC9��\xCA��\xCB��\xCC��\xCF��\xD0��\xD1��\xD2��\xD4��\xD5��\xD6��\xD7��\xD8��\xD9��\xDB��\xDC��\xDD��\xDE��\xDF��\xE0��\xE1��\xE2��\xE3��\xE4��\xE5��\xE6��\xE7��\xE8��\xE9��\xEB��\xEC��\xED��\xEF��\xF0��\xF1��\xF2��\xF3��\xF4��\xF5��\xF6��\xF7��\xF8��\xF9��\xFA��\xFC��\xFD��\xFE��\xFF1Sx\x92\xC6\xC7\xC9\xDA\xDB\xDC\xDD\x94\xA5\xA7\xA9\xBC\x
 C0\x8D   +      " & 0 : D!"!&"""""""""+"H"`"e"\xF2%\xCA0��0N��NN	N]N\x8CN\x94
 QkQmSAV\xD7V\xDBWg(j*l4pk\x91\xD1\xF0\xFE\xFF\xFF\xFF������ ��(��\xA0��\xA1��\xA2��\xA4��\xA5��\xA6��\xA7��\xA8��\xA9��\xAA��\xAB��\xAC��\xAD��\xAE��\xAF��\xB0��\xB1��\xB2��\xB4��\xB5��\xB6��\xB7��\xB8��\xB9��\xBA��\xBB��\xBC��\xBD��\xBE��\xBF��\xC0��\xC1��\xC2��\xC3��\xC4��\xC6��\xC7��\xC8��\xC9��\xCA��\xCB��\xCC��\xCD��\xD0��\xD1��\xD2��\xD3��\xD5��\xD6��\xD7��\xD8��\xD9��\xDA��\xDC��\xDD��\xDE��\xDF��\xE0��\xE1��\xE2��\xE3��\xE4��\xE5��\xE6��\xE7��\xE8��\xE9��\xEA��\xEC��\xED��\xEE��\xF0��\xF1��\xF2��\xF3��\xF4��\xF5��\xF6��\xF7��\xF8��\xF9��\xFA��\xFB��\xFD��\xFE��\xFF1Rx\x92\xC6\xC7\xC9\xD8\xDB\xDC\xDD\x94\xA5\xA7\xA9\xBC\xC0\x8D  	         & 0 9 D!"!&"""""""""+"H"`"d"\xF2%\xCA0��0N��NN	N]N\x8CN\x94QkQmSAV\xD7V\xDBWg(j*l4pk\x91\xD1\xF0��\xFE\xFF\xFF\xFF\xFF\xE3\xFF\xE2\xFF\xF9\xFF\xF4\xFF\xE0\xFF\xFD\xFF\xE9��\xFF\xDD\xFF\xE2\xFF\xDF\xFF\xE6\xFF\xEC\xFF\xEA��\xF
 F\xD9��\xFF\xD1\xFF\xDC��\xFF\xD5\xFF\xDA\xFF\xCF\xFF\xEB����+\xFF\xD7\xFF\xDD������+\xFF\xD5\x
 FF\xDA\xFF\xE4\xFF\xE1\xFF\xD8\xFF\x9D\xFF\xC5\xFF\x9C\xFF\xDF\xFF\x9B\xFF\xDA\xFF\xDB\xFF\xDF\xFF\xDB\xFF\xEE\xFF\x94\xFF\xDC\xFF\xD9\xFF\xC7\xFF\x90\xFF\xEE\xFF\xB4\xFF\xD8\xFF\xD5\xFF\x8B\xFF\xE3\xFF\xE4\xFF\xA7\xFF\x89\xFF\x87\xFF\x88\xFF\x89\xFF\x87\xFF\x88\xFF\xAC\xFF\x87\xFF\x88\xFF\x86\xFF\x87\xFF\x88\xFF\x86\xFF\x87\xFF\xCF\xFF\x86\xFF\x87\xFF\x85\xFF\x86\xFF\x87\xFF\x85\xFF\xA8\xFF\x9B\xFF\x85\xFF\x83\xFF\x84\xFF\xC4\xFF\xC5\xFF\xA1\xFF\x81\xFF|\xFFX\xFF?\xFD\xED\xFD\xF5\xFD\xEC\xFD\xDE\xFD\xE0\xFD\xD8\xFD\xDD\xFD>\xFDo\xFDk\xFD*\xFC\xD3\xFD\xFB\x88\xE0\xF4\xE0\xF2\xE0\xF3\xDF\xFF\xE0\xC2\xE0\x85\xE0\xBD\xE0\xBC\xE0\xBB\xE0\xB8\xE0\xAF\xE0\xA7\xE0\x9E\xDF\xC1߭\xDE\xE2\xDE\xCC\xDE\xD6\xDE\xD5޲މ\xDE\xCD\xDE\xCA޾ޥފއ\xDD\xFB\xDB$\xD0\xFE\xD1\xB3\xB3\xB2\xFA\xB2\xAC\xB2v\xB2q\xAF\x9D\xAF\x99\xADɪ5\xAA)\xA9\xF2\x99\xE7\x96\xE9\x94ڐ\xA2o?\xEF\xF6���������������������������������������������������������������������������������������������������������������������
 ���������������������������������������������������������������������������������������������������������������������
 ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\xFF\xFF������}����k ��������3!%!!}\xEE\xFD\x8F\xF4\xFE \xFC\xE0}&������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!
 !\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8
  ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!
 !\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE
 8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \x
 FC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC
 ������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8����������1!!\xE8\xFC\xC8��������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\x
 FF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8
  ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC����������\xE8 ������!!\xE8\xFC \xFC\xE0������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������
 !!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE
 8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \x
 FC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC
 ������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xF
 F8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE
 8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������
 !!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\
 xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC 
 \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xF
 C������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\
 xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\
 xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\x90\xE8X����
 ��!!\xE8\xFCX\xC8��������\x90\xE8X������!!\xE8\xFCX\xC8������\xC8\xFF8\x90 ������3#\xC8\xC8\xC8 \xFC������\xC8\xFF8\x90
  ������3#\xC8\xC8\xC8 \xFC����������\x80��-j _<\xF5��	\xE8��������\xB3o_Y��������\xC4ݫ$����\xFF8\xE8 ���������������������������� \xFF8����\xE8��������\xE8������������������������������\xE8��}��������\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8��
 ��\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8��
 ��\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8
 ����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8������������\xF4����\xE8����M������\xFA������\xA7������\xC8������d������������\xE8��������������������\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8��
 ��\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8��\xC8\xE8��\xC8��������������!��.��;��H��U��b��o��|��\x89��\x96��\xA3��\xB0��\xBD��\xCA��\xD7��\xE4��\xF1��\xFE%2?LYfs\x80\x8D\x9A\xA7\xB4\xC1\xCE\xDB\xE8\xF5)6CP]jw\x84\x91\x9E\xAB\xB8\xC5\xD2\xDF\xEC\xF9 -:GTan{\x88\x95\xA2\xAF\xBC\xC9\xD6\xE3\xF0\xFD
+#0=JWdq~\x8B\x98\xA5\xB2\xBF\xCC\xD9\xE6\xF3��+'4AN[hu\x82\x8F\x9C\xA9\xB6\xC3\xD0\xDD\xEA\xF7+8ER_ly\x86\x93\xA0\xAD\xBA\xC7\xD4\xE1\xEE\xFB"/<IVcp}\x8A\x97\xA4\xA4\xB1\xBE\xCB\xD8\xE5\xF2\xFF&3@MZgt\x81\x8E\x9B\xA8\xB5\xC2\xCF\xDC\xE9\xF6				*	7	D	Q	^	k	x	\x85	\x92	\x9F	\xAC	\xB9	\xC6	\xD3	\xE0	\xED	\xFA
+
+
+!
+.
+;
+H
+U
+b
+o
+|
+\x89
+\x96
+\xA3
+\xB0
+\xBD
+\xCA
+\xD7
+\xE4
+\xF1
+\xFE%2?LYfs\x80\x8D\x9A\xA7\xB4\xC1\xCE\xDB\xE8\xF5)6CCCCCCCCCCCCCP]jw\x84\x91\x9E\xAB\xB8\xC5\xD2\xDF\xEC\xF9+++ +-+:+G+T��������������������������������������������������������������$\xB6����������������\xF0��������������������\xF0��������������������������������.����������������@����������������T����������������l��������������
+h\x80����������������$\xE8����������������R����������������\xF8^��������������
+V��������������`��������������g��������������
+~��������������\x88��������������
+\x94������������
+����\x9E��������������\x9E��������������)\xB0��������������
+\xD9��������������\xE3��������������
+\xEA����	����\xF0\xF4����	����\xE4����	����\xF8����	����.����	����4����	����H����	����`����	��
+ht����	����$'\xDC����	����R(������	����(R����	����(f����	����(t��T��h��e�� ��A��h��e��m�� ��f��o��n��t�� ��b��e��l��o��n��g��s�� ��t��o�� ��t��h��e�� ��p��u��b��l��i��c�� ��d��o��m��a��i��n��.�� ��I��n�� ��j��u��r��i��s��d��i��c��t��i��o��n��s�� ��t��h��a��t�� ��d��o�� ��n��o��t�� ��r��e��c��o��g��n��i��z��e�� ��p��u��b��l��i��c�� ��d��o��m��a��i��n�� ��o��w��n��e��r��s��h��i��p�� ��o��f�� ��t��h��e��s��e�� ��f��i��l��e��s��,�� ��t��h��e�� ��f��o��l��l��o��w��i��n��g�� ��C��r��e��a��t��i��v��e�� ��C��o��m��m��o��n��s�� ��Z��e��r��o�� ��d��e��c��l��a��r��a��t��i��o��n�� ��a��p��p��l��i��e��s��:�� ��h��t��t��p��:��/��/��l��a��b��s��.��c��r��e��a��t��i��v��e��c��o��m��m��o��n��s��.��o��r��g��/��l��i��c��e��n��s��e��s��/��z��e��r��o��-��w��a��i��v��e��/��1��.��0��/��u��s��/��l��e��g��a��l��c��o��d��e��H��e��l��v��e��t��i��c��a��2��R��e��g��u��l��a��r��V��e��r��s��i��o��n�� ��1��.��5��0�� ��H��e��l��v��e��t��i��c��a��2��H��e��l��v��e��t��i��c��a��2��V��e��r��s��i
 ��o��n�� ��1��.��5��0��H��e��l��v��e��t��i��c��a��2��T��h��e�� ��A��h��e��m�� ��f��o��n��t�� ��w��a��s�� ��d��e��v��e��l��o��p��e��d�� ��b��y�� ��T��o��d��d�� ��F��a��h��r��n��e��r�� ��a��n��d�� ��M��y��l��e��s�� ��C��.�� ��M��a��x��f��i��e��l��d�� ��t��o�� ��h��e��l��p�� ��t��e��s��t�� ��w��r��i��t��e��r��s�� ��d��e��v��e��l��o��p�� ��p��r��e��d��i��c��t��a��b��l��e�� ��t��e��s��t��s��.�� ��T��h��e�� ��u��n��i��t��s�� ��p��e��r�� ��e��m�� ��i��s�� ��1��0��0��0��,�� ��t��h��e�� ��a
 ��d��v��a��n��c��e�� ��i��s�� ��8��0��0��,�� ��a��n��d�� ��t��h��e�� ��d��e��s��c��e��n��t�� ��i��s�� ��2��0��0��,�� ��t��h��e��r��e��b��y�� ��m��a��k��i��n��g�� ��t��h��e�� ��e��m�� ��s��q��u��a��r��e�� ��e��x��a��c��t��l��y�� ��s��q��u��a��r��e��.�� ��T��h��e�� ��g��l��y��p��h��s�� ��f��o��r�� ��m��o��s��t�� ��c��h��a��r��a��c��t��e��r��s�� ��i��s�� ��s��i��m��p��l��y�� ��a�� ��b��o��x�� ��w��h��i��c��h�� ��f��i��l��l��s�� ��t��h��i��s�� ��s��q��u��a��r��e��.�� ��T��h��e�� ��c��o��d��e��p��o��i��n��t��s�� ��m��a��p��p��e��d�� ��t��o�� ��t��h��i��s�� ��f��u��l��l�� ��s��q��u��a��r��e�� ��w��i��t��h�� ��a�� ��f��u��l��l�� ��a��d��v��a��n��c��e�� ��a��r��e�� ��t��h��e�� ��f��o��l��l��o��w��i��n��g�� ��r��a��n��g��e��s��:�� ��U��+��2��0��-��U��+��2��6��,�� ��U��+��2��8��-��U��+��6��F��,�� ��U��+��7��1��-��U��+��7��E��,�� ��U��+��A��0��-��U��+��C��8��,�� ��U��+��C��A��-��U��+��F��F��,�� ��U��+��1��3��1��,�� ��U��+��1��5��2��-��U��+��1��5��3��,�� ��U��+��1��7��8��,�� ��U��+��1��9��2��,�
 � ��U��+��2��C��6��-��U��+��2��C��7��,�� ��U��+��2��C��9��,�� ��U��+��2��D��8��-��U��+��2��D��D��,�� ��U��+��3��9��4��,�� ��U��+��3��A��5��,�� ��U��+��3��A��7��,�� ��U��+��3��A��9��,�� ��U��+��3��B��C��,�� ��U��+��3��C��0��,�� ��U��+��2��0��1��3��-��U��+��2��0��1��4��,�� ��U��+��2��0��1��8��-��U��+��2��0��1��A��,�� ��U��+��2��0��1��C��-��U��+��2��0��1��E��,�� ��U��+��2��0��2��0��-��U��+��2��0��2��2��,�� ��U��+��2��0��2��6��,�� ��U��+��2��0��3��0��,�� ��U��+��2��0��3��9��-��U��+��2��0��3��A��,��
  ��U��+��2��0��4��4��,�� ��U��+��2��1��2��2��,�� ��U��+��2��1��2��6��,�� ��U��+��2��2��0��2��,�� ��U��+��2��2��0��6��,�� ��U��+��2��2��0��F��,�� ��U��+��2��2��1��1��-��U��+��2��2��1��2��,�� ��U��+��2��2��1��9��-��U��+��2��2��1��A��,�� ��U��+��2��2��1��E��,�� ��U��+��2��2��2��B��,�� ��U��+��2��2��4��8��,�� ��U��+��2��2��6��0��,�� ��U��+��2��2��6��4��-��U��+��2��2��6��5��,�� ��U��+��2��2��F��2��,�� ��U��+��2��5��C��A��,�� ��U��+��3��0��0��7��,�� ��U��+��4��E��0��0��,�� ��U��+��4��E��0��3��,�� ��U��+��4��E��0��9��,�� ��U��+��4��E��5��D��,�� ��U��+��4��E��8��C��,�� ��U��+��4��E��9��4��,�� ��U��+��5��1��6��B��,�� ��U��+��5��1��6��D��,�� ��U��+��5��3��4��1��,�� ��U��+��5��6��D��7��,�� ��U��+��5��6��D��B��,�� ��U��+��5��7��1��F��,�� ��U��+��6��7��2��8��,�� ��U��+��6��C��3��4��,�� ��U��+��7��0��6��B��,�� ��U��+��9��1��D��1��,�� ��U��+��F��0��0��0��-��U��+��F��0��0��2��.�� ��T��h��e�� ��c��o��d��e��p��o��i��n��t��s�� ��w��h��i��c��h�� ��a��r��e�� ��m��a��p��p��e��d�� ��t��o�� ��s��o��m��e��t
 ��h��i��n��g�� ��e��l��s��e�� ��a��r��e�� ��t��h��e�� ��f��o��l��l��o��w��i��n��g��:�� ��"�� ��"�� ��(��U��+��2��0��)��:�� ��N��o�� ��p��a��t��h�� ��b��u��t�� ��f��u��l��l�� ��a��d��v��a��n��c��e��;�� ��"��p��"�� ��(��U��+��7��0��)��:�� ��P��a��t��h�� ��h��a��s�� ��0�� ��a��s��c��e��n��t�� ��b��u��t�� ��f��u��l��l�� ��d��e��s��c��e��n��t��;�� ��"��\xC9��"�� ��(��U��+��C��9��)��:�� ��P��a��t��h�� ��h��a��s�� ��0�� ��d��e��s��c��e��n��t�� ��b��u��t��
  ��f��u��l��l�� ��a��s��c��e��n��t��;�� ��N��o��n��-��b��r��e��a��k��i��n��g�� ��s��p��a��c��e�� ��(��U��+��A��0��)��:�� ��N��o�� ��p��a��t��h�� ��b��u��t�� ��f��u��l��l�� ��a��d��v��a��n��c��e��;�� ��Z��e��r��o��-��w��i��d��t��h�� ��n��o��n��-��b��r��e��a��k��i��n��g�� ��s��p��a��c��e�� ��(��U��+��F��E��F��F��)��:�� ��N��o�� ��p��a��t��h�� ��a��n��d�� ��0�� ��a��d��v��a��n��c��e��;�� ��E��n�� ��s��p��a��c��e�� ��(��U��+��2��0��0��2��)��:�� ��N��o�� ��p��a��t��h�� ��a��n��d�� ��h��a��l��f�� ��a��d��v��a��n��c��e��;�� ��E��m�� ��s��p��a��c��e�� ��(��U��+��2��0��0��3��)��:�� ��N��o�� ��p��a��t��h�� ��b��u��t�� ��f��u��l��l�� ��a��d��v��a��n��c��e��;�� ��T��h��r��e��e��-��p��e��r��-��e��m�� ��s��p��a��c��e�� ��(��U��+��2��0��0��4��)��:�� ��N��o�� ��p��a��t��h�� ��a��n��d�� ��o��n��e�� ��t��h��i��r��d�� ��a��d��v��a��n��c��e��;�� ��F��o��u��r��-��p��e��r��-��e��m�� ��s��p��a��c��e�� ��(��U��+��2��0��0��5��)��:�� ��N��o�� ��p��a��t��h�� ��a��n��d�� ��o��n��e�� ��q��u��a��r��t��e��r�� ��a
 ��d��v��a��n��c��e��;�� ��S��i��x��-��p��e��r��-��e��m�� ��s��p��a��c��e�� ��(��U��+��2��0��0��6��)��:�� ��N��o�� ��p��a��t��h�� ��a��n��d�� ��o��n��e�� ��s��i��x��t��h�� ��a��d��v��a��n��c��e��;�� ��T��h��i��n�� ��s��p��a��c��e�� ��(��U��+��2��0��0��9��)��:�� ��N��o�� ��p��a��t��h�� ��a��n��d�� ��o��n��e�� ��f��i��f��t��h�� ��a��d��v��a��n��c��e��;�� ��H��a��i��r�� ��s��p��a��c��e�� ��(��U��+��2��0��0��A��)��:�� ��N��o�� ��p��a��t��h�� ��a��n��d�� ��o��n��e�� ��t��e��n��t��h�� ��a��d��v��a��n
 ��c��e��;�� ��Z��e��r��o�� ��w��i��d��t��h�� ��s��p��a��c��e�� ��(��U��+��2��0��0��B��)��:�� ��N��o�� ��p��a��t��h�� ��a��n��d�� ��n��o�� ��a��d��v��a��n��c��e��;�� ��I��d��e��o��g��r��a��p��h��i��c�� ��s��p��a��c��e�� ��(��U��+��3��0��0��0��)��:�� ��N��o�� ��p��a��t��h�� ��b��u��t�� ��f��u��l��l�� ��a��d��v��a��n��c��e��;�� ��Z��e��r��o�� ��w��i��d��t��h�� ��n��o��n��-��j��o��i��n��e��r�� ��(��U��+��2��0��0��C��)��:�� ��N��o�� ��p��a��t��h�� ��a��n��d�� ��n��o�� ��a��d��v��a��n��c��e��;�� ��Z��e��r��o�� ��w��i��d��t��h�� ��j��o��i��n��e��r�� ��(��U��+��2��0��0��D��)��:�� ��N��o�� ��p��a��t��h�� ��a��n��d�� ��n��o�� ��a��d��v��a��n��c��e��;�� ��G��r��e��e��k�� ��c��a��p��i��t��a��l�� ��l��e��t��t��e��r�� ��C��h��i�� ��(��U��+��3��A��7��)��:�� ��T��h��i��n�� ��h��o��r��i��z��o��n��t��a��l�� ��s��t��r��i��p��e�� ��a��n��d�� ��f��u��l��l�� ��a��d��v��a��n��c��e��;�� ��"j*��"�� ��(��U��+��6��A��2��A��)��:�� ��T��h��i��n�� ��h��o��r��i��z��o��n��t��a��l�� ��s��t��r��i��p��e�� �
 �a��n��d�� ��f��u��l��l�� ��a��d��v��a��n��c��e��;�� ��G��r��e��e��k�� ��c��a��p��i��t��a��l�� ��l��e��t��t��e��r�� ��U��p��s��i��l��o��n�� ��(��U��+��3��A��5��)��:�� ��T��h��i��n�� ��v��e��r��t��i��c��a��l�� ��s��t��r��i��p��e�� ��a��n��d�� ��f��u��l��l�� ��a��d��v��a��n��c��e��;�� ��"~\xB5��"�� ��(��U��+��7��E��B��5��)��:�� ��T��h��i��n�� ��v��e��r��t��i��c��a��l�� ��s��t��r��i��p��e�� ��a��n��d�� ��f��u��l��l�� ��a��d��v��a��n��c��e��.��h��t��t��p��:��/��/��w��w��w��.
 ��w��3��c��.��o��r��g��h��t��t��p��:��/��/��d��e��v��.��w��3��.��o��r��g��/��C��S��S��/��f��o��n��t��s��/��a��h��e��m��/��C��O��P��Y��I��N��G��
+The Ahem font belongs to the public domain. In jurisdictions that do not recognize public domain ownership of these files, the following Creative Commons Zero declaration applies: http://labs.creativecommons.org/licenses/zero-waive/1.0/us/legalcodeHelvetica2RegularVersion 1.50 Helvetica2Helvetica2Version 1.50Helvetica2http://www.w3c.orghttp://dev.w3.org/CSS/fonts/ahem/COPYING
+Helvetica2RegularHelvetica2��T��h��e�� ��A��h��e��m�� ��f��o��n��t�� ��b��e��l��o��n��g��s�� ��t��o�� ��t��h��e�� ��p��u��b��l��i��c�� ��d��o��m��a��i��n��.�� ��I��n�� ��j��u��r��i��s��d��i��c��t��i��o��n��s�� ��t��h��a��t�� ��d��o�� ��n��o��t�� ��r��e��c��o��g��n��i��z��e�� ��p��u��b��l��i��c�� ��d��o��m��a��i��n�� ��o��w��n��e��r��s��h��i��p�� ��o��f�� ��t��h��e��s��e�� ��f��i��l��e��s��,�� ��t��h��e�� ��f��o��l��l��o��w��i��n��g�� ��C��r��e��a��t��i��v��e�� ��C��o��m��m��o��n��s�� ��Z��e��r��o�� ��d��e��c��l��a��r��a��t��i��o��n�� ��a��p��p��l��i��e��s��:�� ��h��t��t��p��:��/��/��l��a��b��s��.��c��r��e��a��t��i��v��e��c��o��m��m��o��n��s��.��o��r��g��/��l��i��c��e��n��s��e��s��/��z��e��r��o��-��w��a��i��v��e��/��1��.��0��/��u��s��/��l��e��g��a��l��c��o��d��e��H��e��l��v��e��t��i��c��a��2��R��e��g��u��l��a��r��V��e��r��s��i��o��n�� ��1��.��5��0�� ��H��e��l��v��e��t��i��c��a��2��H��e��l��v��e��t��i��c��a��2��V��e��r��s��i��o��n�� ��1��.��5��0��H��e��l��v��e��t��i��c��a��2��T��h��e�
 � ��A��h��e��m�� ��f��o��n��t�� ��w��a��s�� ��d��e��v��e��l��o��p��e��d�� ��b��y�� ��T��o��d��d�� ��F��a��h��r��n��e��r�� ��a��n��d�� ��M��y��l��e��s�� ��C��.�� ��M��a��x��f��i��e��l��d�� ��t��o�� ��h��e��l��p�� ��t��e��s��t�� ��w��r��i��t��e��r��s�� ��d��e��v��e��l��o��p�� ��p��r��e��d��i��c��t��a��b��l��e�� ��t��e��s��t��s��.�� ��T��h��e�� ��u��n��i��t��s�� ��p��e��r�� ��e��m�� ��i��s�� ��1��0��0��0��,�� ��t��h��e�� ��a��d��v��a��n��c��e�� ��i��s�� ��8��0��0��,�� ��a��n��d�� ��t
 ��h��e�� ��d��e��s��c��e��n��t�� ��i��s�� ��2��0��0��,�� ��t��h��e��r��e��b��y�� ��m��a��k��i��n��g�� ��t��h��e�� ��e��m�� ��s��q��u��a��r��e�� ��e��x��a��c��t��l��y�� ��s��q��u��a��r��e��.�� ��T��h��e�� ��g��l��y��p��h��s�� ��f��o��r�� ��m��o��s��t�� ��c��h��a��r��a��c��t��e��r��s�� ��i��s�� ��s��i��m��p��l��y�� ��a�� ��b��o��x�� ��w��h��i��c��h�� ��f��i��l��l��s�� ��t��h��i��s�� ��s��q��u��a��r��e��.�� ��T��h��e�� ��c��o��d��e��p��o��i��n��t��s�� ��m��a��p��p��e��d�� ��t��o�� ��t��h��i��s�� ��f��u��l��l�� ��s��q��u��a��r��e�� ��w��i��t��h�� ��a�� ��f��u��l��l�� ��a��d��v��a��n��c��e�� ��a��r��e�� ��t��h��e�� ��f��o��l��l��o��w��i��n��g�� ��r��a��n��g��e��s��:�� ��U��+��2��0��-��U��+��2��6��,�� ��U��+��2��8��-��U��+��6��F��,�� ��U��+��7��1��-��U��+��7��E��,�� ��U��+��A��0��-��U��+��C��8��,�� ��U��+��C��A��-��U��+��F��F��,�� ��U��+��1��3��1��,�� ��U��+��1��5��2��-��U��+��1��5��3��,�� ��U��+��1��7��8��,�� ��U��+��1��9��2��,�� ��U��+��2��C��6��-��U��+��2��C��7��,�� ��U��+��2��C��9��,�
 � ��U��+��2��D��8��-��U��+��2��D��D��,�� ��U��+��3��9��4��,�� ��U��+��3��A��5��,�� ��U��+��3��A��7��,�� ��U��+��3��A��9��,�� ��U��+��3��B��C��,�� ��U��+��3��C��0��,�� ��U��+��2��0��1��3��-��U��+��2��0��1��4��,�� ��U��+��2��0��1��8��-��U��+��2��0��1��A��,�� ��U��+��2��0��1��C��-��U��+��2��0��1��E��,�� ��U��+��2��0��2��0��-��U��+��2��0��2��2��,�� ��U��+��2��0��2��6��,�� ��U��+��2��0��3��0��,�� ��U��+��2��0��3��9��-��U��+��2��0��3��A��,�� ��U��+��2��0��4��4��,�� ��U��+��2��1��2��2��,�� ��U��+��2��
 1��2��6��,�� ��U��+��2��2��0��2��,�� ��U��+��2��2��0��6��,�� ��U��+��2��2��0��F��,�� ��U��+��2��2��1��1��-��U��+��2��2��1��2��,�� ��U��+��2��2��1��9��-��U��+��2��2��1��A��,�� ��U��+��2��2��1��E��,�� ��U��+��2��2��2��B��,�� ��U��+��2��2��4��8��,�� ��U��+��2��2��6��0��,�� ��U��+��2��2��6��4��-��U��+��2��2��6��5��,�� ��U��+��2��2��F��2��,�� ��U��+��2��5��C��A��,�� ��U��+��3��0��0��7��,�� ��U��+��4��E��0��0��,�� ��U��+��4��E��0��3��,�� ��U��+��4��E��0��9��,�� ��U��+��4��E��5��D��,�� ��U��+��4��E��8��C��,�� ��U��+��4��E��9��4��,�� ��U��+��5��1��6��B��,�� ��U��+��5��1��6��D��,�� ��U��+��5��3��4��1��,�� ��U��+��5��6��D��7��,�� ��U��+��5��6��D��B��,�� ��U��+��5��7��1��F��,�� ��U��+��6��7��2��8��,�� ��U��+��6��C��3��4��,�� ��U��+��7��0��6��B��,�� ��U��+��9��1��D��1��,�� ��U��+��F��0��0��0��-��U��+��F��0��0��2��.�� ��T��h��e�� ��c��o��d��e��p��o��i��n��t��s�� ��w��h��i��c��h�� ��a��r��e�� ��m��a��p��p��e��d�� ��t��o�� ��s��o��m��e��t��h��i��n��g�� ��e��l��s��e�� ��a��r��e�� ��t��h��e�� ��f��o
 ��l��l��o��w��i��n��g��:�� ��"�� ��"�� ��(��U��+��2��0��)��:�� ��N��o�� ��p��a��t��h�� ��b��u��t�� ��f��u��l��l�� ��a��d��v��a��n��c��e��;�� ��"��p��"�� ��(��U��+��7��0��)��:�� ��P��a��t��h�� ��h��a��s�� ��0�� ��a��s��c��e��n��t�� ��b��u��t�� ��f��u��l��l�� ��d��e��s��c��e��n��t��;�� ��"��\xC9��"�� ��(��U��+��C��9��)��:�� ��P��a��t��h�� ��h��a��s�� ��0�� ��d��e��s��c��e��n��t�� ��b��u��t�� ��f��u��l��l�� ��a��s��c��e��n��t��;�� ��N��o��n��-��b��r��
 e��a��k��i��n��g�� ��s��p��a��c��e�� ��(��U��+��A��0��)��:�� ��N��o�� ��p��a��t��h�� ��b��u��t�� ��f��u��l��l�� ��a��d��v��a��n��c��e��;�� ��Z��e��r��o��-��w��i��d��t��h�� ��n��o��n��-��b��r��e��a��k��i��n��g�� ��s��p��a��c��e�� ��(��U��+��F��E��F��F��)��:�� ��N��o�� ��p��a��t��h�� ��a��n��d�� ��0�� ��a��d��v��a��n��c��e��;�� ��E��n�� ��s��p��a��c��e�� ��(��U��+��2��0��0��2��)��:�� ��N��o�� ��p��a��t��h�� ��a��n��d�� ��h��a��l��f�� ��a��d��v��a��n��c��e��;�� ��E��m�� ��s��p��a��c��e�� ��(��U��+��2��0��0��3��)��:�� ��N��o�� ��p��a��t��h�� ��b��u��t�� ��f��u��l��l�� ��a��d��v��a��n��c��e��;�� ��T��h��r��e��e��-��p��e��r��-��e��m�� ��s��p��a��c��e�� ��(��U��+��2��0��0��4��)��:�� ��N��o�� ��p��a��t��h�� ��a��n��d�� ��o��n��e�� ��t��h��i��r��d�� ��a��d��v��a��n��c��e��;�� ��F��o��u��r��-��p��e��r��-��e��m�� ��s��p��a��c��e�� ��(��U��+��2��0��0��5��)��:�� ��N��o�� ��p��a��t��h�� ��a��n��d�� ��o��n��e�� ��q��u��a��r��t��e��r�� ��a��d��v��a��n��c��e��;�� ��S��i��x��-��p��e��r��-��e��m�� ��s
 ��p��a��c��e�� ��(��U��+��2��0��0��6��)��:�� ��N��o�� ��p��a��t��h�� ��a��n��d�� ��o��n��e�� ��s��i��x��t��h�� ��a��d��v��a��n��c��e��;�� ��T��h��i��n�� ��s��p��a��c��e�� ��(��U��+��2��0��0��9��)��:�� ��N��o�� ��p��a��t��h�� ��a��n��d�� ��o��n��e�� ��f��i��f��t��h�� ��a��d��v��a��n��c��e��;�� ��H��a��i��r�� ��s��p��a��c��e�� ��(��U��+��2��0��0��A��)��:�� ��N��o�� ��p��a��t��h�� ��a��n��d�� ��o��n��e�� ��t��e��n��t��h�� ��a��d��v��a��n��c��e��;�� ��Z��e��r��o�� ��w��i��d��t��h�� ��s��p��a��c��e
 �� ��(��U��+��2��0��0��B��)��:�� ��N��o�� ��p��a��t��h�� ��a��n��d�� ��n��o�� ��a��d��v��a��n��c��e��;�� ��I��d��e��o��g��r��a��p��h��i��c�� ��s��p��a��c��e�� ��(��U��+��3��0��0��0��)��:�� ��N��o�� ��p��a��t��h�� ��b��u��t�� ��f��u��l��l�� ��a��d��v��a��n��c��e��;�� ��Z��e��r��o�� ��w��i��d��t��h�� ��n��o��n��-��j��o��i��n��e��r�� ��(��U��+��2��0��0��C��)��:�� ��N��o�� ��p��a��t��h�� ��a��n��d�� ��n��o�� ��a��d��v��a��n��c��e��;�� ��Z��e��r��o�� ��w��i��d��t��h�� ��j��o��i��n��e��r�� ��(��U��+��2��0��0��D��)��:�� ��N��o�� ��p��a��t��h�� ��a��n��d�� ��n��o�� ��a��d��v��a��n��c��e��;�� ��G��r��e��e��k�� ��c��a��p��i��t��a��l�� ��l��e��t��t��e��r�� ��C��h��i�� ��(��U��+��3��A��7��)��:�� ��T��h��i��n�� ��h��o��r��i��z��o��n��t��a��l�� ��s��t��r��i��p��e�� ��a��n��d�� ��f��u��l��l�� ��a��d��v��a��n��c��e��;�� ��"j*��"�� ��(��U��+��6��A��2��A��)��:�� ��T��h��i��n�� ��h��o��r��i��z��o��n��t��a��l�� ��s��t��r��i��p��e�� ��a��n��d�� ��f��u��l��l�� ��a��d��v��a��n��c��e��;�� ��G��r�
 �e��e��k�� ��c��a��p��i��t��a��l�� ��l��e��t��t��e��r�� ��U��p��s��i��l��o��n�� ��(��U��+��3��A��5��)��:�� ��T��h��i��n�� ��v��e��r��t��i��c��a��l�� ��s��t��r��i��p��e�� ��a��n��d�� ��f��u��l��l�� ��a��d��v��a��n��c��e��;�� ��"~\xB5��"�� ��(��U��+��7��E��B��5��)��:�� ��T��h��i��n�� ��v��e��r��t��i��c��a��l�� ��s��t��r��i��p��e�� ��a��n��d�� ��f��u��l��l�� ��a��d��v��a��n��c��e��.��h��t��t��p��:��/��/��w��w��w��.��w��3��c��.��o��r��g��h��t��t��p��:��/��/��d��e��v��.��w��3
 ��.��o��r��g��/��C��S��S��/��f��o��n��t��s��/��a��h��e��m��/��C��O��P��Y��I��N��G��
+��H��e��l��v��e��t��i��c��a��2��R��e��g��u��l��a��r��H��e��l��v��e��t��i��c��a��2������������������\xFF{������������������������������������������������������������	������+�������������������������������������� ��!��"��#��$��%��&��'��(��)��*��+��,��-��.��/��0��1��2��3��4��5��6��7��8��9��:��;��<��=��>��?��@��A��B��C��D��E��F��G��H��I��J��K��L��M��N��O��P��Q��R��S��T��U��V��W��X��Y��Z��[��\��]��^��_��`��a��b��c��d��e��f��g��h��i��j��k��l��m��n��o��p��q��r��s��t��u��v��w��x��y��z��{��|��}��~����\x80��\x81��\x83��\x84��\x85��\x86��\x88��\x89��\x8A��\x8B��\x8D��\x8E��\x90��\x91��\x93��\x96��\x97��\x9D��\x9E��\xA0��\xA1��\xA2��\xA3��\xA4��\xA9��\xAA��\xAC��\xAD��\xAE��\xAF��\xB6��\xB7��\xB8��\xBA��\xBD��\xC3��\xC7��\xC8��\xC9��\xCA��\xCB��\xCC��\xCD��\xCE��\xCF��\xD0��\xD1��\xD3��\xD4��\xD5��\xD6��\xD7��\xD8��\xD9��\xDA��\xDB��\xDC��\xDD��\xDE��\xDF��\xE0��\xE1��\xE8��\xE9��\xEA��\xEB��\xEC��\xED��\xEE��\xEF��\xF0��\xF1��\xF2��\xF3��\xF4��
 \xF5��\xF6��\xB0��\xB1��\xBB��\xA6��\xA8��\x9F��\x9B��\xB2��\xB3��\xC4��\xB4��\xB5��\xC5��\x82��\xC2��\x87��\xAB��\xC6��\xBE��\xBF��\xBC��\x8C��\x98��\x9A��\x99��\xA5��\x92��\x9C��\x8F��\x94��\x95��\xA7��\xB9��\xD2��\xC0��\xC1��	
++ !"#$%&'(NULLglyph243glyph204glyph205HTDELuniFEFFuni2002uni2003uni2004uni2005uni2006uni2009uni200Auni200Buni3000	afii61664afii301uni4E00uni4E8Cuni4E09uni56DBuni4E94uni516Duni4E03uni516Buni4E5Duni5341uni3007uni56D7uni706Buni6C34uni6728uni91D1uni571Funi03A7uni6A2Auni03A5uni7EB5��
\ No newline at end of file

Modified: trunk/Tools/WebKitTestRunner/WebKitTestRunner.xcodeproj/project.pbxproj (228876 => 228877)


--- trunk/Tools/WebKitTestRunner/WebKitTestRunner.xcodeproj/project.pbxproj	2018-02-21 17:08:45 UTC (rev 228876)
+++ trunk/Tools/WebKitTestRunner/WebKitTestRunner.xcodeproj/project.pbxproj	2018-02-21 17:34:45 UTC (rev 228877)
@@ -54,6 +54,7 @@
 		1CBA02971FD87DEE00179C7D /* FakeHelvetica-Helvetica2-400.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 1CBA02921FD86EA100179C7D /* FakeHelvetica-Helvetica2-400.ttf */; };
 		1CBA02981FD87DF000179C7D /* FakeHelvetica-Helvetica-500.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 1CBA02931FD86EA100179C7D /* FakeHelvetica-Helvetica-500.ttf */; };
 		1CBA02991FD87DF300179C7D /* FakeHelvetica-Helvetica-400.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 1CBA02941FD86EA100179C7D /* FakeHelvetica-Helvetica-400.ttf */; };
+		1CEA84DD203782ED00440D08 /* FakeHelvetica-ArmenianCharacter.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 1CEA84DC203782ED00440D08 /* FakeHelvetica-ArmenianCharacter.ttf */; };
 		29210EAE144CACB700835BB5 /* AccessibilityUIElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 29210EA9144CACB200835BB5 /* AccessibilityUIElement.cpp */; };
 		29210EB0144CACBD00835BB5 /* AccessibilityController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 29210EA2144CAAA500835BB5 /* AccessibilityController.cpp */; };
 		29210EB4144CACD500835BB5 /* AccessibilityTextMarker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 29210EB1144CACD400835BB5 /* AccessibilityTextMarker.cpp */; };
@@ -226,6 +227,7 @@
 		1CBA02931FD86EA100179C7D /* FakeHelvetica-Helvetica-500.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "FakeHelvetica-Helvetica-500.ttf"; path = "fonts/FakeHelvetica-Helvetica-500.ttf"; sourceTree = "<group>"; };
 		1CBA02941FD86EA100179C7D /* FakeHelvetica-Helvetica-400.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "FakeHelvetica-Helvetica-400.ttf"; path = "fonts/FakeHelvetica-Helvetica-400.ttf"; sourceTree = "<group>"; };
 		1CBA02951FD86EA100179C7D /* FakeHelvetica-Helvetica2-500.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "FakeHelvetica-Helvetica2-500.ttf"; path = "fonts/FakeHelvetica-Helvetica2-500.ttf"; sourceTree = "<group>"; };
+		1CEA84DC203782ED00440D08 /* FakeHelvetica-ArmenianCharacter.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "FakeHelvetica-ArmenianCharacter.ttf"; sourceTree = "<group>"; };
 		26D758E5160BECDC00268472 /* GeolocationProviderMock.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GeolocationProviderMock.cpp; sourceTree = "<group>"; };
 		26D758E6160BECDD00268472 /* GeolocationProviderMock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GeolocationProviderMock.h; sourceTree = "<group>"; };
 		29210EA2144CAAA500835BB5 /* AccessibilityController.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AccessibilityController.cpp; sourceTree = "<group>"; };
@@ -705,6 +707,7 @@
 			isa = PBXGroup;
 			children = (
 				6510A77711EC643800410867 /* AHEM____.TTF */,
+				1CEA84DC203782ED00440D08 /* FakeHelvetica-ArmenianCharacter.ttf */,
 				1CBA02941FD86EA100179C7D /* FakeHelvetica-Helvetica-400.ttf */,
 				1CBA02931FD86EA100179C7D /* FakeHelvetica-Helvetica-500.ttf */,
 				1CBA02921FD86EA100179C7D /* FakeHelvetica-Helvetica2-400.ttf */,
@@ -962,6 +965,7 @@
 			buildActionMask = 2147483647;
 			files = (
 				6510A78211EC643800410867 /* AHEM____.TTF in Resources */,
+				1CEA84DD203782ED00440D08 /* FakeHelvetica-ArmenianCharacter.ttf in Resources */,
 				1CBA02991FD87DF300179C7D /* FakeHelvetica-Helvetica-400.ttf in Resources */,
 				1CBA02981FD87DF000179C7D /* FakeHelvetica-Helvetica-500.ttf in Resources */,
 				1CBA02971FD87DEE00179C7D /* FakeHelvetica-Helvetica2-400.ttf in Resources */,
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to