Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
[Cocoa] Add SPI to disallow user-installed fonts
https://bugs.webkit.org/show_bug.cgi?id=180062 <rdar://problem/35042408> Reviewed by Simon Fraser. Source/WebCore: This hooks up a WK2 preference, ShouldDisallowUserInstalledFonts, to our font selection code. This preference works by specifying an attribute to our font selection code which will prohibit user-installed fonts from ever being selected. This works both to disallow newly installed fonts, as well as disallowing user-installed fonts which "shadow" (or have the same name as) existing fonts, so that the existing font is selected instead. The goal of this setting is to decrease the fingerprinting surface area which trackers can use to identify users on the open Web. Tests: fast/text/user-installed-font.html fast/text/user-installed-fonts/disable.html fast/text/user-installed-fonts/shadow-disable.html fast/text/user-installed-fonts/shadow-family-disable.html fast/text/user-installed-fonts/shadow-family.html fast/text/user-installed-fonts/shadow-postscript-disable.html fast/text/user-installed-fonts/shadow-postscript-family-disable.html fast/text/user-installed-fonts/shadow-postscript-family.html fast/text/user-installed-fonts/shadow-postscript.html fast/text/user-installed-fonts/shadow.html * css/CSSFontFaceSet.cpp: (WebCore::CSSFontFaceSet::ensureLocalFontFacesForFamilyRegistered): * css/StyleResolver.cpp: (WebCore::StyleResolver::initializeFontStyle): * page/Settings.yaml: * platform/graphics/FontCache.h: * platform/graphics/FontDescription.cpp: (WebCore::FontDescription::FontDescription): * platform/graphics/FontDescription.h: (WebCore::FontDescription::mayRepresentUserInstalledFont const): (WebCore::FontDescription::setMayRepresentUserInstalledFont): (WebCore::FontDescription::operator== const): * platform/graphics/cocoa/FontCacheCoreText.cpp: (WebCore::FontDatabase::singleton): (WebCore::FontDatabase::singletonAllowingUserInstalledFonts): (WebCore::FontDatabase::singletonDisallowingUserInstalledFonts): (WebCore::FontDatabase::collectionForFamily): (WebCore::FontDatabase::fontForPostScriptName): (WebCore::FontDatabase::FontDatabase): (WebCore::FontCache::getFontSelectionCapabilitiesInFamily): (WebCore::platformFontLookupWithFamily): (WebCore::invalidateFontCache): (WebCore::fontWithFamily): * style/StyleResolveForDocument.cpp: (WebCore::Style::resolveForDocument): * testing/InternalSettings.cpp: (WebCore::InternalSettings::setShouldDisallowUserInstalledFonts): * testing/InternalSettings.h: * testing/InternalSettings.idl: Source/WebCore/PAL: * pal/spi/cocoa/CoreTextSPI.h: Source/WebKit: * Shared/WebPreferences.yaml: * UIProcess/API/C/WKPreferences.cpp: (WKPreferencesSetShouldDisallowUserInstalledFonts): (WKPreferencesGetShouldDisallowUserInstalledFonts): * UIProcess/API/C/WKPreferencesRefPrivate.h: * UIProcess/API/Cocoa/WKPreferences.mm: (-[WKPreferences _shouldDisallowUserInstalledFonts]): (-[WKPreferences _setShouldDisallowUserInstalledFonts:]): * UIProcess/API/Cocoa/WKPreferencesPrivate.h: Tools: * WebKitTestRunner/InjectedBundle/ActivateFonts.h: * WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl: * WebKitTestRunner/InjectedBundle/InjectedBundlePage.cpp: (WTR::InjectedBundlePage::resetAfterTest): * WebKitTestRunner/InjectedBundle/TestRunner.h: * WebKitTestRunner/InjectedBundle/cocoa/ActivateFontsCocoa.mm: (WTR::resourcesDirectoryURL): (WTR::activateFonts): (WTR::installFakeHelvetica): (WTR::uninstallFakeHelvetica): * WebKitTestRunner/InjectedBundle/mac/TestRunnerMac.mm: (WTR::TestRunner::installFakeHelvetica): * WebKitTestRunner/WebKitTestRunner.xcodeproj/project.pbxproj: * WebKitTestRunner/fonts/FakeHelvetica-Helvetica-400.ttf: Added. * WebKitTestRunner/fonts/FakeHelvetica-Helvetica-500.ttf: Added. * WebKitTestRunner/fonts/FakeHelvetica-Helvetica2-400.ttf: Added. * WebKitTestRunner/fonts/FakeHelvetica-Helvetica2-500.ttf: Added. LayoutTests: * fast/text/user-installed-font-expected.html: Added. * fast/text/user-installed-font.html: Added. * fast/text/user-installed-fonts/disable-expected-mismatch.html: Added. * fast/text/user-installed-fonts/disable.html: Added. * fast/text/user-installed-fonts/shadow-disable-expected-mismatch.html: Added. * fast/text/user-installed-fonts/shadow-disable.html: Added. * fast/text/user-installed-fonts/shadow-expected.html: Added. * fast/text/user-installed-fonts/shadow-family-disable-expected-mismatch.html: Added. * fast/text/user-installed-fonts/shadow-family-disable.html: Added. * fast/text/user-installed-fonts/shadow-family-expected.html: Added. * fast/text/user-installed-fonts/shadow-family.html: Added. * fast/text/user-installed-fonts/shadow-postscript-disable-expected-mismatch.html: Added. * fast/text/user-installed-fonts/shadow-postscript-disable.html: Added. * fast/text/user-installed-fonts/shadow-postscript-expected.html: Added. * fast/text/user-installed-fonts/shadow-postscript-family-disable-expected-mismatch.html: Added. * fast/text/user-installed-fonts/shadow-postscript-family-disable.html: Added. * fast/text/user-installed-fonts/shadow-postscript-family-expected.html: Added. * fast/text/user-installed-fonts/shadow-postscript-family.html: Added. * fast/text/user-installed-fonts/shadow-postscript.html: Added. * fast/text/user-installed-fonts/shadow.html: Added. * platform/gtk/TestExpectations: * platform/ios-wk1/TestExpectations: * platform/ios/TestExpectations: * platform/mac-wk1/TestExpectations: * platform/mac/TestExpectations: * platform/win/TestExpectations: * platform/wpe/TestExpectations: Canonical link: https://commits.webkit.org/196461@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@225641 268f45cc-cd09-0410-ab3c-d52691b4dbfc
- Loading branch information
Showing
with
573 additions
and 23 deletions.
- +36 −0 LayoutTests/ChangeLog
- +9 −0 LayoutTests/fast/text/user-installed-font-expected.html
- +9 −0 LayoutTests/fast/text/user-installed-font.html
- +8 −0 LayoutTests/fast/text/user-installed-fonts/disable-expected-mismatch.html
- +12 −0 LayoutTests/fast/text/user-installed-fonts/disable.html
- +8 −0 LayoutTests/fast/text/user-installed-fonts/shadow-disable-expected-mismatch.html
- +14 −0 LayoutTests/fast/text/user-installed-fonts/shadow-disable.html
- +9 −0 LayoutTests/fast/text/user-installed-fonts/shadow-expected.html
- +8 −0 LayoutTests/fast/text/user-installed-fonts/shadow-family-disable-expected-mismatch.html
- +14 −0 LayoutTests/fast/text/user-installed-fonts/shadow-family-disable.html
- +9 −0 LayoutTests/fast/text/user-installed-fonts/shadow-family-expected.html
- +13 −0 LayoutTests/fast/text/user-installed-fonts/shadow-family.html
- +8 −0 LayoutTests/fast/text/user-installed-fonts/shadow-postscript-disable-expected-mismatch.html
- +14 −0 LayoutTests/fast/text/user-installed-fonts/shadow-postscript-disable.html
- +9 −0 LayoutTests/fast/text/user-installed-fonts/shadow-postscript-expected.html
- +8 −0 LayoutTests/fast/text/user-installed-fonts/shadow-postscript-family-disable-expected-mismatch.html
- +14 −0 LayoutTests/fast/text/user-installed-fonts/shadow-postscript-family-disable.html
- +9 −0 LayoutTests/fast/text/user-installed-fonts/shadow-postscript-family-expected.html
- +13 −0 LayoutTests/fast/text/user-installed-fonts/shadow-postscript-family.html
- +13 −0 LayoutTests/fast/text/user-installed-fonts/shadow-postscript.html
- +13 −0 LayoutTests/fast/text/user-installed-fonts/shadow.html
- +2 −0 LayoutTests/platform/gtk/TestExpectations
- +3 −0 LayoutTests/platform/ios-wk1/TestExpectations
- +6 −0 LayoutTests/platform/ios/TestExpectations
- +3 −0 LayoutTests/platform/mac-wk1/TestExpectations
- +4 −0 LayoutTests/platform/mac/TestExpectations
- +3 −0 LayoutTests/platform/win/TestExpectations
- +3 −0 LayoutTests/platform/wpe/TestExpectations
- +58 −0 Source/WebCore/ChangeLog
- +10 −0 Source/WebCore/PAL/ChangeLog
- +1 −0 Source/WebCore/PAL/pal/spi/cocoa/CoreTextSPI.h
- +5 −1 Source/WebCore/css/CSSFontFaceSet.cpp
- +1 −0 Source/WebCore/css/StyleResolver.cpp
- +4 −0 Source/WebCore/page/Settings.yaml
- +5 −1 Source/WebCore/platform/graphics/FontCache.h
- +1 −0 Source/WebCore/platform/graphics/FontDescription.cpp
- +5 −1 Source/WebCore/platform/graphics/FontDescription.h
- +67 −16 Source/WebCore/platform/graphics/cocoa/FontCacheCoreText.cpp
- +1 −1 Source/WebCore/platform/graphics/freetype/FontCacheFreeType.cpp
- +1 −1 Source/WebCore/platform/graphics/win/FontCacheWin.cpp
- +1 −0 Source/WebCore/style/StyleResolveForDocument.cpp
- +18 −0 Source/WebKit/ChangeLog
- +4 −0 Source/WebKit/Shared/WebPreferences.yaml
- +10 −0 Source/WebKit/UIProcess/API/C/WKPreferences.cpp
- +4 −0 Source/WebKit/UIProcess/API/C/WKPreferencesRefPrivate.h
- +10 −0 Source/WebKit/UIProcess/API/Cocoa/WKPreferences.mm
- +2 −0 Source/WebKit/UIProcess/API/Cocoa/WKPreferencesPrivate.h
- +26 −0 Tools/ChangeLog
- +2 −0 Tools/WebKitTestRunner/InjectedBundle/ActivateFonts.h
- +2 −0 Tools/WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl
- +3 −0 Tools/WebKitTestRunner/InjectedBundle/InjectedBundlePage.cpp
- +2 −0 Tools/WebKitTestRunner/InjectedBundle/TestRunner.h
- +34 −2 Tools/WebKitTestRunner/InjectedBundle/cocoa/ActivateFontsCocoa.mm
- +6 −0 Tools/WebKitTestRunner/InjectedBundle/mac/TestRunnerMac.mm
- +16 −0 Tools/WebKitTestRunner/WebKitTestRunner.xcodeproj/project.pbxproj
- BIN Tools/WebKitTestRunner/fonts/FakeHelvetica-Helvetica-400.ttf
- BIN Tools/WebKitTestRunner/fonts/FakeHelvetica-Helvetica-500.ttf
- BIN Tools/WebKitTestRunner/fonts/FakeHelvetica-Helvetica2-400.ttf
- BIN Tools/WebKitTestRunner/fonts/FakeHelvetica-Helvetica2-500.ttf
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@@ -0,0 +1,9 @@ | ||
<!DOCTYPE html> | ||
<html> | ||
<head> | ||
</head> | ||
<body> | ||
This test makes sure that user-installed fonts work in the general case. The test passes if you see a black square below. | ||
<div style="width: 96px; height: 96px; background: black;"></div> | ||
</body> | ||
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@@ -0,0 +1,9 @@ | ||
<!DOCTYPE html> | ||
<html> | ||
<head> | ||
</head> | ||
<body> | ||
This test makes sure that user-installed fonts work in the general case. The test passes if you see a black square below. | ||
<div style="font: 100px 'Ahem'; width: 96px; height: 96px; overflow: hidden; position: relative;"><div style="position: relative; top: -2px; left: -2px;">e</div></div> | ||
</body> | ||
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@@ -0,0 +1,8 @@ | ||
<!DOCTYPE html> | ||
<html> | ||
<head> | ||
</head> | ||
<body> | ||
<div style="width: 96px; height: 96px; background: black;"></div> | ||
</body> | ||
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@@ -0,0 +1,12 @@ | ||
<!DOCTYPE html> | ||
<html> | ||
<head> | ||
<script> | ||
if (window.internals) | ||
internals.settings.setShouldDisallowUserInstalledFonts(true); | ||
</script> | ||
</head> | ||
<body> | ||
<div style="font: 100px 'Ahem'; width: 96px; height: 96px; overflow: hidden; position: relative;"><div style="position: relative; top: -2px; left: -2px;">e</div></div> | ||
</body> | ||
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@@ -0,0 +1,8 @@ | ||
<!DOCTYPE html> | ||
<html> | ||
<head> | ||
</head> | ||
<body> | ||
<div style="width: 96px; height: 96px; background: black;"></div> | ||
</body> | ||
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@@ -0,0 +1,14 @@ | ||
<!DOCTYPE html> | ||
<html> | ||
<head> | ||
<script> | ||
if (window.testRunner) | ||
testRunner.installFakeHelvetica("Helvetica-400"); | ||
if (window.internals) | ||
internals.settings.setShouldDisallowUserInstalledFonts(true); | ||
</script> | ||
</head> | ||
<body> | ||
<div style="font: 400 100px 'Helvetica'; width: 96px; height: 96px; overflow: hidden; position: relative;"><div style="position: relative; top: -2px; left: -2px;">e</div></div> | ||
</body> | ||
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@@ -0,0 +1,9 @@ | ||
<!DOCTYPE html> | ||
<html> | ||
<head> | ||
</head> | ||
<body> | ||
This test makes sure that user-installed fonts which have the same name as preinstalled fonts are used instead of the preinstalled fonts. The test passes if you see a black rectangle below. | ||
<div style="width: 96px; height: 50px; background: black;"></div> | ||
</body> | ||
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@@ -0,0 +1,8 @@ | ||
<!DOCTYPE html> | ||
<html> | ||
<head> | ||
</head> | ||
<body> | ||
<div style="width: 96px; height: 96px; background: black;"></div> | ||
</body> | ||
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@@ -0,0 +1,14 @@ | ||
<!DOCTYPE html> | ||
<html> | ||
<head> | ||
<script> | ||
if (window.testRunner) | ||
testRunner.installFakeHelvetica("Helvetica-500"); | ||
if (window.internals) | ||
internals.settings.setShouldDisallowUserInstalledFonts(true); | ||
</script> | ||
</head> | ||
<body> | ||
<div style="font: 500 100px 'Helvetica'; width: 96px; height: 96px; overflow: hidden; position: relative;"><div style="position: relative; top: -2px; left: -2px;">e</div></div> | ||
</body> | ||
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@@ -0,0 +1,9 @@ | ||
<!DOCTYPE html> | ||
<html> | ||
<head> | ||
</head> | ||
<body> | ||
This test makes sure that user-installed fonts which have the same name as preinstalled fonts are used instead of the preinstalled fonts. The test passes if you see a black rectangle below. | ||
<div style="width: 96px; height: 50px; background: black;"></div> | ||
</body> | ||
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@@ -0,0 +1,13 @@ | ||
<!DOCTYPE html> | ||
<html> | ||
<head> | ||
<script> | ||
if (window.testRunner) | ||
testRunner.installFakeHelvetica("Helvetica-500"); | ||
</script> | ||
</head> | ||
<body> | ||
This test makes sure that user-installed fonts which have the same name as preinstalled fonts are used instead of the preinstalled fonts. The test passes if you see a black rectangle below. | ||
<div style="font: 500 100px 'Helvetica'; width: 96px; height: 50px; overflow: hidden; position: relative;"><div style="position: relative; top: -50px; left: -2px;">e</div></div> | ||
</body> | ||
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@@ -0,0 +1,8 @@ | ||
<!DOCTYPE html> | ||
<html> | ||
<head> | ||
</head> | ||
<body> | ||
<div style="width: 96px; height: 96px; background: black;"></div> | ||
</body> | ||
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@@ -0,0 +1,14 @@ | ||
<!DOCTYPE html> | ||
<html> | ||
<head> | ||
<script> | ||
if (window.testRunner) | ||
testRunner.installFakeHelvetica("Helvetica2-400"); | ||
if (window.internals) | ||
internals.settings.setShouldDisallowUserInstalledFonts(true); | ||
</script> | ||
</head> | ||
<body> | ||
<div style="font: 400 100px 'Helvetica'; width: 96px; height: 96px; overflow: hidden; position: relative;"><div style="position: relative; top: -2px; left: -2px;">e</div></div> | ||
</body> | ||
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@@ -0,0 +1,9 @@ | ||
<!DOCTYPE html> | ||
<html> | ||
<head> | ||
</head> | ||
<body> | ||
This test makes sure that user-installed fonts which have the same name as preinstalled fonts are used instead of the preinstalled fonts. The test passes if you see a black rectangle below. | ||
<div style="width: 96px; height: 50px; background: black;"></div> | ||
</body> | ||
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@@ -0,0 +1,8 @@ | ||
<!DOCTYPE html> | ||
<html> | ||
<head> | ||
</head> | ||
<body> | ||
<div style="width: 96px; height: 96px; background: black;"></div> | ||
</body> | ||
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@@ -0,0 +1,14 @@ | ||
<!DOCTYPE html> | ||
<html> | ||
<head> | ||
<script> | ||
if (window.testRunner) | ||
testRunner.installFakeHelvetica("Helvetica2-500"); | ||
if (window.internals) | ||
internals.settings.setShouldDisallowUserInstalledFonts(true); | ||
</script> | ||
</head> | ||
<body> | ||
<div style="font: 500 100px 'Helvetica'; width: 96px; height: 96px; overflow: hidden; position: relative;"><div style="position: relative; top: -2px; left: -2px;">e</div></div> | ||
</body> | ||
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@@ -0,0 +1,9 @@ | ||
<!DOCTYPE html> | ||
<html> | ||
<head> | ||
</head> | ||
<body> | ||
This test makes sure that user-installed fonts which have the same name as preinstalled fonts are used instead of the preinstalled fonts. The test passes if you see a black rectangle below. | ||
<div style="width: 96px; height: 50px; background: black;"></div> | ||
</body> | ||
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@@ -0,0 +1,13 @@ | ||
<!DOCTYPE html> | ||
<html> | ||
<head> | ||
<script> | ||
if (window.testRunner) | ||
testRunner.installFakeHelvetica("Helvetica2-500"); | ||
</script> | ||
</head> | ||
<body> | ||
This test makes sure that user-installed fonts which have the same name as preinstalled fonts are used instead of the preinstalled fonts. The test passes if you see a black rectangle below. | ||
<div style="font: 500 100px 'Helvetica'; width: 96px; height: 50px; overflow: hidden; position: relative;"><div style="position: relative; top: -50px; left: -2px;">e</div></div> | ||
</body> | ||
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@@ -0,0 +1,13 @@ | ||
<!DOCTYPE html> | ||
<html> | ||
<head> | ||
<script> | ||
if (window.testRunner) | ||
testRunner.installFakeHelvetica("Helvetica2-400"); | ||
</script> | ||
</head> | ||
<body> | ||
This test makes sure that user-installed fonts which have the same name as preinstalled fonts are used instead of the preinstalled fonts. The test passes if you see a black rectangle below. | ||
<div style="font: 400 100px 'Helvetica'; width: 96px; height: 50px; overflow: hidden; position: relative;"><div style="position: relative; top: -50px; left: -2px;">e</div></div> | ||
</body> | ||
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@@ -0,0 +1,13 @@ | ||
<!DOCTYPE html> | ||
<html> | ||
<head> | ||
<script> | ||
if (window.testRunner) | ||
testRunner.installFakeHelvetica("Helvetica-400"); | ||
</script> | ||
</head> | ||
<body> | ||
This test makes sure that user-installed fonts which have the same name as preinstalled fonts are used instead of the preinstalled fonts. The test passes if you see a black rectangle below. | ||
<div style="font: 400 100px 'Helvetica'; width: 96px; height: 50px; overflow: hidden; position: relative;"><div style="position: relative; top: -50px; left: -2px;">e</div></div> | ||
</body> | ||
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.