tbb-commits
Threads by month
- ----- 2025 -----
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- 1 participants
- 18730 discussions
commit a5de55cd489855034e69f91ba18b4613993f7d65
Author: Georg Koppen <gk(a)torproject.org>
Date: Mon Sep 2 15:48:26 2019 +0000
Add missing Changelog items
---
projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt | 7 +++++++
rbm.conf | 2 +-
2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt b/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
index 8956739..bd20859 100644
--- a/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
+++ b/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
@@ -13,11 +13,17 @@ Tor Browser 9.0a6 -- September 4 2019
* Bug 28561: Migrate "About Tor Browser" dialog to tor-browser
* Bug 30683: Prevent detection of locale via some *.properties
* Bug 31298: Backport patch for #24056
+ * Bug 9336: Odd wyswig schemes without isolation for browserspy.dk
* Bug 27601: Browser notifications are not working anymore
* Bug 30845: Make sure internal extensions are enabled
* Bug 28896: Enable extensions in private browsing by default
* Bug 31563: Reload search extensions if extensions.enabledScopes has changed
* Bug 31396: Fix communication with NoScript for security settings
+ * Bug 31142: Fix crash of tab and messing with about:newtab
+ * Bug 29049: Backport JS Poison Patch
+ * Bug 25214: Canvas data extraction on locale pdf file should be allowed
+ * Bug 30657: Locale is leaked via title of link tag on non-html page
+ * Bug 31015: Disabling SVG hides UI icons in extensions
* Bug 31357: Retire Tom's default obfs4 bridge
* Windows + OS X + Linux
* Update Tor to 0.4.1.5
@@ -30,6 +36,7 @@ Tor Browser 9.0a6 -- September 4 2019
* Bug 29430: Use obfs4proxy's meek_lite with utls instead of meek
* Bug 31251: Security Level button UI polish
* Bug 31344: Register SecurityLevelPreference's 'unload' callback
+ * Bug 12774: Selecting meek in the browser UI is broken
* Build System:
* Bug 31465: Bump Go to 1.12.9
* Windows
diff --git a/rbm.conf b/rbm.conf
index 0df25ca..c16e8ae 100644
--- a/rbm.conf
+++ b/rbm.conf
@@ -25,7 +25,7 @@ buildconf:
var:
torbrowser_version: '9.0a6'
- torbrowser_build: 'build1'
+ torbrowser_build: 'build2'
torbrowser_incremental_from:
- 9.0a4
project_name: tor-browser
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-2] fixup! Bug 30683: Prevent detection of locale via some *.properties
by gk@torproject.org 02 Sep '19
by gk@torproject.org 02 Sep '19
02 Sep '19
commit 80f3dafdd420491e23c22a688d075548480f78a6
Author: Alex Catarineu <acat(a)torproject.org>
Date: Mon Sep 2 16:58:24 2019 +0200
fixup! Bug 30683: Prevent detection of locale via some *.properties
---
mobile/android/installer/package-manifest.in | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/mobile/android/installer/package-manifest.in b/mobile/android/installer/package-manifest.in
index ae4319214fad..33e0175a624e 100644
--- a/mobile/android/installer/package-manifest.in
+++ b/mobile/android/installer/package-manifest.in
@@ -203,9 +203,9 @@
@BINPATH@/res/dtd/*
@BINPATH@/res/language.properties
@BINPATH@/res/locale/layout/HtmlForm.properties
-@RESPATH@/res/locale/layout/MediaDocument.properties
-@RESPATH@/res/locale/layout/xmlparser.properties
-@RESPATH@/res/locale/dom/dom.properties
+@BINPATH@/res/locale/layout/MediaDocument.properties
+@BINPATH@/res/locale/layout/xmlparser.properties
+@BINPATH@/res/locale/dom/dom.properties
#ifndef MOZ_ANDROID_EXCLUDE_FONTS
@BINPATH@/res/fonts/*
1
0

02 Sep '19
commit db9b9a4d5dfe1d03002d5d9de9a26f7b92b2aa29
Author: Georg Koppen <gk(a)torproject.org>
Date: Mon Sep 2 12:32:57 2019 +0000
Release preparations for 9.0a6
Changelog update, versions bump
---
projects/firefox/config | 4 +-
.../tor-browser/Bundle-Data/Docs/ChangeLog.txt | 80 ++++++++++++++++++++++
projects/tor-launcher/config | 2 +-
projects/tor/config | 2 +-
rbm.conf | 4 +-
5 files changed, 86 insertions(+), 6 deletions(-)
diff --git a/projects/firefox/config b/projects/firefox/config
index caa9e0d..6bdcf8d 100644
--- a/projects/firefox/config
+++ b/projects/firefox/config
@@ -1,7 +1,7 @@
# vim: filetype=yaml sw=2
version: '[% c("abbrev") %]'
filename: 'firefox-[% c("version") %]-[% c("var/osname") %]-[% c("var/build_id") %]'
-git_hash: 'tor-browser-[% c("var/firefox_version") %]-[% c("var/torbrowser_branch") %]-1-build2'
+git_hash: 'tor-browser-[% c("var/firefox_version") %]-[% c("var/torbrowser_branch") %]-2-build1'
tag_gpg_id: 1
git_url: https://git.torproject.org/tor-browser.git
git_submodule: 1
@@ -51,7 +51,7 @@ targets:
branding_directory: '[% IF c("var/android") %]mobile/android[% ELSE %]browser[% END %]/branding/official'
nightly:
- git_hash: 'tor-browser-[% c("var/firefox_version") %]-[% c("var/torbrowser_branch") %]-1'
+ git_hash: 'tor-browser-[% c("var/firefox_version") %]-[% c("var/torbrowser_branch") %]-2'
tag_gpg_id: 0
var:
torbrowser_update_channel: default
diff --git a/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt b/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
index 594225a..8956739 100644
--- a/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
+++ b/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
@@ -1,3 +1,83 @@
+Tor Browser 9.0a6 -- September 4 2019
+ * All platforms
+ * Update Firefox to 68.1.0esr
+ * Update NoScript to 11.0.3
+ * Bug 26847: NoScript pops up a full-site window for XSS warning
+ * Bug 31287: NoScript leaks browser locale
+ * Bug 30429: Rebase patches for Firefox 68 ESR
+ * Bug 10760: Integrate Torbutton into Tor Browser directly
+ * Bug 25856: Remove XUL overlays from Torbutton
+ * Bug 31322: Fix about:tor assertion failure debug builds
+ * Bug 31520: Remove monthly giving banner from Tor Browser
+ * Bug 29430: Add support for meek_lite bridges to bridgeParser
+ * Bug 28561: Migrate "About Tor Browser" dialog to tor-browser
+ * Bug 30683: Prevent detection of locale via some *.properties
+ * Bug 31298: Backport patch for #24056
+ * Bug 27601: Browser notifications are not working anymore
+ * Bug 30845: Make sure internal extensions are enabled
+ * Bug 28896: Enable extensions in private browsing by default
+ * Bug 31563: Reload search extensions if extensions.enabledScopes has changed
+ * Bug 31396: Fix communication with NoScript for security settings
+ * Bug 31357: Retire Tom's default obfs4 bridge
+ * Windows + OS X + Linux
+ * Update Tor to 0.4.1.5
+ * Update Tor Launcher to 0.2.19.3
+ * Bug 29197: Remove use of overlays
+ * Bug 31300: Modify Tor Launcher so it is compatible with ESR68
+ * Bug 31487: Modify moat client code so it is compatible with ESR68
+ * Bug 31488: Moat: support a comma-separated list of transports
+ * Translations update
+ * Bug 29430: Use obfs4proxy's meek_lite with utls instead of meek
+ * Bug 31251: Security Level button UI polish
+ * Bug 31344: Register SecurityLevelPreference's 'unload' callback
+ * Build System:
+ * Bug 31465: Bump Go to 1.12.9
+ * Windows
+ * Bug 31547: Back out patch for Mozilla's bug 1574980
+ * Bug 31141: Fix typo in font.system.whitelist
+ * Backport fix for bug 1572844 to fix broken build
+ * OS X
+ * Bug 29818: Adapt #13379 patch for 68esr
+ * Bug 31403: Bump snowflake commit to cd650fa009
+ * Linux
+ * Bug 31403: Bump snowflake commit to cd650fa009
+ * Android
+ * Bug 31010: Rebase mobile patches for Fennec 68
+ * Bug 31010: Don't use addTrustedTab() on mobile
+ * Build System:
+ * All Platforms:
+ * Bug 30585: Provide standalone clang 8 project across all platforms
+ * Bug 30376: Use Rust 1.34 for Tor Browser 9
+ * Bug 30490: Add cbindgen project for building Firefox 68 ESR/Fennec 68
+ * Bug 30701: Add nodejs project for building Firefox 68 ESR/Fennec 68
+ * Bug 30734: Add nasm project for building Firefox 68 ESR/Fennec 68
+ * Windows
+ * Bug 30322: Windows toolchain update for Firefox 68 ESR
+ * Bug 28716: Create mingw-w64-clang toolchain
+ * Bug 28238: Adapt firefox and fxc2 projects for Windows builds
+ * Bug 28716: Optionally omit timestamp in PE header
+ * Bug 31567: NS_tsnprintf() does not handle %s correctly on Windows
+ * Bug 31458: Revert patch for #27503 and bump mingw-w64 revision used
+ * Bug 9898: Provide clean fix for strcmpi issue in NSPR
+ * OS X
+ * Bug 30323: MacOS toolchain update for Firefox 68 ESR
+ * Bug 31467: Switch to clang for cctools project
+ * Bug 31465: Adapt tor-browser-build projects for macOS notarization
+ * Linux
+ * Bug 30321: Linux toolchain update for Firefox ESR 68
+ * Bug 30736: Install yasm from wheezy-backports
+ * Bug 31447: Don't install Python just for Mach
+ * Bug 31394: Replace "-1" with "−1" in start-tor-browser.desktop.
+ * Android
+ * Bug 30324: Android toolchain update for Fennec 68
+ * Bug 31173: Update android-toolchain project to match Firefox
+ * Bug 31389: Update Android Firefox to build with Clang
+ * Bug 31388: Update Rust project for Android
+ * Bug 30665: Get Firefox 68 ESR working with latest android toolchain
+ * Bug 30460: Update TOPL project to use Firefox 68 toolchain
+ * Bug 30461: Update tor-android-service project to use Firefox 68 toolchain
+ * Bug 28753: Use Gradle with --offline when building the browser part
+
Tor Browser 9.0a5 -- July 31 2019
* Android
* Bug 31260: Backport bug 1477259 for aarch64 support on Google Play
diff --git a/projects/tor-launcher/config b/projects/tor-launcher/config
index 273c466..9c85b4c 100644
--- a/projects/tor-launcher/config
+++ b/projects/tor-launcher/config
@@ -1,5 +1,5 @@
# vim: filetype=yaml sw=2
-version: 0.2.19.2
+version: 0.2.19.3
git_url: https://git.torproject.org/tor-launcher.git
git_hash: '[% c("version") %]'
gpg_keyring: torbutton.gpg
diff --git a/projects/tor/config b/projects/tor/config
index 682cfd3..9a735c2 100644
--- a/projects/tor/config
+++ b/projects/tor/config
@@ -1,6 +1,6 @@
# vim: filetype=yaml sw=2
filename: '[% project %]-[% c("version") %]-[% c("var/osname") %]-[% c("var/build_id") %]'
-version: 0.4.1.3-alpha
+version: 0.4.1.5
git_hash: 'tor-[% c("version") %]'
git_url: https://git.torproject.org/tor.git
git_submodule: 1
diff --git a/rbm.conf b/rbm.conf
index ca3f058..0df25ca 100644
--- a/rbm.conf
+++ b/rbm.conf
@@ -24,10 +24,10 @@ buildconf:
git_signtag_opt: '-s'
var:
- torbrowser_version: '9.0a5'
+ torbrowser_version: '9.0a6'
torbrowser_build: 'build1'
torbrowser_incremental_from:
- - 9.0a3
+ - 9.0a4
project_name: tor-browser
multi_lingual: 0
build_mar: 1
1
0
commit c653109cc75bb4bf8f0bf0f4223447533c40db85
Author: Georg Koppen <gk(a)torproject.org>
Date: Mon Sep 2 10:09:09 2019 +0000
Pick up aarch64 pick up
---
rbm.conf | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/rbm.conf b/rbm.conf
index 26176b2..2a95652 100644
--- a/rbm.conf
+++ b/rbm.conf
@@ -25,7 +25,7 @@ buildconf:
var:
torbrowser_version: '8.5.5'
- torbrowser_build: 'build1'
+ torbrowser_build: 'build2'
torbrowser_incremental_from:
- 8.5.4
project_name: tor-browser
1
0
commit f986c71a6f78a7ecfe663666abded1c4789df480
Author: Georg Koppen <gk(a)torproject.org>
Date: Sat Jul 6 06:52:44 2019 +0000
Pick up aarch64 properly
---
projects/release/config | 2 ++
1 file changed, 2 insertions(+)
diff --git a/projects/release/config b/projects/release/config
index 1623083..0133c3f 100644
--- a/projects/release/config
+++ b/projects/release/config
@@ -17,6 +17,7 @@ targets:
- torbrowser-osx-x86_64
- torbrowser-android-armv7
- torbrowser-android-x86
+ - torbrowser-android-aarch64
- torbrowser-src
torbrowser-android-armv7:
var:
@@ -124,6 +125,7 @@ input_files:
project: tor-browser
enable: '[% c("var/torbrowser-android-aarch64") %]'
target:
+ - '[% c("var/containers_target") %]'
- '[% c("var/build_target") %]'
- torbrowser-android-aarch64
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Revert "Load torbutton in browser.xul on Android"
by gk@torproject.org 02 Sep '19
by gk@torproject.org 02 Sep '19
02 Sep '19
commit af0bfb7134368f2d9a2eb7efeb1d6abcd11b5fdf
Author: Georg Koppen <gk(a)torproject.org>
Date: Mon Sep 2 09:16:02 2019 +0000
Revert "Load torbutton in browser.xul on Android"
This reverts commit 805ff051656dc22d11de026e01223352f39e7380.
---
mobile/android/chrome/content/browser.js | 4 ----
mobile/android/chrome/content/browser.xul | 1 -
2 files changed, 5 deletions(-)
diff --git a/mobile/android/chrome/content/browser.js b/mobile/android/chrome/content/browser.js
index 7fcee29f0c3c..f8e9399f51c4 100644
--- a/mobile/android/chrome/content/browser.js
+++ b/mobile/android/chrome/content/browser.js
@@ -243,8 +243,6 @@ var lazilyLoadedBrowserScripts = [
["CastingApps", "chrome://browser/content/CastingApps.js"],
["RemoteDebugger", "chrome://browser/content/RemoteDebugger.js"],
["gViewSourceUtils", "chrome://global/content/viewSourceUtils.js"],
- ["torbuttonUtils", "chrome://torbutton/content/torbutton_utils.js"],
- ["torbutton", "chrome://torbutton/content/torbutton.js"],
];
lazilyLoadedBrowserScripts.forEach(function(aScript) {
@@ -765,8 +763,6 @@ var BrowserApp = {
true
);
- torbutton_init();
-
// We can't delay registering WebChannel listeners: if the first page is
// about:accounts, which can happen when starting the Firefox Account flow
// from the first run experience, or via the Firefox Account Status
diff --git a/mobile/android/chrome/content/browser.xul b/mobile/android/chrome/content/browser.xul
index 71aa04df0ebf..8072a7a1c6e5 100644
--- a/mobile/android/chrome/content/browser.xul
+++ b/mobile/android/chrome/content/browser.xul
@@ -4,7 +4,6 @@
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<?xml-stylesheet href="chrome://browser/content/browser.css" type="text/css"?>
-<?xml-stylesheet href="chrome://torbutton/skin/torbutton.css" type="text/css"?>
<window id="main-window"
onload="BrowserApp.startup();"
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Load torbutton in BrowserApp.startup on Android
by gk@torproject.org 02 Sep '19
by gk@torproject.org 02 Sep '19
02 Sep '19
commit fe6da38319ca39a62dc8cfffe615ec0335ba3ddf
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Fri Aug 30 10:17:25 2019 -0400
Load torbutton in BrowserApp.startup on Android
---
mobile/android/chrome/content/browser.js | 3 +++
mobile/android/chrome/content/browser.xul | 3 +++
2 files changed, 6 insertions(+)
diff --git a/mobile/android/chrome/content/browser.js b/mobile/android/chrome/content/browser.js
index f8e9399f51c4..dbecd308a3dc 100644
--- a/mobile/android/chrome/content/browser.js
+++ b/mobile/android/chrome/content/browser.js
@@ -763,6 +763,9 @@ var BrowserApp = {
true
);
+ // Torbutton scripts included in browser.xul
+ torbutton_init();
+
// We can't delay registering WebChannel listeners: if the first page is
// about:accounts, which can happen when starting the Firefox Account flow
// from the first run experience, or via the Firefox Account Status
diff --git a/mobile/android/chrome/content/browser.xul b/mobile/android/chrome/content/browser.xul
index 8072a7a1c6e5..fab93922a5f6 100644
--- a/mobile/android/chrome/content/browser.xul
+++ b/mobile/android/chrome/content/browser.xul
@@ -4,6 +4,7 @@
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<?xml-stylesheet href="chrome://browser/content/browser.css" type="text/css"?>
+<?xml-stylesheet href="chrome://torbutton/skin/torbutton.css" type="text/css"?>
<window id="main-window"
onload="BrowserApp.startup();"
@@ -11,6 +12,8 @@
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<script type="application/javascript" src="chrome://browser/content/browser.js"/>
+ <script type="application/javascript" src="chrome://torbutton/content/torbutton_util.js"/>
+ <script type="application/javascript" src="chrome://torbutton/content/torbutton.js"/>
<deck id="browsers" flex="1"/>
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 30683: Prevent detection of locale via some *.properties
by gk@torproject.org 02 Sep '19
by gk@torproject.org 02 Sep '19
02 Sep '19
commit 43d389c5d6e4450882d47a36bddc6e974c6113d5
Author: Alex Catarineu <acat(a)torproject.org>
Date: Tue Aug 20 12:58:09 2019 +0200
Bug 30683: Prevent detection of locale via some *.properties
Spoofing dom/dom.properties, layout/xmlparser.properties,
layout/MediaDocument.properties to en-US if needed.
---
browser/installer/package-manifest.in | 3 +++
dom/base/nsContentUtils.cpp | 17 +++++++++++++----
dom/base/nsContentUtils.h | 4 ++++
dom/html/HTMLSelectElement.cpp | 2 +-
dom/html/HTMLTextAreaElement.cpp | 6 +++---
dom/html/MediaDocument.cpp | 4 +++-
dom/html/MediaDocument.h | 3 +++
dom/html/input/CheckableInputTypes.cpp | 4 ++--
dom/html/input/DateTimeInputTypes.cpp | 6 +++---
dom/html/input/FileInputType.cpp | 2 +-
dom/html/input/InputType.cpp | 16 ++++++++--------
dom/html/input/NumericInputTypes.cpp | 8 ++++----
dom/html/input/SingleLineTextInputTypes.cpp | 6 +++---
dom/locales/moz.build | 6 ++++++
mobile/android/installer/package-manifest.in | 3 +++
parser/htmlparser/nsParserMsgUtils.cpp | 6 ++++++
parser/htmlparser/nsParserMsgUtils.h | 3 +++
17 files changed, 69 insertions(+), 30 deletions(-)
diff --git a/browser/installer/package-manifest.in b/browser/installer/package-manifest.in
index 1a2a24f9b5b9..1825397678d1 100644
--- a/browser/installer/package-manifest.in
+++ b/browser/installer/package-manifest.in
@@ -345,6 +345,9 @@
@RESPATH@/res/dtd/*
@RESPATH@/res/language.properties
@RESPATH@/res/locale/layout/HtmlForm.properties
+@RESPATH@/res/locale/layout/MediaDocument.properties
+@RESPATH@/res/locale/layout/xmlparser.properties
+@RESPATH@/res/locale/dom/dom.properties
#ifdef XP_MACOSX
@RESPATH@/res/MainMenu.nib/
#endif
diff --git a/dom/base/nsContentUtils.cpp b/dom/base/nsContentUtils.cpp
index d7ab544f7274..2b416828e8c1 100644
--- a/dom/base/nsContentUtils.cpp
+++ b/dom/base/nsContentUtils.cpp
@@ -3524,7 +3524,9 @@ static const char* gPropertiesFiles[nsContentUtils::PropertiesFile_COUNT] = {
"chrome://global/locale/security/security.properties",
"chrome://necko/locale/necko.properties",
"chrome://global/locale/layout/HtmlForm.properties",
- "resource://gre/res/locale/layout/HtmlForm.properties"};
+ "resource://gre/res/locale/layout/HtmlForm.properties",
+ "chrome://global/locale/dom/dom.properties",
+ "resource://gre/res/locale/dom/dom.properties"};
/* static */
nsresult nsContentUtils::EnsureStringBundle(PropertiesFile aFile) {
@@ -3573,7 +3575,8 @@ void nsContentUtils::AsyncPrecreateStringBundles() {
}
}
-static bool SpoofLocaleEnglish() {
+/* static */
+bool nsContentUtils::SpoofLocaleEnglish() {
// 0 - will prompt
// 1 - don't spoof
// 2 - spoof
@@ -3584,9 +3587,12 @@ static bool SpoofLocaleEnglish() {
nsresult nsContentUtils::GetLocalizedString(PropertiesFile aFile,
const char* aKey,
nsAString& aResult) {
- // When we spoof English, use en-US default strings in HTML forms.
+ // When we spoof English, use en-US properties in strings that are accessible
+ // by content.
if (aFile == eFORMS_PROPERTIES_MAYBESPOOF && SpoofLocaleEnglish()) {
aFile = eFORMS_PROPERTIES_en_US;
+ } else if (aFile == eDOM_PROPERTIES_MAYBESPOOF && SpoofLocaleEnglish()) {
+ aFile = eDOM_PROPERTIES_en_US;
}
nsresult rv = EnsureStringBundle(aFile);
@@ -3601,9 +3607,12 @@ nsresult nsContentUtils::FormatLocalizedString(PropertiesFile aFile,
const char16_t** aParams,
uint32_t aParamsLength,
nsAString& aResult) {
- // When we spoof English, use en-US default strings in HTML forms.
+ // When we spoof English, use en-US properties in strings that are accessible
+ // by content.
if (aFile == eFORMS_PROPERTIES_MAYBESPOOF && SpoofLocaleEnglish()) {
aFile = eFORMS_PROPERTIES_en_US;
+ } else if (aFile == eDOM_PROPERTIES_MAYBESPOOF && SpoofLocaleEnglish()) {
+ aFile = eDOM_PROPERTIES_en_US;
}
nsresult rv = EnsureStringBundle(aFile);
diff --git a/dom/base/nsContentUtils.h b/dom/base/nsContentUtils.h
index 67febf189c34..9c409099c9af 100644
--- a/dom/base/nsContentUtils.h
+++ b/dom/base/nsContentUtils.h
@@ -1119,6 +1119,8 @@ class nsContentUtils {
eNECKO_PROPERTIES,
eFORMS_PROPERTIES_MAYBESPOOF,
eFORMS_PROPERTIES_en_US,
+ eDOM_PROPERTIES_MAYBESPOOF,
+ eDOM_PROPERTIES_en_US,
PropertiesFile_COUNT
};
static nsresult ReportToConsole(
@@ -1132,6 +1134,8 @@ class nsContentUtils {
static void LogMessageToConsole(const char* aMsg);
+ static bool SpoofLocaleEnglish();
+
/**
* Get the localized string named |aKey| in properties file |aFile|.
*/
diff --git a/dom/html/HTMLSelectElement.cpp b/dom/html/HTMLSelectElement.cpp
index 76f21db23b31..afa01ee224ba 100644
--- a/dom/html/HTMLSelectElement.cpp
+++ b/dom/html/HTMLSelectElement.cpp
@@ -1539,7 +1539,7 @@ nsresult HTMLSelectElement::GetValidationMessage(nsAString& aValidationMessage,
case VALIDITY_STATE_VALUE_MISSING: {
nsAutoString message;
nsresult rv = nsContentUtils::GetLocalizedString(
- nsContentUtils::eDOM_PROPERTIES, "FormValidationSelectMissing",
+ nsContentUtils::eDOM_PROPERTIES_MAYBESPOOF, "FormValidationSelectMissing",
message);
aValidationMessage = message;
return rv;
diff --git a/dom/html/HTMLTextAreaElement.cpp b/dom/html/HTMLTextAreaElement.cpp
index 0d1ba35c8b59..2844267b9bb8 100644
--- a/dom/html/HTMLTextAreaElement.cpp
+++ b/dom/html/HTMLTextAreaElement.cpp
@@ -1001,7 +1001,7 @@ nsresult HTMLTextAreaElement::GetValidationMessage(
const char16_t* params[] = {strMaxLength.get(), strTextLength.get()};
rv = nsContentUtils::FormatLocalizedString(
- nsContentUtils::eDOM_PROPERTIES, "FormValidationTextTooLong", params,
+ nsContentUtils::eDOM_PROPERTIES_MAYBESPOOF, "FormValidationTextTooLong", params,
message);
aValidationMessage = message;
} break;
@@ -1017,13 +1017,13 @@ nsresult HTMLTextAreaElement::GetValidationMessage(
const char16_t* params[] = {strMinLength.get(), strTextLength.get()};
rv = nsContentUtils::FormatLocalizedString(
- nsContentUtils::eDOM_PROPERTIES, "FormValidationTextTooShort", params,
+ nsContentUtils::eDOM_PROPERTIES_MAYBESPOOF, "FormValidationTextTooShort", params,
message);
aValidationMessage = message;
} break;
case VALIDITY_STATE_VALUE_MISSING: {
nsAutoString message;
- rv = nsContentUtils::GetLocalizedString(nsContentUtils::eDOM_PROPERTIES,
+ rv = nsContentUtils::GetLocalizedString(nsContentUtils::eDOM_PROPERTIES_MAYBESPOOF,
"FormValidationValueMissing",
message);
aValidationMessage = message;
diff --git a/dom/html/MediaDocument.cpp b/dom/html/MediaDocument.cpp
index 196adddc0f38..7ec66b31e63d 100644
--- a/dom/html/MediaDocument.cpp
+++ b/dom/html/MediaDocument.cpp
@@ -125,7 +125,9 @@ nsresult MediaDocument::Init() {
nsCOMPtr<nsIStringBundleService> stringService =
mozilla::services::GetStringBundleService();
if (stringService) {
- stringService->CreateBundle(NSMEDIADOCUMENT_PROPERTIES_URI,
+ stringService->CreateBundle(nsContentUtils::SpoofLocaleEnglish()
+ ? NSMEDIADOCUMENT_PROPERTIES_URI_en_US
+ : NSMEDIADOCUMENT_PROPERTIES_URI,
getter_AddRefs(mStringBundle));
}
diff --git a/dom/html/MediaDocument.h b/dom/html/MediaDocument.h
index e11fd2ec8551..37e005c7fffa 100644
--- a/dom/html/MediaDocument.h
+++ b/dom/html/MediaDocument.h
@@ -16,6 +16,9 @@
#define NSMEDIADOCUMENT_PROPERTIES_URI \
"chrome://global/locale/layout/MediaDocument.properties"
+#define NSMEDIADOCUMENT_PROPERTIES_URI_en_US \
+ "resource://gre/res/locale/layout/MediaDocument.properties"
+
namespace mozilla {
namespace dom {
diff --git a/dom/html/input/CheckableInputTypes.cpp b/dom/html/input/CheckableInputTypes.cpp
index f55000c766ea..f0306b69cbd0 100644
--- a/dom/html/input/CheckableInputTypes.cpp
+++ b/dom/html/input/CheckableInputTypes.cpp
@@ -23,7 +23,7 @@ bool CheckboxInputType::IsValueMissing() const {
}
nsresult CheckboxInputType::GetValueMissingMessage(nsAString& aMessage) {
- return nsContentUtils::GetLocalizedString(nsContentUtils::eDOM_PROPERTIES,
+ return nsContentUtils::GetLocalizedString(nsContentUtils::eDOM_PROPERTIES_MAYBESPOOF,
"FormValidationCheckboxMissing",
aMessage);
}
@@ -32,5 +32,5 @@ nsresult CheckboxInputType::GetValueMissingMessage(nsAString& aMessage) {
nsresult RadioInputType::GetValueMissingMessage(nsAString& aMessage) {
return nsContentUtils::GetLocalizedString(
- nsContentUtils::eDOM_PROPERTIES, "FormValidationRadioMissing", aMessage);
+ nsContentUtils::eDOM_PROPERTIES_MAYBESPOOF, "FormValidationRadioMissing", aMessage);
}
diff --git a/dom/html/input/DateTimeInputTypes.cpp b/dom/html/input/DateTimeInputTypes.cpp
index 11dfc9e541b9..0efbe9a9121a 100644
--- a/dom/html/input/DateTimeInputTypes.cpp
+++ b/dom/html/input/DateTimeInputTypes.cpp
@@ -138,7 +138,7 @@ nsresult DateTimeInputTypeBase::GetRangeOverflowMessage(nsAString& aMessage) {
const char16_t* params[] = {maxStr.get()};
return nsContentUtils::FormatLocalizedString(
- nsContentUtils::eDOM_PROPERTIES, "FormValidationDateTimeRangeOverflow",
+ nsContentUtils::eDOM_PROPERTIES_MAYBESPOOF, "FormValidationDateTimeRangeOverflow",
params, aMessage);
}
@@ -148,7 +148,7 @@ nsresult DateTimeInputTypeBase::GetRangeUnderflowMessage(nsAString& aMessage) {
const char16_t* params[] = {minStr.get()};
return nsContentUtils::FormatLocalizedString(
- nsContentUtils::eDOM_PROPERTIES, "FormValidationDateTimeRangeUnderflow",
+ nsContentUtils::eDOM_PROPERTIES_MAYBESPOOF, "FormValidationDateTimeRangeUnderflow",
params, aMessage);
}
@@ -194,7 +194,7 @@ nsresult DateInputType::GetBadInputMessage(nsAString& aMessage) {
}
return nsContentUtils::GetLocalizedString(
- nsContentUtils::eDOM_PROPERTIES, "FormValidationInvalidDate", aMessage);
+ nsContentUtils::eDOM_PROPERTIES_MAYBESPOOF, "FormValidationInvalidDate", aMessage);
}
bool DateInputType::ConvertStringToNumber(
diff --git a/dom/html/input/FileInputType.cpp b/dom/html/input/FileInputType.cpp
index 2536a875b2ca..82a4c2de8659 100644
--- a/dom/html/input/FileInputType.cpp
+++ b/dom/html/input/FileInputType.cpp
@@ -22,5 +22,5 @@ bool FileInputType::IsValueMissing() const {
nsresult FileInputType::GetValueMissingMessage(nsAString& aMessage) {
return nsContentUtils::GetLocalizedString(
- nsContentUtils::eDOM_PROPERTIES, "FormValidationFileMissing", aMessage);
+ nsContentUtils::eDOM_PROPERTIES_MAYBESPOOF, "FormValidationFileMissing", aMessage);
}
diff --git a/dom/html/input/InputType.cpp b/dom/html/input/InputType.cpp
index 210daeafad14..f7a28f4c1a3a 100644
--- a/dom/html/input/InputType.cpp
+++ b/dom/html/input/InputType.cpp
@@ -167,7 +167,7 @@ nsresult InputType::GetValidationMessage(
const char16_t* params[] = {strMaxLength.get(), strTextLength.get()};
rv = nsContentUtils::FormatLocalizedString(
- nsContentUtils::eDOM_PROPERTIES, "FormValidationTextTooLong", params,
+ nsContentUtils::eDOM_PROPERTIES_MAYBESPOOF, "FormValidationTextTooLong", params,
message);
aValidationMessage = message;
break;
@@ -185,7 +185,7 @@ nsresult InputType::GetValidationMessage(
const char16_t* params[] = {strMinLength.get(), strTextLength.get()};
rv = nsContentUtils::FormatLocalizedString(
- nsContentUtils::eDOM_PROPERTIES, "FormValidationTextTooShort", params,
+ nsContentUtils::eDOM_PROPERTIES_MAYBESPOOF, "FormValidationTextTooShort", params,
message);
aValidationMessage = message;
@@ -216,7 +216,7 @@ nsresult InputType::GetValidationMessage(
nsAutoString title;
mInputElement->GetAttr(kNameSpaceID_None, nsGkAtoms::title, title);
if (title.IsEmpty()) {
- rv = nsContentUtils::GetLocalizedString(nsContentUtils::eDOM_PROPERTIES,
+ rv = nsContentUtils::GetLocalizedString(nsContentUtils::eDOM_PROPERTIES_MAYBESPOOF,
"FormValidationPatternMismatch",
message);
} else {
@@ -227,7 +227,7 @@ nsresult InputType::GetValidationMessage(
}
const char16_t* params[] = {title.get()};
rv = nsContentUtils::FormatLocalizedString(
- nsContentUtils::eDOM_PROPERTIES,
+ nsContentUtils::eDOM_PROPERTIES_MAYBESPOOF,
"FormValidationPatternMismatchWithTitle", params, message);
}
aValidationMessage = message;
@@ -279,12 +279,12 @@ nsresult InputType::GetValidationMessage(
if (valueLowStr.Equals(valueHighStr)) {
const char16_t* params[] = {valueLowStr.get()};
rv = nsContentUtils::FormatLocalizedString(
- nsContentUtils::eDOM_PROPERTIES,
+ nsContentUtils::eDOM_PROPERTIES_MAYBESPOOF,
"FormValidationStepMismatchOneValue", params, message);
} else {
const char16_t* params[] = {valueLowStr.get(), valueHighStr.get()};
rv = nsContentUtils::FormatLocalizedString(
- nsContentUtils::eDOM_PROPERTIES, "FormValidationStepMismatch",
+ nsContentUtils::eDOM_PROPERTIES_MAYBESPOOF, "FormValidationStepMismatch",
params, message);
}
} else {
@@ -293,7 +293,7 @@ nsresult InputType::GetValidationMessage(
const char16_t* params[] = {valueLowStr.get()};
rv = nsContentUtils::FormatLocalizedString(
- nsContentUtils::eDOM_PROPERTIES,
+ nsContentUtils::eDOM_PROPERTIES_MAYBESPOOF,
"FormValidationStepMismatchOneValue", params, message);
}
@@ -319,7 +319,7 @@ nsresult InputType::GetValidationMessage(
nsresult InputType::GetValueMissingMessage(nsAString& aMessage) {
return nsContentUtils::GetLocalizedString(
- nsContentUtils::eDOM_PROPERTIES, "FormValidationValueMissing", aMessage);
+ nsContentUtils::eDOM_PROPERTIES_MAYBESPOOF, "FormValidationValueMissing", aMessage);
}
nsresult InputType::GetTypeMismatchMessage(nsAString& aMessage) {
diff --git a/dom/html/input/NumericInputTypes.cpp b/dom/html/input/NumericInputTypes.cpp
index 6332e028c17e..ab0f6f36eb95 100644
--- a/dom/html/input/NumericInputTypes.cpp
+++ b/dom/html/input/NumericInputTypes.cpp
@@ -73,7 +73,7 @@ nsresult NumericInputTypeBase::GetRangeOverflowMessage(nsAString& aMessage) {
const char16_t* params[] = {maxStr.get()};
return nsContentUtils::FormatLocalizedString(
- nsContentUtils::eDOM_PROPERTIES, "FormValidationNumberRangeOverflow",
+ nsContentUtils::eDOM_PROPERTIES_MAYBESPOOF, "FormValidationNumberRangeOverflow",
params, aMessage);
}
@@ -90,7 +90,7 @@ nsresult NumericInputTypeBase::GetRangeUnderflowMessage(nsAString& aMessage) {
const char16_t* params[] = {minStr.get()};
return nsContentUtils::FormatLocalizedString(
- nsContentUtils::eDOM_PROPERTIES, "FormValidationNumberRangeUnderflow",
+ nsContentUtils::eDOM_PROPERTIES_MAYBESPOOF, "FormValidationNumberRangeUnderflow",
params, aMessage);
}
@@ -150,13 +150,13 @@ bool NumberInputType::HasBadInput() const {
}
nsresult NumberInputType::GetValueMissingMessage(nsAString& aMessage) {
- return nsContentUtils::GetLocalizedString(nsContentUtils::eDOM_PROPERTIES,
+ return nsContentUtils::GetLocalizedString(nsContentUtils::eDOM_PROPERTIES_MAYBESPOOF,
"FormValidationBadInputNumber",
aMessage);
}
nsresult NumberInputType::GetBadInputMessage(nsAString& aMessage) {
- return nsContentUtils::GetLocalizedString(nsContentUtils::eDOM_PROPERTIES,
+ return nsContentUtils::GetLocalizedString(nsContentUtils::eDOM_PROPERTIES_MAYBESPOOF,
"FormValidationBadInputNumber",
aMessage);
}
diff --git a/dom/html/input/SingleLineTextInputTypes.cpp b/dom/html/input/SingleLineTextInputTypes.cpp
index 15cbe65a1941..c879276c86da 100644
--- a/dom/html/input/SingleLineTextInputTypes.cpp
+++ b/dom/html/input/SingleLineTextInputTypes.cpp
@@ -117,7 +117,7 @@ bool URLInputType::HasTypeMismatch() const {
nsresult URLInputType::GetTypeMismatchMessage(nsAString& aMessage) {
return nsContentUtils::GetLocalizedString(
- nsContentUtils::eDOM_PROPERTIES, "FormValidationInvalidURL", aMessage);
+ nsContentUtils::eDOM_PROPERTIES_MAYBESPOOF, "FormValidationInvalidURL", aMessage);
}
/* input type=email */
@@ -155,12 +155,12 @@ bool EmailInputType::HasBadInput() const {
nsresult EmailInputType::GetTypeMismatchMessage(nsAString& aMessage) {
return nsContentUtils::GetLocalizedString(
- nsContentUtils::eDOM_PROPERTIES, "FormValidationInvalidEmail", aMessage);
+ nsContentUtils::eDOM_PROPERTIES_MAYBESPOOF, "FormValidationInvalidEmail", aMessage);
}
nsresult EmailInputType::GetBadInputMessage(nsAString& aMessage) {
return nsContentUtils::GetLocalizedString(
- nsContentUtils::eDOM_PROPERTIES, "FormValidationInvalidEmail", aMessage);
+ nsContentUtils::eDOM_PROPERTIES_MAYBESPOOF, "FormValidationInvalidEmail", aMessage);
}
/* static */
diff --git a/dom/locales/moz.build b/dom/locales/moz.build
index b2bcd271de7c..51f4b88ccd47 100644
--- a/dom/locales/moz.build
+++ b/dom/locales/moz.build
@@ -62,4 +62,10 @@ JAR_MANIFESTS += ['jar.mn']
RESOURCE_FILES.locale.layout += [
'en-US/chrome/layout/HtmlForm.properties',
+ 'en-US/chrome/layout/MediaDocument.properties',
+ 'en-US/chrome/layout/xmlparser.properties',
+]
+
+RESOURCE_FILES.locale.dom += [
+ 'en-US/chrome/dom/dom.properties',
]
diff --git a/mobile/android/installer/package-manifest.in b/mobile/android/installer/package-manifest.in
index 2002a894fc51..ae4319214fad 100644
--- a/mobile/android/installer/package-manifest.in
+++ b/mobile/android/installer/package-manifest.in
@@ -203,6 +203,9 @@
@BINPATH@/res/dtd/*
@BINPATH@/res/language.properties
@BINPATH@/res/locale/layout/HtmlForm.properties
+@RESPATH@/res/locale/layout/MediaDocument.properties
+@RESPATH@/res/locale/layout/xmlparser.properties
+@RESPATH@/res/locale/dom/dom.properties
#ifndef MOZ_ANDROID_EXCLUDE_FONTS
@BINPATH@/res/fonts/*
diff --git a/parser/htmlparser/nsParserMsgUtils.cpp b/parser/htmlparser/nsParserMsgUtils.cpp
index 3e369893d4f7..47749732839e 100644
--- a/parser/htmlparser/nsParserMsgUtils.cpp
+++ b/parser/htmlparser/nsParserMsgUtils.cpp
@@ -9,6 +9,7 @@
#include "nsParserMsgUtils.h"
#include "nsNetCID.h"
#include "mozilla/Services.h"
+#include "nsContentUtils.h"
static nsresult GetBundle(const char* aPropFileName,
nsIStringBundle** aBundle) {
@@ -21,6 +22,11 @@ static nsresult GetBundle(const char* aPropFileName,
mozilla::services::GetStringBundleService();
if (!stringService) return NS_ERROR_FAILURE;
+ if (nsContentUtils::SpoofLocaleEnglish() &&
+ strcmp(aPropFileName, XMLPARSER_PROPERTIES) == 0) {
+ aPropFileName = XMLPARSER_PROPERTIES_en_US;
+ }
+
return stringService->CreateBundle(aPropFileName, aBundle);
}
diff --git a/parser/htmlparser/nsParserMsgUtils.h b/parser/htmlparser/nsParserMsgUtils.h
index b4ec4784d65f..3645610385c1 100644
--- a/parser/htmlparser/nsParserMsgUtils.h
+++ b/parser/htmlparser/nsParserMsgUtils.h
@@ -11,6 +11,9 @@
#define XMLPARSER_PROPERTIES \
"chrome://global/locale/layout/xmlparser.properties"
+#define XMLPARSER_PROPERTIES_en_US \
+ "resource://gre/res/locale/layout/xmlparser.properties"
+
class nsParserMsgUtils {
nsParserMsgUtils(); // Currently this is not meant to be created, use the
// static methods
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Revert "Bug 1574980 - Fix issues with maintenance service install. r=bytesized a=jcristau"
by gk@torproject.org 02 Sep '19
by gk@torproject.org 02 Sep '19
02 Sep '19
commit d8983a79f8a0e9ae4543c229819cd17ee0e3f78a
Author: Georg Koppen <gk(a)torproject.org>
Date: Mon Sep 2 07:22:17 2019 +0000
Revert "Bug 1574980 - Fix issues with maintenance service install. r=bytesized a=jcristau"
We don't use the maintenance service and don't want to have parts of it
now included in our updater code. This commit fixes bug 31547 for esr68.
---
.../components/maintenanceservice/serviceinstall.cpp | 9 +++++++++
toolkit/mozapps/update/common/moz.build | 20 ++++++++++++++------
toolkit/mozapps/update/common/updatehelper.cpp | 9 ---------
3 files changed, 23 insertions(+), 15 deletions(-)
diff --git a/toolkit/components/maintenanceservice/serviceinstall.cpp b/toolkit/components/maintenanceservice/serviceinstall.cpp
index eb02422fadfe..ae91b1b41b76 100644
--- a/toolkit/components/maintenanceservice/serviceinstall.cpp
+++ b/toolkit/components/maintenanceservice/serviceinstall.cpp
@@ -246,6 +246,15 @@ BOOL FixServicePath(SC_HANDLE service, LPCWSTR currentServicePath,
* @return TRUE if the service was installed/upgraded
*/
BOOL SvcInstall(SvcInstallAction action) {
+ mozilla::UniquePtr<wchar_t[]> updateDir;
+ HRESULT permResult = GetCommonUpdateDirectory(
+ nullptr, SetPermissionsOf::FilesAndDirsWithBadPerms, updateDir);
+ if (FAILED(permResult)) {
+ LOG_WARN(
+ ("Unable to set the permissions on the update directory ('%S'): %d",
+ updateDir.get(), permResult));
+ }
+
// Get a handle to the local computer SCM database with full access rights.
nsAutoServiceHandle schSCManager(
OpenSCManager(nullptr, nullptr, SC_MANAGER_ALL_ACCESS));
diff --git a/toolkit/mozapps/update/common/moz.build b/toolkit/mozapps/update/common/moz.build
index 36aae9d6015b..c95f8395e853 100644
--- a/toolkit/mozapps/update/common/moz.build
+++ b/toolkit/mozapps/update/common/moz.build
@@ -14,14 +14,17 @@ EXPORTS += [
if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'windows':
EXPORTS += [
- 'certificatecheck.h',
'pathhash.h',
- 'registrycertificates.h',
'uachelper.h',
'updatehelper.cpp',
'updatehelper.h',
'updateutils_win.h',
]
+ if CONFIG['MOZ_MAINTENANCE_SERVICE']:
+ EXPORTS += [
+ 'certificatecheck.h',
+ 'registrycertificates.h',
+ ]
Library('updatecommon')
@@ -32,21 +35,26 @@ DisableStlWrapping()
if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'windows':
SOURCES += [
- 'certificatecheck.cpp',
'pathhash.cpp',
- 'registrycertificates.cpp',
'uachelper.cpp',
'updatehelper.cpp',
'updateutils_win.cpp',
]
OS_LIBS += [
'advapi32',
- 'crypt32',
'ole32',
'rpcrt4',
'shell32',
- 'wintrust',
]
+ if CONFIG['MOZ_MAINTENANCE_SERVICE']:
+ SOURCES += [
+ 'certificatecheck.cpp',
+ 'registrycertificates.cpp',
+ ]
+ OS_LIBS += [
+ 'crypt32',
+ 'wintrust',
+ ]
SOURCES += [
'/other-licenses/nsis/Contrib/CityHash/cityhash/city.cpp',
diff --git a/toolkit/mozapps/update/common/updatehelper.cpp b/toolkit/mozapps/update/common/updatehelper.cpp
index df14fafc51e9..d51813527d62 100644
--- a/toolkit/mozapps/update/common/updatehelper.cpp
+++ b/toolkit/mozapps/update/common/updatehelper.cpp
@@ -12,7 +12,6 @@
# include "mozilla/UniquePtr.h"
# include "pathhash.h"
# include "shlobj.h"
-# include "registrycertificates.h"
# include "uachelper.h"
# include "updatehelper.h"
# include "updateutils_win.h"
@@ -123,14 +122,6 @@ BOOL StartServiceUpdate(LPCWSTR installDir) {
return FALSE;
}
- // Check that the copied file's certificate matches the expected name and
- // issuer stored in the registry for this installation and that the
- // certificate is trusted by the system's certificate store.
- if (!DoesBinaryMatchAllowedCertificates(installDir, tmpService)) {
- DeleteFileW(tmpService);
- return FALSE;
- }
-
// Start the upgrade comparison process
STARTUPINFOW si = {0};
si.cb = sizeof(STARTUPINFOW);
1
0
commit 784dbc8bc01ff8cd3d510c6429225d4d5232fb96
Author: Georg Koppen <gk(a)torproject.org>
Date: Mon Sep 2 06:07:30 2019 +0000
Release preparations for 0.2.19.3
Version bump
---
src/install.rdf | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/install.rdf b/src/install.rdf
index 9df9f31..8989427 100644
--- a/src/install.rdf
+++ b/src/install.rdf
@@ -7,7 +7,7 @@
<em:creator>The Tor Project, Inc.</em:creator>
<em:contributor>Pearl Crescent, LLC</em:contributor>
<em:id>tor-launcher(a)torproject.org</em:id>
- <em:version>0.2.19.2</em:version>
+ <em:version>0.2.19.3</em:version>
<em:multiprocessCompatible>true</em:multiprocessCompatible>
<em:homepageURL>https://www.torproject.org/projects/torbrowser.html</em:homepageURL>
<em:updateURL>data:text/plain,</em:updateURL>
1
0
commit 66d86946ca9bb7347f3b64bd6cd2eed51abc7891
Author: Georg Koppen <gk(a)torproject.org>
Date: Mon Sep 2 06:05:56 2019 +0000
Translations update
---
src/chrome/locale/de/torlauncher.properties | 2 +-
src/chrome/locale/ka/torlauncher.properties | 2 +-
src/chrome/locale/mk/network-settings.dtd | 6 +--
src/chrome/locale/mk/torlauncher.properties | 4 +-
src/chrome/locale/nb/network-settings.dtd | 2 +-
src/chrome/locale/nb/torlauncher.properties | 24 +++++------
src/chrome/locale/sr/network-settings.dtd | 18 ++++-----
src/chrome/locale/sr/torlauncher.properties | 62 ++++++++++++++---------------
src/chrome/locale/sv/network-settings.dtd | 10 ++---
src/chrome/locale/sv/torlauncher.properties | 14 +++----
10 files changed, 72 insertions(+), 72 deletions(-)
diff --git a/src/chrome/locale/de/torlauncher.properties b/src/chrome/locale/de/torlauncher.properties
index 78f349c..026d24e 100644
--- a/src/chrome/locale/de/torlauncher.properties
+++ b/src/chrome/locale/de/torlauncher.properties
@@ -87,7 +87,7 @@ torlauncher.bootstrapWarning.identity=Nichtübereinstimmung der Identitäten
torlauncher.bootstrapWarning.timeout=Verbindungszeitüberschreitung
torlauncher.bootstrapWarning.noroute=Kein Pfad zum Rechner
torlauncher.bootstrapWarning.ioerror=Lese-/Schreibfehler
-torlauncher.bootstrapWarning.pt_missing=Steckbarer Transport fehlt
+torlauncher.bootstrapWarning.pt_missing=Pluggable Transport fehlt
torlauncher.nsresult.NS_ERROR_NET_RESET=Die Verbindung zum Server ist verloren gegangen.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Konnte nicht mit dem Server verbinden.
diff --git a/src/chrome/locale/ka/torlauncher.properties b/src/chrome/locale/ka/torlauncher.properties
index 271f5b5..c51cdfd 100644
--- a/src/chrome/locale/ka/torlauncher.properties
+++ b/src/chrome/locale/ka/torlauncher.properties
@@ -45,7 +45,7 @@ torlauncher.connect=დაკავშირება
torlauncher.restart_tor=Tor-ის ხელახლა გაშვება
torlauncher.quit=დახურვა
torlauncher.quit_win=გასვლა
-torlauncher.done=შესრულებულია
+torlauncher.done=მზადაა
torlauncher.forAssistance=დახმარებისთვის დაუკავშირდით %S
torlauncher.forAssistance2=დახმარებისთვის ეწვიეთ %S
diff --git a/src/chrome/locale/mk/network-settings.dtd b/src/chrome/locale/mk/network-settings.dtd
index 730fc04..b6fcffc 100644
--- a/src/chrome/locale/mk/network-settings.dtd
+++ b/src/chrome/locale/mk/network-settings.dtd
@@ -9,8 +9,8 @@
<!-- For "first run" wizard: -->
-<!ENTITY torSettings.connectPrompt "Кликнете "Поврзи" да се поврзете на Tor.">
-<!ENTITY torSettings.configurePrompt "Кликни на "Конфигурирај" да ги конфигурирате мрежните поставки ако сте во земја која го цензурира Tor (како Египет, Кина, Турција) или ако се поврзувате од приватна мрежа која бара прокси.">
+<!ENTITY torSettings.connectPrompt "Кликнете на "Поврзи" да се поврзете на Tor.">
+<!ENTITY torSettings.configurePrompt "Кликнете на "Конфигурирај" за да ги конфигурирате мрежните поставки ако сте во земја која го цензурира Tor (како Египет, Кина, Турција) или ако се поврзувате од приватна мрежа која бара прокси.">
<!ENTITY torSettings.configure "Конфигурирај">
<!ENTITY torSettings.connect "Поврзи">
@@ -56,7 +56,7 @@
<!ENTITY torsettings.bridgeHelpTitle "Помош за мост реле">
<!ENTITY torsettings.bridgeHelp1 "Мостовите се неизлистани релеа кои го прават потешко блокирањето на поврзувањата кон Tor мрежата.  Секој тип на мост користи различен метод за избегнување на цензурирањето.  obfs мостот го прави протокот на информации да изгледа нормален, а meek прави како да е од некој стандарден прелистувач наместо од Tor.">
-<!ENTITY torsettings.bridgeHelp2 "Поради тоа колку конкретно државите се обидуваат да го блокираат Tor, конкретни мостови работат во едни конкретни држави но не и во други.  Ако не си сигурен кои мостови работат во твојата држава, посети torproject.org/about/contact.html#support">
+<!ENTITY torsettings.bridgeHelp2 "Поради тоа колку конкретно државите се обидуваат да го блокираат Tor, конкретни мостови работат во едни конкретни држави но не и во други.  Ако не сте сигурни кои мостови работат во вашата држава, посетете ја torproject.org/about/contact.html#support">
<!-- Progress -->
<!ENTITY torprogress.pleaseWait "Ве молиме почекајте додека се воспостави поврзувањето со Тор мрежата.  Ова може да потрае неколку минути.">
diff --git a/src/chrome/locale/mk/torlauncher.properties b/src/chrome/locale/mk/torlauncher.properties
index 58ea6f3..b370ad7 100644
--- a/src/chrome/locale/mk/torlauncher.properties
+++ b/src/chrome/locale/mk/torlauncher.properties
@@ -47,8 +47,8 @@ torlauncher.quit=Прекини
torlauncher.quit_win=Излез
torlauncher.done=Завршено
-torlauncher.forAssistance=За асистенција, контактирајте %S
-torlauncher.forAssistance2=За помош, посетете %S
+torlauncher.forAssistance=За помош, контактирајте не на %S
+torlauncher.forAssistance2=За помош, посетете ја %S
torlauncher.copiedNLogMessages=Копирањето е завршено. %S Tor лог пораките се подготвени да бидат залепени во уредувач на текст или во порака за е-пошта.
diff --git a/src/chrome/locale/nb/network-settings.dtd b/src/chrome/locale/nb/network-settings.dtd
index 73162db..3d1ef4d 100644
--- a/src/chrome/locale/nb/network-settings.dtd
+++ b/src/chrome/locale/nb/network-settings.dtd
@@ -4,7 +4,7 @@
<!ENTITY torsettings.wizard.title.connecting "Etablering av tilkobling">
<!-- For locale picker: -->
-<!ENTITY torlauncher.localePicker.title "Språk i Tor-nettleseren">
+<!ENTITY torlauncher.localePicker.title "Tor Nettleser Språk">
<!ENTITY torlauncher.localePicker.prompt "Velg språk">
<!-- For "first run" wizard: -->
diff --git a/src/chrome/locale/nb/torlauncher.properties b/src/chrome/locale/nb/torlauncher.properties
index 5b4d92d..db8b132 100644
--- a/src/chrome/locale/nb/torlauncher.properties
+++ b/src/chrome/locale/nb/torlauncher.properties
@@ -3,8 +3,8 @@
torlauncher.error_title=Tor-oppstarteren
-torlauncher.tor_exited_during_startup=Tor ble avsluttet under oppstart. Dette kan ha sin årsak i en feil i din torrc-fil, en feil i Tor eller et annet program på din maskin, eller feilaktig maskinvare. Tor-nettleseren vil ikke starte før det bakenforliggende problemet er ordnet og du har startet det på ny.
-torlauncher.tor_exited=Tor avsluttet uventet. Dette kan være forårsaket av en feil i Tor, eller et annet program på ditt system, alternativt ødelagt maskinvare. Før omstart av Tor er gjennomført vil du ikke kunne nå noen nettsider. Hvis problemet vedvarer, send en kopi av din Tor-logg til brukerstøtte.
+torlauncher.tor_exited_during_startup=Tor ble avsluttet under oppstart. Dette kan ha sin årsak i en feil i din torrc-fil, en feil i Tor eller et annet program på din maskin, eller feilaktig maskinvare. Tor Nettleser vil ikke starte før det bakenforliggende problemet er ordnet og du har startet det på ny.
+torlauncher.tor_exited=Tor avsluttet uventet. Dette kan skyldes en feil i Tor i seg selv, et annet program på systemet ditt eller feil maskinvare. Før du starter Tor på nytt, vil ikke Tor Nettleser kunne nå noen nettsteder. Hvis problemet vedvarer, kan du sende en kopi av Tor-loggen til brukerstøtte team.
torlauncher.tor_exited2=Omstart av Tor vil ikke lukke fanene dine.
torlauncher.tor_controlconn_failed=Kunne ikke koble til Tor kontrollport.
torlauncher.tor_failed_to_start=Tor kunne ikke starte.
@@ -38,7 +38,7 @@ torlauncher.contacting_bridgedb=Kontakter BridgeDB. Vennligst vent.
torlauncher.captcha_prompt=Løs CAPTCHA-en for å forespørre en bro.
torlauncher.bad_captcha_solution=Løsningen er ikke riktig. Vær så snill, prøv på nytt.
torlauncher.unable_to_get_bridge=Kunne ikke skaffe en bro fra BridgeDB\n\n%S
-torlauncher.no_meek=Denne nettleseren er ikke konfigurert for svak, noe som trengs for å skaffe broer.
+torlauncher.no_meek=Denne nettleseren er ikke konfigurert for saktmodig, noe som er nødvendig for å skaffe broer.
torlauncher.no_bridges_available=Ingen broer er tilgjengelig på dette tidspunktet. Beklager.
torlauncher.connect=Koble til
@@ -57,21 +57,21 @@ torlauncher.bootstrapStatus.conn_pt=Kobler til bro
torlauncher.bootstrapStatus.conn_done_pt=Koblet til broen
torlauncher.bootstrapStatus.conn_proxy=Kobler til proxy
torlauncher.bootstrapStatus.conn_done_proxy=Koblet til proxy
-torlauncher.bootstrapStatus.conn=Connecting to a Tor relay
-torlauncher.bootstrapStatus.conn_done=Connected to a Tor relay
-torlauncher.bootstrapStatus.handshake=Negotiating with a Tor relay
-torlauncher.bootstrapStatus.handshake_done=Finished negotiating with a Tor relay
+torlauncher.bootstrapStatus.conn=Kobler til et Tor-relé
+torlauncher.bootstrapStatus.conn_done=Koblet til et Tor-relé
+torlauncher.bootstrapStatus.handshake=Forhandler med et Tor-relé
+torlauncher.bootstrapStatus.handshake_done=Ferdig med å forhandle med et Tor-relé
torlauncher.bootstrapStatus.onehop_create=Etablerer en kryptert katalogforbindelse
torlauncher.bootstrapStatus.requesting_status=Mottar nettverkstatus
torlauncher.bootstrapStatus.loading_status=Laster nettverkstatus
torlauncher.bootstrapStatus.loading_keys=Laster identitetsbekreftende sertifikater
torlauncher.bootstrapStatus.requesting_descriptors=Sender forespørsel om rutingsstafettoppsettsinformasjon
torlauncher.bootstrapStatus.loading_descriptors=Laster inn rutingsstafettoppsetts-informasjon
-torlauncher.bootstrapStatus.enough_dirinfo=Finished loading relay information
-torlauncher.bootstrapStatus.ap_conn_pt=Building circuits: Connecting to bridge
-torlauncher.bootstrapStatus.ap_conn_done_pt=Building circuits: Connected to bridge
-torlauncher.bootstrapStatus.ap_conn_proxy=Building circuits: Connecting to proxy
-torlauncher.bootstrapStatus.ap_conn_done_proxy=Building circuits: Connected to proxy
+torlauncher.bootstrapStatus.enough_dirinfo=Fullført lasting om relé informasjon
+torlauncher.bootstrapStatus.ap_conn_pt=Bygger kretser: Kobler til bro
+torlauncher.bootstrapStatus.ap_conn_done_pt=Bygger kretser: Koblet til bro
+torlauncher.bootstrapStatus.ap_conn_proxy=Bygger kretser: Kobler til proxy
+torlauncher.bootstrapStatus.ap_conn_done_proxy=Bygger kretser: Koblet til proxy
torlauncher.bootstrapStatus.ap_conn=Building circuits: Connecting to a Tor relay
torlauncher.bootstrapStatus.ap_conn_done=Building circuits: Connected to a Tor relay
torlauncher.bootstrapStatus.ap_handshake=Building circuits: Negotiating with a Tor relay
diff --git a/src/chrome/locale/sr/network-settings.dtd b/src/chrome/locale/sr/network-settings.dtd
index e0d20a9..7dcd5e2 100644
--- a/src/chrome/locale/sr/network-settings.dtd
+++ b/src/chrome/locale/sr/network-settings.dtd
@@ -1,7 +1,7 @@
<!ENTITY torsettings.dialog.title "Подешавања Тор мреже">
<!ENTITY torsettings.wizard.title.default "Повежите се на Тор">
<!ENTITY torsettings.wizard.title.configure "Подешавања Тор мреже">
-<!ENTITY torsettings.wizard.title.connecting "Establishing a Connection">
+<!ENTITY torsettings.wizard.title.connecting "Uspostavljanje veze">
<!-- For locale picker: -->
<!ENTITY torlauncher.localePicker.title "Тор језик">
@@ -21,11 +21,11 @@
<!ENTITY torsettings.reconfigTor "Поново Конфигуриши">
<!ENTITY torsettings.discardSettings.prompt "You have configured Tor bridges or you have entered local proxy settings.  To make a direct connection to the Tor network, these settings must be removed.">
-<!ENTITY torsettings.discardSettings.proceed "Remove Settings and Connect">
+<!ENTITY torsettings.discardSettings.proceed "Ukloni podešavanja i poveži se">
<!ENTITY torsettings.optional "Опционо">
-<!ENTITY torsettings.useProxy.checkbox "I use a proxy to connect to the Internet">
+<!ENTITY torsettings.useProxy.checkbox "Koristim proxy za povezivanje na internet">
<!ENTITY torsettings.useProxy.type "Врста proxyja:">
<!ENTITY torsettings.useProxy.type.placeholder "изаберите тип проксија">
<!ENTITY torsettings.useProxy.address "Adresa:">
@@ -39,17 +39,17 @@
<!ENTITY torsettings.firewall.checkbox "Овај рачунар пролази кроз firewall који дозвољава само конекције на одређене портове.">
<!ENTITY torsettings.firewall.allowedPorts "Дозвољени Портови:">
<!ENTITY torsettings.useBridges.checkbox "Тор је цензурисан у мојој земљи">
-<!ENTITY torsettings.useBridges.default "Select a built-in bridge">
-<!ENTITY torsettings.useBridges.default.placeholder "select a bridge">
-<!ENTITY torsettings.useBridges.bridgeDB "Request a bridge from torproject.org">
-<!ENTITY torsettings.useBridges.captchaSolution.placeholder "Enter the characters from the image">
+<!ENTITY torsettings.useBridges.default "Odaberi ugrađeni most">
+<!ENTITY torsettings.useBridges.default.placeholder "Odaberi most">
+<!ENTITY torsettings.useBridges.bridgeDB "Zahtevaj most od torproject.org">
+<!ENTITY torsettings.useBridges.captchaSolution.placeholder "Unesi karaktere sa slike">
<!ENTITY torsettings.useBridges.reloadCaptcha.tooltip "Get a new challenge">
-<!ENTITY torsettings.useBridges.captchaSubmit "Submit">
+<!ENTITY torsettings.useBridges.captchaSubmit "Predaj">
<!ENTITY torsettings.useBridges.custom "Provide a bridge I know">
<!ENTITY torsettings.useBridges.label "Enter bridge information from a trusted source.">
<!ENTITY torsettings.useBridges.placeholder "type address:port (one per line)">
-<!ENTITY torsettings.copyLog "Copy Tor Log To Clipboard">
+<!ENTITY torsettings.copyLog "Kopiraj Tor log u privremenu memoriju">
<!ENTITY torsettings.proxyHelpTitle "Proxy Help">
<!ENTITY torsettings.proxyHelp1 "A local proxy might be needed when connecting through a company, school, or university network. If you are not sure whether a proxy is needed, look at the Internet settings in another browser or check your system's network settings.">
diff --git a/src/chrome/locale/sr/torlauncher.properties b/src/chrome/locale/sr/torlauncher.properties
index d76ac94..653ec9d 100644
--- a/src/chrome/locale/sr/torlauncher.properties
+++ b/src/chrome/locale/sr/torlauncher.properties
@@ -26,18 +26,18 @@ torlauncher.error_proxy_addr_missing=Морате навести IP адресу
torlauncher.error_proxy_type_missing=Morate izabrati tip proxya.
torlauncher.error_bridges_missing=Morate odrediti jedan ili vise mostova
torlauncher.error_default_bridges_type_missing=Морате да одаберете тип транспорта за обезбеђене мостове
-torlauncher.error_bridgedb_bridges_missing=Please request a bridge.
+torlauncher.error_bridgedb_bridges_missing=Molimo zahtevajte most
torlauncher.error_bridge_bad_default_type=Не постоје услови да мостови који имају тип транспорта %S буду доступни. Молимо Вас да прилагодите поставке.
-torlauncher.bridge_suffix.meek-amazon=(works in China)
-torlauncher.bridge_suffix.meek-azure=(works in China)
+torlauncher.bridge_suffix.meek-amazon=(radi u Kini)
+torlauncher.bridge_suffix.meek-azure=(radi u Kini)
-torlauncher.request_a_bridge=Request a Bridge…
-torlauncher.request_a_new_bridge=Request a New Bridge…
-torlauncher.contacting_bridgedb=Contacting BridgeDB. Please wait.
-torlauncher.captcha_prompt=Solve the CAPTCHA to request a bridge.
-torlauncher.bad_captcha_solution=The solution is not correct. Please try again.
-torlauncher.unable_to_get_bridge=Unable to obtain a bridge from BridgeDB.\n\n%S
+torlauncher.request_a_bridge=Zahtevanje mosta...
+torlauncher.request_a_new_bridge=Zahtevanje novog mosta...
+torlauncher.contacting_bridgedb=Kontaktiranje BridgeDB. Molimo sačekajte.
+torlauncher.captcha_prompt=Rešite CAPTCHA da biste zahtevali most.
+torlauncher.bad_captcha_solution=Rešenje nije ispravno. Molimo pokušajte ponovo.
+torlauncher.unable_to_get_bridge=Nije moguće nabavljanje mosta od BridgeDB.
torlauncher.no_meek=This browser is not configured for meek, which is needed to obtain bridges.
torlauncher.no_bridges_available=No bridges are available at this time. Sorry.
@@ -48,35 +48,35 @@ torlauncher.quit_win=Излаз
torlauncher.done=Gotovo
torlauncher.forAssistance=За помоћ контактирајте %Ѕ
-torlauncher.forAssistance2=For assistance, visit %S
+torlauncher.forAssistance2=Za pomoć poseti %S
torlauncher.copiedNLogMessages=Копирање завршено. %S Top лог поруке су спремне да буду налепљене у уређивач текста или у поруку у електронској пошти.
torlauncher.bootstrapStatus.starting=Покрећем
-torlauncher.bootstrapStatus.conn_pt=Connecting to bridge
-torlauncher.bootstrapStatus.conn_done_pt=Connected to bridge
-torlauncher.bootstrapStatus.conn_proxy=Connecting to proxy
-torlauncher.bootstrapStatus.conn_done_proxy=Connected to proxy
-torlauncher.bootstrapStatus.conn=Connecting to a Tor relay
-torlauncher.bootstrapStatus.conn_done=Connected to a Tor relay
-torlauncher.bootstrapStatus.handshake=Negotiating with a Tor relay
-torlauncher.bootstrapStatus.handshake_done=Finished negotiating with a Tor relay
+torlauncher.bootstrapStatus.conn_pt=Povezivanje sa mostom
+torlauncher.bootstrapStatus.conn_done_pt=Povezan sa mostom
+torlauncher.bootstrapStatus.conn_proxy=Povezivanje sa proxy-jem
+torlauncher.bootstrapStatus.conn_done_proxy=Povezan sa proxy-jem
+torlauncher.bootstrapStatus.conn=Povezivanje sa Tor relejem
+torlauncher.bootstrapStatus.conn_done=Povezan sa Tor relejem
+torlauncher.bootstrapStatus.handshake=Pregovaranje sa Tor relejem
+torlauncher.bootstrapStatus.handshake_done=Završeno pregovaranje sa Tor relejem
torlauncher.bootstrapStatus.onehop_create=Успостављање шифроване везе директоријума
torlauncher.bootstrapStatus.requesting_status=Преузимање мрежног статуса
torlauncher.bootstrapStatus.loading_status=Учитавање мрежног статуса
torlauncher.bootstrapStatus.loading_keys=Преузимање сертификата ауторитета
torlauncher.bootstrapStatus.requesting_descriptors=Захтев за пренос информације
torlauncher.bootstrapStatus.loading_descriptors=Учитавање преноса информације
-torlauncher.bootstrapStatus.enough_dirinfo=Finished loading relay information
-torlauncher.bootstrapStatus.ap_conn_pt=Building circuits: Connecting to bridge
-torlauncher.bootstrapStatus.ap_conn_done_pt=Building circuits: Connected to bridge
-torlauncher.bootstrapStatus.ap_conn_proxy=Building circuits: Connecting to proxy
-torlauncher.bootstrapStatus.ap_conn_done_proxy=Building circuits: Connected to proxy
-torlauncher.bootstrapStatus.ap_conn=Building circuits: Connecting to a Tor relay
-torlauncher.bootstrapStatus.ap_conn_done=Building circuits: Connected to a Tor relay
-torlauncher.bootstrapStatus.ap_handshake=Building circuits: Negotiating with a Tor relay
-torlauncher.bootstrapStatus.ap_handshake_done=Building circuits: Finished negotiating with a Tor relay
-torlauncher.bootstrapStatus.circuit_create=Building circuits: Establishing a Tor circuit
+torlauncher.bootstrapStatus.enough_dirinfo=Završeno učitavenje informacija o releju
+torlauncher.bootstrapStatus.ap_conn_pt=Građenje kola: Povezivanje sa mostom
+torlauncher.bootstrapStatus.ap_conn_done_pt=Građenje kola: Povezan sa mostom
+torlauncher.bootstrapStatus.ap_conn_proxy=Građenje kola: Povezivanje sa proxy-jem
+torlauncher.bootstrapStatus.ap_conn_done_proxy=Građenje kola: Povezan sa proxy-jem
+torlauncher.bootstrapStatus.ap_conn=Građenje kola: Povezivanje sa Tor relejem
+torlauncher.bootstrapStatus.ap_conn_done=Građenje kola: Povezans a Tor relejem
+torlauncher.bootstrapStatus.ap_handshake=Građenje kola: Pregovaranje sa Tor relejem
+torlauncher.bootstrapStatus.ap_handshake_done=Građenje kola: Završeno pregovaranje sa Tor relejem
+torlauncher.bootstrapStatus.circuit_create=Građenje kola: Uspostavljanje Tor kola
torlauncher.bootstrapStatus.done=Повезан са Тор мрежом!
torlauncher.bootstrapWarning.done=ради
@@ -89,6 +89,6 @@ torlauncher.bootstrapWarning.noroute=нема путање до сервера
torlauncher.bootstrapWarning.ioerror=грешка при писању/читању
torlauncher.bootstrapWarning.pt_missing=Недостаје прикључујући транспорт
-torlauncher.nsresult.NS_ERROR_NET_RESET=The connection to the server was lost.
-torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Could not connect to the server.
-torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Could not connect to the proxy.
+torlauncher.nsresult.NS_ERROR_NET_RESET=Veza sa serverom je izgubljena.
+torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Neuspešno povezivanje sa serverom.
+torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Neuspešno povezivanje sa proxy-jem.
diff --git a/src/chrome/locale/sv/network-settings.dtd b/src/chrome/locale/sv/network-settings.dtd
index 3cd528b..95a0720 100644
--- a/src/chrome/locale/sv/network-settings.dtd
+++ b/src/chrome/locale/sv/network-settings.dtd
@@ -23,11 +23,11 @@
<!ENTITY torsettings.discardSettings.prompt "Du har konfigurerat Tor-broar eller så har du angett lokala proxyinställningar.  För att göra en direktanslutning till Tor-nätverket måste de här inställningarna tas bort.">
<!ENTITY torsettings.discardSettings.proceed "Ta bort inställningar och anslut">
-<!ENTITY torsettings.optional "Valfri">
+<!ENTITY torsettings.optional "Valfritt">
<!ENTITY torsettings.useProxy.checkbox "Jag använder en proxy för att ansluta till internet">
-<!ENTITY torsettings.useProxy.type "Typ av proxy:">
-<!ENTITY torsettings.useProxy.type.placeholder "Välj en proxy typ">
+<!ENTITY torsettings.useProxy.type "Proxytyp:">
+<!ENTITY torsettings.useProxy.type.placeholder "Välj en proxytyp">
<!ENTITY torsettings.useProxy.address "Adress:">
<!ENTITY torsettings.useProxy.address.placeholder "IP-adress eller värdnamn">
<!ENTITY torsettings.useProxy.port "Port:">
@@ -52,11 +52,11 @@
<!ENTITY torsettings.copyLog "Kopiera Tor-loggen till urklippet">
<!ENTITY torsettings.proxyHelpTitle "Proxy hjälp">
-<!ENTITY torsettings.proxyHelp1 "En lokal proxy kan behövas när du ansluter via ett företag, skola eller universitetsnätverk. Om du inte är säker på om en proxy behövs, titta på internetinställningarna i en annan webbläsare eller kontrollera systemets nätverksinställningar.">
+<!ENTITY torsettings.proxyHelp1 "En lokal proxy kan behövas när du ansluter via ett företags-, skol- eller universitetsnätverk. Om du inte är säker på om en proxy behövs, titta på internetinställningarna i en annan webbläsare eller kontrollera systemets nätverksinställningar.">
<!ENTITY torsettings.bridgeHelpTitle "Hjälp om relä-broar">
<!ENTITY torsettings.bridgeHelp1 "Broar är olistade reläer som gör det svårare att blockera anslutningar till Tor nätverket.   Var typ av bro använder sig av olika metoder för att undvika censur.   Obfs gör att din trafik ser ut som brus och meek gör att din trafik ser ut som att du ansluter till tjänsten istället för Tor.">
<!ENTITY torsettings.bridgeHelp2 "I och med att vissa länder försöker blockera Tor fungerar inte alla broar i alla länder.   Ifall du är osäker på vilka broar som fungerar i ditt land besök torproject.org/about/contact.html#support">
<!-- Progress -->
-<!ENTITY torprogress.pleaseWait "Var god och vänta medans vi etablerar en anslutning till Tor nätverket.   Detta kan ta upp till flera minuter.">
+<!ENTITY torprogress.pleaseWait "Var god och vänta medan vi etablerar en anslutning till Tor-nätverket.   Detta kan ta upp till flera minuter.">
diff --git a/src/chrome/locale/sv/torlauncher.properties b/src/chrome/locale/sv/torlauncher.properties
index a83d888..4f84ece 100644
--- a/src/chrome/locale/sv/torlauncher.properties
+++ b/src/chrome/locale/sv/torlauncher.properties
@@ -6,7 +6,7 @@ torlauncher.error_title=Tor Launcher
torlauncher.tor_exited_during_startup=Tor stängdes av under uppstart. Detta kan bero på ett fel i din torrc-fil, ett fel i Tor eller ett annat program på ditt system, eller ett hårdvarufel. Tills dess att du har åtgärdat det underliggande problemet och startat om Tor, kommer Tor Browser inte starta.
torlauncher.tor_exited=Tor stängdes oväntat ner. Det kan bero på ett fel i Tor eller i ett annat program på din dator, eller ett hårdvarufel. Tor Browser kommer inte kunna komma åt några sidor förrän du har startat om Tor. Om problemet återkommer, skicka en kopia på din Tor-logg till vår support.
torlauncher.tor_exited2=Att starta om Tor kommer inte stänga några av dina flikar i webbläsaren.
-torlauncher.tor_controlconn_failed=Kunde inte ansluta till Tors kontrollport.
+torlauncher.tor_controlconn_failed=Kunde inte ansluta till Tor-kontrollport.
torlauncher.tor_failed_to_start=Det gick inte att starta Tor.
torlauncher.tor_control_failed=Misslyckades med att ta kontroll över Tor.
torlauncher.tor_bootstrap_failed=Tor misslyckades med att upprätta en anslutning till Tor-nätverket.
@@ -15,22 +15,22 @@ torlauncher.tor_bootstrap_failed_details=%1$S misslyckades (%2$S).
torlauncher.unable_to_start_tor=Kan inte starta Tor.\n\n%S
torlauncher.tor_missing=Tors körbara programfil saknas.
torlauncher.torrc_missing=Torrc-fil saknas och kunde inte skapas.
-torlauncher.datadir_missing=Tor datakatalog finns inte och kunde inte skapas.
-torlauncher.password_hash_missing=Misslyckades med att hämta hashat lösenord.
+torlauncher.datadir_missing=Tor-datakatalog finns inte och kunde inte skapas.
+torlauncher.password_hash_missing=Det gick inte att få hashat lösenord.
torlauncher.failed_to_get_settings=Kunde inte läsa in inställningar för Tor.\n\n%S
torlauncher.failed_to_save_settings=Kunde inte spara inställningar för Tor.\n\n%S
torlauncher.ensure_tor_is_running=Försäkra dig om att Tor är startad.
torlauncher.error_proxy_addr_missing=Du måste ange både en IP-adress eller värdnamn, samt ett port-nummer för att konfigurera Tor till att använda en proxy för att nå Internet.
-torlauncher.error_proxy_type_missing=Du måste välja typ av proxy.
+torlauncher.error_proxy_type_missing=Du måste välja proxytyp.
torlauncher.error_bridges_missing=Du måste ange en eller flera broar.
torlauncher.error_default_bridges_type_missing=Du måste välja en transporttyp för de förkonfigurerade broarna.
torlauncher.error_bridgedb_bridges_missing=Vänligen begär en bro.
torlauncher.error_bridge_bad_default_type=Det finns inga förkonfigurerade broar för transporttypen %S tillgängliga. Du behöver ändra dina inställningar.
-torlauncher.bridge_suffix.meek-amazon=(Fungerar i Kina)
-torlauncher.bridge_suffix.meek-azure=(Fungerar i Kina)
+torlauncher.bridge_suffix.meek-amazon=(fungerar i Kina)
+torlauncher.bridge_suffix.meek-azure=(fungerar i Kina)
torlauncher.request_a_bridge=Begär en bro...
torlauncher.request_a_new_bridge=Begär en ny bro...
@@ -61,7 +61,7 @@ torlauncher.bootstrapStatus.conn=Ansluter till en Tor-relä
torlauncher.bootstrapStatus.conn_done=Ansluten till en Tor-relä
torlauncher.bootstrapStatus.handshake=Förhandlar med en Tor-relä
torlauncher.bootstrapStatus.handshake_done=Avslutade förhandlingarna med en Tor-relä
-torlauncher.bootstrapStatus.onehop_create=Skapar en krypterad kataloganslutning
+torlauncher.bootstrapStatus.onehop_create=Upprättar en krypterad kataloganslutning
torlauncher.bootstrapStatus.requesting_status=Hämtar nätverksstatus
torlauncher.bootstrapStatus.loading_status=Läser in nätverksstatus
torlauncher.bootstrapStatus.loading_keys=Läser in auktoritära certifikat
1
0

[tor-browser-build/master] Bug 30460: Update TOPL Project to Use Android Toolchain (Firefox 68)
by gk@torproject.org 01 Sep '19
by gk@torproject.org 01 Sep '19
01 Sep '19
commit eb5032bf34f73aaa207ad73ce70d7505921713ee
Author: sisbell <shane.isbell(a)gmail.com>
Date: Wed Jul 17 02:19:40 2019 -0700
Bug 30460: Update TOPL Project to Use Android Toolchain (Firefox 68)
Update TOPL version
---
projects/tor-onion-proxy-library/30284.patch | 22 -
.../add_socks_port_flags.patch | 14 -
projects/tor-onion-proxy-library/build | 7 +-
projects/tor-onion-proxy-library/config | 10 +-
.../gradle-dependencies-list.txt | 469 ++++++++++++---------
projects/tor-onion-proxy-library/gradle.patch | 25 ++
projects/tor-onion-proxy-library/maven-repo.patch | 51 ---
7 files changed, 305 insertions(+), 293 deletions(-)
diff --git a/projects/tor-onion-proxy-library/30284.patch b/projects/tor-onion-proxy-library/30284.patch
deleted file mode 100644
index a3594b9..0000000
--- a/projects/tor-onion-proxy-library/30284.patch
+++ /dev/null
@@ -1,22 +0,0 @@
-From 4402f247643c7b3b730f0facaf1c45dc02d5721f Mon Sep 17 00:00:00 2001
-From: sisbell <shane.isbell(a)gmail.com>
-Date: Thu, 16 May 2019 21:33:06 +0000
-Subject: [PATCH] Fixes thaliproject#120: Tor Startup Broken on KitKat Devices
-
-
-diff --git a/universal/src/main/java/com/msopentech/thali/toronionproxy/TorConfig.java b/universal/src/main/java/com/msopentech/thali/toronionproxy/TorConfig.java
-index 3df0f12..1ab7c2d 100644
---- a/universal/src/main/java/com/msopentech/thali/toronionproxy/TorConfig.java
-+++ b/universal/src/main/java/com/msopentech/thali/toronionproxy/TorConfig.java
-@@ -372,7 +372,7 @@ public final class TorConfig {
- public TorConfig build() {
- if(homeDir == null) {
- String userHome = System.getProperty("user.home");
-- homeDir = (userHome != null && !"".equals(userHome)) ? new File(userHome) : configDir;
-+ homeDir = (userHome != null && !"".equals(userHome) && !"/".equals(userHome)) ? new File(userHome) : configDir;
- }
-
- if (torExecutableFile == null) {
---
-2.20.1
-
diff --git a/projects/tor-onion-proxy-library/add_socks_port_flags.patch b/projects/tor-onion-proxy-library/add_socks_port_flags.patch
deleted file mode 100644
index 84aefc9..0000000
--- a/projects/tor-onion-proxy-library/add_socks_port_flags.patch
+++ /dev/null
@@ -1,14 +0,0 @@
-diff --git a/universal/src/main/java/com/msopentech/thali/toronionproxy/TorConfigBuilder.java b/universal/src/main/java/com/msopentech/thali/toronionproxy/TorConfigBuilder.java
-index 731fb3e..e0d0c42 100644
---- a/universal/src/main/java/com/msopentech/thali/toronionproxy/TorConfigBuilder.java
-+++ b/universal/src/main/java/com/msopentech/thali/toronionproxy/TorConfigBuilder.java
-@@ -395,6 +395,9 @@ public final class TorConfigBuilder {
- if (!isNullOrEmpty(isolationFlag)) {
- buffer.append(" ").append(isolationFlag);
- }
-+ buffer.append(" KeepAliveIsolateSOCKSAuth");
-+ buffer.append(" IPv6Traffic");
-+ buffer.append(" PreferIPv6");
- buffer.append('\n');
- return this;
- }
diff --git a/projects/tor-onion-proxy-library/build b/projects/tor-onion-proxy-library/build
index e674061..605f017 100644
--- a/projects/tor-onion-proxy-library/build
+++ b/projects/tor-onion-proxy-library/build
@@ -2,7 +2,6 @@
[% c("var/set_default_env") -%]
output_dir=[% dest_dir %]/[% c('filename') %]
gradle_repo=$rootdir/[% c('input_files_by_name/gradle-dependencies') %]
-export GRADLE_MAVEN_REPO="file://$gradle_repo"
# The download script assumes artifact package name is the complete URL path.
# In some cases this is incorrect, so copy those artifacts to correct location
@@ -18,12 +17,10 @@ tar -C /var/tmp/build -xf [% project %]-[% c('version') %].tar.gz
# Patch projects
cd /var/tmp/build/[% project %]-[% c('version') %]
-patch -p1 < $rootdir/maven-repo.patch
-patch -p1 < $rootdir/add_socks_port_flags.patch
-patch -p1 < $rootdir/30284.patch
+patch -p1 < $rootdir/gradle.patch
# Build Android Libraries and Apps
-$GRADLE_HOME/gradle-4.1/bin/gradle --offline -P androidplugin=3.0.1 assembleRelease -x lint
+$GRADLE_HOME/gradle-4.10.2/bin/gradle --offline --no-daemon -P androidplugin=3.1.0 -Dmaven.repo.local=$gradle_repo assembleRelease -x lint
# Package
cp universal/build/libs/* android/build/outputs/aar/* $output_dir
diff --git a/projects/tor-onion-proxy-library/config b/projects/tor-onion-proxy-library/config
index 0f24402..02b69ac 100644
--- a/projects/tor-onion-proxy-library/config
+++ b/projects/tor-onion-proxy-library/config
@@ -1,8 +1,8 @@
# vim: filetype=yaml sw=2
version: '[% c("abbrev") %]'
filename: '[% project %]-[% c("version") %]-[% c("var/build_id") %]'
-git_hash: 27df20a5cb107a009db009df4aaef000a6e78e2e
-git_url: https://github.com/sisbell/Tor_Onion_Proxy_Library.git
+git_hash: a720e25bcdada2e6ba5c8cb1f566a6b633b79dc5
+git_url: https://github.com/thaliproject/Tor_Onion_Proxy_Library.git
git_submodule: 1
var:
@@ -13,7 +13,7 @@ var:
container:
use_container: 1
# this should be updated when the list of gradle dependencies is changed
- gradle_dependencies_version: 2
+ gradle_dependencies_version: 3
targets:
android:
@@ -28,6 +28,4 @@ input_files:
- filename: 'gradle-dependencies-[% c("var/gradle_dependencies_version") %]'
name: gradle-dependencies
exec: '[% INCLUDE "fetch-gradle-dependencies" %]'
- - filename: maven-repo.patch
- - filename: add_socks_port_flags.patch
- - filename: 30284.patch
+ - filename: gradle.patch
diff --git a/projects/tor-onion-proxy-library/gradle-dependencies-list.txt b/projects/tor-onion-proxy-library/gradle-dependencies-list.txt
index fe44f31..3701351 100644
--- a/projects/tor-onion-proxy-library/gradle-dependencies-list.txt
+++ b/projects/tor-onion-proxy-library/gradle-dependencies-list.txt
@@ -1,201 +1,280 @@
# On how to update dependencies see projects/common/how-to-create-gradle-dependencies-list.txt
# Don't forget to update var/gradle_dependencies_version when modifying this file
sha256sum | url
-c3c99bf58182889fe86315e9a01473ee2c95540b9dedef898cec64554d925c54 | https://repo1.maven.org/maven2/com/android/tools/annotations/24.5.0/annotat…
-58aa4df8faae90e484c0bc47494a1ec97dc51fe53eae2b4a70d60ea7489cdf8c | https://dl.google.com/dl/android/maven2/com/android/tools/external/com-inte…
-47a89be0fa0fedd476db5fd2c83487654d2a119c391f83a142be876667cf7dab | https://repo1.maven.org/maven2/com/googlecode/json-simple/json-simple/1.1/j…
-c0de2bbc4cb8297419659813ecd4ed1d077ed1dd5c1f5544cc5143e493e84c10 | https://repo1.maven.org/maven2/org/ow2/asm/asm-tree/5.1/asm-tree-5.1.jar
-a20fb26c8de5b0ff7a3069e681fcf01ebefd2f3d24b832c3af22d981d7d4376b | https://dl.google.com/dl/android/maven2/com/android/tools/repository/26.0.1…
-26e25982a0382633c9a2ad52da483bf44d06bed72e09b98cdce61e0780ebb928 | https://dl.google.com/dl/android/maven2/com/android/support/support-compat/…
-cf7e3630e1929ddeffcb0315db2acb37182c92dd3af970111b6115592f64d077 | https://repo1.maven.org/maven2/org/jacoco/org.jacoco.core/0.7.4.20150226212…
-2068320bd6bad744c3673ab048f67e30bef8f518996fa380033556600669905d | https://repo1.maven.org/maven2/org/codehaus/mojo/animal-sniffer-annotations…
-ddb0fc5402b4cd8f31d5f29c830793d3ec00fd8ce60786254e5f0f132f0bdd8d | https://dl.google.com/dl/android/maven2/com/android/tools/lint/lint-api/26.…
-cf251279505960889b6b281c26af0438656ebac3845e52791925cf7649cb15a6 | https://dl.google.com/dl/android/maven2/com/android/tools/sdklib/26.0.1/sdk…
-8b870b3f2ee38bf15681acbc8b628df1ccf7c533190b5c79af9934b6cd66d451 | https://dl.google.com/dl/android/maven2/com/android/databinding/baseLibrary…
-6f2ebfdaa5571ff614b002da3fac8f18cf9879dd4c5ea8144b55f87fce63c338 | https://dl.google.com/dl/android/maven2/com/android/support/support-v4/26.1…
-81120db4d5490c4f0e9789e1178d2bac231fcff2618bd80f8ef6ff03c550d59b | https://repo1.maven.org/maven2/org/ow2/asm/asm-analysis/5.1/asm-analysis-5.…
-e8b4151ae1679f1abe7a14ee371ac9b3c651ae7b63290d1f586bdd0f78face9a | https://repo1.maven.org/maven2/com/android/tools/build/transform-api/2.0.0-…
-74fa208043740642f7e6eb09faba15965218ad2f50ce3020efb100136e4b591c | https://repo1.maven.org/maven2/it/unimi/dsi/fastutil/7.2.0/fastutil-7.2.0.j…
-ee032c39ae5e3cd099148fbba9a2124f9ed613e5cb93e03ee0fa8808ce364040 | https://repo1.maven.org/maven2/org/ow2/asm/asm-util/5.1/asm-util-5.1.jar
-e899e02ec8ac6a73fb9c9c7cb9ebd9bfc4ce8263412285d5ec6f2df920880905 | https://dl.google.com/dl/android/maven2/com/android/tools/build/builder-mod…
-3d6eba428555a558de046b5d76eacc1f5a54b4f5f20b84d636ed7aff18aa48c3 | https://repo1.maven.org/maven2/org/apache/httpcomponents/project/7/project-…
-e116f486c3554484c949b31fc93d3507f9701de7b379e45a0e0c1cf5099b2bbf | https://dl.google.com/dl/android/maven2/com/android/support/animated-vector…
-18f5c52120db036e88d6136f8839c832d074bdda95c756c6f429249d2db54ac6 | https://repo1.maven.org/maven2/org/slf4j/slf4j-parent/1.7.25/slf4j-parent-1…
-5d252585d47129cd667d96c92237383138a42edec5a8963a7dd44cd770faed91 | https://dl.google.com/dl/android/maven2/com/android/tools/lint/lint-checks/…
-1151b7f0ea29c9a9a8fee042a1dbe82f196632d801c438d08b279e131c767118 | https://dl.google.com/dl/android/maven2/com/android/support/support-vector-…
-df5f5e4b6d2ddcde49ed5a4e7e3bf2cb7f87e0d9892e5b066f995c4d703b228f | https://dl.google.com/dl/android/maven2/com/android/tools/analytics-library…
-99d6199ad5a09a0e5e8a49a4cc08f818483ddcfd7eedea2f9923412daf982309 | https://dl.google.com/dl/android/maven2/com/android/support/support-annotat…
-1158e94c7de4da480873f0b4ab4a1da14c0d23d4b1902cc94a58a6f0f9ab579e | https://repo1.maven.org/maven2/com/google/guava/guava/22.0/guava-22.0.jar
-af83b06679ebe43ded35c9922c1db31b85c14f48892dd741460b7cb8aacd1673 | https://dl.google.com/dl/android/maven2/com/android/support/support-vector-…
-3369250d6893cde0feda0a97c3c70f79ad9d8b8a82f08a868997873b154cba71 | https://dl.google.com/dl/android/maven2/android/arch/lifecycle/runtime/1.0.…
-a34658f5c5de4b573eef21131cc32cc25f7b66407944f312b28ec2e56abb1fa9 | https://repo1.maven.org/maven2/org/ow2/asm/asm-analysis/5.1/asm-analysis-5.…
-e767a1248adb4843110457e839e504c2511649ee78f05a6a311ea7f23578894d | https://dl.google.com/dl/android/maven2/com/android/tools/build/builder-tes…
-f51550a06b1410bd4962cb0e71df0b921a60a7ef47bfa9c4825a14be72316eea | https://repo1.maven.org/maven2/org/codehaus/mojo/animal-sniffer-parent/1.14…
-2ba9c1cfec6b4a183b72a5ccc6cb2c83479d6ad7e931543c792292c1679a7f43 | https://dl.google.com/dl/android/maven2/com/android/tools/external/org-jetb…
-54b34e941b8e1414bd3e40d736efd3481772dc26db3296f6aa45cec9f6203d86 | https://repo1.maven.org/maven2/commons-codec/commons-codec/1.6/commons-code…
-6b5ad911a13a5c814c04be4376586eec15838158cb59b9f062ae138ddff1b861 | https://dl.google.com/dl/android/maven2/com/android/tools/layoutlib/layoutl…
-d82e24e72c158315cec9f6efcb7a26851655bd987d705fc81699ff6710703ee4 | https://dl.google.com/dl/android/maven2/android/arch/lifecycle/common/1.0.0…
-21bb4d44dff54e33a37c11af69859a714202ae00969aab5453eba7276688f8ec | https://repo1.maven.org/maven2/org/apache/httpcomponents/project/4.1.1/proj…
-85ec8258fafc283f61647e6a11b404890821c11db6fcf550779ecf7a14151007 | https://repo1.maven.org/maven2/org/ow2/asm/asm-parent/5.1/asm-parent-5.1.pom
-c71555751e57e0ef912870e8ac9625ae782502a6a5b9c19ccf83b2a97d8b26bd | https://repo1.maven.org/maven2/com/google/jimfs/jimfs-parent/1.1/jimfs-pare…
-cd6db17a11a31ede794ccbd1df0e4d9750f640234731f21cff885a9997277e81 | https://repo1.maven.org/maven2/com/google/google/1/google-1.pom
-f34b3a0b62cdb468eb7e8335de4edc87958dc299306c2b4ba8ea15e6a4be106a | https://repo1.maven.org/maven2/net/sf/proguard/proguard-gradle/5.3.3/progua…
-7846399b35c7cd642a9b3a000c3e2d62d04eb37a4547b6933cc8b18bcc2f086b | https://repo1.maven.org/maven2/com/googlecode/juniversalchardet/juniversalc…
-932e6bab9a24a7bc958bbdb7e29e04d083b473d11c4ba3fab1e9b7149579f272 | https://repo1.maven.org/maven2/com/google/protobuf/protobuf-parent/3.0.0/pr…
-362e9324ee7c697e21279e20077b52737ddef3f1b2c1a7abe5ad34b465145550 | https://repo1.maven.org/maven2/org/apache/httpcomponents/httpclient/4.2.6/h…
-401877d5e70ad599e9b6cff18434ea0332f637b51f8ec68352646c836f9bb2a4 | https://repo1.maven.org/maven2/org/antlr/antlr4-master/4.5.3/antlr4-master-…
-e5e82da4cc66c8d917bbf743e3c0752efe8522735e7fc9dbddb65bccea81cfe9 | https://repo1.maven.org/maven2/org/apache/httpcomponents/httpcore/4.2.5/htt…
-e30f1db6058f745f26112ef309f89becb27c617c7d9e4c6e02165a7620a92e6a | https://dl.google.com/dl/android/maven2/com/android/tools/common/26.0.1/com…
-f8ab13b14be080fe2f617f90e55599760e4a1b4deeea5c595df63d0d6375ed6d | https://repo1.maven.org/maven2/com/intellij/annotations/12.0/annotations-12…
-cc6a41dc3eaacc9e440a6bd0d2890b20d36b4ee408fe2d67122f328bb6e01581 | https://repo1.maven.org/maven2/commons-io/commons-io/2.4/commons-io-2.4.jar
-cf149955279b07d4f11e817985c1164a69e930d73db7441b43a6ef53bbd286c4 | https://repo1.maven.org/maven2/com/google/errorprone/error_prone_parent/2.0…
-ec4c74554312fac5116350164786f91b35c9e082fa4ea598bfa42b5db05d7abb | https://repo1.maven.org/maven2/org/jacoco/org.jacoco.core/0.7.4.20150226212…
-e1abd7f1116cf5e0c59947693e2189208ec94296b2a3394c959e3511d399a7b0 | https://repo1.maven.org/maven2/com/squareup/javawriter/2.5.0/javawriter-2.5…
-23e6d006f7d07bb43ebc80b2e530c8cdd65bbabcaaf911c3f12e2ea26167178c | https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle-core…
-5215b648798c6c8d9b9cde3642d3bfb5a4cc894b7c8411004352e7de5d119827 | https://repo1.maven.org/maven2/org/apache/httpcomponents/httpcomponents-cli…
-d0f2e16d054e8bb97add9ca26525eb2346f692809fcd2a28787da8ceb3c35ee8 | https://repo1.maven.org/maven2/commons-logging/commons-logging/1.1.1/common…
-86bf301a20ad0cd0a391e22a52e6fbf90575c096ff83233fa9fd0d52b3219121 | https://dl.google.com/dl/android/maven2/android/arch/lifecycle/common/1.0.0…
-536c45e8804de01321c478cfb994377f81f1e32897636616fa21b877fd137c6f | https://repo1.maven.org/maven2/org/eclipse/jdt/core/compiler/ecj/4.6.1/ecj-…
-d49d179f707d3f3a00b2a7d36136b54aa8d44fa22770703cd82fe52fb39e22eb | https://repo1.maven.org/maven2/com/android/tools/build/transform-api/2.0.0-…
+dc417b6aa3ec6ff879b13720a11f463aa00f1f9ab7c33b9fe4006de67c29cd52 | https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle/3.1.…
+6c6776338f04a28676ab0d4ad13a1ada690998f4a843068cd3af7589f6d3e188 | https://dl.google.com/dl/android/maven2/com/android/tools/build/bundletool/…
+8d5bbd5948e49bbc51f42c029d3a4bf8f2b8b495c8e25fc0cf0efc9df5f07054 | https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle-core…
+f26bdec2b9496470c0ce63b0d290816e8000ef018daaa259597ebae947fd690f | https://repo.maven.apache.org/maven2/net/sf/proguard/proguard-gradle/5.3.3/…
+0288414509c625b8dd544384fbd29f502bdc8b4f86cfc26625aa23eef9fa6057 | https://repo.maven.apache.org/maven2/net/sf/proguard/proguard-parent/5.3.3/…
+cd36b31f1495f4fe55a936dd00607abdd945e1f8074549225a04c402d1d35750 | https://repo.maven.apache.org/maven2/org/ow2/asm/asm-commons/5.1/asm-common…
+6b7a74be21c57056eed1c1606524c3b6381ba091a98925fd934567c4a524ac38 | https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jre…
+81120db4d5490c4f0e9789e1178d2bac231fcff2618bd80f8ef6ff03c550d59b | https://repo.maven.apache.org/maven2/org/ow2/asm/asm-analysis/5.1/asm-analy…
+d49d179f707d3f3a00b2a7d36136b54aa8d44fa22770703cd82fe52fb39e22eb | https://repo.maven.apache.org/maven2/com/android/tools/build/transform-api/…
+6d079b5abf39f323baaccc68463beef5cf2e9574f333dd749ae96753f00eb205 | https://repo.maven.apache.org/maven2/org/ow2/asm/asm/5.1/asm-5.1.pom
+0c0e9d1857c250d1d71b5c6be7b8cc29afe55e7419a90d13bbe968ae5bd7240e | https://repo.maven.apache.org/maven2/org/ow2/asm/asm-util/5.1/asm-util-5.1.…
+7af7e2d8b24b4798f04c2b7da24c9fbd1b7557b4e017c2054481565916079092 | https://repo.maven.apache.org/maven2/net/sf/jopt-simple/jopt-simple/4.9/jop…
+6743e37575c3138fe821ff1afd78d4545db8b0e850efac139dff36bb6590d46b | https://dl.google.com/dl/android/maven2/com/android/tools/lint/lint-gradle-…
+85ec8258fafc283f61647e6a11b404890821c11db6fcf550779ecf7a14151007 | https://repo.maven.apache.org/maven2/org/ow2/asm/asm-parent/5.1/asm-parent-…
+cbe7dab110aa887f6d7ae1ed209eb679e1334a154f1f02b8a92a693fea6299a0 | https://dl.google.com/dl/android/maven2/com/android/databinding/compilerCom…
+b51f8867c92b6a722499557fc3a1fdea77bdf9ef574722fe90ce436a29559454 | https://repo.maven.apache.org/maven2/org/sonatype/oss/oss-parent/7/oss-pare…
+51215c67d2c068d8b7d2f6f80f51372a098075deccc448d4bdd7b987ba8328fb | https://repo.maven.apache.org/maven2/org/ow2/ow2/1.3/ow2-1.3.pom
+01b97e89902e1a85de0d7a6708d56dca8b8ca4c496f2710e777f3c74e2dd9660 | https://dl.google.com/dl/android/maven2/com/android/tools/build/builder/3.1…
+075e524b0db8885e885806f6fc7e6832c7af3c74dd7806b9c59a2ce321fd1f32 | https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle-api/…
+180a588bb8b4ed7cc554578b0dbfdb1aecfb3380922173df6541da18ee230911 | https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_anno…
+83f17ba86c5fa1a15a3a3c8030d4ce42ef21c1d39b65db6cc004a8eeb2c59406 | https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java/3.4.…
+901fb1440a0ef8e0c0553a7bb44c0b89647bf53c8822642eea0b57173c7c688d | https://repo.maven.apache.org/maven2/com/google/auto/value/auto-value/1.5.2…
+89c43073e7eaa0eaba72a4a36ae1b6bfdfe5d81bb9d0e156aee05e4a72de3cb8 | https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java-util…
+bfadb3b40f65dd6de1666d6b29f8bb54031396c76eeef4146cf9f28255f8bf33 | https://repo.maven.apache.org/maven2/com/google/guava/guava/22.0/guava-22.0…
+24909c552842c0eb7a4c769d631a43cbef5a9a10c1640f2bdbd1ea149c573a47 | https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-parent/3.…
+c6b6d61ddb8f6b3bf29e8dafe35ff5d5a1ea90304b457e05657c1e7b8063a143 | https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_pare…
+c98f1b0978cfd24712c27388e040c50ce0692252b3aa9448603d9efa05ebe8a8 | https://repo.maven.apache.org/maven2/com/google/auto/auto-parent/3/auto-par…
+1eaf9182e1977c1c50a70edbfbf70536398c68990bfaafc9f0e9899041201539 | https://repo.maven.apache.org/maven2/com/google/guava/guava-parent/22.0/gua…
+cd6db17a11a31ede794ccbd1df0e4d9750f640234731f21cff885a9997277e81 | https://repo.maven.apache.org/maven2/com/google/google/1/google-1.pom
+6ca265a30441628d070e4abe03b3c3c9ddadbcf3a06283ba0d6506baaaa23bc1 | https://dl.google.com/dl/android/maven2/com/android/tools/build/aapt2-proto…
+e1abd7f1116cf5e0c59947693e2189208ec94296b2a3394c959e3511d399a7b0 | https://repo.maven.apache.org/maven2/com/squareup/javawriter/2.5.0/javawrit…
+321668fc474a73140eb9cc73c779f1ebb9f60948aade3beddee082ecefcf0259 | https://repo.maven.apache.org/maven2/org/bouncycastle/bcpkix-jdk15on/1.56/b…
+fb5369fc7ea4b2e3cf8d6f20243f1d97f81341bf818b179cd8dbd1da7a781a21 | https://repo.maven.apache.org/maven2/org/ow2/asm/asm-tree/5.1/asm-tree-5.1.…
+8fdc3336e7b01873193ba9c48b87de7d788dc0954d1eb45c322492627a4b5c6e | https://repo.maven.apache.org/maven2/org/bouncycastle/bcprov-jdk15on/1.56/b…
+5a3f320877640666ea483eb6764e6d407c283c324d4d45b38db9d5fbfc8bdf8b | https://dl.google.com/dl/android/maven2/com/android/tools/analytics-library…
+47a89be0fa0fedd476db5fd2c83487654d2a119c391f83a142be876667cf7dab | https://repo.maven.apache.org/maven2/com/googlecode/json-simple/json-simple…
+48b9884f3c8d7765749723a8224299fa73bdb453c54126529c274305bc37077d | https://dl.google.com/dl/android/maven2/com/android/tools/build/apksig/3.1.…
+953b116521a73575eee990e3f2c36a892fb088bb2d9a3027c82193cb7a013ef7 | https://repo.maven.apache.org/maven2/it/unimi/dsi/fastutil/7.2.0/fastutil-7…
+02554156b6af9aafbb34da23ad09ccc93383657b47b2ac8e151ec325966a8e72 | https://dl.google.com/dl/android/maven2/com/android/tools/sdk-common/26.1.0…
+674c6cc0741b9babe0f154734d826c4313889bf8a9e6b3ca8af8c1bf206ebbf5 | https://dl.google.com/dl/android/maven2/com/android/tools/ddms/ddmlib/26.1.…
+77fa615c35438801d49a487f82b6426d5f55c516b7a287d975c25432dc77af7a | https://dl.google.com/dl/android/maven2/com/android/tools/analytics-library…
+31641a4746e77cec3e3375c9973530f82a389bead83099f32dcfc38137695557 | https://dl.google.com/dl/android/maven2/com/android/tools/build/builder-mod…
+8971cb4273045b0af916ce6ebeb140527b9ebc917319ce5d1ea266362690e4dd | https://dl.google.com/dl/android/maven2/com/android/tools/sdklib/26.1.0/sdk…
+0aa1569bf11a2f78d202b63ef747f82a3ba0c3affaa6ff2f5071620264d2648e | https://dl.google.com/dl/android/maven2/com/android/tools/build/builder-tes…
+7d90ddec5f11b616aa80ff306bd818d1133f3cffafca88cc3e2bdd659863c75b | https://dl.google.com/dl/android/maven2/com/android/tools/common/26.1.0/com…
+041cda360c68cb182a9b2cfae639d4b3590f714181b756452905aff9a4e5e2ed | https://dl.google.com/dl/android/maven2/com/android/tools/build/manifest-me…
+8c5adb944e161657e866270783fb92a4a6bf2c1e5d3211a98b7ab1b3b7c91cb2 | https://dl.google.com/dl/android/maven2/com/android/tools/analytics-library…
+f35215da1bed69e3d60735d76221d7012cd1a5bc0a30f6f7421719ada463b4dd | https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.…
+723936ec07b87b210a44ef8058f32f56e3d56442218dfbf8f4e538a927160ede | https://repo.maven.apache.org/maven2/com/google/code/gson/gson/2.7/gson-2.7…
+8a4e4b32eedaa72976a757e12cf1dfe742725db0b7311bf176dd937ba4236384 | https://repo.maven.apache.org/maven2/org/antlr/antlr4/4.5.3/antlr4-4.5.3.pom
+b3760f40f19e735b2cd418f7656335d926d1d9413e10982a1c9695b64edbb647 | https://repo.maven.apache.org/maven2/com/squareup/javapoet/1.8.0/javapoet-1…
+7846399b35c7cd642a9b3a000c3e2d62d04eb37a4547b6933cc8b18bcc2f086b | https://repo.maven.apache.org/maven2/com/googlecode/juniversalchardet/juniv…
+c3c99bf58182889fe86315e9a01473ee2c95540b9dedef898cec64554d925c54 | https://repo.maven.apache.org/maven2/com/android/tools/annotations/24.5.0/a…
+b2b5dd46cf998fa626eb6f8a1c114f6167c8d392694164e62533e5898e9b31f2 | https://repo.maven.apache.org/maven2/commons-io/commons-io/2.4/commons-io-2…
+401877d5e70ad599e9b6cff18434ea0332f637b51f8ec68352646c836f9bb2a4 | https://repo.maven.apache.org/maven2/org/antlr/antlr4-master/4.5.3/antlr4-m…
+871e8c737322301f0cc8acfe39a2960c4579d9d8666aeea5298bb6fcc9e4272b | https://repo.maven.apache.org/maven2/com/google/code/gson/gson-parent/2.7/g…
+fb40265f982548212ff82e362e59732b2187ec6f0d80182885c14ef1f982827a | https://repo.maven.apache.org/maven2/org/sonatype/oss/oss-parent/9/oss-pare…
+79d0d2111187b8af3ad3635d815595f7b50c49685463784fe6bd7c3f897358e3 | https://dl.google.com/dl/android/maven2/com/android/databinding/baseLibrary…
+467ae650442e876867379094e7518dfdd67d22c5352ebd39808c84259e9790ba | https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/25/c…
+4946e60a547c8eda69f3bc23c5b6f0dadcf8469ea49b1d1da7de34aecfcf18dd | https://repo.maven.apache.org/maven2/org/apache/apache/9/apache-9.pom
+2077417c22d3ab7734ce35385e9c3f4721840fa8df925edb19abe3eea8507348 | https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jre…
+ca9778da4afbcd421b09384b257c9de47f610aec5c9165e0209228d25a337a20 | https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.2…
+e51efb2ec140b2849b9880fb161cb6e30dd672368a534c1f47ab46d7f537d9ca | https://repo.maven.apache.org/maven2/net/sf/proguard/proguard-base/5.3.3/pr…
+1879f19a05991e3ed95910b96689333396b0c467a215dc4d1f90018404b72a26 | https://repo.maven.apache.org/maven2/org/codehaus/mojo/animal-sniffer-annot…
+feab9191311c3d7aeef2b66d6064afc80d3d1d52d980fb07ae43c78c987ba93a | https://repo.maven.apache.org/maven2/com/google/code/findbugs/jsr305/1.3.9/…
+f0c98c571e93a7cb4dd18df0fa308f0963e7a0620ac2d4244e61e709d03ad6be | https://repo.maven.apache.org/maven2/com/google/j2objc/j2objc-annotations/1…
+f51550a06b1410bd4962cb0e71df0b921a60a7ef47bfa9c4825a14be72316eea | https://repo.maven.apache.org/maven2/org/codehaus/mojo/animal-sniffer-paren…
+3e395d6fbc43c09a3774cac8694ce527398305ea3fd5492d80e25af27d382a9c | https://repo.maven.apache.org/maven2/org/codehaus/mojo/mojo-parent/34/mojo-…
+6b87237de8c2e1740cf80627c7f3ce3e15de1930bb250c55a1eca94fa3e014df | https://repo.maven.apache.org/maven2/org/codehaus/codehaus-parent/4/codehau…
+59ac55c581df73ba7efdc454c9134a63330db42f62053a675f36ad22265e3b6b | https://dl.google.com/dl/android/maven2/com/android/tools/annotations/26.1.…
+b787d574c851505e76212968b9ae1641ea79804aef7f5a2cee2a01cd4055213a | https://repo.maven.apache.org/maven2/org/apache/commons/commons-compress/1.…
+f5a0a1eeaa100ed36aa83eca562d5dbb7e9b045c98b44db7da4745e9d9a20328 | https://repo.maven.apache.org/maven2/org/apache/httpcomponents/httpclient/4…
+db3cd95bec1001605e1653f2843e8542e712fa2bb672fd9c8c1ace86c57673d1 | https://repo.maven.apache.org/maven2/org/apache/httpcomponents/httpmime/4.1…
+52b6fd2eaf2240e14dbe752f1fa884270cc668d6f350e8e7f65f6033a8172d69 | https://repo.maven.apache.org/maven2/org/apache/httpcomponents/httpcomponen…
+5215b648798c6c8d9b9cde3642d3bfb5a4cc894b7c8411004352e7de5d119827 | https://repo.maven.apache.org/maven2/org/apache/httpcomponents/httpcomponen…
+87cd27e1a02a5c3eb6d85059ce98696bb1b44c2b8b650f0567c86df60fa61da7 | https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/39/c…
+3d6eba428555a558de046b5d76eacc1f5a54b4f5f20b84d636ed7aff18aa48c3 | https://repo.maven.apache.org/maven2/org/apache/httpcomponents/project/7/pr…
+e9344a57c53db3a11520d160da91482d0f491c08edde34bc1c5b4fb5baf798f1 | https://dl.google.com/dl/android/maven2/com/android/tools/repository/26.1.0…
+6b93985e7deda921224dccd63031eeb9b282c00eff3103b3cca4dfd945b0d7e9 | https://dl.google.com/dl/android/maven2/com/android/tools/dvlib/26.1.0/dvli…
+9f85ff2fd7d6cb3097aa47fb419ee7f0ebe869109f98aba9f4eca3f49e74a40e | https://repo.maven.apache.org/maven2/org/apache/apache/16/apache-16.pom
+21bb4d44dff54e33a37c11af69859a714202ae00969aab5453eba7276688f8ec | https://repo.maven.apache.org/maven2/org/apache/httpcomponents/project/4.1.…
+ff513db0361fd41237bef4784968bc15aae478d4ec0a9496f811072ccaf3841d | https://repo.maven.apache.org/maven2/org/apache/apache/13/apache-13.pom
+2a587e265c5ce8aa01d4f2a5958a6c8cd4d56f28d1dcdbfb53daadb1158a898f | https://dl.google.com/dl/android/maven2/com/android/tools/layoutlib/layoutl…
+31ce606f4e9518936299bb0d27c978fa61e185fd1de7c9874fe959a53e34a685 | https://repo.maven.apache.org/maven2/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0.pom
+965aeb2bedff369819bdde1bf7a0b3b89b8247dd69c88b86375d76163bb8c397 | https://repo.maven.apache.org/maven2/org/jetbrains/annotations/13.0/annotat…
+efa86e5cd922f17b472fdfcae57234d8d4ac3e148b6250737dfce454af7a7a44 | https://repo.maven.apache.org/maven2/com/google/jimfs/jimfs/1.1/jimfs-1.1.p…
+e5327b31b595ab8143e97836d5ccdf85feb91e7ff5666f7b26913632facca4aa | https://repo.maven.apache.org/maven2/org/glassfish/jaxb/jaxb-runtime/2.2.11…
+f879b6e945854c6900b0dbee1c8384d7ab3de7e157fd7ac84937405c416d2a5e | https://repo.maven.apache.org/maven2/com/sun/activation/javax.activation/1.…
+21918cb8e4eda67f24251e909a5d81672201d93604c4ffbf33522ad836a58e90 | https://repo.maven.apache.org/maven2/com/sun/xml/bind/mvn/jaxb-runtime-pare…
+1d8518e3ac7532a104e4f7be77def37c982e530723c6bdb3d67708cce2b0c2c4 | https://repo.maven.apache.org/maven2/com/sun/activation/all/1.2.0/all-1.2.0…
+c71555751e57e0ef912870e8ac9625ae782502a6a5b9c19ccf83b2a97d8b26bd | https://repo.maven.apache.org/maven2/com/google/jimfs/jimfs-parent/1.1/jimf…
+281440811268e65d9e266b3cc898297e214e04f09740d0386ceeb4a8923d63bf | https://repo.maven.apache.org/maven2/net/java/jvnet-parent/1/jvnet-parent-1…
+b5301b711c01547e571b615f9a0832ee525d34a4ce3372f53907a87cf20b0480 | https://repo.maven.apache.org/maven2/com/sun/xml/bind/mvn/jaxb-parent/2.2.1…
+b25e0693de21cb92b039a2e4608f396590fb8773108f10d6dc9f1465f03b5be9 | https://repo.maven.apache.org/maven2/com/sun/xml/bind/jaxb-bom-ext/2.2.11/j…
+a52e6850f070dc9f7a2a51d0b25dfaafd49b0b9bf8196db6c0b3c5b7c94d8d38 | https://repo.maven.apache.org/maven2/org/glassfish/jaxb/jaxb-bom/2.2.11/jax…
+471395735549495297c8ff939b9a32e08b91302020ff773586d27e497abb8fbb | https://repo.maven.apache.org/maven2/net/java/jvnet-parent/4/jvnet-parent-4…
+b6eb99f1362b8344ca5400d57a35c49e3504f23f3dee304fdb879d4d953f4bc6 | https://repo.maven.apache.org/maven2/org/apache/httpcomponents/httpcore/4.2…
+d0f2e16d054e8bb97add9ca26525eb2346f692809fcd2a28787da8ceb3c35ee8 | https://repo.maven.apache.org/maven2/commons-logging/commons-logging/1.1.1/…
+a06e35d3fff3a6b813d94894ebf3e498f9540c864c5b39ae783907e3a6c72889 | https://repo.maven.apache.org/maven2/commons-codec/commons-codec/1.6/common…
+8bd632c00bdf80a7de36c22b60f12452c147d8eca2f00d79d66699ebe7daa02a | https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/5/co…
+fb8c5e55e30a7addb4ff210858a0e8d2494ed6757bbe19012da99d51586c3cbb | https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/22/c…
+164e7a9cf23a4e63bbc961f8db7d965d53d685710660a88249641f91d36f83a4 | https://repo.maven.apache.org/maven2/org/apache/httpcomponents/httpcomponen…
+9e9323a26ba8eb2394efef0c96d31b70df570808630dc147cab1e73541cc5194 | https://repo.maven.apache.org/maven2/org/apache/apache/4/apache-4.pom
+ec31409f203bcabf99534f59231ec0576d875d4d4b7349b09566a7a8c8179b24 | https://repo.maven.apache.org/maven2/org/glassfish/jaxb/jaxb-core/2.2.11/ja…
+b7505e0ecf7d495b4daa3e6569f71611d1a789dc531cbd92a2025922ff2655d3 | https://repo.maven.apache.org/maven2/com/sun/xml/fastinfoset/FastInfoset/1.…
+27cb450b6c367a00bd8362519907f84defac7b12086c64d4d6e97e33ab873ead | https://repo.maven.apache.org/maven2/org/jvnet/staxex/stax-ex/1.7.7/stax-ex…
+fd0857899f1067e0287c2ffd91e38f967a26bd405b83a34650c2742cee9fc261 | https://repo.maven.apache.org/maven2/com/sun/xml/fastinfoset/fastinfoset-pr…
+30f5789efa39ddbf96095aada3fc1260c4561faf2f714686717cb2dc5049475a | https://repo.maven.apache.org/maven2/net/java/jvnet-parent/3/jvnet-parent-3…
+8514cb724b4fca59a5cf272b632e539bd0a0f3cacf1844082d0a173a86406bd8 | https://repo.maven.apache.org/maven2/org/glassfish/jaxb/txw2/2.2.11/txw2-2.…
+ebe7137b5fbfd050545f9a7f3f339ae55beb0b53755071b4fd62aa024c626d1c | https://repo.maven.apache.org/maven2/com/sun/istack/istack-commons-runtime/…
+2092a7d8d9bc5698c59b094bdea46622915c48c83ae66d5b5ad549c7bf16155b | https://repo.maven.apache.org/maven2/javax/xml/bind/jaxb-api/2.2.12-b140109…
+9a398c699a5d3f3b56f1056c68890ede25d94a12d98eabc2a473733e6ab2362c | https://repo.maven.apache.org/maven2/com/sun/xml/bind/mvn/jaxb-txw-parent/2…
+c3071277f89b162982606b4e65c92077212efb6cbf1bdc365c51bd0b57ac818c | https://repo.maven.apache.org/maven2/com/sun/istack/istack-commons/2.21/ist…
+633524eee6ef1941f7cb1dab7ee3927b0a221ceee9047aeb5515f4cbb990c82a | https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jre…
+a34658f5c5de4b573eef21131cc32cc25f7b66407944f312b28ec2e56abb1fa9 | https://repo.maven.apache.org/maven2/org/ow2/asm/asm-analysis/5.1/asm-analy…
+97b3786e1f55e74bddf8ad102bf50e33bbcbc1f6b7fd7b36f0bbbb25cd4981be | https://repo.maven.apache.org/maven2/org/ow2/asm/asm-commons/5.1/asm-common…
+b74049d19d3cf68a74da30e88e2d10b1e5127a555de32ccabde05cbbf36211d7 | https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle-api/…
+165576ede06d1a6466ded082938d162ed98bbdfb5e829874a18ffb58e59ec2ad | https://dl.google.com/dl/android/maven2/com/android/tools/lint/lint-gradle-…
+f05f7bcfa15bbc61a197b6f575a0ad4a1ef750f9e906e29e4362a7059ba7616d | https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle/3.1.…
+ee032c39ae5e3cd099148fbba9a2124f9ed613e5cb93e03ee0fa8808ce364040 | https://repo.maven.apache.org/maven2/org/ow2/asm/asm-util/5.1/asm-util-5.1.…
+c0de2bbc4cb8297419659813ecd4ed1d077ed1dd5c1f5544cc5143e493e84c10 | https://repo.maven.apache.org/maven2/org/ow2/asm/asm-tree/5.1/asm-tree-5.1.…
+f34b3a0b62cdb468eb7e8335de4edc87958dc299306c2b4ba8ea15e6a4be106a | https://repo.maven.apache.org/maven2/net/sf/proguard/proguard-gradle/5.3.3/…
+d2da399a9967c69f0a21739256fa79d284222c223082cacadc17372244764b54 | https://repo.maven.apache.org/maven2/org/ow2/asm/asm/5.1/asm-5.1.jar
+26c5856e954b5f864db76f13b86919b59c6eecf9fd930b96baa8884626baf2f5 | https://repo.maven.apache.org/maven2/net/sf/jopt-simple/jopt-simple/4.9/jop…
+e65a921804a1daa865c73fa8e68286d22353434f60612fc61f5e584dd6d88e32 | https://dl.google.com/dl/android/maven2/com/android/tools/repository/26.1.0…
+51642702f1610ac3802c930983ba37737cfa1aedce849de2071f14b9fe6a6f3a | https://dl.google.com/dl/android/maven2/com/android/tools/build/builder-tes…
+a096805a7e0fb3dc10fa47c325186bebb55bbf5c77cb54dd4b1c71b723692628 | https://dl.google.com/dl/android/maven2/com/android/tools/build/manifest-me…
+ed9d26dce59d2e5b436702da2f7c57d52754c3afbc558872db30ac110279967d | https://dl.google.com/dl/android/maven2/com/android/tools/analytics-library…
+9772cb36f7498ca30f0accf25911560753fbe9167c3af58e8b00e7eb6ac1f7c3 | https://dl.google.com/dl/android/maven2/com/android/tools/analytics-library…
+4189e0be5ab15cf2330f70b24fbdc75ca37514f188388fce8580ce16a9a68052 | https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java-util…
+3790edb05c95577ea2cf3430158b494ffef7f3fce90cd7da1b68e5d52c2e2812 | https://dl.google.com/dl/android/maven2/com/android/tools/dvlib/26.1.0/dvli…
+5c7d7b188eb06a074a0c7131fc5a22cd9f3fc2cd5810ec32222d18cffdf8144f | https://dl.google.com/dl/android/maven2/com/android/databinding/compilerCom…
+29da0f2265bf14cea484bb492813318c9268afc0aac85e625ba6d0e85382ef61 | https://dl.google.com/dl/android/maven2/com/android/tools/layoutlib/layoutl…
+c4828e28d7c0a930af9387510b3bada7daa5c04d7c25a75c7b8b081f1c257ddd | https://repo.maven.apache.org/maven2/com/google/jimfs/jimfs/1.1/jimfs-1.1.j…
+3bdb56f0bfabcd26ef63e58700f0d7e5087cd1e95e1abe2aa2e4b300b5616f15 | https://dl.google.com/dl/android/maven2/com/android/tools/build/bundletool/…
+de3c873b5dc06060f7a2a4d9b872a3f4dc1955c18095ef9702d13477e437782a | https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_anno…
+b24e096cdd8ca1c38ce34f722bfea3e60ce5017a0c637af6b229d9bc3fc3a14a | https://dl.google.com/dl/android/maven2/com/android/tools/common/26.1.0/com…
+3101fdd6ae78f7fd4a2f5fd15c50d2fc321f2978f2e732e2c9729bdafd85fdf7 | https://dl.google.com/dl/android/maven2/com/android/tools/build/builder-mod…
+fcfb09fb0ea0aa97d3cfe7ea792398081348e468f126b3603cb3803f240197f0 | https://repo.maven.apache.org/maven2/com/squareup/javawriter/2.5.0/javawrit…
+6d95df7310eecf36772e74e25bf9dcffe8d1caf3614fb173443f5a5d6c937fe1 | https://dl.google.com/dl/android/maven2/com/android/tools/ddms/ddmlib/26.1.…
+d4ebd42e1dbc81281085cdf5b56cebb183a9b8aeae51a84f53ff84774abcc94e | https://dl.google.com/dl/android/maven2/com/android/tools/sdklib/26.1.0/sdk…
+fa7c629e1ef9e8e3bedd647431f5d023ba87b5ad536c3a79497e2cd8c40f40be | https://dl.google.com/dl/android/maven2/com/android/tools/build/apksig/3.1.…
+20a5111ef908e8cbab6c0a0e3ae1c031fa1460ed6bb00b4f621e9e93e6fac9f4 | https://dl.google.com/dl/android/maven2/com/android/tools/build/aapt2-proto…
+2d9484f4c649f708f47f9a479465fc729770ee65617dca3011836602264f6439 | https://repo.maven.apache.org/maven2/com/googlecode/json-simple/json-simple…
+6cac9421439b39b9f4aa76738ced039462a69911c410f2c372c196b0f4b7f4cf | https://repo.maven.apache.org/maven2/com/google/auto/value/auto-value/1.5.2…
+788dd6aa22a49fecd1d7125b717c46103025bb647f9b50b6cb70f58e0962884d | https://dl.google.com/dl/android/maven2/com/android/databinding/baseLibrary…
+cc6a41dc3eaacc9e440a6bd0d2890b20d36b4ee408fe2d67122f328bb6e01581 | https://repo.maven.apache.org/maven2/commons-io/commons-io/2.4/commons-io-2…
+7043dee4e9e7175e93e0b36f45b1ec1ecb893c5f755667e8b916eb8dd201c6ca | https://repo.maven.apache.org/maven2/org/bouncycastle/bcpkix-jdk15on/1.56/b…
+8e108c92027bb428196f10fa11cffbe589f7648a6af2016d652279385fdfd789 | https://repo.maven.apache.org/maven2/com/squareup/javapoet/1.8.0/javapoet-1…
+38954e8d9c297d62846ac7bcddc7a5758a184ec1b05092e5e1089650be4962b0 | https://dl.google.com/dl/android/maven2/com/android/tools/sdk-common/26.1.0…
+757bfe906193b8b651e79dc26cd67d6b55d0770a2cdfb0381591504f779d4a76 | https://repo.maven.apache.org/maven2/com/googlecode/juniversalchardet/juniv…
+c7a20fb951d437797afe8980aff6c1e5a03f310c661ba58ba1d4fa90cb0f2926 | https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jre…
+cd69e90c331faa78ae5e65509a2ac9df452d1ee2bad7cf3034f073fc1c1305af | https://dl.google.com/dl/android/maven2/com/android/tools/annotations/26.1.…
+dce7e66b32456a1b1198da0caff3a8acb71548658391e798c79369241e6490a4 | https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java/3.4.…
+905721a0eea90a81534abb7ee6ef4ea2e5e645fa1def0a5cd88402df1b46c9ed | https://repo.maven.apache.org/maven2/com/google/code/findbugs/jsr305/1.3.9/…
+2994a7eb78f2710bd3d3bfb639b2c94e219cedac0d4d084d516e78c16dddecf6 | https://repo.maven.apache.org/maven2/com/google/j2objc/j2objc-annotations/1…
+2068320bd6bad744c3673ab048f67e30bef8f518996fa380033556600669905d | https://repo.maven.apache.org/maven2/org/codehaus/mojo/animal-sniffer-annot…
+2d43eb5ea9e133d2ee2405cc14f5ee08951b8361302fdd93494a3a997b508d32 | https://repo.maven.apache.org/maven2/com/google/code/gson/gson/2.7/gson-2.7…
+1d2e883717b8ab7d3fcc9fa01034d165809a9c94daa6303a838f11e4d36adc86 | https://repo.maven.apache.org/maven2/net/sf/proguard/proguard-base/5.3.3/pr…
+31629566148e8a47688ae43b420abc3ecd783ed15b33bebc00824bf24c9b15aa | https://repo.maven.apache.org/maven2/org/apache/httpcomponents/httpmime/4.1…
+f264dd9f79a1fde10ce5ecc53221eff24be4c9331c830b7d52f2f08a7b633de2 | https://repo.maven.apache.org/maven2/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0.jar
+ace2a10dc8e2d5fd34925ecac03e4988b2c0f851650c94b8cef49ba1bd111478 | https://repo.maven.apache.org/maven2/org/jetbrains/annotations/13.0/annotat…
+993302b16cd7056f21e779cc577d175a810bb4900ef73cd8fbf2b50f928ba9ce | https://repo.maven.apache.org/maven2/com/sun/activation/javax.activation/1.…
+2c1542faf343185b7cab9c3d55c8ae5471d6d095d3887a4adefdbdf2984dc0b6 | https://repo.maven.apache.org/maven2/org/apache/commons/commons-compress/1.…
+362e9324ee7c697e21279e20077b52737ddef3f1b2c1a7abe5ad34b465145550 | https://repo.maven.apache.org/maven2/org/apache/httpcomponents/httpclient/4…
+a874f2351cfba8e2946be3002d10c18a6da8f21b52ba2acf52f2b85d5520ed70 | https://repo.maven.apache.org/maven2/org/glassfish/jaxb/jaxb-runtime/2.2.11…
+ce6f913cad1f0db3aad70186d65c5bc7ffcc9a99e3fe8e0b137312819f7c362f | https://repo.maven.apache.org/maven2/commons-logging/commons-logging/1.1.1/…
+05cfd9f5ac0b41910703a8925f7211a495909b27a2ffdd1c5106f1689aeafcd4 | https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.2…
+a31ff7d77163c0deb09e7fee59ad35ae44c2cee2cc8552a116ccd1583d813fb4 | https://repo.maven.apache.org/maven2/org/jvnet/staxex/stax-ex/1.7.7/stax-ex…
+e5e82da4cc66c8d917bbf743e3c0752efe8522735e7fc9dbddb65bccea81cfe9 | https://repo.maven.apache.org/maven2/org/apache/httpcomponents/httpcore/4.2…
+54b34e941b8e1414bd3e40d736efd3481772dc26db3296f6aa45cec9f6203d86 | https://repo.maven.apache.org/maven2/commons-codec/commons-codec/1.6/common…
+272a3ccad45a4511351920cd2a8633c53cab8d5220c7a92954da5526bb5eafea | https://repo.maven.apache.org/maven2/org/glassfish/jaxb/txw2/2.2.11/txw2-2.…
+37bcaee8ebb04362c8352a5bf6221b86967ecdab5164c696b10b9a2bb587b2aa | https://repo.maven.apache.org/maven2/org/glassfish/jaxb/jaxb-core/2.2.11/ja…
+b5e60cd8b7b5ff01ce4a74c5dd008f4fbd14ced3495d0b47b85cfedc182211f2 | https://repo.maven.apache.org/maven2/javax/xml/bind/jaxb-api/2.2.12-b140109…
+c33e67a0807095f02a0e2da139412dd7c4f9cc1a4c054b3e434f96831ba950f4 | https://repo.maven.apache.org/maven2/com/sun/istack/istack-commons-runtime/…
+e8b4151ae1679f1abe7a14ee371ac9b3c651ae7b63290d1f586bdd0f78face9a | https://repo.maven.apache.org/maven2/com/android/tools/build/transform-api/…
+27a77db909f3c2833c0b1a37c55af1db06045118ad2eed96ce567b6632bce038 | https://repo.maven.apache.org/maven2/com/sun/xml/fastinfoset/FastInfoset/1.…
+4f48a872bad6e4d9c053f4ad610d11e4012ad7e58dc19a03dd5eb811f36069dd | https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.…
+1158e94c7de4da480873f0b4ab4a1da14c0d23d4b1902cc94a58a6f0f9ab579e | https://repo.maven.apache.org/maven2/com/google/guava/guava/22.0/guava-22.0…
+3233ce076be21d977a817abfe7d937739f7a1d6dac30a497df30124989d2da85 | https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle-core…
+a32de739cfdf515774e696f91aa9697d2e7731e5cb5045ca8a4b657f8b1b4fb4 | https://repo.maven.apache.org/maven2/org/antlr/antlr4/4.5.3/antlr4-4.5.3.jar
+963e1ee14f808ffb99897d848ddcdb28fa91ddda867eb18d303e82728f878349 | https://repo.maven.apache.org/maven2/org/bouncycastle/bcprov-jdk15on/1.56/b…
+80c134366b35e375d2ed22158d8958f3732366fa80980df76bd632371368eb96 | https://dl.google.com/dl/android/maven2/com/android/tools/analytics-library…
+74fa208043740642f7e6eb09faba15965218ad2f50ce3020efb100136e4b591c | https://repo.maven.apache.org/maven2/it/unimi/dsi/fastutil/7.2.0/fastutil-7…
+2166e41cacbce74d2573afd585b719b826f34863d7d9e9db1103e61686857ad1 | https://dl.google.com/dl/android/maven2/com/android/tools/build/builder/3.1…
+bd9b9cb1a3987b1427f7a18babe7f92078e32bbe2e1dca6dced00cc0e3a077a9 | https://repo.maven.apache.org/maven2/org/slf4j/slf4j-android/1.7.25/slf4j-a…
+7cd9d7a0b5d93dfd461a148891b43509cf403a9c7f9fb49060d3554df1c81e1e | https://repo.maven.apache.org/maven2/org/slf4j/slf4j-api/1.7.25/slf4j-api-1…
+18f5c52120db036e88d6136f8839c832d074bdda95c756c6f429249d2db54ac6 | https://repo.maven.apache.org/maven2/org/slf4j/slf4j-parent/1.7.25/slf4j-pa…
+3369726ca2b0e3736c741ff3c22e06f707a1007ff20ccc5b5ba5d0d9a01ead30 | https://repo.spring.io/plugins-release/net/freehaven/tor/control/jtorctl/0.…
+d9f2abe237eab1b651694c0d292dea9ec5b341ae70bfaafffbbb5d46b78c5e17 | https://dl.google.com/dl/android/maven2/com/android/support/appcompat-v7/28…
+f6c4146b8b2029e52971402d1c29ed59d2a98b4fab33ef8e6f44233ac0cf27ba | https://dl.google.com/dl/android/maven2/com/android/support/collections/28.…
+d4783f9cce5b193cb59486fa9fd9f06e828fe4d2d9a5744fab372b9a4a95ecca | https://dl.google.com/dl/android/maven2/com/android/support/animated-vector…
+1e54416142b0f1274db09bbea1808f5cf9311c895bb0d84adaa18a7b5132aadc | https://dl.google.com/dl/android/maven2/com/android/support/support-vector-…
+5727103ce28357bce8f74655c0994508d55d060f9ec6dafba0103e7fe55f275b | https://dl.google.com/dl/android/maven2/com/android/support/cursoradapter/2…
+86a744b8739e8b354d0ecaec35dd943dea9a66f0296a3a9c1eb384fc93a4eaf7 | https://dl.google.com/dl/android/maven2/com/android/support/support-core-ut…
+a086481e014492fd3a4d5f4459875b8a70a201258f0b225836212ee29df0091a | https://dl.google.com/dl/android/maven2/com/android/support/support-annotat…
+6b79a06c2282fc0f961cfd826a26ad41ff5c457b0c11d9a6b6a63e51f53d961a | https://dl.google.com/dl/android/maven2/com/android/support/support-compat/…
+d24bdade5b77b26b82d39beda9fa0f42bcdf61cb5661a3c66ddfde3f77869b07 | https://dl.google.com/dl/android/maven2/com/android/support/support-fragmen…
+c7a7d3c2a9d6c21d8b6d470933b9472c733a4799b3ff702081b608adf1c7e592 | https://repo.spring.io/plugins-release/android/arch/lifecycle/runtime/1.1.1…
+e7d6f726e702b418998fab6284df2f509f5acdf9203ced37c8d1274f9e38447b | https://dl.google.com/dl/android/maven2/com/android/support/versionedparcel…
+5ffda693e34d152463f8a9a6c00407fb11747a2271c278e082a287abad3f9cba | https://dl.google.com/dl/android/maven2/com/android/support/documentfile/28…
+9a9bad607f4b946d1503fe9b751af156da361e642e86f4fb5355b89b9557e8df | https://dl.google.com/dl/android/maven2/com/android/support/loader/28.0.0/l…
+e15dd914e64f5cfcbd91aeb1b921fd6ead39c21926e171a4955dd12c849c6e78 | https://dl.google.com/dl/android/maven2/com/android/support/print/28.0.0/pr…
+351a941335421113dff16b1ff9d4618bbcb093fd1508fc8639f18c5533313091 | https://dl.google.com/dl/android/maven2/com/android/support/localbroadcastm…
+deae2518ee1d17db319fbaf4055e32d591d58569eb9ccad53d8d323cf1840555 | https://repo.spring.io/plugins-release/android/arch/lifecycle/viewmodel/1.1…
+708ad4a6a48ce625aee395fd0625ae5441fee8f0e25861406603f765e679b544 | https://dl.google.com/dl/android/maven2/com/android/support/support-core-ui…
+1742e74f222d06ea26f811191adf18e4cb74213b785e3f5d0d930224e83b4e82 | https://repo.spring.io/plugins-release/android/arch/lifecycle/common/1.1.1/…
+eb91acbeeaccc7fa382f88b02a22d5eddf314665bbb8fed090c067b703f50a5c | https://repo.spring.io/plugins-release/android/arch/core/common/1.1.1/commo…
+e8db306738739a616a74c38533a91cc066ee194fd45f492f188164e6cb1b856e | https://repo.spring.io/plugins-release/android/arch/lifecycle/livedata/1.1.…
+424f2d0b4a3ac46e0ad5349192ad0ecdc0bfcb10ed91767a08230cd16a3cfe36 | https://dl.google.com/dl/android/maven2/com/android/support/drawerlayout/28…
+be47ac0d8fd8bdd783071596c5ea271362484752d282fb8c3421d1853ad02619 | https://dl.google.com/dl/android/maven2/com/android/support/slidingpanelayo…
+080bba6573f6a4a9b2af443bf4ecb2a7ac4302a027274cc9bf9fdd51f409430e | https://dl.google.com/dl/android/maven2/com/android/support/viewpager/28.0.…
+296b5f5eaa5cb38f67bca092aaf56bf6d23a13aa07cd81a377f861f52d609f9b | https://dl.google.com/dl/android/maven2/com/android/support/interpolator/28…
+790f1d0ca7c1a65d5afb40baf5b5423fa3163f6f90a47f3193ae0c8bb11c6e78 | https://dl.google.com/dl/android/maven2/com/android/support/asynclayoutinfl…
+c2e08d32b75d98a844f20be02510c830f7e5b53f64907af2270a898d59dc872f | https://dl.google.com/dl/android/maven2/com/android/support/swiperefreshlay…
+187c2729dfd51ef8db5963598d14da67bad5ceb4ea5252f382044249327010e5 | https://dl.google.com/dl/android/maven2/com/android/support/customview/28.0…
+cb83674d682f81daf7b2d43e965a18b83ef4f5bb02a69d14bb20175753361a4f | https://dl.google.com/dl/android/maven2/com/android/support/coordinatorlayo…
+30453099142d085d801460a20d7e02a3f4d3004238879eaeb62083f59f1193a9 | https://repo.spring.io/plugins-release/android/arch/core/runtime/1.1.1/runt…
+67a11cd85fd5c96ecdb84538e1eb58d7be59200e7d36d99943f31ecb514fe2a1 | https://repo.spring.io/plugins-release/android/arch/lifecycle/livedata-core…
+c81e1e98ca3cb2edae002c69cf35b22aec364b8cb2f1042c97e206eb5790ac41 | https://dl.google.com/dl/android/maven2/com/android/support/support-core-ut…
+bbc7f65fc95649464733af373361532ab5f9f3b749c3badaa2bbf27e574b6c6f | https://dl.google.com/dl/android/maven2/com/android/support/support-core-ui…
+920b85efd72dc33e915b0f88a883fe73b88483c6df8751a741e17611f2460341 | https://dl.google.com/dl/android/maven2/com/android/support/loader/28.0.0/l…
+f658986d968172bccfed28578471c96050780fe5e133861e4d331069cc373f4d | https://dl.google.com/dl/android/maven2/com/android/support/support-vector-…
+d1d234f66a1b36a9aee9b94fa6c66f97128c0828078c8e889e9037ec898cd600 | https://dl.google.com/dl/android/maven2/com/android/support/slidingpanelayo…
+3772fc738ada86824ba1a4b3f197c3dbd67b7ddcfe2c9db1de95ef2e3487a915 | https://dl.google.com/dl/android/maven2/com/android/support/support-fragmen…
+271ecbc906cda8dcd9e655ba0473129c3408a4189c806f616c378e6fd18fb3b7 | https://dl.google.com/dl/android/maven2/com/android/support/animated-vector…
+8f6809afae4793550c37461c9810e954ae6a23dbb4d23e5333bf18148df1150a | https://dl.google.com/dl/android/maven2/com/android/support/drawerlayout/28…
+013c4c53058758ec104dbae970be58159f75dfe342ba8b937d15ff5282e35ffc | https://dl.google.com/dl/android/maven2/com/android/support/viewpager/28.0.…
+98db03845f994e08248bf701c1ff0ccaa12e70f94251ec9272900f0f694e072b | https://dl.google.com/dl/android/maven2/com/android/support/customview/28.0…
+115bde87721f7334579b0c735f60dd7c98af1bb7f34010c5b0553b95dc351aa2 | https://dl.google.com/dl/android/maven2/com/android/support/asynclayoutinfl…
+9dfacd80423dc979048fbaed83c0ee543c46259feb2417377e79a656888d3892 | https://dl.google.com/dl/android/maven2/com/android/support/coordinatorlayo…
+a3b41f7f6730866b49865e86e49f988d4858699765f534300fb2ff5f9325e712 | https://dl.google.com/dl/android/maven2/com/android/support/swiperefreshlay…
+a3a8e5230359746ed91801579b5fbe4668e3b1c4e6a14c7d67c8f58cb0311752 | https://dl.google.com/dl/android/maven2/com/android/support/appcompat-v7/28…
+e17e3b01dbea3f9ea1c86943292f903ca93d2231c6242e456e0b6a9c5817118a | https://dl.google.com/dl/android/maven2/com/android/support/support-compat/…
+87feffe742b8d62ca8a9833abe564838bf6a672e31c7ad1306ec4006adf90d21 | https://dl.google.com/dl/android/maven2/com/android/support/cursoradapter/2…
+47cdcd3e9302b7b064923f05487a5c03babbd9bbda4726b71e97791fab5d4779 | https://dl.google.com/dl/android/maven2/com/android/support/documentfile/28…
+d287c823af5fdde72c099fcfc5f630efe9687af7a914343ae6fd92de32c8a806 | https://dl.google.com/dl/android/maven2/com/android/support/localbroadcastm…
+4be8a812d73e4a80e35b91ceae127def3f0bb9726bf3bc439aa0cc81503f5728 | https://dl.google.com/dl/android/maven2/com/android/support/print/28.0.0/pr…
+7bc7ee86a0db39a4b51956f3e89842d2bd962118d57d779eb6ed6b34ba0677ea | https://dl.google.com/dl/android/maven2/com/android/support/interpolator/28…
+60eb1cb08f71b65c3f6123135e03ebeb5930b5e126e1e5b2ac91b386908c9d02 | https://dl.google.com/dl/android/maven2/com/android/support/versionedparcel…
+c4e4be66c1b2f0abec593571454e1de14013f7e0f96bf2a9f212931a48cae550 | https://repo.spring.io/plugins-release/android/arch/lifecycle/runtime/1.1.1…
+c3215aa5873311b3f88a6f4e4a3c25ad89971bc127de8c3e1291c57f93a05c39 | https://repo.spring.io/plugins-release/android/arch/core/runtime/1.1.1/runt…
+7de29cfaba77d6b5d5be234c57f6812d0150d087e63941af22ba1d1f8e2bc96a | https://repo.spring.io/plugins-release/android/arch/lifecycle/viewmodel/1.1…
+d6fdd8b985d6178d7ea2f16986a24e83f1bee936b74d43167c69e08d3cc12c50 | https://repo.spring.io/plugins-release/android/arch/lifecycle/livedata-core…
+50ab0490c1ff1a7cfb4e554032998b080888946d0dd424f39900efc4a1bcd750 | https://repo.spring.io/plugins-release/android/arch/lifecycle/livedata/1.1.…
+18c4a0095d5c1da6b817592e767bb23d29dd2f560ad74df75ff3961dbde25b79 | https://repo.maven.apache.org/maven2/org/slf4j/slf4j-api/1.7.25/slf4j-api-1…
ec3a75bebddbf19ff56a281cf5d1ad146169dcaa0e69d7b14f4aaba2e7775f34 | https://repo.spring.io/plugins-release/net/freehaven/tor/control/jtorctl/0.…
-953b116521a73575eee990e3f2c36a892fb088bb2d9a3027c82193cb7a013ef7 | https://repo1.maven.org/maven2/it/unimi/dsi/fastutil/7.2.0/fastutil-7.2.0.p…
-fb40265f982548212ff82e362e59732b2187ec6f0d80182885c14ef1f982827a | https://repo1.maven.org/maven2/org/sonatype/oss/oss-parent/9/oss-parent-9.p…
-f056ed61a281b3e230a63e4abf510c0d2f9bf7ff513cacb65a29538ba90ab177 | https://repo1.maven.org/maven2/org/jacoco/org.jacoco.build/0.7.4.2015022621…
-9f85ff2fd7d6cb3097aa47fb419ee7f0ebe869109f98aba9f4eca3f49e74a40e | https://repo1.maven.org/maven2/org/apache/apache/16/apache-16.pom
-b6eb99f1362b8344ca5400d57a35c49e3504f23f3dee304fdb879d4d953f4bc6 | https://repo1.maven.org/maven2/org/apache/httpcomponents/httpcore/4.2.5/htt…
-4946e60a547c8eda69f3bc23c5b6f0dadcf8469ea49b1d1da7de34aecfcf18dd | https://repo1.maven.org/maven2/org/apache/apache/9/apache-9.pom
-13c1448f7ebb61f67e6fbd6cd5c188804c17c4d7e77c4b79b316ede4ef9cd9b3 | https://dl.google.com/dl/android/maven2/com/android/tools/lint/lint/26.0.1/…
-7cd9d7a0b5d93dfd461a148891b43509cf403a9c7f9fb49060d3554df1c81e1e | https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.…
-467ae650442e876867379094e7518dfdd67d22c5352ebd39808c84259e9790ba | https://repo1.maven.org/maven2/org/apache/commons/commons-parent/25/commons…
-36d8385de1be7791231acb933b757198f97cb53bc7d046e8c4bc403d214caaca | https://dl.google.com/dl/android/maven2/com/android/support/support-v4/26.1…
-9466512cd8cf0bd66a8a3661685373f7b3deafded11096e044926ff5c82c7a4c | https://repo1.maven.org/maven2/com/google/code/gson/gson/2.3/gson-2.3.jar
-45eb0d6e49430271b5fb385c53fae0b81d6ad3eae465a7a8d948217bcae1e86d | https://repo1.maven.org/maven2/com/android/tools/external/lombok/lombok-ast…
-5fe8a11e913086fb7ab505b930987f30cfa3f4b226d4bbbc68003ca4387ae40e | https://dl.google.com/dl/android/maven2/com/android/tools/lint/lint-api/26.…
-e6531a278b4f632f198a6e45b9e11de1b2b678cd5a4e0fdff442f604c2439a42 | https://repo1.maven.org/maven2/org/jacoco/org.jacoco.report/0.7.4.201502262…
-7a3554c605e088e7e323b1084656243f0444fa353e2f2dee1f1a4204eb64ff09 | https://repo1.maven.org/maven2/org/jacoco/org.jacoco.report/0.7.4.201502262…
-8b0aa8a74e990ca8d633ab7bd1938530e921548df13fd4020224a61065378876 | https://dl.google.com/dl/android/maven2/com/android/tools/build/builder-tes…
-8c6191e0dd8bfdc862332cb79b08185ac5b63565d405dac2605be4c2b19774bd | https://repo1.maven.org/maven2/com/android/tools/external/lombok/lombok-ast…
-963e1ee14f808ffb99897d848ddcdb28fa91ddda867eb18d303e82728f878349 | https://repo1.maven.org/maven2/org/bouncycastle/bcprov-jdk15on/1.56/bcprov-…
-feab9191311c3d7aeef2b66d6064afc80d3d1d52d980fb07ae43c78c987ba93a | https://repo1.maven.org/maven2/com/google/code/findbugs/jsr305/1.3.9/jsr305…
-8a4e4b32eedaa72976a757e12cf1dfe742725db0b7311bf176dd937ba4236384 | https://repo1.maven.org/maven2/org/antlr/antlr4/4.5.3/antlr4-4.5.3.pom
-fcfb09fb0ea0aa97d3cfe7ea792398081348e468f126b3603cb3803f240197f0 | https://repo1.maven.org/maven2/com/squareup/javawriter/2.5.0/javawriter-2.5…
-b787d574c851505e76212968b9ae1641ea79804aef7f5a2cee2a01cd4055213a | https://repo1.maven.org/maven2/org/apache/commons/commons-compress/1.12/com…
-52b6fd2eaf2240e14dbe752f1fa884270cc668d6f350e8e7f65f6033a8172d69 | https://repo1.maven.org/maven2/org/apache/httpcomponents/httpcomponents-cli…
-31ce606f4e9518936299bb0d27c978fa61e185fd1de7c9874fe959a53e34a685 | https://repo1.maven.org/maven2/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0.pom
-10107898991129eff2042a41b1bfc2d72c4ea8e4babe429ae3aeb32c69c568de | https://dl.google.com/dl/android/maven2/com/android/tools/analytics-library…
-a1e7d6b3efc1703c7c8f1b15ecf8757f17d0ac41f32c9a48481a5caf638c55db | https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java/3.0.0/prot…
-aeb197158a2fb6bd2cb9233e22874f8051f82891dbd82b6b089f49e309f82e40 | https://dl.google.com/dl/android/maven2/com/android/tools/lint/lint/26.0.1/…
-a9d65daccc5afca97372936246ac49fb587423e005606e7981b0efc66b0e9385 | https://dl.google.com/dl/android/maven2/com/android/tools/annotations/26.0.…
-9d8cee7cd40eff22ebdeb90c8e70f5ee96c5bd25cb2c3e3b3940e27285a3e98a | https://dl.google.com/dl/android/maven2/com/android/support/support-media-c…
-b51f8867c92b6a722499557fc3a1fdea77bdf9ef574722fe90ce436a29559454 | https://repo1.maven.org/maven2/org/sonatype/oss/oss-parent/7/oss-parent-7.p…
-6b87237de8c2e1740cf80627c7f3ce3e15de1930bb250c55a1eca94fa3e014df | https://repo1.maven.org/maven2/org/codehaus/codehaus-parent/4/codehaus-pare…
-f0c98c571e93a7cb4dd18df0fa308f0963e7a0620ac2d4244e61e709d03ad6be | https://repo1.maven.org/maven2/com/google/j2objc/j2objc-annotations/1.1/j2o…
-a47c950c755747ca3093a05e9ec85d0e2f33cbd224909f571fe7577963a4d799 | https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.1.3-2/…
-26c5856e954b5f864db76f13b86919b59c6eecf9fd930b96baa8884626baf2f5 | https://repo1.maven.org/maven2/net/sf/jopt-simple/jopt-simple/4.9/jopt-simp…
-a2aaabe14b7c88dc55ce9b07b8a7bff5bc6c6d729cb404f591bdd3d6b4d7035e | https://dl.google.com/dl/android/maven2/android/arch/core/common/1.0.0/comm…
-d5905aee3c8a4ac75e069a73b914c0a41b9b36b0e6b04126719fca22659d3cc8 | https://dl.google.com/dl/android/maven2/com/android/support/animated-vector…
-ce6f913cad1f0db3aad70186d65c5bc7ffcc9a99e3fe8e0b137312819f7c362f | https://repo1.maven.org/maven2/commons-logging/commons-logging/1.1.1/common…
-668eb6aeb3d038267e719deb55f38a4233a12602afb97e89da609c095394400a | https://dl.google.com/dl/android/maven2/com/android/tools/build/apksig/3.0.…
-f264dd9f79a1fde10ce5ecc53221eff24be4c9331c830b7d52f2f08a7b633de2 | https://repo1.maven.org/maven2/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0.jar
-905721a0eea90a81534abb7ee6ef4ea2e5e645fa1def0a5cd88402df1b46c9ed | https://repo1.maven.org/maven2/com/google/code/findbugs/jsr305/1.3.9/jsr305…
-1a56992fc50f838fd091b6b9701b30da64b00bd2fe76ad2c800212eb459b49e2 | https://repo1.maven.org/maven2/com/google/code/gson/gson/2.3/gson-2.3.pom
-8bd632c00bdf80a7de36c22b60f12452c147d8eca2f00d79d66699ebe7daa02a | https://repo1.maven.org/maven2/org/apache/commons/commons-parent/5/commons-…
-07f08b315c812406e9d497e1b592689742feb3950c1a713f95e2692d3e15b619 | https://dl.google.com/dl/android/maven2/com/android/tools/ddms/ddmlib/26.0.…
-fcd77cba4ea3893429860b93da5d43f2e089f2ba8bdfa97ef724f410f404152a | https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle/3.0.…
-e4c7afb8f0d7aa159318d42a011cc2c9b0525d820973cbca5318bec6c649cecc | https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java/3.0.0/prot…
-18c4a0095d5c1da6b817592e767bb23d29dd2f560ad74df75ff3961dbde25b79 | https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.…
-5a12ac3f190fc2cfab73435d859511220b13eb38f8784a530d06395969cf8c59 | https://raw.githubusercontent.com/guardianproject/gpmaven/master/org/torpro…
-81f73f8b25b430f5a40a39727bbcef653a1d0868cc69233b44e4282ce5a94ff9 | https://dl.google.com/dl/android/maven2/com/android/tools/ddms/ddmlib/26.0.…
-2d9484f4c649f708f47f9a479465fc729770ee65617dca3011836602264f6439 | https://repo1.maven.org/maven2/com/googlecode/json-simple/json-simple/1.1/j…
-31629566148e8a47688ae43b420abc3ecd783ed15b33bebc00824bf24c9b15aa | https://repo1.maven.org/maven2/org/apache/httpcomponents/httpmime/4.1/httpm…
-51215c67d2c068d8b7d2f6f80f51372a098075deccc448d4bdd7b987ba8328fb | https://repo1.maven.org/maven2/org/ow2/ow2/1.3/ow2-1.3.pom
-757bfe906193b8b651e79dc26cd67d6b55d0770a2cdfb0381591504f779d4a76 | https://repo1.maven.org/maven2/com/googlecode/juniversalchardet/juniversalc…
-7af7e2d8b24b4798f04c2b7da24c9fbd1b7557b4e017c2054481565916079092 | https://repo1.maven.org/maven2/net/sf/jopt-simple/jopt-simple/4.9/jopt-simp…
-63b465cc628f8c305702b12b26501cea236a3175db15b5a7356e98484aa63db5 | https://dl.google.com/dl/android/maven2/com/android/tools/build/builder-mod…
+fbd7b254e02d8aef60c418a5f0e14a783b38a16162caffb2d2a16ccd5d2c09b4 | https://repo.maven.apache.org/maven2/org/slf4j/slf4j-android/1.7.25/slf4j-a…
+5d5b9414f02d3fa0ee7526b8d5ddae0da67c8ecc8c4d63ffa6cf91488a93b927 | https://dl.google.com/dl/android/maven2/com/android/support/support-annotat…
+93c258c8a09f531a267653829742c0f8f6da0e348b11cb8655b0855628f2d4f0 | https://dl.google.com/dl/android/maven2/com/android/support/collections/28.…
+3a616a32f433e9e23f556b38575c31b013613d3ae85206263b7625fe1f4c151a | https://repo.spring.io/plugins-release/android/arch/core/common/1.1.1/commo…
+8d378e88ebd5189e09eef623414812c868fd90aa519d6160e2311fb8b81cff56 | https://repo.spring.io/plugins-release/android/arch/lifecycle/common/1.1.1/…
177603e3dce43e843799fe0284f8afe8121bb0cdbcdd34cd06bc09f7bd3e6c6f | https://raw.githubusercontent.com/guardianproject/gpmaven/master/org/torpro…
-fb8c5e55e30a7addb4ff210858a0e8d2494ed6757bbe19012da99d51586c3cbb | https://repo1.maven.org/maven2/org/apache/commons/commons-parent/22/commons…
-0c0e9d1857c250d1d71b5c6be7b8cc29afe55e7419a90d13bbe968ae5bd7240e | https://repo1.maven.org/maven2/org/ow2/asm/asm-util/5.1/asm-util-5.1.pom
-1eaf9182e1977c1c50a70edbfbf70536398c68990bfaafc9f0e9899041201539 | https://repo1.maven.org/maven2/com/google/guava/guava-parent/22.0/guava-par…
-0277ea358292b25721c5edbae66c6a0b557b25497877d1aae5f2cac2bf6b3e6a | https://dl.google.com/dl/android/maven2/com/android/support/support-fragmen…
-7043dee4e9e7175e93e0b36f45b1ec1ecb893c5f755667e8b916eb8dd201c6ca | https://repo1.maven.org/maven2/org/bouncycastle/bcpkix-jdk15on/1.56/bcpkix-…
-0a640f956f4cdde8b5d3458a67ca67599eeb6f47349167a3f1afce7d60978027 | https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle-core…
-f2885288839f82f824a0c042922ae7f24ed0d55ce26a74b6a7c557e0b7e30c24 | https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.1.3-2/k…
-f26bdec2b9496470c0ce63b0d290816e8000ef018daaa259597ebae947fd690f | https://repo1.maven.org/maven2/net/sf/proguard/proguard-gradle/5.3.3/progua…
-9cddda75f4a1b4469e73f44e7b61a3e897d0f657df4797f9106ffe88c4eeade0 | https://repo1.maven.org/maven2/org/eclipse/jdt/core/compiler/ecj/4.6.1/ecj-…
-6895e368fa59168428c78cdf300bb29352073f397d8f260af3de82df2c8b2448 | https://dl.google.com/dl/android/maven2/com/android/tools/analytics-library…
-9d44e7bf343dfd19a55e3e6f4c4e733b68d32509e0b0af5b32f2981f4f1dedd8 | https://dl.google.com/dl/android/maven2/com/android/support/appcompat-v7/26…
-712d7c974d20b71ce730938a3dda8d23e87cfd16500e1c1a2c9ecc2c9ff0d323 | https://dl.google.com/dl/android/maven2/com/android/tools/build/apksig/3.0.…
-e7a7a5810829dee924cec654a569a48301fcedd487f7b88710e816d127385f51 | https://dl.google.com/dl/android/maven2/com/android/tools/analytics-library…
-7d6da01cf9766b1705c6c80cfc12274a895b406c4c287900b07a56145ca6c030 | https://dl.google.com/dl/android/maven2/com/android/support/support-compat/…
-ecd46dc69f5212b35eb21d64db68072f956c000083030ff53e09d1f81487c580 | https://dl.google.com/dl/android/maven2/com/android/tools/external/org-jetb…
-2ec779741f72313fc6623d0f0e42b2450dd2425dd6ad319697e658aae9ae177b | https://dl.google.com/dl/android/maven2/com/android/tools/dvlib/26.0.1/dvli…
-e4e34e5d02bd102e8d39ddbc29f9ead8a15a61e367993d02238196ac48509ad8 | https://dl.google.com/dl/android/maven2/android/arch/lifecycle/runtime/1.0.…
-1917871c8deb468307a584680c87a44572f5a8b0b98c6d397fc0f5f86596dbe7 | https://repo.spring.io/plugins-release/org/jetbrains/trove4j/trove4j/201608…
-a9660f8b64b74f474226c70a50187d8efcac448d32ce97756f408975aa52cdaa | https://dl.google.com/dl/android/maven2/com/android/tools/sdk-common/26.0.1…
-0ee5f691cbbedb69969b48374d27412f821959af5d2dffbabc424b607cdbbdf6 | https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.1.3-2/…
-e824935c264b041e847b67808aee704f8cd47d698203259057e42f473e1f6f30 | https://dl.google.com/dl/android/maven2/com/android/databinding/compilerCom…
-cd36b31f1495f4fe55a936dd00607abdd945e1f8074549225a04c402d1d35750 | https://repo1.maven.org/maven2/org/ow2/asm/asm-commons/5.1/asm-commons-5.1.…
-1879f19a05991e3ed95910b96689333396b0c467a215dc4d1f90018404b72a26 | https://repo1.maven.org/maven2/org/codehaus/mojo/animal-sniffer-annotations…
-d2da399a9967c69f0a21739256fa79d284222c223082cacadc17372244764b54 | https://repo1.maven.org/maven2/org/ow2/asm/asm/5.1/asm-5.1.jar
-f8fd874c37c89d5dfe5ec8190d94626512bd36ab2c2ac9d4b67515c5bee745cb | https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.1.3-2/k…
-2a0475c2625fc27f80d3c5021130509b4068e0f984f2511e7a77a097de48b41d | https://dl.google.com/dl/android/maven2/com/android/tools/sdklib/26.0.1/sdk…
-ace2a10dc8e2d5fd34925ecac03e4988b2c0f851650c94b8cef49ba1bd111478 | https://repo1.maven.org/maven2/org/jetbrains/annotations/13.0/annotations-1…
-efa86e5cd922f17b472fdfcae57234d8d4ac3e148b6250737dfce454af7a7a44 | https://repo1.maven.org/maven2/com/google/jimfs/jimfs/1.1/jimfs-1.1.pom
-87cd27e1a02a5c3eb6d85059ce98696bb1b44c2b8b650f0567c86df60fa61da7 | https://repo1.maven.org/maven2/org/apache/commons/commons-parent/39/commons…
-803be394edb8dd7d1e678683ed85aee7f86a172c90f03e6198c8a49d4f342b99 | https://dl.google.com/dl/android/maven2/com/android/tools/build/builder/3.0…
-965aeb2bedff369819bdde1bf7a0b3b89b8247dd69c88b86375d76163bb8c397 | https://repo1.maven.org/maven2/org/jetbrains/annotations/13.0/annotations-1…
-70c458dcf6040317b41ddf50a7d53a02b8a85b0723b36cde9562c59e3cd11dae | https://dl.google.com/dl/android/maven2/com/android/tools/dvlib/26.0.1/dvli…
-c9a55463942128f0b7fad62b8bee5886d1cb1c733fb3b78507465b025e6a4031 | https://dl.google.com/dl/android/maven2/com/android/databinding/compilerCom…
-ff513db0361fd41237bef4784968bc15aae478d4ec0a9496f811072ccaf3841d | https://repo1.maven.org/maven2/org/apache/apache/13/apache-13.pom
-6f52ba933a117bd67131b281214510ea30232b9807bfe569bc0c17e6a2d4018c | https://dl.google.com/dl/android/maven2/com/android/tools/repository/26.0.1…
-2c1542faf343185b7cab9c3d55c8ae5471d6d095d3887a4adefdbdf2984dc0b6 | https://repo1.maven.org/maven2/org/apache/commons/commons-compress/1.12/com…
-4fda6d4eb430971e3b1dad7456988333f374b0f4ba15f99839ca1a0ab5155c8a | https://dl.google.com/dl/android/maven2/com/android/support/support-core-ut…
-4f88a89142c64bf03906f84609594666e9694df56e3e6f05edfab8a68b39d837 | https://dl.google.com/dl/android/maven2/com/android/tools/annotations/26.0.…
-c4828e28d7c0a930af9387510b3bada7daa5c04d7c25a75c7b8b081f1c257ddd | https://repo1.maven.org/maven2/com/google/jimfs/jimfs/1.1/jimfs-1.1.jar
-f5a0a1eeaa100ed36aa83eca562d5dbb7e9b045c98b44db7da4745e9d9a20328 | https://repo1.maven.org/maven2/org/apache/httpcomponents/httpclient/4.2.6/h…
-fb5369fc7ea4b2e3cf8d6f20243f1d97f81341bf818b179cd8dbd1da7a781a21 | https://repo1.maven.org/maven2/org/ow2/asm/asm-tree/5.1/asm-tree-5.1.pom
-38db692b5cbaf69d89b1fe5b0fc38a5cc83f898716f8bc64086fa17c25ea57d6 | https://dl.google.com/dl/android/maven2/com/android/tools/analytics-library…
-8fdc3336e7b01873193ba9c48b87de7d788dc0954d1eb45c322492627a4b5c6e | https://repo1.maven.org/maven2/org/bouncycastle/bcprov-jdk15on/1.56/bcprov-…
-97b3786e1f55e74bddf8ad102bf50e33bbcbc1f6b7fd7b36f0bbbb25cd4981be | https://repo1.maven.org/maven2/org/ow2/asm/asm-commons/5.1/asm-commons-5.1.…
-ee041b3beb682e8bbf2dc16b6edc233483cbc36bde27fd13996617a667b615a5 | https://dl.google.com/dl/android/maven2/com/android/tools/external/com-inte…
-052b0d2b58e5df4f30e4f64bdf5414473f6cfa10147f8f8d89cb0b63316ba8f3 | https://dl.google.com/dl/android/maven2/com/android/tools/build/manifest-me…
-3e395d6fbc43c09a3774cac8694ce527398305ea3fd5492d80e25af27d382a9c | https://repo1.maven.org/maven2/org/codehaus/mojo/mojo-parent/34/mojo-parent…
-3eae72fcf02a175efa1377886e6500e6147f92104ff43ee92b9b69d59357b90d | https://dl.google.com/dl/android/maven2/com/android/support/support-annotat…
-b2b5dd46cf998fa626eb6f8a1c114f6167c8d392694164e62533e5898e9b31f2 | https://repo1.maven.org/maven2/commons-io/commons-io/2.4/commons-io-2.4.pom
-321668fc474a73140eb9cc73c779f1ebb9f60948aade3beddee082ecefcf0259 | https://repo1.maven.org/maven2/org/bouncycastle/bcpkix-jdk15on/1.56/bcpkix-…
-db3cd95bec1001605e1653f2843e8542e712fa2bb672fd9c8c1ace86c57673d1 | https://repo1.maven.org/maven2/org/apache/httpcomponents/httpmime/4.1/httpm…
-1d2e883717b8ab7d3fcc9fa01034d165809a9c94daa6303a838f11e4d36adc86 | https://repo1.maven.org/maven2/net/sf/proguard/proguard-base/5.3.3/proguard…
-0288414509c625b8dd544384fbd29f502bdc8b4f86cfc26625aa23eef9fa6057 | https://repo1.maven.org/maven2/net/sf/proguard/proguard-parent/5.3.3/progua…
-e51efb2ec140b2849b9880fb161cb6e30dd672368a534c1f47ab46d7f537d9ca | https://repo1.maven.org/maven2/net/sf/proguard/proguard-base/5.3.3/proguard…
-b27bbb9d269a97be8ff0ac480c0f09c9a953f62e6ff05d90fcbb0ddb4de97c77 | https://dl.google.com/dl/android/maven2/com/android/tools/common/26.0.1/com…
-24633fb1e62a9e4b1a25e2c1751d68be89e050b488652456e545b8019539137d | https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle-api/…
-a32de739cfdf515774e696f91aa9697d2e7731e5cb5045ca8a4b657f8b1b4fb4 | https://repo1.maven.org/maven2/org/antlr/antlr4/4.5.3/antlr4-4.5.3.jar
-bede73084ec812b916f686cc6e47625bd0756154bef589a4c2b419e54a393bf5 | https://dl.google.com/dl/android/maven2/com/android/tools/build/manifest-me…
-eeafc0b2f5ffce9cfd848f4f7f66a927d402ba83961b12f00457fcf7806eac8f | https://dl.google.com/dl/android/maven2/com/android/support/support-media-c…
-bd9b9cb1a3987b1427f7a18babe7f92078e32bbe2e1dca6dced00cc0e3a077a9 | https://repo1.maven.org/maven2/org/slf4j/slf4j-android/1.7.25/slf4j-android…
-7e8bdca281bdcb6dad48a80854837f1c0ab46f31a0b292370e320f471f5b9cfd | https://dl.google.com/dl/android/maven2/com/android/tools/sdk-common/26.0.1…
-1f8c906d0de98ddfa81b1ce520ee52fbd280c222383b66cba89e16eafb626001 | https://dl.google.com/dl/android/maven2/com/android/databinding/baseLibrary…
-ec3997c0fe3d424c0659e3202edc348f757e9c0bec329500326176e2146484d3 | https://dl.google.com/dl/android/maven2/com/android/support/appcompat-v7/26…
-a06e35d3fff3a6b813d94894ebf3e498f9540c864c5b39ae783907e3a6c72889 | https://repo1.maven.org/maven2/commons-codec/commons-codec/1.6/commons-code…
-5192934cd73df32e2c15722ed7fc488dde90baaec9ae030010dd1a80fb4e74e1 | https://dl.google.com/dl/android/maven2/android/arch/core/common/1.0.0/comm…
-164e7a9cf23a4e63bbc961f8db7d965d53d685710660a88249641f91d36f83a4 | https://repo1.maven.org/maven2/org/apache/httpcomponents/httpcomponents-cor…
-7c3cd1581b573d3c88797f4d48312d171e6e24881f064271f19d3ef1c9b480d0 | https://dl.google.com/dl/android/maven2/com/android/support/support-core-ui…
-8d4006178fedef4255797b806167cf4a6774158eedabf96420693afbbd00fee3 | https://dl.google.com/dl/android/maven2/com/android/tools/analytics-library…
-2994a7eb78f2710bd3d3bfb639b2c94e219cedac0d4d084d516e78c16dddecf6 | https://repo1.maven.org/maven2/com/google/j2objc/j2objc-annotations/1.1/j2o…
-bfadb3b40f65dd6de1666d6b29f8bb54031396c76eeef4146cf9f28255f8bf33 | https://repo1.maven.org/maven2/com/google/guava/guava/22.0/guava-22.0.pom
-3369726ca2b0e3736c741ff3c22e06f707a1007ff20ccc5b5ba5d0d9a01ead30 | https://repo.spring.io/plugins-release/net/freehaven/tor/control/jtorctl/0.…
-949246020c08a0543389082af38268cdce4ee7a7a8218097369b9845752866cb | https://dl.google.com/dl/android/maven2/com/android/tools/lint/lint-checks/…
-6d079b5abf39f323baaccc68463beef5cf2e9574f333dd749ae96753f00eb205 | https://repo1.maven.org/maven2/org/ow2/asm/asm/5.1/asm-5.1.pom
-82f538051599335ea881ec264407547cab52be750f16ce099cfb27754fc755ff | https://dl.google.com/dl/android/maven2/com/android/support/support-core-ui…
+5a12ac3f190fc2cfab73435d859511220b13eb38f8784a530d06395969cf8c59 | https://raw.githubusercontent.com/guardianproject/gpmaven/master/org/torpro…
+02f5d794ea6c15a19b885cf06257b96fe65b2f09cc7f1c2cf4f93355a0b639fe | https://repo.spring.io/plugins-release/com/android/tools/lint/lint-gradle/2…
+a8cd12c8da17b31e0fb46e64f7d3fc2e63344ca13815bade32a2d54fa2dedd3c | https://repo.maven.apache.org/maven2/org/codehaus/groovy/groovy-all/2.4.12/…
+1e6048277ba9356bbb5db9f929642b9e01e3171495601a510c6e15736ba42f4e | https://repo.spring.io/plugins-release/com/android/tools/lint/lint/26.1.0/l…
+75ce4eefabd4027b1eba98fa52ae3b51a13d7e394df8f844a6c8c2340600a7c2 | https://repo.spring.io/plugins-release/com/android/tools/external/com-intel…
+42a84e03f9af2dd6b233a101bf46e9e5598a26eb009aba95d83eca52b01e0c41 | https://repo.spring.io/plugins-release/com/android/tools/external/org-jetbr…
5c415a9d8585200de4be1947e15291cc79f599b06249375f5c9ea22d4b2d090f | https://repo.spring.io/plugins-release/org/jetbrains/trove4j/trove4j/201608…
-9144127192d6f612c2366825dceaeb23b0d53130b83e0bf1ffe107d1470a8487 | https://repo1.maven.org/maven2/com/google/errorprone/error_prone_annotation…
-e2b4935e76d91b5abec44de309f2c8bb8d1d2e6cc0b8790b43cb654f1e22c722 | https://dl.google.com/dl/android/maven2/com/android/tools/layoutlib/layoutl…
-fbd7b254e02d8aef60c418a5f0e14a783b38a16162caffb2d2a16ccd5d2c09b4 | https://repo1.maven.org/maven2/org/slf4j/slf4j-android/1.7.25/slf4j-android…
-9e9323a26ba8eb2394efef0c96d31b70df570808630dc147cab1e73541cc5194 | https://repo1.maven.org/maven2/org/apache/apache/4/apache-4.pom
-1ef71c25a9d46ae0ce023d02a5734e0b06fdf934fbc5948e20482526b22b4179 | https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle/3.0.…
-e2f7b17610f9f0a2b55c019b7627be3d42ec142fde1db5caf8a34dbe3bb8dbcd | https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle-api/…
-5dc327c690d031a11aa8f9f4cdc391fb938fbb7c7c143cc4bc60dd573d1fd1c9 | https://dl.google.com/dl/android/maven2/com/android/tools/build/builder/3.0…
-a0ab3369ef40fe199160692f0463a5f63f1277ebfb64dd587c76fdb128d76b32 | https://dl.google.com/dl/android/maven2/com/android/support/support-fragmen…
-faf82de0dc02e0c0ae327cd653f37255496b2e53fce280b3ab4cb34553a89086 | https://repo1.maven.org/maven2/com/intellij/annotations/12.0/annotations-12…
-cb4cfad870bf563a07199f3ebea5763f0dec440fcda0b318640b1feaa788656b | https://repo1.maven.org/maven2/com/google/errorprone/error_prone_annotation…
-a824b7efa9f6e66378e39d3eb79b8857ce6955663e4186ca6b2ad852eea64743 | https://dl.google.com/dl/android/maven2/com/android/support/support-core-ut…
+12ace827e21f7d198e37419cc8aa4340af629bad22b132f53efe4b2bbc3b3cd6 | https://repo.spring.io/plugins-release/com/android/tools/lint/lint-checks/2…
+815df2f2fddf91ec4c02133b7576f5311f62c11c3c6e3d5eb11c93275849818b | https://repo.spring.io/plugins-release/com/android/tools/external/com-intel…
+8336ad360b60e0922c9f81fe030724be1627c148d9c214f8b6c4bb563df05d6b | https://repo.spring.io/plugins-release/com/android/tools/lint/lint-kotlin/2…
+9d15d02d7e44be94dee79a44b29b95d3707376f9a27390223049bb158bb31b21 | https://repo.spring.io/plugins-release/com/android/tools/lint/lint-api/26.1…
+9144127192d6f612c2366825dceaeb23b0d53130b83e0bf1ffe107d1470a8487 | https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_anno…
+cf149955279b07d4f11e817985c1164a69e930d73db7441b43a6ef53bbd286c4 | https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_pare…
+3827bd989d317c419f62913a1f5fed6f10daaed7f7434a009eea2595ad87da3c | https://repo.spring.io/plugins-release/com/android/tools/lint/lint-kotlin/2…
+ec9d6afcfed18e6c768898fc98be209a8a0fd18a3cfd707f700964e8a22953b6 | https://repo.spring.io/plugins-release/com/android/tools/lint/lint-gradle/2…
+6096c358ab6c0494e1b7d802d2f9016eed62207450b940ecc4fc29b14817c2f1 | https://repo.spring.io/plugins-release/com/android/tools/lint/lint/26.1.0/l…
+cb4cfad870bf563a07199f3ebea5763f0dec440fcda0b318640b1feaa788656b | https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_anno…
+f0ab6b1143a5735185bb6176eed6ee7f4dbdb8b4ce7a840faf43f19ae59602eb | https://repo.spring.io/plugins-release/com/android/tools/lint/lint-api/26.1…
+2b1656bd710b8690dc19244a1061279c937d67bfc8697117497532e83d732aa9 | https://repo.spring.io/plugins-release/com/android/tools/lint/lint-checks/2…
+1917871c8deb468307a584680c87a44572f5a8b0b98c6d397fc0f5f86596dbe7 | https://repo.spring.io/plugins-release/org/jetbrains/trove4j/trove4j/201608…
+6a56af4bd48903d56bec62821876cadefafd007360cc6bd0d8f7aa8d72b38be4 | https://repo.maven.apache.org/maven2/org/codehaus/groovy/groovy-all/2.4.12/…
+1a228bae07b7037c856247af7a4a6f05615e61d95c206fea4284a028272a3969 | https://repo.spring.io/plugins-release/com/android/tools/external/org-jetbr…
+4e5f6ffcc1fd9634c506324cb42e43c495cceab6e164c0e3f1ccfaf6e3d05863 | https://repo.spring.io/plugins-release/com/android/tools/external/com-intel…
+9ee2e54b8f61651f7a6213bb10f14368b0e79abe213588aba916c7ad43d9af17 | https://repo.spring.io/plugins-release/com/android/tools/external/com-intel…
diff --git a/projects/tor-onion-proxy-library/gradle.patch b/projects/tor-onion-proxy-library/gradle.patch
new file mode 100644
index 0000000..3168458
--- /dev/null
+++ b/projects/tor-onion-proxy-library/gradle.patch
@@ -0,0 +1,25 @@
+diff --git a/android/build.gradle b/android/build.gradle
+index a8d9bdc..e8faf8c 100644
+--- a/android/build.gradle
++++ b/android/build.gradle
+@@ -15,7 +15,7 @@ buildscript {
+
+ android {
+ compileSdkVersion 28
+-
++ buildToolsVersion "27.0.3"
+ defaultConfig {
+ minSdkVersion 16
+ targetSdkVersion 28
+diff --git a/android_tor_installer/build.gradle b/android_tor_installer/build.gradle
+index 554fd49..4059748 100644
+--- a/android_tor_installer/build.gradle
++++ b/android_tor_installer/build.gradle
+@@ -15,6 +15,7 @@ buildscript {
+
+ android {
+ compileSdkVersion 28
++ buildToolsVersion "27.0.3"
+
+ defaultConfig {
+ minSdkVersion 16
diff --git a/projects/tor-onion-proxy-library/maven-repo.patch b/projects/tor-onion-proxy-library/maven-repo.patch
deleted file mode 100644
index 4c78aec..0000000
--- a/projects/tor-onion-proxy-library/maven-repo.patch
+++ /dev/null
@@ -1,51 +0,0 @@
-diff --git a/android/build.gradle b/android/build.gradle
-index b6d8608..38093be 100644
---- a/android/build.gradle
-+++ b/android/build.gradle
-@@ -7,6 +7,7 @@ buildscript {
- mavenLocal()
- mavenCentral()
- google()
-+ maven { url System.getenv("GRADLE_MAVEN_REPO") }
- }
- dependencies {
- classpath "com.android.tools.build:gradle:${androidplugin}"
-@@ -82,6 +83,7 @@ repositories {
- mavenCentral()
- google()
- maven { url "https://raw.githubusercontent.com/guardianproject/gpmaven/master" }
-+ maven { url System.getenv("GRADLE_MAVEN_REPO") }
- }
-
- /**
-diff --git a/android_tor_installer/build.gradle b/android_tor_installer/build.gradle
-index 1bc0343..7d8e886 100644
---- a/android_tor_installer/build.gradle
-+++ b/android_tor_installer/build.gradle
-@@ -7,6 +7,7 @@ buildscript {
- mavenLocal()
- mavenCentral()
- google()
-+ maven { url System.getenv("GRADLE_MAVEN_REPO") }
- }
- dependencies {
- classpath "com.android.tools.build:gradle:${androidplugin}"
-@@ -50,5 +51,6 @@ repositories {
- google()
- maven { url "https://repo.spring.io/plugins-release" }
- maven { url "https://raw.githubusercontent.com/guardianproject/gpmaven/master" }
-+ maven { url System.getenv("GRADLE_MAVEN_REPO") }
-
- }
-diff --git a/build.gradle b/build.gradle
-index a269024..430f3e1 100644
---- a/build.gradle
-+++ b/build.gradle
-@@ -9,6 +9,7 @@ subprojects {
- mavenLocal()
- mavenCentral()
- maven { url "https://repo.spring.io/plugins-release" }
-+ maven { url System.getenv("GRADLE_MAVEN_REPO") }
- }
- }
-
1
0

[tor-browser-build/master] Bug 30665: Get Firefox 68 ESR Working with latest android toolchain
by gk@torproject.org 01 Sep '19
by gk@torproject.org 01 Sep '19
01 Sep '19
commit 2d3e92fc4f3e7961a469d5f0a50ebc9b067c08cc
Author: sisbell <shane.isbell(a)gmail.com>
Date: Mon Aug 26 10:28:35 2019 -0700
Bug 30665: Get Firefox 68 ESR Working with latest android toolchain
Bug 31389: Update Android Firefox to Build with Clang
---
projects/firefox/android-dependencies.patch | 30 -
projects/firefox/android-packages.patch | 10 +
projects/firefox/android-remove-emulator.patch | 23 +
projects/firefox/build | 23 +-
projects/firefox/config | 8 +-
projects/firefox/gradle-dependencies-list.txt | 942 +++++++++++++++----------
projects/firefox/mozconfig-android-aarch64 | 12 +-
projects/firefox/mozconfig-android-armv7 | 12 +-
projects/firefox/mozconfig-android-x86 | 14 +-
9 files changed, 631 insertions(+), 443 deletions(-)
diff --git a/projects/firefox/android-dependencies.patch b/projects/firefox/android-dependencies.patch
deleted file mode 100644
index 429bf8d..0000000
--- a/projects/firefox/android-dependencies.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-diff --git a/mobile/android/app/build.gradle b/mobile/android/app/build.gradle
-index c8380042d8a9..990fabe05a60 100644
---- a/mobile/android/app/build.gradle
-+++ b/mobile/android/app/build.gradle
-@@ -225,8 +225,10 @@ dependencies {
- implementation "com.android.support:design:${mozconfig.substs.ANDROID_SUPPORT_LIBRARY_VERSION}"
- implementation "com.android.support:customtabs:${mozconfig.substs.ANDROID_SUPPORT_LIBRARY_VERSION}"
- implementation "com.android.support:palette-v7:${mozconfig.substs.ANDROID_SUPPORT_LIBRARY_VERSION}"
-- implementation files('orbotservice-release.aar')
-+ implementation files('android-release.aar')
-+ implementation files('universal-0.0.3.jar')
- implementation files('jsocksAndroid-release.aar')
-+ implementation files('service-release.aar')
-
- if (mozconfig.substs.MOZ_NATIVE_DEVICES) {
- implementation "com.android.support:mediarouter-v7:${mozconfig.substs.ANDROID_SUPPORT_LIBRARY_VERSION}"
-@@ -265,9 +267,10 @@ dependencies {
- // Including the Robotium JAR directly can cause issues with dexing.
- androidTestImplementation 'com.jayway.android.robotium:robotium-solo:5.5.4'
-
-- // Orbotservice
-- implementation 'org.torproject:tor-android-binary:0.3.4.9'
-- implementation 'com.jrummyapps:android-shell:1.0.1'
-+ //tor-android-service
-+ implementation 'net.freehaven.tor.control:jtorctl:0.2'
-+ implementation 'org.slf4j:slf4j-api:1.7.25'
-+ implementation 'org.slf4j:slf4j-android:1.7.25'
- }
-
- // TODO: (bug 1261486): This impl is not robust -
diff --git a/projects/firefox/android-packages.patch b/projects/firefox/android-packages.patch
new file mode 100644
index 0000000..3c70b41
--- /dev/null
+++ b/projects/firefox/android-packages.patch
@@ -0,0 +1,10 @@
+diff --git a/python/mozboot/mozboot/android-packages.txt b/python/mozboot/mozboot/android-packages.txt
+index ac947a72f410..1a9aa21cb5d8 100644
+--- a/python/mozboot/mozboot/android-packages.txt
++++ b/python/mozboot/mozboot/android-packages.txt
+@@ -1,5 +1,3 @@
+ platform-tools
+ build-tools;27.0.3
+ platforms;android-28
+-emulator
+-docs
diff --git a/projects/firefox/android-remove-emulator.patch b/projects/firefox/android-remove-emulator.patch
new file mode 100644
index 0000000..9499983
--- /dev/null
+++ b/projects/firefox/android-remove-emulator.patch
@@ -0,0 +1,23 @@
+diff --git a/build/moz.configure/android-sdk.configure b/build/moz.configure/android-sdk.configure
+index a8ecc617850d..0a58597e2646 100644
+--- a/build/moz.configure/android-sdk.configure
++++ b/build/moz.configure/android-sdk.configure
+@@ -87,10 +87,6 @@ def android_platform_tools(sdk_root):
+ tools)
+
+
+-@depends(android_sdk_root)
+-def android_emulator_path(sdk_root):
+- return [os.path.join(sdk_root, 'emulator')]
+-
+
+ @template
+ def check_android_tools(tool, tool_dir):
+@@ -108,7 +104,6 @@ def check_android_tools(tool, tool_dir):
+
+ check_android_tools('zipalign', android_build_tools)
+ check_android_tools('adb', android_platform_tools)
+-check_android_tools('emulator', android_emulator_path)
+
+ set_config('ANDROID_SDK_ROOT', android_sdk_root)
+ set_config('ANDROID_TOOLS', android_tools)
diff --git a/projects/firefox/build b/projects/firefox/build
index a4b10b6..1450576 100644
--- a/projects/firefox/build
+++ b/projects/firefox/build
@@ -29,7 +29,7 @@ export PATH="/var/tmp/dist/rust/bin:/var/tmp/dist/cbindgen:/var/tmp/dist/nasm/bi
tar -C /var/tmp/dist -xf [% c('input_files_by_name/clang') %]
export LLVM_CONFIG="/var/tmp/dist/clang/bin/llvm-config"
-[% IF c("var/linux") %]
+[% IF c("var/linux") || c("var/android") %]
tar -C /var/tmp/dist -xf $rootdir/[% c('input_files_by_name/binutils') %]
export PATH="/var/tmp/dist/binutils/bin:$PATH"
# Use clang for everything on Linux now.
@@ -53,19 +53,24 @@ mv -f $rootdir/[% c('input_files_by_name/mozconfig') %] .mozconfig
export ASAN_OPTIONS="detect_leaks=0"
[% END -%]
+[% IF c("var/android-armv7") -%]
+ cp /var/tmp/dist/android-toolchain/android-ndk/arm/lib64/libclang.so.6 /var/tmp/dist/android-toolchain/android-ndk/arm/lib64/libclang.so
+[% END -%]
+
[% IF c("var/android") %]
gradle_repo=/var/tmp/dist/gradle-dependencies
export GRADLE_MAVEN_REPOSITORIES="file://$gradle_repo"
+ export GRADLE_FLAGS="--no-daemon --offline"
# Move Gradle Repo to hard-coded location. This location is embedded in the file
# chrome/toolkit/content/global/buildconfig.html so needs to be standard for reproducibility
mv $rootdir/[% c('input_files_by_name/gradle-dependencies') %] $gradle_repo
- cp -r $gradle_repo/plugins-release/* $gradle_repo
- cp -r $gradle_repo/maven2/* $gradle_repo
+ cp -r $gradle_repo/m2/* $gradle_repo
# Move Android library dependencies so they will be included in the apk during the build
cp $rootdir/[% c('input_files_by_name/topl') %]/* mobile/android/app
cp $rootdir/[% c('input_files_by_name/tor-android-service') %]/* mobile/android/app
# Apply patches
- patch -p1 < $rootdir/android-dependencies.patch
+ patch -p1 < $rootdir/android-packages.patch
+ patch -p1 < $rootdir/android-remove-emulator.patch
# Prepare building the multi-locale .apk including our own strings
mkdir -p /var/tmp/dist/locales
@@ -88,12 +93,6 @@ fi
export LDFLAGS="-Wl,--no-insert-timestamp"
[% END -%]
-# Backporting a sec-high bugfix to ESR 60, but making sure it is only applied to
-# mobile, as desktop ESR has not seen any testing with this mobile-related patch
-[% IF c("var/android") %]
- patch -p1 < $rootdir/1527534.patch
-[% END -%]
-
[% IF ! c("var/android") %]
# Place a copy of the Tor Launcher sources under browser/extensions
tar -C browser/extensions -xf $rootdir/[% c('input_files_by_name/tor-launcher') %]
@@ -102,7 +101,9 @@ fi
rm -f configure
rm -f js/src/configure
-./mach configure --with-tor-browser-version=[% c("var/torbrowser_version") %] --with-distribution-id=org.torproject --enable-update-channel=[% c("var/torbrowser_update_channel") %] --enable-bundled-fonts --with-branding=[% c("var/branding_directory") %]
+# Android does not support --enable-bundled-fonts option
+./mach configure --with-tor-browser-version=[% c("var/torbrowser_version") %] --with-distribution-id=org.torproject --enable-update-channel=[% c("var/torbrowser_update_channel") %] [% IF ! c("var/android") %]--enable-bundled-fonts[% END -%] --with-branding=[% c("var/branding_directory") %]
+
# Don't build with --verbose anymore or otherwise Stylo compilation breaks on
# Linux. See: #30321 for details.
./mach build
diff --git a/projects/firefox/config b/projects/firefox/config
index 06f7c60..caa9e0d 100644
--- a/projects/firefox/config
+++ b/projects/firefox/config
@@ -28,7 +28,7 @@ var:
container:
use_container: 1
# this should be updated when the list of gradle dependencies is changed
- gradle_dependencies_version: 5
+ gradle_dependencies_version: 6
# used by projects/firefox-locale-bundle
l10n-changesets.json: '[% exec("cat mobile/locales/l10n-changesets.json") %]'
@@ -135,7 +135,7 @@ input_files:
name: mozconfig
- project: binutils
name: binutils
- enable: '[% c("var/linux") %]'
+ enable: '[% c("var/linux") || c("var/android") %]'
- filename: fix-info-plist.py
enable: '[% c("var/osx") %]'
- filename: nsis-uninstall.patch
@@ -172,7 +172,9 @@ input_files:
- project: tor-onion-proxy-library
name: topl
enable: '[% c("var/android") %]'
- - filename: android-dependencies.patch
+ - filename: android-packages.patch
+ enable: '[% c("var/android") %]'
+ - filename: android-remove-emulator.patch
enable: '[% c("var/android") %]'
- project: firefox-locale-bundle
name: firefox-locale-bundle
diff --git a/projects/firefox/gradle-dependencies-list.txt b/projects/firefox/gradle-dependencies-list.txt
index fee53d2..b46f871 100644
--- a/projects/firefox/gradle-dependencies-list.txt
+++ b/projects/firefox/gradle-dependencies-list.txt
@@ -1,374 +1,574 @@
# On how to update dependencies see projects/common/how-to-create-gradle-dependencies-list.txt
# Don't forget to update var/gradle_dependencies_version when modifying this file
sha256sum | url
-0397963405810796ee2d9527e9d1e1a2ed9c44cdb83cdd6959a4ee148ab56fbe | https://repo1.maven.org/maven2/org/robolectric/sandbox/3.5.1/sandbox-3.5.1.…
-14db0f7d2299c5400ff7764bb37b4fa80306582d8965fdf6999091723e2384ce | https://repo1.maven.org/maven2/org/robolectric/annotations/3.5.1/annotation…
-cd6db17a11a31ede794ccbd1df0e4d9750f640234731f21cff885a9997277e81 | https://repo1.maven.org/maven2/com/google/google/1/google-1.pom
-d46777ad3ea8bca73491b2e02fc85b3664486abf5314cc4dc6740908bd855330 | https://repo1.maven.org/maven2/com/google/android/apps/common/testing/acces…
-ee041b3beb682e8bbf2dc16b6edc233483cbc36bde27fd13996617a667b615a5 | https://maven.google.com/com/android/tools/external/com-intellij/intellij-c…
-536c45e8804de01321c478cfb994377f81f1e32897636616fa21b877fd137c6f | https://repo1.maven.org/maven2/org/eclipse/jdt/core/compiler/ecj/4.6.1/ecj-…
-2ec779741f72313fc6623d0f0e42b2450dd2425dd6ad319697e658aae9ae177b | https://maven.google.com/com/android/tools/dvlib/26.0.1/dvlib-26.0.1.pom
-8d4006178fedef4255797b806167cf4a6774158eedabf96420693afbbd00fee3 | https://maven.google.com/com/android/tools/analytics-library/protos/26.0.1/…
-c3fb02564ca173e45548d7a91aca1efe341db11da2656199d559773e7ae15edf | https://repo1.maven.org/maven2/org/ow2/asm/asm-commons/5.0.1/asm-commons-5.…
-ff513db0361fd41237bef4784968bc15aae478d4ec0a9496f811072ccaf3841d | https://repo1.maven.org/maven2/org/apache/apache/13/apache-13.pom
-8b870b3f2ee38bf15681acbc8b628df1ccf7c533190b5c79af9934b6cd66d451 | https://maven.google.com/com/android/databinding/baseLibrary/3.0.1/baseLibr…
-c0de2bbc4cb8297419659813ecd4ed1d077ed1dd5c1f5544cc5143e493e84c10 | https://repo1.maven.org/maven2/org/ow2/asm/asm-tree/5.1/asm-tree-5.1.jar
-8c6191e0dd8bfdc862332cb79b08185ac5b63565d405dac2605be4c2b19774bd | https://repo1.maven.org/maven2/com/android/tools/external/lombok/lombok-ast…
-8b0aa8a74e990ca8d633ab7bd1938530e921548df13fd4020224a61065378876 | https://maven.google.com/com/android/tools/build/builder-test-api/3.0.1/bui…
-363cc83767b760d7a564d5301e09467e6d48fc1c1c1664b1e18c50815ce19076 | https://repo1.maven.org/maven2/com/google/guava/guava/20.0/guava-20.0.pom
-bede73084ec812b916f686cc6e47625bd0756154bef589a4c2b419e54a393bf5 | https://maven.google.com/com/android/tools/build/manifest-merger/26.0.1/man…
-f6775dc981540ffa10f33bd831f14608517ce38b90628e045707dd5bb5d1348e | https://repo1.maven.org/maven2/org/apache/maven/wagon/wagon-http-shared/1.0…
-9f85ff2fd7d6cb3097aa47fb419ee7f0ebe869109f98aba9f4eca3f49e74a40e | https://repo1.maven.org/maven2/org/apache/apache/16/apache-16.pom
-e5e82da4cc66c8d917bbf743e3c0752efe8522735e7fc9dbddb65bccea81cfe9 | https://repo1.maven.org/maven2/org/apache/httpcomponents/httpcore/4.2.5/htt…
-cc6a41dc3eaacc9e440a6bd0d2890b20d36b4ee408fe2d67122f328bb6e01581 | https://repo1.maven.org/maven2/commons-io/commons-io/2.4/commons-io-2.4.jar
-3e395d6fbc43c09a3774cac8694ce527398305ea3fd5492d80e25af27d382a9c | https://repo1.maven.org/maven2/org/codehaus/mojo/mojo-parent/34/mojo-parent…
-1ccea47240da2f0b75dbddb22718fd64cce42c20bf7983e35480b098ab62d26d | https://repo1.maven.org/maven2/com/squareup/leakcanary/leakcanary-android-n…
-8a4e4b32eedaa72976a757e12cf1dfe742725db0b7311bf176dd937ba4236384 | https://repo1.maven.org/maven2/org/antlr/antlr4/4.5.3/antlr4-4.5.3.pom
-e824935c264b041e847b67808aee704f8cd47d698203259057e42f473e1f6f30 | https://maven.google.com/com/android/databinding/compilerCommon/3.0.1/compi…
-6b87237de8c2e1740cf80627c7f3ce3e15de1930bb250c55a1eca94fa3e014df | https://repo1.maven.org/maven2/org/codehaus/codehaus-parent/4/codehaus-pare…
-3c09321a4140cbbaf50ceefb08f249e2a033eef78dc6efc3d3022515b05a0cda | https://maven.google.com/com/android/support/customtabs/23.4.0/customtabs-2…
-0a640f956f4cdde8b5d3458a67ca67599eeb6f47349167a3f1afce7d60978027 | https://maven.google.com/com/android/tools/build/gradle-core/3.0.1/gradle-c…
-e6d920d5a1a34aaaebab1e6a82c36bbfd61f1eeaabc4534ee05d4faad56f1b7a | https://repo1.maven.org/maven2/org/apache/ant/ant/1.8.0/ant-1.8.0.pom
-401877d5e70ad599e9b6cff18434ea0332f637b51f8ec68352646c836f9bb2a4 | https://repo1.maven.org/maven2/org/antlr/antlr4-master/4.5.3/antlr4-master-…
-b27bbb9d269a97be8ff0ac480c0f09c9a953f62e6ff05d90fcbb0ddb4de97c77 | https://maven.google.com/com/android/tools/common/26.0.1/common-26.0.1.jar
-58aa4df8faae90e484c0bc47494a1ec97dc51fe53eae2b4a70d60ea7489cdf8c | https://maven.google.com/com/android/tools/external/com-intellij/intellij-c…
-965aeb2bedff369819bdde1bf7a0b3b89b8247dd69c88b86375d76163bb8c397 | https://repo1.maven.org/maven2/org/jetbrains/annotations/13.0/annotations-1…
-cf149955279b07d4f11e817985c1164a69e930d73db7441b43a6ef53bbd286c4 | https://repo1.maven.org/maven2/com/google/errorprone/error_prone_parent/2.0…
-260cc48a58764afbcadec4a9b41877c5aa826c760ae3b6b1db8bde44074c7c41 | https://repo1.maven.org/maven2/org/ow2/asm/asm/5.0.1/asm-5.0.1.pom
-cb4cfad870bf563a07199f3ebea5763f0dec440fcda0b318640b1feaa788656b | https://repo1.maven.org/maven2/com/google/errorprone/error_prone_annotation…
-a0d002465c0f611eedaaef2b2530707d2e9fb3a5c7ed66f53c556a12f714f43a | https://maven.google.com/com/android/support/support-v4/23.4.0/support-v4-2…
-cd36b31f1495f4fe55a936dd00607abdd945e1f8074549225a04c402d1d35750 | https://repo1.maven.org/maven2/org/ow2/asm/asm-commons/5.1/asm-commons-5.1.…
-7b33cee43a87b390f2ea8084ed431b605016e2ff4c24db9a1fbdd8ffe97ef92d | https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-gradle-plugin-ap…
-13c1448f7ebb61f67e6fbd6cd5c188804c17c4d7e77c4b79b316ede4ef9cd9b3 | https://maven.google.com/com/android/tools/lint/lint/26.0.1/lint-26.0.1.pom
-381d72c526be217b770f9f8c3f749a86d3b1548ac5c1fcb48d267530ec60d43f | https://repo1.maven.org/maven2/org/codehaus/plexus/plexus-components/1.1.14…
-ef5ff4dc0257c1eebed07da22b4695ffdd3030da8d224282fb9c565b56cf2f24 | https://repo1.maven.org/maven2/org/simpleframework/simple-http/6.0.1/simple…
-7c758612888782ccfe376823aee7cdcc7e0cdafb097f7ef50295a0b0c3a16edf | https://repo1.maven.org/maven2/org/codehaus/plexus/plexus-container-default…
-b51f8867c92b6a722499557fc3a1fdea77bdf9ef574722fe90ce436a29559454 | https://repo1.maven.org/maven2/org/sonatype/oss/oss-parent/7/oss-parent-7.p…
-757bfe906193b8b651e79dc26cd67d6b55d0770a2cdfb0381591504f779d4a76 | https://repo1.maven.org/maven2/com/googlecode/juniversalchardet/juniversalc…
-f0c98c571e93a7cb4dd18df0fa308f0963e7a0620ac2d4244e61e709d03ad6be | https://repo1.maven.org/maven2/com/google/j2objc/j2objc-annotations/1.1/j2o…
-85c3c8840bb21554faf159998146f7ca9ef1b951defb29ec4e8252ec463728fd | https://repo1.maven.org/maven2/org/apache/maven/wagon/wagon-provider-api/1.…
-5215b648798c6c8d9b9cde3642d3bfb5a4cc894b7c8411004352e7de5d119827 | https://repo1.maven.org/maven2/org/apache/httpcomponents/httpcomponents-cli…
-81120db4d5490c4f0e9789e1178d2bac231fcff2618bd80f8ef6ff03c550d59b | https://repo1.maven.org/maven2/org/ow2/asm/asm-analysis/5.1/asm-analysis-5.…
-3db15325cd620c0e54c3d88b6b7ec1bac43db376e18c9bf56bd0c05402ee6be8 | https://repo1.maven.org/maven2/org/apache/maven/maven-plugin-registry/2.2.1…
-efa86e5cd922f17b472fdfcae57234d8d4ac3e148b6250737dfce454af7a7a44 | https://repo1.maven.org/maven2/com/google/jimfs/jimfs/1.1/jimfs-1.1.pom
-fcfb09fb0ea0aa97d3cfe7ea792398081348e468f126b3603cb3803f240197f0 | https://repo1.maven.org/maven2/com/squareup/javawriter/2.5.0/javawriter-2.5…
-d5831ee4f71055800821a34a3051cf1ed5b3702f295ffebd50f65fb5d81a71b8 | https://repo1.maven.org/maven2/org/mockito/mockito-core/1.10.19/mockito-cor…
-d125b3ade9f694ae60ef835f5ae000b6ba35fba8c34bafd8b40a1961375e63fa | https://repo1.maven.org/maven2/org/apache/maven/maven-profile/2.2.1/maven-p…
-7450c3330cf06c254db9f0dc5ef49eac15502311cf19e0208ba473076ee043d6 | https://repo1.maven.org/maven2/org/apache/maven/maven-parent/11/maven-paren…
-15d4b252c5aa3aeb8d634ae5aaf348ac6ce183b6b5e3615364e6c083715c1133 | https://repo1.maven.org/maven2/com/getkeepsafe/dexcount/dexcount-gradle-plu…
-fcd77cba4ea3893429860b93da5d43f2e089f2ba8bdfa97ef724f410f404152a | https://maven.google.com/com/android/tools/build/gradle/3.0.1/gradle-3.0.1.…
-e116f32edcb77067289a3148143f2c0c97b27cf9a1342f8108ee37dec4868861 | https://repo1.maven.org/maven2/org/apache/maven/wagon/wagon-provider-api/1.…
-70c458dcf6040317b41ddf50a7d53a02b8a85b0723b36cde9562c59e3cd11dae | https://maven.google.com/com/android/tools/dvlib/26.0.1/dvlib-26.0.1.jar
-95b8b357d19f63797dd7d67622fd3f18374d64acbc6584faba1c7759a31e8438 | https://repo1.maven.org/maven2/nekohtml/xercesMinimal/1.9.6.2/xercesMinimal…
-ee4e1227673b6ba0b462b567f011b88b6e4e4cd044e1c9734ffb1a2ff80d7ee7 | https://repo1.maven.org/maven2/org/robolectric/resources/3.5.1/resources-3.…
-857db5645aaefbd7fbe9ba6454b072bc0518ebaba08a93d5eae89a9850e949c4 | https://repo1.maven.org/maven2/com/getkeepsafe/dexcount/dexcount-gradle-plu…
-faf82de0dc02e0c0ae327cd653f37255496b2e53fce280b3ab4cb34553a89086 | https://repo1.maven.org/maven2/com/intellij/annotations/12.0/annotations-12…
-343b1a3093410e3fb26c66998423ab389c3a7441cd1a8859bd327dd15b479aa4 | https://repo1.maven.org/maven2/org/objenesis/objenesis-parent/2.1/objenesis…
-31629566148e8a47688ae43b420abc3ecd783ed15b33bebc00824bf24c9b15aa | https://repo1.maven.org/maven2/org/apache/httpcomponents/httpmime/4.1/httpm…
-5f1d5eab6940ece3ebb73691d8a60434d8d1e330176442be8f35a1585345b2ec | https://maven.google.com/com/android/support/design/23.4.0/design-23.4.0.aar
-56057490cbc1eeae6227e6eb5c6d5b324b77429b8a78d15027c77d491ef9c675 | https://repo1.maven.org/maven2/org/ow2/asm/asm/5.0.1/asm-5.0.1.jar
-34af0baedaef19375b7c1a7da967e9089d5e0754647fdbe9a302590392874b77 | https://repo1.maven.org/maven2/org/apache/maven/maven-project/2.2.1/maven-p…
-963e1ee14f808ffb99897d848ddcdb28fa91ddda867eb18d303e82728f878349 | https://repo1.maven.org/maven2/org/bouncycastle/bcprov-jdk15on/1.56/bcprov-…
-0ec9e69539aa51350a7d295003d8e7f36007d9cd4a3b93730994a24ada5a11c5 | https://maven.google.com/com/android/support/test/exposed-instrumentation-a…
-1870cb5f561ac94760064c5eff8d4259692dd5845680113e78ed9b239e6cf34a | https://repo1.maven.org/maven2/org/simpleframework/simple-http/6.0.1/simple…
-bfc90e9e32d0eab1f397fb974b5f150a815188382ac41f372a7149d5bc178008 | https://repo1.maven.org/maven2/xpp3/xpp3_min/1.1.4c/xpp3_min-1.1.4c.jar
-5d252585d47129cd667d96c92237383138a42edec5a8963a7dd44cd770faed91 | https://maven.google.com/com/android/tools/lint/lint-checks/26.0.1/lint-che…
-fdff6cfa9ed9cc911c842a5d2395f209ec621ef1239d46810e9e495809d3ae09 | https://repo1.maven.org/maven2/nekohtml/nekohtml/1.9.6.2/nekohtml-1.9.6.2.j…
-9a9f556713a404e770c9dbdaed7eb086078014c989291960c76fdde6db4192f7 | https://repo1.maven.org/maven2/org/apache/maven/maven-settings/2.2.1/maven-…
-2994a7eb78f2710bd3d3bfb639b2c94e219cedac0d4d084d516e78c16dddecf6 | https://repo1.maven.org/maven2/com/google/j2objc/j2objc-annotations/1.1/j2o…
-e1abd7f1116cf5e0c59947693e2189208ec94296b2a3394c959e3511d399a7b0 | https://repo1.maven.org/maven2/com/squareup/javawriter/2.5.0/javawriter-2.5…
-cf7e3630e1929ddeffcb0315db2acb37182c92dd3af970111b6115592f64d077 | https://repo1.maven.org/maven2/org/jacoco/org.jacoco.core/0.7.4.20150226212…
-ed68ffe66e8fcc23fdeab4eab259a197a11f26325eae59c5afba3a273cd83d25 | https://maven.google.com/com/android/support/test/espresso/espresso-idling-…
-932e6bab9a24a7bc958bbdb7e29e04d083b473d11c4ba3fab1e9b7149579f272 | https://repo1.maven.org/maven2/com/google/protobuf/protobuf-parent/3.0.0/pr…
-c3c99bf58182889fe86315e9a01473ee2c95540b9dedef898cec64554d925c54 | https://repo1.maven.org/maven2/com/android/tools/annotations/24.5.0/annotat…
-1eaf9182e1977c1c50a70edbfbf70536398c68990bfaafc9f0e9899041201539 | https://repo1.maven.org/maven2/com/google/guava/guava-parent/22.0/guava-par…
-736c8cb2b448d46a67d2a315e67e8903baaefc35e498df45a2d816f8698383c1 | https://repo1.maven.org/maven2/com/jrummyapps/android-shell/1.0.1/android-s…
-153b32f474fd676ec36ad807c508885005139140fc92168bb76bf6be31f8efb8 | https://repo1.maven.org/maven2/org/apache/maven/maven-model/2.2.1/maven-mod…
-949246020c08a0543389082af38268cdce4ee7a7a8218097369b9845752866cb | https://maven.google.com/com/android/tools/lint/lint-checks/26.0.1/lint-che…
-f264dd9f79a1fde10ce5ecc53221eff24be4c9331c830b7d52f2f08a7b633de2 | https://repo1.maven.org/maven2/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0.jar
-164e7a9cf23a4e63bbc961f8db7d965d53d685710660a88249641f91d36f83a4 | https://repo1.maven.org/maven2/org/apache/httpcomponents/httpcomponents-cor…
-150021a89ae6f252415cbfff5c3111bf87433776b997b68e6e71f37e5b696799 | https://maven.google.com/com/android/support/support-vector-drawable/23.4.0…
-3759796aab6669f10d58d6f6ef1b25a8a9ca4f7ec48bd47ad5141dd1f0865a38 | https://repo1.maven.org/maven2/com/squareup/leakcanary/leakcanary-watcher/1…
-0d25a88a1b1e44801f8912206a40ff249cb5702ee87cf3d243d5213f7bcf534f | https://repo1.maven.org/maven2/org/apache/maven/maven-settings/2.2.1/maven-…
-50cadbcd70d80cf627661628e9d5163fe4f0757b87e89e68b43663b509c031d5 | https://repo1.maven.org/maven2/org/simpleframework/simple-common/6.0.1/simp…
-3a0a524d3540d005d4df0ca39305fce1972f0d2d966d9b8e6bdb956011501584 | https://maven.google.com/com/android/support/test/runner/0.5/runner-0.5.pom
-91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff | https://repo1.maven.org/maven2/javax/inject/javax.inject/1/javax.inject-1.j…
-f2abf7db3c5937fe021fd66f8bd2d9460cf2c9b1ad8efa0abb797d778390b22f | https://repo1.maven.org/maven2/com/squareup/haha/haha/2.0.2/haha-2.0.2.pom
-34e08ee62116071cbb69c0ed70d15a7a5b208d62798c59f2120bb8929324cb63 | https://repo1.maven.org/maven2/xmlpull/xmlpull/1.1.3.1/xmlpull-1.1.3.1.jar
-2068320bd6bad744c3673ab048f67e30bef8f518996fa380033556600669905d | https://repo1.maven.org/maven2/org/codehaus/mojo/animal-sniffer-annotations…
-3c4fa807380179c24966309fe642eee19558948ebfd326f8f01c301629a50cb0 | https://repo1.maven.org/maven2/com/squareup/leakcanary/leakcanary-android/1…
-62dd8e35a2c4432bb22f8250bbfe08639635599b4064d5d747bd24cf3c02fac5 | https://repo1.maven.org/maven2/org/apache/maven/maven-model/2.2.1/maven-mod…
-97b3786e1f55e74bddf8ad102bf50e33bbcbc1f6b7fd7b36f0bbbb25cd4981be | https://repo1.maven.org/maven2/org/ow2/asm/asm-commons/5.1/asm-commons-5.1.…
-2ba9c1cfec6b4a183b72a5ccc6cb2c83479d6ad7e931543c792292c1679a7f43 | https://maven.google.com/com/android/tools/external/org-jetbrains/uast/26.0…
-e51efb2ec140b2849b9880fb161cb6e30dd672368a534c1f47ab46d7f537d9ca | https://repo1.maven.org/maven2/net/sf/proguard/proguard-base/5.3.3/proguard…
-d1e247c4ed3952385fd704ac9db2a222247cfe7d20508b4f3c76b90f857952ed | https://repo1.maven.org/maven2/org/apache/maven/maven-artifact-manager/2.2.…
-d7c632ad8f81044765e2963bde33073c5a098256c07ab48a63d792f9e1ed048c | https://maven.google.com/com/android/support/support-annotations/25.0.1/sup…
-712d7c974d20b71ce730938a3dda8d23e87cfd16500e1c1a2c9ecc2c9ff0d323 | https://maven.google.com/com/android/tools/build/apksig/3.0.1/apksig-3.0.1.…
-2a0e55bb02940d54bc025aca27ec5071535890fc8ef892cf4fb4fe63f216242d | https://repo1.maven.org/maven2/com/squareup/haha/haha/2.0.2/haha-2.0.2.jar
-715268d800bacd07236ee1e6f4407650e61cf979733bc262e4de15fbd13b920d | https://repo1.maven.org/maven2/org/mockito/mockito-core/1.10.19/mockito-cor…
-668eb6aeb3d038267e719deb55f38a4233a12602afb97e89da609c095394400a | https://maven.google.com/com/android/tools/build/apksig/3.0.1/apksig-3.0.1.…
-beff8c3c1e840e0f7f78aadef170f347bae349f098babfc176765f499a4bcbb5 | https://repo1.maven.org/maven2/org/robolectric/sandbox/3.5.1/sandbox-3.5.1.…
-85ec8258fafc283f61647e6a11b404890821c11db6fcf550779ecf7a14151007 | https://repo1.maven.org/maven2/org/ow2/asm/asm-parent/5.1/asm-parent-5.1.pom
-fde386a7905173a1b103de6ab820727584b50d0e32282e2797787c20a64ffa93 | https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core…
-597b54cc1a494799d783921c6ac04352f33e94fca8e00f299d4ca192db79e3fc | https://repo1.maven.org/maven2/org/robolectric/shadows-framework/3.5.1/shad…
-52b6fd2eaf2240e14dbe752f1fa884270cc668d6f350e8e7f65f6033a8172d69 | https://repo1.maven.org/maven2/org/apache/httpcomponents/httpcomponents-cli…
-d49d179f707d3f3a00b2a7d36136b54aa8d44fa22770703cd82fe52fb39e22eb | https://repo1.maven.org/maven2/com/android/tools/build/transform-api/2.0.0-…
-362e9324ee7c697e21279e20077b52737ddef3f1b2c1a7abe5ad34b465145550 | https://repo1.maven.org/maven2/org/apache/httpcomponents/httpclient/4.2.6/h…
-e246e2a062b5d989fdefc521c9c56431ba5554ff8d2344edee9218a34a546a33 | https://repo1.maven.org/maven2/org/codehaus/plexus/plexus/2.0.2/plexus-2.0.…
-cf7718bd0e99b70d4e06b0fca5ef757b1400bb4ec0da910aba6e2582a6c47dea | https://jitpack.io/com/github/delight-im/Android-Languages/v1.0.1/Android-L…
-02c12c3c2ae12dd475219ff691c82a4d9ea21f44bc594a181295bf6d43dcfbb0 | https://repo1.maven.org/maven2/com/google/code/findbugs/jsr305/2.0.1/jsr305…
-401429d864e4c28b0ef7bc9213ac7b48989f8a9a26db200abb8c65f41f5a503e | https://repo1.maven.org/maven2/org/ow2/asm/asm-tree/5.0.1/asm-tree-5.0.1.pom
-d91daa358c2fd7adc1333020433a2c159ae28803b8603cfcaf599fcceab235f0 | https://repo1.maven.org/maven2/com/jrummyapps/android-shell/1.0.1/android-s…
-b84d281f59b9da528139e0752a0e1cab0bd98d52c58442b00e45c9748e1d9eee | https://repo1.maven.org/maven2/org/codehaus/plexus/plexus-interpolation/1.1…
-cf3d36efa6d760c6901a21fb14d9eab6553454742ecc4c5c484e2a347cdac4ea | https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-annotation-proce…
-b677d99c309dc272f60cefa1f1b639ab750d592ded0ea7bfc9f9c5600ebd742d | https://repo1.maven.org/maven2/pl/bclogic/pulsator4droid/1.0.3/pulsator4dro…
-1dea25a2af87ff4757ece0dcb676e0d891dfe1e1e784d6251112e35f21d77b86 | https://maven.google.com/com/android/support/palette-v7/23.4.0/palette-v7-2…
-74fa208043740642f7e6eb09faba15965218ad2f50ce3020efb100136e4b591c | https://repo1.maven.org/maven2/it/unimi/dsi/fastutil/7.2.0/fastutil-7.2.0.j…
-f021eb07aebec822496f489a2d6ec5d3fa81a2717bfc8407cb0ebcaadcee2d7e | https://repo1.maven.org/maven2/org/apache/maven/wagon/wagon-http-lightweigh…
-b5b46ac0c09da41b04dbc753456b48912856a7ffbb1490676910b510c471d13f | https://repo1.maven.org/maven2/xpp3/xpp3_min/1.1.4c/xpp3_min-1.1.4c.pom
-6d079b5abf39f323baaccc68463beef5cf2e9574f333dd749ae96753f00eb205 | https://repo1.maven.org/maven2/org/ow2/asm/asm/5.1/asm-5.1.pom
-f52619bf2f5c5117f0af1c23adff3a9c8f468647be47fefc59b81dcec7e480e6 | https://repo1.maven.org/maven2/org/apache/maven/maven-ant-tasks/2.1.3/maven…
-2643837251ebdff33a7731646abb563a6050dbb1307937a6e401ef25f3c59103 | https://repo1.maven.org/maven2/com/jayway/android/robotium/robotium/5.5.4/r…
-f699823d0081f69cbb676c1845ea222e0ada79bc88a53e5d22d8bd02d328f57e | https://repo1.maven.org/maven2/com/squareup/javawriter/2.1.1/javawriter-2.1…
-3d6eba428555a558de046b5d76eacc1f5a54b4f5f20b84d636ed7aff18aa48c3 | https://repo1.maven.org/maven2/org/apache/httpcomponents/project/7/project-…
-7b0aa6ed7553597ce0610684a9f7eca8021eee218f2e2f427c04a7fbf5f920bd | https://repo1.maven.org/maven2/com/google/android/apps/common/testing/acces…
-59970f2f0cfce6487b7180d7de653d904d8160fb2cd9d8aba6c375d39fec6652 | https://repo1.maven.org/maven2/pl/bclogic/pulsator4droid/1.0.3/pulsator4dro…
-dce95c6e899e42925697aa961b4f01ced3211003cd2101df93ce9d52bb3c3d0a | https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-compiler-runner/…
-a34658f5c5de4b573eef21131cc32cc25f7b66407944f312b28ec2e56abb1fa9 | https://repo1.maven.org/maven2/org/ow2/asm/asm-analysis/5.1/asm-analysis-5.…
-e6531a278b4f632f198a6e45b9e11de1b2b678cd5a4e0fdff442f604c2439a42 | https://repo1.maven.org/maven2/org/jacoco/org.jacoco.report/0.7.4.201502262…
-24465b2ba90dc5ed7e2c05f1c87fe4256c27df6d3cd69b6177f3cb447b05c021 | https://maven.google.com/com/android/support/recyclerview-v7/23.4.0/recycle…
-d47fc646324c22c66f2b0e0e743c850dde9a51990c53925e7501d960f2e8df84 | https://repo1.maven.org/maven2/com/squareup/javawriter/2.1.1/javawriter-2.1…
-321668fc474a73140eb9cc73c779f1ebb9f60948aade3beddee082ecefcf0259 | https://repo1.maven.org/maven2/org/bouncycastle/bcpkix-jdk15on/1.56/bcpkix-…
-7298feeb36ff14dd933c38e62585fb9973fea32fb3c4bc5379428cb1aac5dd3c | https://repo1.maven.org/maven2/org/apache/maven/wagon/wagon-file/1.0-beta-6…
-38db692b5cbaf69d89b1fe5b0fc38a5cc83f898716f8bc64086fa17c25ea57d6 | https://maven.google.com/com/android/tools/analytics-library/shared/26.0.1/…
-0c0e9d1857c250d1d71b5c6be7b8cc29afe55e7419a90d13bbe968ae5bd7240e | https://repo1.maven.org/maven2/org/ow2/asm/asm-util/5.1/asm-util-5.1.pom
-45eb0d6e49430271b5fb385c53fae0b81d6ad3eae465a7a8d948217bcae1e86d | https://repo1.maven.org/maven2/com/android/tools/external/lombok/lombok-ast…
-0251dbb938740ace07a53675113eee753ba389db65aebc814b175af50321620e | https://repo1.maven.org/maven2/org/apache/ant/ant/1.8.0/ant-1.8.0.jar
-943e12b100627804638fa285805a0ab788a680266531e650921ebfe4621a8bfa | https://repo1.maven.org/maven2/javax/inject/javax.inject/1/javax.inject-1.p…
-0156d3f3f54a82eda56285b82aa85caadfdf00d90cde549f7091e0bb0702aad2 | https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.1.51/ko…
-d2da399a9967c69f0a21739256fa79d284222c223082cacadc17372244764b54 | https://repo1.maven.org/maven2/org/ow2/asm/asm/5.1/asm-5.1.jar
-be214032de23c6b520b79c1ccdb160948e0c67ed7c11984b7ec4ca5537867b4e | https://repo1.maven.org/maven2/org/apache/maven/wagon/wagon-http-lightweigh…
-9e9323a26ba8eb2394efef0c96d31b70df570808630dc147cab1e73541cc5194 | https://repo1.maven.org/maven2/org/apache/apache/4/apache-4.pom
-1d2e883717b8ab7d3fcc9fa01034d165809a9c94daa6303a838f11e4d36adc86 | https://repo1.maven.org/maven2/net/sf/proguard/proguard-base/5.3.3/proguard…
-f26bdec2b9496470c0ce63b0d290816e8000ef018daaa259597ebae947fd690f | https://repo1.maven.org/maven2/net/sf/proguard/proguard-gradle/5.3.3/progua…
-31ce606f4e9518936299bb0d27c978fa61e185fd1de7c9874fe959a53e34a685 | https://repo1.maven.org/maven2/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0.pom
-ecd46dc69f5212b35eb21d64db68072f956c000083030ff53e09d1f81487c580 | https://maven.google.com/com/android/tools/external/org-jetbrains/uast/26.0…
-315a79bf0beee4a355ebe36de326b7b9b22a1ecdf22badd7e1bb2af94429bff1 | https://maven.google.com/com/android/support/cardview-v7/23.4.0/cardview-v7…
-ef71d45a49edfe76be0f520312a76bc2aae73ec0743a5ffffe10d30122c6e2b2 | https://repo1.maven.org/maven2/org/codehaus/plexus/plexus-container-default…
-8b5cd510f29b8f96143cd990747797e9408735c914078a47fa3a6290b474d045 | https://maven.google.com/com/android/support/test/rules/0.5/rules-0.5.pom
-6b5ad911a13a5c814c04be4376586eec15838158cb59b9f062ae138ddff1b861 | https://maven.google.com/com/android/tools/layoutlib/layoutlib-api/26.0.1/l…
-f34b3a0b62cdb468eb7e8335de4edc87958dc299306c2b4ba8ea15e6a4be106a | https://repo1.maven.org/maven2/net/sf/proguard/proguard-gradle/5.3.3/progua…
-e4c7afb8f0d7aa159318d42a011cc2c9b0525d820973cbca5318bec6c649cecc | https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java/3.0.0/prot…
-7e8bdca281bdcb6dad48a80854837f1c0ab46f31a0b292370e320f471f5b9cfd | https://maven.google.com/com/android/tools/sdk-common/26.0.1/sdk-common-26.…
-953b116521a73575eee990e3f2c36a892fb088bb2d9a3027c82193cb7a013ef7 | https://repo1.maven.org/maven2/it/unimi/dsi/fastutil/7.2.0/fastutil-7.2.0.p…
-fb8c5e55e30a7addb4ff210858a0e8d2494ed6757bbe19012da99d51586c3cbb | https://repo1.maven.org/maven2/org/apache/commons/commons-parent/22/commons…
-1bd627d7252500462075f4a08cd0db4dbbf1ccecc08b093709551b54c8649085 | https://repo1.maven.org/maven2/org/simpleframework/simple-transport/6.0.1/s…
-1f8c906d0de98ddfa81b1ce520ee52fbd280c222383b66cba89e16eafb626001 | https://maven.google.com/com/android/databinding/baseLibrary/3.0.1/baseLibr…
-4ad0673155d7e0e5cf6d13689802d8d507f38e5ea00a6d2fb92aef206108213d | https://repo1.maven.org/maven2/org/apache/maven/maven-plugin-registry/2.2.1…
-8fdc3336e7b01873193ba9c48b87de7d788dc0954d1eb45c322492627a4b5c6e | https://repo1.maven.org/maven2/org/bouncycastle/bcprov-jdk15on/1.56/bcprov-…
-d19c24122f9f70221e8d97a54f48fbf43feba5b003963057458982e0407aab42 | https://repo1.maven.org/maven2/com/jayway/android/robotium/robotium-solo/5.…
-ec4c74554312fac5116350164786f91b35c9e082fa4ea598bfa42b5db05d7abb | https://repo1.maven.org/maven2/org/jacoco/org.jacoco.core/0.7.4.20150226212…
-e2f7b17610f9f0a2b55c019b7627be3d42ec142fde1db5caf8a34dbe3bb8dbcd | https://maven.google.com/com/android/tools/build/gradle-api/3.0.1/gradle-ap…
-b6eb99f1362b8344ca5400d57a35c49e3504f23f3dee304fdb879d4d953f4bc6 | https://repo1.maven.org/maven2/org/apache/httpcomponents/httpcore/4.2.5/htt…
-52d73f35f7e638ce3cb56546f879c20e7f7019f72aa20cde1fa80e97865dfd40 | https://repo1.maven.org/maven2/javax/annotation/javax.annotation-api/1.2/ja…
-f658a628efd6e0efe416b977638ba144af660fe6413f3637a4d03feb6a1ce806 | https://repo1.maven.org/maven2/org/apache/maven/maven-artifact/2.2.1/maven-…
-d0f2e16d054e8bb97add9ca26525eb2346f692809fcd2a28787da8ceb3c35ee8 | https://repo1.maven.org/maven2/commons-logging/commons-logging/1.1.1/common…
-0c5a9770ae0271dc97bcc6cb0f2e809a40ba587cdce2556f9db59912c8e158fc | https://repo1.maven.org/maven2/org/apache/maven/maven-parent/19/maven-paren…
-ecaffef655fea6b138f0855a12f7dbb59fc0d6bffb5c1bfd31803cccb49ea08c | https://repo1.maven.org/maven2/org/apache/maven/maven-profile/2.2.1/maven-p…
-2bf4e59f3acd106fea6145a9a88fe8956509f8b9c0fdd11eb96fee757269e3f3 | https://repo1.maven.org/maven2/classworlds/classworlds/1.1-alpha-2/classwor…
-7846399b35c7cd642a9b3a000c3e2d62d04eb37a4547b6933cc8b18bcc2f086b | https://repo1.maven.org/maven2/com/googlecode/juniversalchardet/juniversalc…
-fb5369fc7ea4b2e3cf8d6f20243f1d97f81341bf818b179cd8dbd1da7a781a21 | https://repo1.maven.org/maven2/org/ow2/asm/asm-tree/5.1/asm-tree-5.1.pom
-ecbd655fd71d298eaf0787045b84324ce68936ad0de98c7a9c55538e539f2747 | https://repo1.maven.org/maven2/org/apache/ant/ant-parent/1.8.0/ant-parent-1…
-1917871c8deb468307a584680c87a44572f5a8b0b98c6d397fc0f5f86596dbe7 | https://repo.spring.io/plugins-release/org/jetbrains/trove4j/trove4j/201608…
-ace2a10dc8e2d5fd34925ecac03e4988b2c0f851650c94b8cef49ba1bd111478 | https://repo1.maven.org/maven2/org/jetbrains/annotations/13.0/annotations-1…
-905721a0eea90a81534abb7ee6ef4ea2e5e645fa1def0a5cd88402df1b46c9ed | https://repo1.maven.org/maven2/com/google/code/findbugs/jsr305/1.3.9/jsr305…
-a20fb26c8de5b0ff7a3069e681fcf01ebefd2f3d24b832c3af22d981d7d4376b | https://maven.google.com/com/android/tools/repository/26.0.1/repository-26.…
-db3cd95bec1001605e1653f2843e8542e712fa2bb672fd9c8c1ace86c57673d1 | https://repo1.maven.org/maven2/org/apache/httpcomponents/httpmime/4.1/httpm…
-2ca121831e597b4d8f2cb22d17c5c041fc23a7777ceb6bfbdd4dfb34bbe7d997 | https://repo1.maven.org/maven2/org/codehaus/plexus/plexus-utils/1.5.15/plex…
-24633fb1e62a9e4b1a25e2c1751d68be89e050b488652456e545b8019539137d | https://maven.google.com/com/android/tools/build/gradle-api/3.0.1/gradle-ap…
-fee07b2760ef3ed20f2edefa70504a29f9216d277adae56ce85778ee4b18cd04 | https://maven.google.com/com/android/support/support-v4/23.4.0/support-v4-2…
-f095c882716d49269a806685dcb256fa6a36389b2713ac56bb758bf8693565a2 | https://repo1.maven.org/maven2/org/apache/maven/wagon/wagon-http-shared/1.0…
-4a028c17c75cce301e13fdfbc0750ceb48a166dd1013ee516a49684472fcf0e5 | https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-android-extensio…
-1e7f53fa5b8b5c807e986ba335665da03f18d660802d8bf061823089d1bee468 | https://repo1.maven.org/maven2/com/google/code/findbugs/jsr305/2.0.1/jsr305…
-70cc10a9e0b028dd98ca870354afc45eb61eebbd5c6b247b9dd00b4af2b9279a | https://repo1.maven.org/maven2/org/simpleframework/simple-common/6.0.1/simp…
-07f08b315c812406e9d497e1b592689742feb3950c1a713f95e2692d3e15b619 | https://maven.google.com/com/android/tools/ddms/ddmlib/26.0.1/ddmlib-26.0.1…
-2d9484f4c649f708f47f9a479465fc729770ee65617dca3011836602264f6439 | https://repo1.maven.org/maven2/com/googlecode/json-simple/json-simple/1.1/j…
-db50fbb16778e5ff47eaf46a2b63891c546911e7bde06c068ecbe9806b02c672 | https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-gradle-plugin/1.…
-a0700d84efe7cc3103557bd0522f9443681b96ba9559c4bb7f9dc9bf35243485 | https://repo1.maven.org/maven2/com/ibm/icu/icu4j/53.1/icu4j-53.1.pom
-467ae650442e876867379094e7518dfdd67d22c5352ebd39808c84259e9790ba | https://repo1.maven.org/maven2/org/apache/commons/commons-parent/25/commons…
-54b34e941b8e1414bd3e40d736efd3481772dc26db3296f6aa45cec9f6203d86 | https://repo1.maven.org/maven2/commons-codec/commons-codec/1.6/commons-code…
-b3005544708f8583e455c22b09a4940596a057108bccdadb9db4d8e048091fed | https://repo1.maven.org/maven2/org/apache/maven/maven-error-diagnostics/2.2…
-aeb197158a2fb6bd2cb9233e22874f8051f82891dbd82b6b089f49e309f82e40 | https://maven.google.com/com/android/tools/lint/lint/26.0.1/lint-26.0.1.jar
-2c1542faf343185b7cab9c3d55c8ae5471d6d095d3887a4adefdbdf2984dc0b6 | https://repo1.maven.org/maven2/org/apache/commons/commons-compress/1.12/com…
-0ee5f691cbbedb69969b48374d27412f821959af5d2dffbabc424b607cdbbdf6 | https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.1.3-2/…
-419487d0c123d11cc6e1a12da517d02958ee1de209f1e1855bb14f5dd3759bb0 | https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-android-extensio…
-6f52ba933a117bd67131b281214510ea30232b9807bfe569bc0c17e6a2d4018c | https://maven.google.com/com/android/tools/repository/26.0.1/repository-26.…
-1933a6037439b389bda2feaccfc0113880fd8d88f7d240d2052b91108dd5ae89 | https://repo1.maven.org/maven2/org/apache/apache/5/apache-5.pom
-30f5789efa39ddbf96095aada3fc1260c4561faf2f714686717cb2dc5049475a | https://repo1.maven.org/maven2/net/java/jvnet-parent/3/jvnet-parent-3.pom
-24ddb65b7a6c3befb6267ce5f739f237c84eba99389265c30df67c3dd8396a40 | https://repo1.maven.org/maven2/org/apache/maven/maven-project/2.2.1/maven-p…
-50eb253acd0b6ee048f432d9fc3a3b36264efb3da1ffa7fb07f6c4d4b7a8ca31 | https://repo1.maven.org/maven2/org/codehaus/codehaus-parent/3/codehaus-pare…
-d7e368746fa68ca6ba63519fb0838be9a278d509a5fcee6cd4a778a119eae447 | https://maven.google.com/com/android/support/appcompat-v7/23.4.0/appcompat-…
-dec38b5e95eba8dbb0aefb0ea72fb777def93e75f60c247a143b0b81a5de3916 | https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-gradle-plugin-ap…
-1ceb4bfb0f098ae29b935044b2363e11323313fe3ed2055df8b79737d5056277 | https://repo1.maven.org/maven2/org/hamcrest/hamcrest-library/1.3/hamcrest-l…
-950c765f9ebfb7de187cf70ec5b61218568b993bc760cb341bdf142ac94e751b | https://repo1.maven.org/maven2/com/squareup/leakcanary/leakcanary-android/1…
-e8b4151ae1679f1abe7a14ee371ac9b3c651ae7b63290d1f586bdd0f78face9a | https://repo1.maven.org/maven2/com/android/tools/build/transform-api/2.0.0-…
-d53062ffe8677a4f5e1ad3a1d1fa37ed600fab39166d39be7ed204635c5f839b | https://repo1.maven.org/maven2/org/apache/maven/maven-artifact/2.2.1/maven-…
-7e4a34c7b63d879c5cec454e2e47eb1e61e271a58672e7e548659f4f23742500 | https://repo1.maven.org/maven2/org/bouncycastle/bcprov-jdk15on/1.52/bcprov-…
-da9fd92eacdf63daf0be52eb71accc10ff7943a85d7aac9ea96cf7e03ee3d3cc | https://repo1.maven.org/maven2/org/apache/ant/ant-launcher/1.8.0/ant-launch…
-43edcc0fc3bd8520bf60066f54088f272e39aa856d25cdd6ca9ee4d8f5c32666 | https://maven.google.com/com/android/support/support-vector-drawable/23.4.0…
-2242fd02d12b1ca73267fb3d89863025517200e7a4ee426cba4667d0172c74c3 | https://repo1.maven.org/maven2/org/codehaus/plexus/plexus/1.0.4/plexus-1.0.…
-e2b4935e76d91b5abec44de309f2c8bb8d1d2e6cc0b8790b43cb654f1e22c722 | https://maven.google.com/com/android/tools/layoutlib/layoutlib-api/26.0.1/l…
-b7134929f7cc7c04021ec1cc27ef63ab907e410cf0588e397b8851181eb91092 | https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.2/gson-2.8.2.j…
-a32de739cfdf515774e696f91aa9697d2e7731e5cb5045ca8a4b657f8b1b4fb4 | https://repo1.maven.org/maven2/org/antlr/antlr4/4.5.3/antlr4-4.5.3.jar
-6d535f94efb663bdb682c9f27a50335394688009642ba7a9677504bc1be4129b | https://repo1.maven.org/maven2/org/hamcrest/hamcrest-parent/1.3/hamcrest-pa…
-5c415a9d8585200de4be1947e15291cc79f599b06249375f5c9ea22d4b2d090f | https://repo.spring.io/plugins-release/org/jetbrains/trove4j/trove4j/201608…
-5dc327c690d031a11aa8f9f4cdc391fb938fbb7c7c143cc4bc60dd573d1fd1c9 | https://maven.google.com/com/android/tools/build/builder/3.0.1/builder-3.0.…
-f7524cfffc9773ea75a9f7379139f00a57355e411009ea9529b7adf7ef93fde8 | https://repo1.maven.org/maven2/org/apache/maven/wagon/wagon-file/1.0-beta-6…
-358700f7a5b932bce30ebb0010641a9cade4b8499a60845717b2e22a39697f92 | https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.1.60/ko…
-4054f186137e3b849a7c23c9e846cd57d8a2fe32c17d4c62bd420512d74c3d3f | https://repo1.maven.org/maven2/org/objenesis/objenesis/2.1/objenesis-2.1.pom
-ff2aceed10da9930a44f6c8f81c6372d5e55eb59c4e0ea9d37f77dfd765fa9fa | https://repo1.maven.org/maven2/org/ow2/asm/asm-tree/5.0.1/asm-tree-5.0.1.jar
-bd94ab42c841db16fb480f4c65d33d297e544655ecc498b37c5cf33a0c5f1968 | https://maven.google.com/com/android/support/support-annotations/25.0.1/sup…
-df5f5e4b6d2ddcde49ed5a4e7e3bf2cb7f87e0d9892e5b066f995c4d703b228f | https://maven.google.com/com/android/tools/analytics-library/protos/26.0.1/…
-228367b7569fb1462a3eb1423bc2778e2fc7fbaee3d3767890c02b8924fa1889 | https://repo1.maven.org/maven2/org/apache/maven/maven-error-diagnostics/2.2…
-340422be8f3e3c847a0a0bf944296774f6db81f2fa8b34912bc931a112a26919 | https://repo1.maven.org/maven2/org/apache/maven/wagon/wagon-providers/1.0-b…
-a9660f8b64b74f474226c70a50187d8efcac448d32ce97756f408975aa52cdaa | https://maven.google.com/com/android/tools/sdk-common/26.0.1/sdk-common-26.…
-c5f51e723e84eee14c339170730b4e590342732e1560747ae559585a6ae09a0d | https://repo1.maven.org/maven2/org/robolectric/robolectric/3.5.1/robolectri…
-8c38b967ee2d7ae4c0bb021717f58717c9a627a82f4af9963263367de078164e | https://maven.google.com/com/android/support/palette-v7/23.4.0/palette-v7-2…
-ff9988062651ac02bfcafd3aa4302f9366fac66d4ad639b36530193afdbdd67b | https://repo1.maven.org/maven2/org/robolectric/utils/3.5.1/utils-3.5.1.pom
-616da56b2e90bf055b90436800259a8f82715f8e03307c512483328380a51248 | https://repo1.maven.org/maven2/org/simpleframework/simple-transport/6.0.1/s…
-b2b5dd46cf998fa626eb6f8a1c114f6167c8d392694164e62533e5898e9b31f2 | https://repo1.maven.org/maven2/commons-io/commons-io/2.4/commons-io-2.4.pom
-d3d96637b0e8e61046567b8c87b667dcf3cd31c7447f651cb58d6e6e744adfba | https://maven.google.com/com/android/support/appcompat-v7/23.4.0/appcompat-…
-770471090ca40a17b9e436ee2ec00819be42042da6f4085ece1d37916dc08ff9 | https://repo1.maven.org/maven2/backport-util-concurrent/backport-util-concu…
-42f0be9bf98c12dacdcb99dd141d83d4dc5bb7c37a6f26684cd3ff2287667fba | https://repo1.maven.org/maven2/org/hamcrest/hamcrest-integration/1.3/hamcre…
-711d64522f9ec410983bd310934296da134be4254a125080a0416ec178dfad1c | https://repo1.maven.org/maven2/org/hamcrest/hamcrest-library/1.3/hamcrest-l…
-cf251279505960889b6b281c26af0438656ebac3845e52791925cf7649cb15a6 | https://maven.google.com/com/android/tools/sdklib/26.0.1/sdklib-26.0.1.jar
-7b5da383a465a071e90eac4a5e615992a499d9776938305d7581d8abbf3b13e5 | https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-compiler-runner/…
-2a0475c2625fc27f80d3c5021130509b4068e0f984f2511e7a77a097de48b41d | https://maven.google.com/com/android/tools/sdklib/26.0.1/sdklib-26.0.1.pom
-6895e368fa59168428c78cdf300bb29352073f397d8f260af3de82df2c8b2448 | https://maven.google.com/com/android/tools/analytics-library/tracker/26.0.1…
-22a5564590c8bfd8df7efb2b0c7d9942b46a0beb59ba38899d59c1270f293b1c | https://repo1.maven.org/maven2/org/robolectric/resources/3.5.1/resources-3.…
-c71555751e57e0ef912870e8ac9625ae782502a6a5b9c19ccf83b2a97d8b26bd | https://repo1.maven.org/maven2/com/google/jimfs/jimfs-parent/1.1/jimfs-pare…
-f8ab13b14be080fe2f617f90e55599760e4a1b4deeea5c595df63d0d6375ed6d | https://repo1.maven.org/maven2/com/intellij/annotations/12.0/annotations-12…
-bfadb3b40f65dd6de1666d6b29f8bb54031396c76eeef4146cf9f28255f8bf33 | https://repo1.maven.org/maven2/com/google/guava/guava/22.0/guava-22.0.pom
-8ba35dd4ea1647b89a8ae082bb6c81d5695a1ec31e73aa57bfa3512069c4bee2 | https://repo1.maven.org/maven2/com/thoughtworks/xstream/xstream/1.4.8/xstre…
-91b9f17a54e6c340c8d3ea4b359401170706eb26a82d51909abe6ba80081aed8 | https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.2/gson-2.8.2.p…
-59721f0805e223d84b90677887d9ff567dc534d7c502ca903c0c2b17f05c116a | https://repo1.maven.org/maven2/junit/junit/4.12/junit-4.12.jar
-052b0d2b58e5df4f30e4f64bdf5414473f6cfa10147f8f8d89cb0b63316ba8f3 | https://maven.google.com/com/android/tools/build/manifest-merger/26.0.1/man…
-258f12f1facc44d0b25b9fa2bde33a58f3de9eea412588ff47922c9cac910a5a | https://maven.google.com/com/android/support/cardview-v7/23.4.0/cardview-v7…
-90f163f78e3ffb6f1c7ad97de9e7eba4eea25807141b85d6d12be67ca25449c4 | https://repo1.maven.org/maven2/junit/junit/4.12/junit-4.12.pom
-d135cff96dcbbc8a5fab30180e557cae620373cf26941d4c738a88896a2d98ed | https://repo1.maven.org/maven2/org/apache/maven/maven/2.2.1/maven-2.2.1.pom
-47a89be0fa0fedd476db5fd2c83487654d2a119c391f83a142be876667cf7dab | https://repo1.maven.org/maven2/com/googlecode/json-simple/json-simple/1.1/j…
-0cc647963b74ad1d7a37c9868e9e5a8f474e49297e1863582253a08a4c719cb1 | https://repo1.maven.org/maven2/classworlds/classworlds/1.1-alpha-2/classwor…
-8bd632c00bdf80a7de36c22b60f12452c147d8eca2f00d79d66699ebe7daa02a | https://repo1.maven.org/maven2/org/apache/commons/commons-parent/5/commons-…
-f5655d331af6afcd4dbaedaa739b889380c771a7e83f7aea5c8544a05074cf0b | https://repo1.maven.org/maven2/nekohtml/nekohtml/1.9.6.2/nekohtml-1.9.6.2.p…
-30b09c7504768820bfd8572ffcf8c2c55a668ecff6ca3e125906d00bf393a082 | https://maven.google.com/com/android/support/test/espresso/espresso-idling-…
-7bc4c7f999b9c673c714f7f8adb6281b11b8f14d5821a2b860c3d60c24518c66 | https://repo1.maven.org/maven2/com/squareup/leakcanary/leakcanary-watcher/1…
-e30f1db6058f745f26112ef309f89becb27c617c7d9e4c6e02165a7620a92e6a | https://maven.google.com/com/android/tools/common/26.0.1/common-26.0.1.pom
-6422a1f272022e3153ed68af04e5a03548fe48061ed2846c044df84e02abb143 | https://repo1.maven.org/maven2/org/robolectric/junit/3.5.1/junit-3.5.1.pom
-9cddda75f4a1b4469e73f44e7b61a3e897d0f657df4797f9106ffe88c4eeade0 | https://repo1.maven.org/maven2/org/eclipse/jdt/core/compiler/ecj/4.6.1/ecj-…
-5fe8a11e913086fb7ab505b930987f30cfa3f4b226d4bbbc68003ca4387ae40e | https://maven.google.com/com/android/tools/lint/lint-api/26.0.1/lint-api-26…
-55aa554843983f431df5616112cf688d38aa17c132357afd1c109435bfdac4e6 | https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java/2.6.1/prot…
-08426143d37d770f3e4dae45b0870c3ab1ba512cb64418f34496025b72d16760 | https://repo1.maven.org/maven2/org/apache/ant/ant-launcher/1.8.0/ant-launch…
-70f418efbb506c5155da5f9a5a33262ea08a9e4d7fea186aa9015c41a7224ac2 | https://repo1.maven.org/maven2/org/hamcrest/hamcrest-integration/1.3/hamcre…
-7043dee4e9e7175e93e0b36f45b1ec1ecb893c5f755667e8b916eb8dd201c6ca | https://repo1.maven.org/maven2/org/bouncycastle/bcpkix-jdk15on/1.56/bcpkix-…
-d7d77326867e6d903156ebb18c244819b26aebe3aa82a1c57081081a0b6c4f63 | https://repo1.maven.org/maven2/org/robolectric/utils/3.5.1/utils-3.5.1.jar
-567ae5af5665bb445802ca650a4dc848737c9ee564f69f2ead5df1189d394304 | https://maven.google.com/com/android/support/recyclerview-v7/23.4.0/recycle…
-66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9 | https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core…
-ddb0fc5402b4cd8f31d5f29c830793d3ec00fd8ce60786254e5f0f132f0bdd8d | https://maven.google.com/com/android/tools/lint/lint-api/26.0.1/lint-api-26…
-81f73f8b25b430f5a40a39727bbcef653a1d0868cc69233b44e4282ce5a94ff9 | https://maven.google.com/com/android/tools/ddms/ddmlib/26.0.1/ddmlib-26.0.1…
-326ba49aa7a35e07b6cc592ad7a5b0f86f4667051a8e70e7639c54bc0c356dee | https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.1.60/ko…
-a219a1abf948400b669d08be73a6f9209fb720d237e5ff74c223bffe5f9df93d | https://repo1.maven.org/maven2/com/thoughtworks/xstream/xstream/1.4.8/xstre…
-8f10ffd8df0d3e9819c8cc8402709c6b248bc53a954ef6e45470d9ae3a5735fb | https://repo1.maven.org/maven2/xmlpull/xmlpull/1.1.3.1/xmlpull-1.1.3.1.pom
-e37a4467bac5cdeb02c5c4b8e5063d2f4e67b69e3c7df6d6b610f13185572bab | https://repo1.maven.org/maven2/com/ibm/icu/icu4j/53.1/icu4j-53.1.jar
-f4778bb3abf2df40bfa365d00ff301b5eec76f2933b85f6aa3918e2ab6f08b91 | https://maven.google.com/com/android/support/design/23.4.0/design-23.4.0.pom
-f51550a06b1410bd4962cb0e71df0b921a60a7ef47bfa9c4825a14be72316eea | https://repo1.maven.org/maven2/org/codehaus/mojo/animal-sniffer-parent/1.14…
-781ae7e6a1ae87e55b3e0a19a441bafd385f4ed9b5b4bd6316ec9bc6952d0273 | https://maven.google.com/com/android/support/test/exposed-instrumentation-a…
-e336a35a1e102c2f11ce1ea7f0872df14e332374b8eacc0877e50f85f84c3d09 | https://maven.google.com/com/android/support/animated-vector-drawable/23.4.…
-3ec9d39b3e35fad9aab1e6b137466ce2190f88aee897cffa383e94a65287105e | https://repo1.maven.org/maven2/com/jayway/android/robotium/robotium-solo/5.…
-727a7252ca385f648c3ddf4f104e3908cba723fa577fdd93b0cf851eb16c44f1 | https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.1.51/ko…
-fb1cb7fa27d892712ced8fbf8d027eb5052ecd3999dba1ba47824357accb40e7 | https://repo1.maven.org/maven2/org/ow2/asm/asm-commons/5.0.1/asm-commons-5.…
-ee032c39ae5e3cd099148fbba9a2124f9ed613e5cb93e03ee0fa8808ce364040 | https://repo1.maven.org/maven2/org/ow2/asm/asm-util/5.1/asm-util-5.1.jar
-5fe283f47b0e7f7d95a4252af3fa7a0db4d8f080cd9df308608c0472b8f168a1 | https://repo1.maven.org/maven2/org/apache/maven/maven-repository-metadata/2…
-f056ed61a281b3e230a63e4abf510c0d2f9bf7ff513cacb65a29538ba90ab177 | https://repo1.maven.org/maven2/org/jacoco/org.jacoco.build/0.7.4.2015022621…
-803be394edb8dd7d1e678683ed85aee7f86a172c90f03e6198c8a49d4f342b99 | https://maven.google.com/com/android/tools/build/builder/3.0.1/builder-3.0.…
-2d4cdc52be79184386d74333d1c4466b7960f83505bfd5e596e76c5ab6ee3bbf | https://repo1.maven.org/maven2/com/almworks/sqlite4java/sqlite4java/0.282/s…
-c4828e28d7c0a930af9387510b3bada7daa5c04d7c25a75c7b8b081f1c257ddd | https://repo1.maven.org/maven2/com/google/jimfs/jimfs/1.1/jimfs-1.1.jar
-63b465cc628f8c305702b12b26501cea236a3175db15b5a7356e98484aa63db5 | https://maven.google.com/com/android/tools/build/builder-model/3.0.1/builde…
-332883794330d554c24cf311bf60481ad55bf773d5a4b71434d7f6c119ba9dbe | https://repo1.maven.org/maven2/com/squareup/leakcanary/leakcanary-analyzer/…
-36a666e3b71ae7f0f0dca23654b67e086e6c93d192f60ba5dfd5519db6c288c8 | https://repo1.maven.org/maven2/com/google/guava/guava/20.0/guava-20.0.jar
-9e1d8dd83ca6003f841e3af878ce2dc7c22497493a7bb6d1b62ec1b0d0a83c05 | https://repo1.maven.org/maven2/com/almworks/sqlite4java/sqlite4java/0.282/s…
-51215c67d2c068d8b7d2f6f80f51372a098075deccc448d4bdd7b987ba8328fb | https://repo1.maven.org/maven2/org/ow2/ow2/1.3/ow2-1.3.pom
-0288414509c625b8dd544384fbd29f502bdc8b4f86cfc26625aa23eef9fa6057 | https://repo1.maven.org/maven2/net/sf/proguard/proguard-parent/5.3.3/progua…
-a9d65daccc5afca97372936246ac49fb587423e005606e7981b0efc66b0e9385 | https://maven.google.com/com/android/tools/annotations/26.0.1/annotations-2…
-f1226fd07fc72af8d6232bdfa70bf31d883a1a01cbc547f23a74e9066c692df1 | https://repo1.maven.org/maven2/com/google/guava/guava-parent/20.0/guava-par…
-21bb4d44dff54e33a37c11af69859a714202ae00969aab5453eba7276688f8ec | https://repo1.maven.org/maven2/org/apache/httpcomponents/project/4.1.1/proj…
-c9a55463942128f0b7fad62b8bee5886d1cb1c733fb3b78507465b025e6a4031 | https://maven.google.com/com/android/databinding/compilerCommon/3.0.1/compi…
-7c75075badcb014443ee94c8c4cad2f4a9905be3ce9430fe7b220afc7fa3a80f | https://repo1.maven.org/maven2/org/codehaus/plexus/plexus-containers/1.0.3/…
-7af7e2d8b24b4798f04c2b7da24c9fbd1b7557b4e017c2054481565916079092 | https://repo1.maven.org/maven2/net/sf/jopt-simple/jopt-simple/4.9/jopt-simp…
-10107898991129eff2042a41b1bfc2d72c4ea8e4babe429ae3aeb32c69c568de | https://maven.google.com/com/android/tools/analytics-library/tracker/26.0.1…
-9144127192d6f612c2366825dceaeb23b0d53130b83e0bf1ffe107d1470a8487 | https://repo1.maven.org/maven2/com/google/errorprone/error_prone_annotation…
-4946e60a547c8eda69f3bc23c5b6f0dadcf8469ea49b1d1da7de34aecfcf18dd | https://repo1.maven.org/maven2/org/apache/apache/9/apache-9.pom
-a06e35d3fff3a6b813d94894ebf3e498f9540c864c5b39ae783907e3a6c72889 | https://repo1.maven.org/maven2/commons-codec/commons-codec/1.6/commons-code…
-c9268e671899430946b54c4d1b93c30f0db1b7df0b39b3c6279d6bd475a6fbdc | https://repo1.maven.org/maven2/com/thoughtworks/xstream/xstream-parent/1.4.…
-025caec7c56a0cb4d86c45bc18ac3e23dba291e22ebceb76302a9a9b9b7183cc | https://repo1.maven.org/maven2/org/apache/maven/wagon/wagon/1.0-beta-6/wago…
-4a16a423391387d46724749ad29263e64894dadf6783aa38e4b9c888c88d25fe | https://repo1.maven.org/maven2/org/robolectric/shadowapi/3.5.1/shadowapi-3.…
-feab9191311c3d7aeef2b66d6064afc80d3d1d52d980fb07ae43c78c987ba93a | https://repo1.maven.org/maven2/com/google/code/findbugs/jsr305/1.3.9/jsr305…
-87cd27e1a02a5c3eb6d85059ce98696bb1b44c2b8b650f0567c86df60fa61da7 | https://repo1.maven.org/maven2/org/apache/commons/commons-parent/39/commons…
-1ef71c25a9d46ae0ce023d02a5734e0b06fdf934fbc5948e20482526b22b4179 | https://maven.google.com/com/android/tools/build/gradle/3.0.1/gradle-3.0.1.…
-c513995cf019d9213d4fda666589937b2bf1bea5c4cdd337e6170e80b18406ee | https://repo1.maven.org/maven2/org/sonatype/oss/oss-parent/4/oss-parent-4.p…
-9884c02d47244364e1fb27675b5ef3b206a2d2d3141ac77f57fd771a175c2a2f | https://repo1.maven.org/maven2/org/ow2/asm/asm-parent/5.0.1/asm-parent-5.0.…
-9dad0f56523955b60a9903f4e8342891355d7a59c77f36a3b53cf6ff2e4df625 | https://repo1.maven.org/maven2/org/apache/maven/maven-repository-metadata/2…
-23e6d006f7d07bb43ebc80b2e530c8cdd65bbabcaaf911c3f12e2ea26167178c | https://maven.google.com/com/android/tools/build/gradle-core/3.0.1/gradle-c…
-6d574f9ae0922791eb8f06979f0010997d4b862c7aec96d485ae797ddfc13278 | https://repo1.maven.org/maven2/org/robolectric/shadowapi/3.5.1/shadowapi-3.…
-1a5c870be804f9041c1392606c19ef5a8ae503e79705962c2f8452c51cb0d27c | https://repo1.maven.org/maven2/com/squareup/leakcanary/leakcanary-analyzer/…
-0dc4d181e4d347893c2ddbd2e6cd5d7287fc651c03648fa64b2341c7366b1773 | https://repo1.maven.org/maven2/org/bouncycastle/bcprov-jdk15on/1.52/bcprov-…
-fd9507feb858fa620d1b4aa4b7039fdea1a77e09d3fd28cfbddfff468d9d8c28 | https://repo1.maven.org/maven2/org/codehaus/plexus/plexus-interpolation/1.1…
-645e30c1a93c6b50c918c14cea11e1f41015153fe6329149ad17d930e820be4a | https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-gradle-plugin/1.…
-a1e7d6b3efc1703c7c8f1b15ecf8757f17d0ac41f32c9a48481a5caf638c55db | https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java/3.0.0/prot…
-e899e02ec8ac6a73fb9c9c7cb9ebd9bfc4ce8263412285d5ec6f2df920880905 | https://maven.google.com/com/android/tools/build/builder-model/3.0.1/builde…
-6ee434905eeb60a7c4d52b1f45288d5e53b68094f1cce6990bced2097c3dbec4 | https://maven.google.com/com/android/support/test/espresso/espresso-core/2.…
-7a3554c605e088e7e323b1084656243f0444fa353e2f2dee1f1a4204eb64ff09 | https://repo1.maven.org/maven2/org/jacoco/org.jacoco.report/0.7.4.201502262…
-c74330cc6b806c804fd37e74487b4fe5d7c2750c5e15fbc6efa13bdee1bdef80 | https://repo1.maven.org/maven2/org/objenesis/objenesis/2.1/objenesis-2.1.jar
-26c5856e954b5f864db76f13b86919b59c6eecf9fd930b96baa8884626baf2f5 | https://repo1.maven.org/maven2/net/sf/jopt-simple/jopt-simple/4.9/jopt-simp…
-fc3958e775903d5816d017dd486357963b141ddeded2fc97ee7bd0a4f8a6ebb6 | https://jitpack.io/com/github/delight-im/Android-Languages/v1.0.1/Android-L…
-5909b396ca3a2be10d0eea32c74ef78d816e1b4ead21de1d78de1f890d033e04 | https://repo1.maven.org/maven2/javax/annotation/javax.annotation-api/1.2/ja…
-6b8361d8f44649e739343b77c644f1fef1f19d771734ed83785b0dc297198bd1 | https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-annotation-proce…
-7b0cdb372fbde4e801f76bdb416927162ebd32c0c4e53fa39828437d3112c9d5 | https://repo1.maven.org/maven2/com/squareup/leakcanary/leakcanary-android-n…
-58a4152e2ea975e955393d49ed23f3c88fa8368d75d2290fb2c28373a6c5a977 | https://maven.google.com/com/android/support/test/runner/0.5/runner-0.5.aar
-89fc0cd20db030033ba04bb00c2837efe1e530b00f86935d6a645717d15bb978 | https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java/2.6.1/prot…
-12a3c9a32b82fdc95223cab1f9d344e14ef3e396da14c4d0013451646f3280e7 | https://repo1.maven.org/maven2/org/codehaus/plexus/plexus-utils/1.5.15/plex…
-a47c950c755747ca3093a05e9ec85d0e2f33cbd224909f571fe7577963a4d799 | https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.1.3-2/…
-4f88a89142c64bf03906f84609594666e9694df56e3e6f05edfab8a68b39d837 | https://maven.google.com/com/android/tools/annotations/26.0.1/annotations-2…
-f16b5ea711dfe0323454b880180aa832420ec039936e4aa75fb978748634808a | https://repo1.maven.org/maven2/org/apache/maven/maven-ant-tasks/2.1.3/maven…
-e263064a6ebeba4209d1abb089f9fff5194d79bb011b525d276b3994025123e0 | https://maven.google.com/com/android/support/test/rules/0.5/rules-0.5.aar
-f5759b7fcdfc83a525a036deedcbd32e5b536b625ebc282426f16ca137eb5902 | https://repo1.maven.org/maven2/backport-util-concurrent/backport-util-concu…
-2f781378c1be7caa98fa1c5a109f296a6bcdcbe1f9a67a3d16e07f5eb786c96c | https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-project/1.1.51/k…
-ecf58351f8fe0c398b8b452216705bece5291b9b327d30202c16b28ac680450c | https://repo1.maven.org/maven2/org/apache/maven/maven-artifact-manager/2.2.…
-e91a88dd0c5e99069b7f09d4a46b5e06f1e9c4c72fc0a8e987e25d86af480f01 | https://maven.google.com/com/android/support/support-annotations/23.4.0/sup…
-b46b548f116a5dd5b018e6f1f4760fe04f93aecdbea094c2f0890e8bf690ada3 | https://repo1.maven.org/maven2/org/robolectric/shadows-framework/3.5.1/shad…
-b787d574c851505e76212968b9ae1641ea79804aef7f5a2cee2a01cd4055213a | https://repo1.maven.org/maven2/org/apache/commons/commons-compress/1.12/com…
-1158e94c7de4da480873f0b4ab4a1da14c0d23d4b1902cc94a58a6f0f9ab579e | https://repo1.maven.org/maven2/com/google/guava/guava/22.0/guava-22.0.jar
-aff003f3a0afcfad1bc8b4cce81813ababc48680345f16a1a70adcd1adcb8ce2 | https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-compiler-embedda…
-1879f19a05991e3ed95910b96689333396b0c467a215dc4d1f90018404b72a26 | https://repo1.maven.org/maven2/org/codehaus/mojo/animal-sniffer-annotations…
-e7a7a5810829dee924cec654a569a48301fcedd487f7b88710e816d127385f51 | https://maven.google.com/com/android/tools/analytics-library/shared/26.0.1/…
-a160969150a1671661098deef05da96e1a4f40b93dab045e222485aa976e75a6 | https://maven.google.com/com/android/support/customtabs/23.4.0/customtabs-2…
-b9c445604a16b15c4269485d569252a53e3094efc8a0c252e09dee1f2f204568 | https://repo1.maven.org/maven2/org/robolectric/annotations/3.5.1/annotation…
-631b213b1b10c00c900aad759c88ed0c83084bae76336ad00dcfe1f24c48be65 | https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-compiler-embedda…
-fb40265f982548212ff82e362e59732b2187ec6f0d80182885c14ef1f982827a | https://repo1.maven.org/maven2/org/sonatype/oss/oss-parent/9/oss-parent-9.p…
-b2e81b7d5a22755f2ea76aa9bbbd4359d61c4cb9577193ccfbb8f97378ed293b | https://repo1.maven.org/maven2/org/robolectric/junit/3.5.1/junit-3.5.1.jar
-f5a0a1eeaa100ed36aa83eca562d5dbb7e9b045c98b44db7da4745e9d9a20328 | https://repo1.maven.org/maven2/org/apache/httpcomponents/httpclient/4.2.6/h…
-ce9e83354fb5c24ed0e2b26a986130ed5d3dedeba288eb1fce563f78f7bb881f | https://maven.google.com/com/android/support/test/espresso/espresso-core/2.…
-c219d697fa9c8f243d8f6e347499b6d4e8af1d0cac4bbc7b3907d338a2024c13 | https://repo1.maven.org/maven2/nekohtml/xercesMinimal/1.9.6.2/xercesMinimal…
-603cf898f93b854f18021fab452aca3fe482368eeb2e720988ae82212ebcf4b6 | https://repo1.maven.org/maven2/org/robolectric/robolectric/3.5.1/robolectri…
-ce6f913cad1f0db3aad70186d65c5bc7ffcc9a99e3fe8e0b137312819f7c362f | https://repo1.maven.org/maven2/commons-logging/commons-logging/1.1.1/common…
-e767a1248adb4843110457e839e504c2511649ee78f05a6a311ea7f23578894d | https://maven.google.com/com/android/tools/build/builder-test-api/3.0.1/bui…
-cf5c43860b53ba5a95c19bc6525cc43d3488a6fe3df2f649c0099a613a0640e3 | https://repo1.maven.org/maven2/com/google/code/gson/gson-parent/2.8.2/gson-…
-9619e68f7eb36da3a28a60315f34320972badbad43749cc66712bb95b96a4ef3 | https://maven.google.com/com/android/support/support-annotations/23.4.0/sup…
-bcb7ce66a9c629fa7c723a767b6430e1a383e8d4dd543d603dcb0ad1b855b8b2 | https://maven.google.com/com/android/support/animated-vector-drawable/23.4.…
-3369726ca2b0e3736c741ff3c22e06f707a1007ff20ccc5b5ba5d0d9a01ead30 | http://repo.spring.io/plugins-release/net/freehaven/tor/control/jtorctl/0.2…
-18c4a0095d5c1da6b817592e767bb23d29dd2f560ad74df75ff3961dbde25b79 | https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.…
-fbd7b254e02d8aef60c418a5f0e14a783b38a16162caffb2d2a16ccd5d2c09b4 | https://repo1.maven.org/maven2/org/slf4j/slf4j-android/1.7.25/slf4j-android…
-ec3a75bebddbf19ff56a281cf5d1ad146169dcaa0e69d7b14f4aaba2e7775f34 | https://repo.spring.io/plugins-release//net/freehaven/tor/control/jtorctl/0…
-bd9b9cb1a3987b1427f7a18babe7f92078e32bbe2e1dca6dced00cc0e3a077a9 | https://repo1.maven.org/maven2/org/slf4j/slf4j-android/1.7.25/slf4j-android…
-7cd9d7a0b5d93dfd461a148891b43509cf403a9c7f9fb49060d3554df1c81e1e | https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.…
-18f5c52120db036e88d6136f8839c832d074bdda95c756c6f429249d2db54ac6 | https://repo1.maven.org/maven2/org/slf4j/slf4j-parent/1.7.25/slf4j-parent-1…
-
+f5759b7fcdfc83a525a036deedcbd32e5b536b625ebc282426f16ca137eb5902 | https://jcenter.bintray.com/backport-util-concurrent/backport-util-concurre…
+770471090ca40a17b9e436ee2ec00819be42042da6f4085ece1d37916dc08ff9 | https://jcenter.bintray.com/backport-util-concurrent/backport-util-concurre…
+2bf4e59f3acd106fea6145a9a88fe8956509f8b9c0fdd11eb96fee757269e3f3 | https://jcenter.bintray.com/classworlds/classworlds/1.1-alpha-2/classworlds…
+0cc647963b74ad1d7a37c9868e9e5a8f474e49297e1863582253a08a4c719cb1 | https://jcenter.bintray.com/classworlds/classworlds/1.1-alpha-2/classworlds…
+9e1d8dd83ca6003f841e3af878ce2dc7c22497493a7bb6d1b62ec1b0d0a83c05 | https://jcenter.bintray.com/com/almworks/sqlite4java/sqlite4java/0.282/sqli…
+2d4cdc52be79184386d74333d1c4466b7960f83505bfd5e596e76c5ab6ee3bbf | https://jcenter.bintray.com/com/almworks/sqlite4java/sqlite4java/0.282/sqli…
+857db5645aaefbd7fbe9ba6454b072bc0518ebaba08a93d5eae89a9850e949c4 | https://jcenter.bintray.com/com/getkeepsafe/dexcount/dexcount-gradle-plugin…
+15d4b252c5aa3aeb8d634ae5aaf348ac6ce183b6b5e3615364e6c083715c1133 | https://jcenter.bintray.com/com/getkeepsafe/dexcount/dexcount-gradle-plugin…
+7b0aa6ed7553597ce0610684a9f7eca8021eee218f2e2f427c04a7fbf5f920bd | https://jcenter.bintray.com/com/google/android/apps/common/testing/accessib…
+d46777ad3ea8bca73491b2e02fc85b3664486abf5314cc4dc6740908bd855330 | https://jcenter.bintray.com/com/google/android/apps/common/testing/accessib…
+c98f1b0978cfd24712c27388e040c50ce0692252b3aa9448603d9efa05ebe8a8 | https://jcenter.bintray.com/com/google/auto/auto-parent/3/auto-parent-3.pom
+6cac9421439b39b9f4aa76738ced039462a69911c410f2c372c196b0f4b7f4cf | https://jcenter.bintray.com/com/google/auto/value/auto-value/1.5.2/auto-val…
+901fb1440a0ef8e0c0553a7bb44c0b89647bf53c8822642eea0b57173c7c688d | https://jcenter.bintray.com/com/google/auto/value/auto-value/1.5.2/auto-val…
+905721a0eea90a81534abb7ee6ef4ea2e5e645fa1def0a5cd88402df1b46c9ed | https://jcenter.bintray.com/com/google/code/findbugs/jsr305/1.3.9/jsr305-1.…
+feab9191311c3d7aeef2b66d6064afc80d3d1d52d980fb07ae43c78c987ba93a | https://jcenter.bintray.com/com/google/code/findbugs/jsr305/1.3.9/jsr305-1.…
+1e7f53fa5b8b5c807e986ba335665da03f18d660802d8bf061823089d1bee468 | https://jcenter.bintray.com/com/google/code/findbugs/jsr305/2.0.1/jsr305-2.…
+02c12c3c2ae12dd475219ff691c82a4d9ea21f44bc594a181295bf6d43dcfbb0 | https://jcenter.bintray.com/com/google/code/findbugs/jsr305/2.0.1/jsr305-2.…
+2d43eb5ea9e133d2ee2405cc14f5ee08951b8361302fdd93494a3a997b508d32 | https://jcenter.bintray.com/com/google/code/gson/gson/2.7/gson-2.7.jar
+723936ec07b87b210a44ef8058f32f56e3d56442218dfbf8f4e538a927160ede | https://jcenter.bintray.com/com/google/code/gson/gson/2.7/gson-2.7.pom
+c6221763bd79c4f1c3dc7f750b5f29a0bb38b367b81314c4f71896e340c40825 | https://jcenter.bintray.com/com/google/code/gson/gson/2.8.0/gson-2.8.0.jar
+a5331a0ecb548f9942ab5b93c7ac43c38a21e897763dde1bcdbf0774f416ca6f | https://jcenter.bintray.com/com/google/code/gson/gson/2.8.0/gson-2.8.0.pom
+b7134929f7cc7c04021ec1cc27ef63ab907e410cf0588e397b8851181eb91092 | https://jcenter.bintray.com/com/google/code/gson/gson/2.8.2/gson-2.8.2.jar
+91b9f17a54e6c340c8d3ea4b359401170706eb26a82d51909abe6ba80081aed8 | https://jcenter.bintray.com/com/google/code/gson/gson/2.8.2/gson-2.8.2.pom
+871e8c737322301f0cc8acfe39a2960c4579d9d8666aeea5298bb6fcc9e4272b | https://jcenter.bintray.com/com/google/code/gson/gson-parent/2.7/gson-paren…
+0f1d8369b1e9f1bc4b467c8dcfdd8b59733aad5b5c8419c3a59b2f9abaf04cd2 | https://jcenter.bintray.com/com/google/code/gson/gson-parent/2.8.0/gson-par…
+cf5c43860b53ba5a95c19bc6525cc43d3488a6fe3df2f649c0099a613a0640e3 | https://jcenter.bintray.com/com/google/code/gson/gson-parent/2.8.2/gson-par…
+2d9484f4c649f708f47f9a479465fc729770ee65617dca3011836602264f6439 | https://jcenter.bintray.com/com/googlecode/json-simple/json-simple/1.1/json…
+47a89be0fa0fedd476db5fd2c83487654d2a119c391f83a142be876667cf7dab | https://jcenter.bintray.com/com/googlecode/json-simple/json-simple/1.1/json…
+757bfe906193b8b651e79dc26cd67d6b55d0770a2cdfb0381591504f779d4a76 | https://jcenter.bintray.com/com/googlecode/juniversalchardet/juniversalchar…
+7846399b35c7cd642a9b3a000c3e2d62d04eb37a4547b6933cc8b18bcc2f086b | https://jcenter.bintray.com/com/googlecode/juniversalchardet/juniversalchar…
+cb4cfad870bf563a07199f3ebea5763f0dec440fcda0b318640b1feaa788656b | https://jcenter.bintray.com/com/google/errorprone/error_prone_annotations/2…
+9144127192d6f612c2366825dceaeb23b0d53130b83e0bf1ffe107d1470a8487 | https://jcenter.bintray.com/com/google/errorprone/error_prone_annotations/2…
+de3c873b5dc06060f7a2a4d9b872a3f4dc1955c18095ef9702d13477e437782a | https://jcenter.bintray.com/com/google/errorprone/error_prone_annotations/2…
+180a588bb8b4ed7cc554578b0dbfdb1aecfb3380922173df6541da18ee230911 | https://jcenter.bintray.com/com/google/errorprone/error_prone_annotations/2…
+cf149955279b07d4f11e817985c1164a69e930d73db7441b43a6ef53bbd286c4 | https://jcenter.bintray.com/com/google/errorprone/error_prone_parent/2.0.18…
+c6b6d61ddb8f6b3bf29e8dafe35ff5d5a1ea90304b457e05657c1e7b8063a143 | https://jcenter.bintray.com/com/google/errorprone/error_prone_parent/2.1.2/…
+cd6db17a11a31ede794ccbd1df0e4d9750f640234731f21cff885a9997277e81 | https://jcenter.bintray.com/com/google/google/1/google-1.pom
+36a666e3b71ae7f0f0dca23654b67e086e6c93d192f60ba5dfd5519db6c288c8 | https://jcenter.bintray.com/com/google/guava/guava/20.0/guava-20.0.jar
+363cc83767b760d7a564d5301e09467e6d48fc1c1c1664b1e18c50815ce19076 | https://jcenter.bintray.com/com/google/guava/guava/20.0/guava-20.0.pom
+1158e94c7de4da480873f0b4ab4a1da14c0d23d4b1902cc94a58a6f0f9ab579e | https://jcenter.bintray.com/com/google/guava/guava/22.0/guava-22.0.jar
+bfadb3b40f65dd6de1666d6b29f8bb54031396c76eeef4146cf9f28255f8bf33 | https://jcenter.bintray.com/com/google/guava/guava/22.0/guava-22.0.pom
+7baa80df284117e5b945b19b98d367a85ea7b7801bd358ff657946c3bd1b6596 | https://jcenter.bintray.com/com/google/guava/guava/23.0/guava-23.0.jar
+ac2ac42a7a6b4ce5097c6c83e2fbbacbbb7f9913f1b4f993eb1723a14476324e | https://jcenter.bintray.com/com/google/guava/guava/23.0/guava-23.0.pom
+f1226fd07fc72af8d6232bdfa70bf31d883a1a01cbc547f23a74e9066c692df1 | https://jcenter.bintray.com/com/google/guava/guava-parent/20.0/guava-parent…
+1eaf9182e1977c1c50a70edbfbf70536398c68990bfaafc9f0e9899041201539 | https://jcenter.bintray.com/com/google/guava/guava-parent/22.0/guava-parent…
+66cc3a0d329f9fe130605fdb2c901e5a9bb2612f02f23a76757b46e689b3594d | https://jcenter.bintray.com/com/google/guava/guava-parent/23.0/guava-parent…
+2994a7eb78f2710bd3d3bfb639b2c94e219cedac0d4d084d516e78c16dddecf6 | https://jcenter.bintray.com/com/google/j2objc/j2objc-annotations/1.1/j2objc…
+f0c98c571e93a7cb4dd18df0fa308f0963e7a0620ac2d4244e61e709d03ad6be | https://jcenter.bintray.com/com/google/j2objc/j2objc-annotations/1.1/j2objc…
+c4828e28d7c0a930af9387510b3bada7daa5c04d7c25a75c7b8b081f1c257ddd | https://jcenter.bintray.com/com/google/jimfs/jimfs/1.1/jimfs-1.1.jar
+efa86e5cd922f17b472fdfcae57234d8d4ac3e148b6250737dfce454af7a7a44 | https://jcenter.bintray.com/com/google/jimfs/jimfs/1.1/jimfs-1.1.pom
+c71555751e57e0ef912870e8ac9625ae782502a6a5b9c19ccf83b2a97d8b26bd | https://jcenter.bintray.com/com/google/jimfs/jimfs-parent/1.1/jimfs-parent-…
+55aa554843983f431df5616112cf688d38aa17c132357afd1c109435bfdac4e6 | https://jcenter.bintray.com/com/google/protobuf/protobuf-java/2.6.1/protobu…
+89fc0cd20db030033ba04bb00c2837efe1e530b00f86935d6a645717d15bb978 | https://jcenter.bintray.com/com/google/protobuf/protobuf-java/2.6.1/protobu…
+dce7e66b32456a1b1198da0caff3a8acb71548658391e798c79369241e6490a4 | https://jcenter.bintray.com/com/google/protobuf/protobuf-java/3.4.0/protobu…
+83f17ba86c5fa1a15a3a3c8030d4ce42ef21c1d39b65db6cc004a8eeb2c59406 | https://jcenter.bintray.com/com/google/protobuf/protobuf-java/3.4.0/protobu…
+4189e0be5ab15cf2330f70b24fbdc75ca37514f188388fce8580ce16a9a68052 | https://jcenter.bintray.com/com/google/protobuf/protobuf-java-util/3.4.0/pr…
+89c43073e7eaa0eaba72a4a36ae1b6bfdfe5d81bb9d0e156aee05e4a72de3cb8 | https://jcenter.bintray.com/com/google/protobuf/protobuf-java-util/3.4.0/pr…
+24909c552842c0eb7a4c769d631a43cbef5a9a10c1640f2bdbd1ea149c573a47 | https://jcenter.bintray.com/com/google/protobuf/protobuf-parent/3.4.0/proto…
+e37a4467bac5cdeb02c5c4b8e5063d2f4e67b69e3c7df6d6b610f13185572bab | https://jcenter.bintray.com/com/ibm/icu/icu4j/53.1/icu4j-53.1.jar
+a0700d84efe7cc3103557bd0522f9443681b96ba9559c4bb7f9dc9bf35243485 | https://jcenter.bintray.com/com/ibm/icu/icu4j/53.1/icu4j-53.1.pom
+2643837251ebdff33a7731646abb563a6050dbb1307937a6e401ef25f3c59103 | https://jcenter.bintray.com/com/jayway/android/robotium/robotium/5.5.4/robo…
+d19c24122f9f70221e8d97a54f48fbf43feba5b003963057458982e0407aab42 | https://jcenter.bintray.com/com/jayway/android/robotium/robotium-solo/5.5.4…
+3ec9d39b3e35fad9aab1e6b137466ce2190f88aee897cffa383e94a65287105e | https://jcenter.bintray.com/com/jayway/android/robotium/robotium-solo/5.5.4…
+54b34e941b8e1414bd3e40d736efd3481772dc26db3296f6aa45cec9f6203d86 | https://jcenter.bintray.com/commons-codec/commons-codec/1.6/commons-codec-1…
+a06e35d3fff3a6b813d94894ebf3e498f9540c864c5b39ae783907e3a6c72889 | https://jcenter.bintray.com/commons-codec/commons-codec/1.6/commons-codec-1…
+ad19d2601c3abf0b946b5c3a4113e226a8c1e3305e395b90013b78dd94a723ce | https://jcenter.bintray.com/commons-codec/commons-codec/1.9/commons-codec-1…
+e5efcf039cd909688c201dc5479b144fd6f01f0e40252b7fc5e7d2e1b5c07990 | https://jcenter.bintray.com/commons-codec/commons-codec/1.9/commons-codec-1…
+cc6a41dc3eaacc9e440a6bd0d2890b20d36b4ee408fe2d67122f328bb6e01581 | https://jcenter.bintray.com/commons-io/commons-io/2.4/commons-io-2.4.jar
+b2b5dd46cf998fa626eb6f8a1c114f6167c8d392694164e62533e5898e9b31f2 | https://jcenter.bintray.com/commons-io/commons-io/2.4/commons-io-2.4.pom
+ce6f913cad1f0db3aad70186d65c5bc7ffcc9a99e3fe8e0b137312819f7c362f | https://jcenter.bintray.com/commons-logging/commons-logging/1.1.1/commons-l…
+d0f2e16d054e8bb97add9ca26525eb2346f692809fcd2a28787da8ceb3c35ee8 | https://jcenter.bintray.com/commons-logging/commons-logging/1.1.1/commons-l…
+daddea1ea0be0f56978ab3006b8ac92834afeefbd9b7e4e6316fca57df0fa636 | https://jcenter.bintray.com/commons-logging/commons-logging/1.2/commons-log…
+c91ab5aa570d86f6fd07cc158ec6bc2c50080402972ee9179fe24100739fbb20 | https://jcenter.bintray.com/commons-logging/commons-logging/1.2/commons-log…
+8e108c92027bb428196f10fa11cffbe589f7648a6af2016d652279385fdfd789 | https://jcenter.bintray.com/com/squareup/javapoet/1.8.0/javapoet-1.8.0.jar
+b3760f40f19e735b2cd418f7656335d926d1d9413e10982a1c9695b64edbb647 | https://jcenter.bintray.com/com/squareup/javapoet/1.8.0/javapoet-1.8.0.pom
+f699823d0081f69cbb676c1845ea222e0ada79bc88a53e5d22d8bd02d328f57e | https://jcenter.bintray.com/com/squareup/javawriter/2.1.1/javawriter-2.1.1.…
+d47fc646324c22c66f2b0e0e743c850dde9a51990c53925e7501d960f2e8df84 | https://jcenter.bintray.com/com/squareup/javawriter/2.1.1/javawriter-2.1.1.…
+fcfb09fb0ea0aa97d3cfe7ea792398081348e468f126b3603cb3803f240197f0 | https://jcenter.bintray.com/com/squareup/javawriter/2.5.0/javawriter-2.5.0.…
+e1abd7f1116cf5e0c59947693e2189208ec94296b2a3394c959e3511d399a7b0 | https://jcenter.bintray.com/com/squareup/javawriter/2.5.0/javawriter-2.5.0.…
+1ccea47240da2f0b75dbddb22718fd64cce42c20bf7983e35480b098ab62d26d | https://jcenter.bintray.com/com/squareup/leakcanary/leakcanary-android-no-o…
+7b0cdb372fbde4e801f76bdb416927162ebd32c0c4e53fa39828437d3112c9d5 | https://jcenter.bintray.com/com/squareup/leakcanary/leakcanary-android-no-o…
+1d8518e3ac7532a104e4f7be77def37c982e530723c6bdb3d67708cce2b0c2c4 | https://jcenter.bintray.com/com/sun/activation/all/1.2.0/all-1.2.0.pom
+993302b16cd7056f21e779cc577d175a810bb4900ef73cd8fbf2b50f928ba9ce | https://jcenter.bintray.com/com/sun/activation/javax.activation/1.2.0/javax…
+f879b6e945854c6900b0dbee1c8384d7ab3de7e157fd7ac84937405c416d2a5e | https://jcenter.bintray.com/com/sun/activation/javax.activation/1.2.0/javax…
+c3071277f89b162982606b4e65c92077212efb6cbf1bdc365c51bd0b57ac818c | https://jcenter.bintray.com/com/sun/istack/istack-commons/2.21/istack-commo…
+c33e67a0807095f02a0e2da139412dd7c4f9cc1a4c054b3e434f96831ba950f4 | https://jcenter.bintray.com/com/sun/istack/istack-commons-runtime/2.21/ista…
+ebe7137b5fbfd050545f9a7f3f339ae55beb0b53755071b4fd62aa024c626d1c | https://jcenter.bintray.com/com/sun/istack/istack-commons-runtime/2.21/ista…
+b25e0693de21cb92b039a2e4608f396590fb8773108f10d6dc9f1465f03b5be9 | https://jcenter.bintray.com/com/sun/xml/bind/jaxb-bom-ext/2.2.11/jaxb-bom-e…
+b5301b711c01547e571b615f9a0832ee525d34a4ce3372f53907a87cf20b0480 | https://jcenter.bintray.com/com/sun/xml/bind/mvn/jaxb-parent/2.2.11/jaxb-pa…
+21918cb8e4eda67f24251e909a5d81672201d93604c4ffbf33522ad836a58e90 | https://jcenter.bintray.com/com/sun/xml/bind/mvn/jaxb-runtime-parent/2.2.11…
+9a398c699a5d3f3b56f1056c68890ede25d94a12d98eabc2a473733e6ab2362c | https://jcenter.bintray.com/com/sun/xml/bind/mvn/jaxb-txw-parent/2.2.11/jax…
+27a77db909f3c2833c0b1a37c55af1db06045118ad2eed96ce567b6632bce038 | https://jcenter.bintray.com/com/sun/xml/fastinfoset/FastInfoset/1.2.13/Fast…
+b7505e0ecf7d495b4daa3e6569f71611d1a789dc531cbd92a2025922ff2655d3 | https://jcenter.bintray.com/com/sun/xml/fastinfoset/FastInfoset/1.2.13/Fast…
+fd0857899f1067e0287c2ffd91e38f967a26bd405b83a34650c2742cee9fc261 | https://jcenter.bintray.com/com/sun/xml/fastinfoset/fastinfoset-project/1.2…
+a219a1abf948400b669d08be73a6f9209fb720d237e5ff74c223bffe5f9df93d | https://jcenter.bintray.com/com/thoughtworks/xstream/xstream/1.4.8/xstream-…
+8ba35dd4ea1647b89a8ae082bb6c81d5695a1ec31e73aa57bfa3512069c4bee2 | https://jcenter.bintray.com/com/thoughtworks/xstream/xstream/1.4.8/xstream-…
+c9268e671899430946b54c4d1b93c30f0db1b7df0b39b3c6279d6bd475a6fbdc | https://jcenter.bintray.com/com/thoughtworks/xstream/xstream-parent/1.4.8/x…
+74fa208043740642f7e6eb09faba15965218ad2f50ce3020efb100136e4b591c | https://jcenter.bintray.com/it/unimi/dsi/fastutil/7.2.0/fastutil-7.2.0.jar
+953b116521a73575eee990e3f2c36a892fb088bb2d9a3027c82193cb7a013ef7 | https://jcenter.bintray.com/it/unimi/dsi/fastutil/7.2.0/fastutil-7.2.0.pom
+91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff | https://jcenter.bintray.com/javax/inject/javax.inject/1/javax.inject-1.jar
+943e12b100627804638fa285805a0ab788a680266531e650921ebfe4621a8bfa | https://jcenter.bintray.com/javax/inject/javax.inject/1/javax.inject-1.pom
+b5e60cd8b7b5ff01ce4a74c5dd008f4fbd14ced3495d0b47b85cfedc182211f2 | https://jcenter.bintray.com/javax/xml/bind/jaxb-api/2.2.12-b140109.1041/jax…
+2092a7d8d9bc5698c59b094bdea46622915c48c83ae66d5b5ad549c7bf16155b | https://jcenter.bintray.com/javax/xml/bind/jaxb-api/2.2.12-b140109.1041/jax…
+59721f0805e223d84b90677887d9ff567dc534d7c502ca903c0c2b17f05c116a | https://jcenter.bintray.com/junit/junit/4.12/junit-4.12.jar
+90f163f78e3ffb6f1c7ad97de9e7eba4eea25807141b85d6d12be67ca25449c4 | https://jcenter.bintray.com/junit/junit/4.12/junit-4.12.pom
+fdff6cfa9ed9cc911c842a5d2395f209ec621ef1239d46810e9e495809d3ae09 | https://jcenter.bintray.com/nekohtml/nekohtml/1.9.6.2/nekohtml-1.9.6.2.jar
+f5655d331af6afcd4dbaedaa739b889380c771a7e83f7aea5c8544a05074cf0b | https://jcenter.bintray.com/nekohtml/nekohtml/1.9.6.2/nekohtml-1.9.6.2.pom
+95b8b357d19f63797dd7d67622fd3f18374d64acbc6584faba1c7759a31e8438 | https://jcenter.bintray.com/nekohtml/xercesMinimal/1.9.6.2/xercesMinimal-1.…
+c219d697fa9c8f243d8f6e347499b6d4e8af1d0cac4bbc7b3907d338a2024c13 | https://jcenter.bintray.com/nekohtml/xercesMinimal/1.9.6.2/xercesMinimal-1.…
+ec3a75bebddbf19ff56a281cf5d1ad146169dcaa0e69d7b14f4aaba2e7775f34 | https://jcenter.bintray.com/net/freehaven/tor/control/jtorctl/0.2/jtorctl-0…
+3369726ca2b0e3736c741ff3c22e06f707a1007ff20ccc5b5ba5d0d9a01ead30 | https://jcenter.bintray.com/net/freehaven/tor/control/jtorctl/0.2/jtorctl-0…
+281440811268e65d9e266b3cc898297e214e04f09740d0386ceeb4a8923d63bf | https://jcenter.bintray.com/net/java/jvnet-parent/1/jvnet-parent-1.pom
+30f5789efa39ddbf96095aada3fc1260c4561faf2f714686717cb2dc5049475a | https://jcenter.bintray.com/net/java/jvnet-parent/3/jvnet-parent-3.pom
+471395735549495297c8ff939b9a32e08b91302020ff773586d27e497abb8fbb | https://jcenter.bintray.com/net/java/jvnet-parent/4/jvnet-parent-4.pom
+26c5856e954b5f864db76f13b86919b59c6eecf9fd930b96baa8884626baf2f5 | https://jcenter.bintray.com/net/sf/jopt-simple/jopt-simple/4.9/jopt-simple-…
+7af7e2d8b24b4798f04c2b7da24c9fbd1b7557b4e017c2054481565916079092 | https://jcenter.bintray.com/net/sf/jopt-simple/jopt-simple/4.9/jopt-simple-…
+f264dd9f79a1fde10ce5ecc53221eff24be4c9331c830b7d52f2f08a7b633de2 | https://jcenter.bintray.com/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0.jar
+31ce606f4e9518936299bb0d27c978fa61e185fd1de7c9874fe959a53e34a685 | https://jcenter.bintray.com/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0.pom
+1d2e883717b8ab7d3fcc9fa01034d165809a9c94daa6303a838f11e4d36adc86 | https://jcenter.bintray.com/net/sf/proguard/proguard-base/5.3.3/proguard-ba…
+e51efb2ec140b2849b9880fb161cb6e30dd672368a534c1f47ab46d7f537d9ca | https://jcenter.bintray.com/net/sf/proguard/proguard-base/5.3.3/proguard-ba…
+f34b3a0b62cdb468eb7e8335de4edc87958dc299306c2b4ba8ea15e6a4be106a | https://jcenter.bintray.com/net/sf/proguard/proguard-gradle/5.3.3/proguard-…
+f26bdec2b9496470c0ce63b0d290816e8000ef018daaa259597ebae947fd690f | https://jcenter.bintray.com/net/sf/proguard/proguard-gradle/5.3.3/proguard-…
+0288414509c625b8dd544384fbd29f502bdc8b4f86cfc26625aa23eef9fa6057 | https://jcenter.bintray.com/net/sf/proguard/proguard-parent/5.3.3/proguard-…
+a32de739cfdf515774e696f91aa9697d2e7731e5cb5045ca8a4b657f8b1b4fb4 | https://jcenter.bintray.com/org/antlr/antlr4/4.5.3/antlr4-4.5.3.jar
+8a4e4b32eedaa72976a757e12cf1dfe742725db0b7311bf176dd937ba4236384 | https://jcenter.bintray.com/org/antlr/antlr4/4.5.3/antlr4-4.5.3.pom
+401877d5e70ad599e9b6cff18434ea0332f637b51f8ec68352646c836f9bb2a4 | https://jcenter.bintray.com/org/antlr/antlr4-master/4.5.3/antlr4-master-4.5…
+0251dbb938740ace07a53675113eee753ba389db65aebc814b175af50321620e | https://jcenter.bintray.com/org/apache/ant/ant/1.8.0/ant-1.8.0.jar
+e6d920d5a1a34aaaebab1e6a82c36bbfd61f1eeaabc4534ee05d4faad56f1b7a | https://jcenter.bintray.com/org/apache/ant/ant/1.8.0/ant-1.8.0.pom
+da9fd92eacdf63daf0be52eb71accc10ff7943a85d7aac9ea96cf7e03ee3d3cc | https://jcenter.bintray.com/org/apache/ant/ant-launcher/1.8.0/ant-launcher-…
+08426143d37d770f3e4dae45b0870c3ab1ba512cb64418f34496025b72d16760 | https://jcenter.bintray.com/org/apache/ant/ant-launcher/1.8.0/ant-launcher-…
+ecbd655fd71d298eaf0787045b84324ce68936ad0de98c7a9c55538e539f2747 | https://jcenter.bintray.com/org/apache/ant/ant-parent/1.8.0/ant-parent-1.8.…
+ff513db0361fd41237bef4784968bc15aae478d4ec0a9496f811072ccaf3841d | https://jcenter.bintray.com/org/apache/apache/13/apache-13.pom
+36c2f2f979ac67b450c0cb480e4e9baf6b40f3a681f22ba9692287d1139ad494 | https://jcenter.bintray.com/org/apache/apache/15/apache-15.pom
+9f85ff2fd7d6cb3097aa47fb419ee7f0ebe869109f98aba9f4eca3f49e74a40e | https://jcenter.bintray.com/org/apache/apache/16/apache-16.pom
+9e9323a26ba8eb2394efef0c96d31b70df570808630dc147cab1e73541cc5194 | https://jcenter.bintray.com/org/apache/apache/4/apache-4.pom
+1933a6037439b389bda2feaccfc0113880fd8d88f7d240d2052b91108dd5ae89 | https://jcenter.bintray.com/org/apache/apache/5/apache-5.pom
+4946e60a547c8eda69f3bc23c5b6f0dadcf8469ea49b1d1da7de34aecfcf18dd | https://jcenter.bintray.com/org/apache/apache/9/apache-9.pom
+2c1542faf343185b7cab9c3d55c8ae5471d6d095d3887a4adefdbdf2984dc0b6 | https://jcenter.bintray.com/org/apache/commons/commons-compress/1.12/common…
+b787d574c851505e76212968b9ae1641ea79804aef7f5a2cee2a01cd4055213a | https://jcenter.bintray.com/org/apache/commons/commons-compress/1.12/common…
+cb49812dc1bfb0ea4f20f398bcae1a88c6406e213e67f7524fb10d4f8ad9347b | https://jcenter.bintray.com/org/apache/commons/commons-exec/1.3/commons-exe…
+82827f6019c0f71bd74fba886ab337ff6da291f63df9723379a209d6ad3b44f8 | https://jcenter.bintray.com/org/apache/commons/commons-exec/1.3/commons-exe…
+fb8c5e55e30a7addb4ff210858a0e8d2494ed6757bbe19012da99d51586c3cbb | https://jcenter.bintray.com/org/apache/commons/commons-parent/22/commons-pa…
+467ae650442e876867379094e7518dfdd67d22c5352ebd39808c84259e9790ba | https://jcenter.bintray.com/org/apache/commons/commons-parent/25/commons-pa…
+e4d258af8b2ff4032148d415379def7870789a6003e80576f1504b10f26b4be8 | https://jcenter.bintray.com/org/apache/commons/commons-parent/32/commons-pa…
+3a2e69d06d641d1f3b293126dc9e2e4ea6563bf8c36c87e0ab6fa4292d04b79c | https://jcenter.bintray.com/org/apache/commons/commons-parent/34/commons-pa…
+7098a1ab8336ecd4c9dc21cbbcac869f82c66f64b8ac4f7988d41b4fcb44e49a | https://jcenter.bintray.com/org/apache/commons/commons-parent/35/commons-pa…
+87cd27e1a02a5c3eb6d85059ce98696bb1b44c2b8b650f0567c86df60fa61da7 | https://jcenter.bintray.com/org/apache/commons/commons-parent/39/commons-pa…
+8bd632c00bdf80a7de36c22b60f12452c147d8eca2f00d79d66699ebe7daa02a | https://jcenter.bintray.com/org/apache/commons/commons-parent/5/commons-par…
+362e9324ee7c697e21279e20077b52737ddef3f1b2c1a7abe5ad34b465145550 | https://jcenter.bintray.com/org/apache/httpcomponents/httpclient/4.2.6/http…
+f5a0a1eeaa100ed36aa83eca562d5dbb7e9b045c98b44db7da4745e9d9a20328 | https://jcenter.bintray.com/org/apache/httpcomponents/httpclient/4.2.6/http…
+0dffc621400d6c632f55787d996b8aeca36b30746a716e079a985f24d8074057 | https://jcenter.bintray.com/org/apache/httpcomponents/httpclient/4.5.2/http…
+488001ba21829a4b28b0efbed18dccb13689f58f0985453863257049f7ec19f0 | https://jcenter.bintray.com/org/apache/httpcomponents/httpclient/4.5.2/http…
+5215b648798c6c8d9b9cde3642d3bfb5a4cc894b7c8411004352e7de5d119827 | https://jcenter.bintray.com/org/apache/httpcomponents/httpcomponents-client…
+52b6fd2eaf2240e14dbe752f1fa884270cc668d6f350e8e7f65f6033a8172d69 | https://jcenter.bintray.com/org/apache/httpcomponents/httpcomponents-client…
+1de8cba6c1e5c46b28619e335a6fb7204c352dba3e8b1cefb4b59575e2beed01 | https://jcenter.bintray.com/org/apache/httpcomponents/httpcomponents-client…
+164e7a9cf23a4e63bbc961f8db7d965d53d685710660a88249641f91d36f83a4 | https://jcenter.bintray.com/org/apache/httpcomponents/httpcomponents-core/4…
+18d9243541c80848d5378bad89fccc5e1bf5c0465b2481d948b0c06851091cdc | https://jcenter.bintray.com/org/apache/httpcomponents/httpcomponents-core/4…
+e5e82da4cc66c8d917bbf743e3c0752efe8522735e7fc9dbddb65bccea81cfe9 | https://jcenter.bintray.com/org/apache/httpcomponents/httpcore/4.2.5/httpco…
+b6eb99f1362b8344ca5400d57a35c49e3504f23f3dee304fdb879d4d953f4bc6 | https://jcenter.bintray.com/org/apache/httpcomponents/httpcore/4.2.5/httpco…
+64d5453874cab7e40a7065cb01a9a9ca1053845a9786b478878b679e0580cec3 | https://jcenter.bintray.com/org/apache/httpcomponents/httpcore/4.4.5/httpco…
+147fa18df753534e50054d018a360f789902af1e5c24322a3f0b200d0684fed2 | https://jcenter.bintray.com/org/apache/httpcomponents/httpcore/4.4.5/httpco…
+31629566148e8a47688ae43b420abc3ecd783ed15b33bebc00824bf24c9b15aa | https://jcenter.bintray.com/org/apache/httpcomponents/httpmime/4.1/httpmime…
+db3cd95bec1001605e1653f2843e8542e712fa2bb672fd9c8c1ace86c57673d1 | https://jcenter.bintray.com/org/apache/httpcomponents/httpmime/4.1/httpmime…
+231a3f7e4962053db2be8461d5422e68fc458a3a7dd7d8ada803a348e21f8f07 | https://jcenter.bintray.com/org/apache/httpcomponents/httpmime/4.5.2/httpmi…
+004b5b6272d820029adefcaaa92186ec46a485990b54d03509e441eda85b3784 | https://jcenter.bintray.com/org/apache/httpcomponents/httpmime/4.5.2/httpmi…
+21bb4d44dff54e33a37c11af69859a714202ae00969aab5453eba7276688f8ec | https://jcenter.bintray.com/org/apache/httpcomponents/project/4.1.1/project…
+3d6eba428555a558de046b5d76eacc1f5a54b4f5f20b84d636ed7aff18aa48c3 | https://jcenter.bintray.com/org/apache/httpcomponents/project/7/project-7.p…
+d135cff96dcbbc8a5fab30180e557cae620373cf26941d4c738a88896a2d98ed | https://jcenter.bintray.com/org/apache/maven/maven/2.2.1/maven-2.2.1.pom
+f16b5ea711dfe0323454b880180aa832420ec039936e4aa75fb978748634808a | https://jcenter.bintray.com/org/apache/maven/maven-ant-tasks/2.1.3/maven-an…
+f52619bf2f5c5117f0af1c23adff3a9c8f468647be47fefc59b81dcec7e480e6 | https://jcenter.bintray.com/org/apache/maven/maven-ant-tasks/2.1.3/maven-an…
+d53062ffe8677a4f5e1ad3a1d1fa37ed600fab39166d39be7ed204635c5f839b | https://jcenter.bintray.com/org/apache/maven/maven-artifact/2.2.1/maven-art…
+f658a628efd6e0efe416b977638ba144af660fe6413f3637a4d03feb6a1ce806 | https://jcenter.bintray.com/org/apache/maven/maven-artifact/2.2.1/maven-art…
+d1e247c4ed3952385fd704ac9db2a222247cfe7d20508b4f3c76b90f857952ed | https://jcenter.bintray.com/org/apache/maven/maven-artifact-manager/2.2.1/m…
+ecf58351f8fe0c398b8b452216705bece5291b9b327d30202c16b28ac680450c | https://jcenter.bintray.com/org/apache/maven/maven-artifact-manager/2.2.1/m…
+b3005544708f8583e455c22b09a4940596a057108bccdadb9db4d8e048091fed | https://jcenter.bintray.com/org/apache/maven/maven-error-diagnostics/2.2.1/…
+228367b7569fb1462a3eb1423bc2778e2fc7fbaee3d3767890c02b8924fa1889 | https://jcenter.bintray.com/org/apache/maven/maven-error-diagnostics/2.2.1/…
+153b32f474fd676ec36ad807c508885005139140fc92168bb76bf6be31f8efb8 | https://jcenter.bintray.com/org/apache/maven/maven-model/2.2.1/maven-model-…
+62dd8e35a2c4432bb22f8250bbfe08639635599b4064d5d747bd24cf3c02fac5 | https://jcenter.bintray.com/org/apache/maven/maven-model/2.2.1/maven-model-…
+7450c3330cf06c254db9f0dc5ef49eac15502311cf19e0208ba473076ee043d6 | https://jcenter.bintray.com/org/apache/maven/maven-parent/11/maven-parent-1…
+0c5a9770ae0271dc97bcc6cb0f2e809a40ba587cdce2556f9db59912c8e158fc | https://jcenter.bintray.com/org/apache/maven/maven-parent/19/maven-parent-1…
+4ad0673155d7e0e5cf6d13689802d8d507f38e5ea00a6d2fb92aef206108213d | https://jcenter.bintray.com/org/apache/maven/maven-plugin-registry/2.2.1/ma…
+3db15325cd620c0e54c3d88b6b7ec1bac43db376e18c9bf56bd0c05402ee6be8 | https://jcenter.bintray.com/org/apache/maven/maven-plugin-registry/2.2.1/ma…
+ecaffef655fea6b138f0855a12f7dbb59fc0d6bffb5c1bfd31803cccb49ea08c | https://jcenter.bintray.com/org/apache/maven/maven-profile/2.2.1/maven-prof…
+d125b3ade9f694ae60ef835f5ae000b6ba35fba8c34bafd8b40a1961375e63fa | https://jcenter.bintray.com/org/apache/maven/maven-profile/2.2.1/maven-prof…
+24ddb65b7a6c3befb6267ce5f739f237c84eba99389265c30df67c3dd8396a40 | https://jcenter.bintray.com/org/apache/maven/maven-project/2.2.1/maven-proj…
+34af0baedaef19375b7c1a7da967e9089d5e0754647fdbe9a302590392874b77 | https://jcenter.bintray.com/org/apache/maven/maven-project/2.2.1/maven-proj…
+5fe283f47b0e7f7d95a4252af3fa7a0db4d8f080cd9df308608c0472b8f168a1 | https://jcenter.bintray.com/org/apache/maven/maven-repository-metadata/2.2.…
+9dad0f56523955b60a9903f4e8342891355d7a59c77f36a3b53cf6ff2e4df625 | https://jcenter.bintray.com/org/apache/maven/maven-repository-metadata/2.2.…
+9a9f556713a404e770c9dbdaed7eb086078014c989291960c76fdde6db4192f7 | https://jcenter.bintray.com/org/apache/maven/maven-settings/2.2.1/maven-set…
+0d25a88a1b1e44801f8912206a40ff249cb5702ee87cf3d243d5213f7bcf534f | https://jcenter.bintray.com/org/apache/maven/maven-settings/2.2.1/maven-set…
+025caec7c56a0cb4d86c45bc18ac3e23dba291e22ebceb76302a9a9b9b7183cc | https://jcenter.bintray.com/org/apache/maven/wagon/wagon/1.0-beta-6/wagon-1…
+7298feeb36ff14dd933c38e62585fb9973fea32fb3c4bc5379428cb1aac5dd3c | https://jcenter.bintray.com/org/apache/maven/wagon/wagon-file/1.0-beta-6/wa…
+f7524cfffc9773ea75a9f7379139f00a57355e411009ea9529b7adf7ef93fde8 | https://jcenter.bintray.com/org/apache/maven/wagon/wagon-file/1.0-beta-6/wa…
+be214032de23c6b520b79c1ccdb160948e0c67ed7c11984b7ec4ca5537867b4e | https://jcenter.bintray.com/org/apache/maven/wagon/wagon-http-lightweight/1…
+f021eb07aebec822496f489a2d6ec5d3fa81a2717bfc8407cb0ebcaadcee2d7e | https://jcenter.bintray.com/org/apache/maven/wagon/wagon-http-lightweight/1…
+f095c882716d49269a806685dcb256fa6a36389b2713ac56bb758bf8693565a2 | https://jcenter.bintray.com/org/apache/maven/wagon/wagon-http-shared/1.0-be…
+f6775dc981540ffa10f33bd831f14608517ce38b90628e045707dd5bb5d1348e | https://jcenter.bintray.com/org/apache/maven/wagon/wagon-http-shared/1.0-be…
+e116f32edcb77067289a3148143f2c0c97b27cf9a1342f8108ee37dec4868861 | https://jcenter.bintray.com/org/apache/maven/wagon/wagon-provider-api/1.0-b…
+85c3c8840bb21554faf159998146f7ca9ef1b951defb29ec4e8252ec463728fd | https://jcenter.bintray.com/org/apache/maven/wagon/wagon-provider-api/1.0-b…
+340422be8f3e3c847a0a0bf944296774f6db81f2fa8b34912bc931a112a26919 | https://jcenter.bintray.com/org/apache/maven/wagon/wagon-providers/1.0-beta…
+7043dee4e9e7175e93e0b36f45b1ec1ecb893c5f755667e8b916eb8dd201c6ca | https://jcenter.bintray.com/org/bouncycastle/bcpkix-jdk15on/1.56/bcpkix-jdk…
+321668fc474a73140eb9cc73c779f1ebb9f60948aade3beddee082ecefcf0259 | https://jcenter.bintray.com/org/bouncycastle/bcpkix-jdk15on/1.56/bcpkix-jdk…
+0dc4d181e4d347893c2ddbd2e6cd5d7287fc651c03648fa64b2341c7366b1773 | https://jcenter.bintray.com/org/bouncycastle/bcprov-jdk15on/1.52/bcprov-jdk…
+7e4a34c7b63d879c5cec454e2e47eb1e61e271a58672e7e548659f4f23742500 | https://jcenter.bintray.com/org/bouncycastle/bcprov-jdk15on/1.52/bcprov-jdk…
+963e1ee14f808ffb99897d848ddcdb28fa91ddda867eb18d303e82728f878349 | https://jcenter.bintray.com/org/bouncycastle/bcprov-jdk15on/1.56/bcprov-jdk…
+8fdc3336e7b01873193ba9c48b87de7d788dc0954d1eb45c322492627a4b5c6e | https://jcenter.bintray.com/org/bouncycastle/bcprov-jdk15on/1.56/bcprov-jdk…
+50eb253acd0b6ee048f432d9fc3a3b36264efb3da1ffa7fb07f6c4d4b7a8ca31 | https://jcenter.bintray.com/org/codehaus/codehaus-parent/3/codehaus-parent-…
+6b87237de8c2e1740cf80627c7f3ce3e15de1930bb250c55a1eca94fa3e014df | https://jcenter.bintray.com/org/codehaus/codehaus-parent/4/codehaus-parent-…
+6a56af4bd48903d56bec62821876cadefafd007360cc6bd0d8f7aa8d72b38be4 | https://jcenter.bintray.com/org/codehaus/groovy/groovy-all/2.4.12/groovy-al…
+a8cd12c8da17b31e0fb46e64f7d3fc2e63344ca13815bade32a2d54fa2dedd3c | https://jcenter.bintray.com/org/codehaus/groovy/groovy-all/2.4.12/groovy-al…
+2068320bd6bad744c3673ab048f67e30bef8f518996fa380033556600669905d | https://jcenter.bintray.com/org/codehaus/mojo/animal-sniffer-annotations/1.…
+1879f19a05991e3ed95910b96689333396b0c467a215dc4d1f90018404b72a26 | https://jcenter.bintray.com/org/codehaus/mojo/animal-sniffer-annotations/1.…
+f51550a06b1410bd4962cb0e71df0b921a60a7ef47bfa9c4825a14be72316eea | https://jcenter.bintray.com/org/codehaus/mojo/animal-sniffer-parent/1.14/an…
+3e395d6fbc43c09a3774cac8694ce527398305ea3fd5492d80e25af27d382a9c | https://jcenter.bintray.com/org/codehaus/mojo/mojo-parent/34/mojo-parent-34…
+2242fd02d12b1ca73267fb3d89863025517200e7a4ee426cba4667d0172c74c3 | https://jcenter.bintray.com/org/codehaus/plexus/plexus/1.0.4/plexus-1.0.4.p…
+e246e2a062b5d989fdefc521c9c56431ba5554ff8d2344edee9218a34a546a33 | https://jcenter.bintray.com/org/codehaus/plexus/plexus/2.0.2/plexus-2.0.2.p…
+381d72c526be217b770f9f8c3f749a86d3b1548ac5c1fcb48d267530ec60d43f | https://jcenter.bintray.com/org/codehaus/plexus/plexus-components/1.1.14/pl…
+7c758612888782ccfe376823aee7cdcc7e0cdafb097f7ef50295a0b0c3a16edf | https://jcenter.bintray.com/org/codehaus/plexus/plexus-container-default/1.…
+ef71d45a49edfe76be0f520312a76bc2aae73ec0743a5ffffe10d30122c6e2b2 | https://jcenter.bintray.com/org/codehaus/plexus/plexus-container-default/1.…
+7c75075badcb014443ee94c8c4cad2f4a9905be3ce9430fe7b220afc7fa3a80f | https://jcenter.bintray.com/org/codehaus/plexus/plexus-containers/1.0.3/ple…
+fd9507feb858fa620d1b4aa4b7039fdea1a77e09d3fd28cfbddfff468d9d8c28 | https://jcenter.bintray.com/org/codehaus/plexus/plexus-interpolation/1.11/p…
+b84d281f59b9da528139e0752a0e1cab0bd98d52c58442b00e45c9748e1d9eee | https://jcenter.bintray.com/org/codehaus/plexus/plexus-interpolation/1.11/p…
+2ca121831e597b4d8f2cb22d17c5c041fc23a7777ceb6bfbdd4dfb34bbe7d997 | https://jcenter.bintray.com/org/codehaus/plexus/plexus-utils/1.5.15/plexus-…
+12a3c9a32b82fdc95223cab1f9d344e14ef3e396da14c4d0013451646f3280e7 | https://jcenter.bintray.com/org/codehaus/plexus/plexus-utils/1.5.15/plexus-…
+5c9f9714232f0f8ffb94d9a8cd7b5a43a8282c66adbb3ff9c2b6a928a6eed621 | https://jcenter.bintray.com/org/eclipse/jetty/jetty-continuation/7.6.21.v20…
+608b26cf0f48c53857028e5073568d4b7867412a1ba5d6ae0f855f9853f90de9 | https://jcenter.bintray.com/org/eclipse/jetty/jetty-continuation/7.6.21.v20…
+83823cb344a79340c2a454856f1b3931dca16b2791203220b510cf1ab7149ecb | https://jcenter.bintray.com/org/eclipse/jetty/jetty-http/7.6.21.v20160908/j…
+ee13eeebca316b72c07fbeab6c8bd5e0fba42d17b3a2aaa92dbe69a0e76c544d | https://jcenter.bintray.com/org/eclipse/jetty/jetty-http/7.6.21.v20160908/j…
+e228770d72984d88a65e56e8993edf24de00b134f28280ab43509f7f1d9652d7 | https://jcenter.bintray.com/org/eclipse/jetty/jetty-io/7.6.21.v20160908/jet…
+2226dc95295952d18be6fe4f1714fbc74a4c312803483939e3b5096c9185aac6 | https://jcenter.bintray.com/org/eclipse/jetty/jetty-io/7.6.21.v20160908/jet…
+a3578c9748a785c8d5be737222d3078663f590332ce3d5d24bd132825c73f63c | https://jcenter.bintray.com/org/eclipse/jetty/jetty-parent/18/jetty-parent-…
+cad17899a82a634fb487060875eb66dfbaf6e4127abab78655d43028de4af284 | https://jcenter.bintray.com/org/eclipse/jetty/jetty-parent/20/jetty-parent-…
+9547b29f5e3abb4908db3986076e61c43ce33baf22dfd3e515ed2e0c9ec5cc80 | https://jcenter.bintray.com/org/eclipse/jetty/jetty-project/7.6.21.v2016090…
+37270df84eedb56652f62ee777a2a6ee69d5a360b0501d3d96a050ec233518fc | https://jcenter.bintray.com/org/eclipse/jetty/jetty-server/7.6.21.v20160908…
+1de7d02de2a034808614cff189080c536a722b28084a39365aef75253ac3b62b | https://jcenter.bintray.com/org/eclipse/jetty/jetty-server/7.6.21.v20160908…
+5160e7e35558ca7e4cda300cd046892b14c233679b8159d68074ed00fafdc7fc | https://jcenter.bintray.com/org/eclipse/jetty/jetty-util/7.6.21.v20160908/j…
+cfa292af1dd93eafd970ba00c30c55f39dab6db9911dcac8eb0897ab8c6bac09 | https://jcenter.bintray.com/org/eclipse/jetty/jetty-util/7.6.21.v20160908/j…
+fbeb9035112292148b211226409ea25d8acc5b6ba2f7afe806516d79e50e10fc | https://jcenter.bintray.com/org/eclipse/jetty/orbit/javax.servlet/2.5.0.v20…
+01863a492c538b35729d7f9e37ada84cc9dfb693ba28b26421c28c283c181132 | https://jcenter.bintray.com/org/eclipse/jetty/orbit/javax.servlet/2.5.0.v20…
+7db6c47b0d2868b832aa36a45ddfce7158759ff49f8125235e165f17bf24c128 | https://jcenter.bintray.com/org/eclipse/jetty/orbit/jetty-orbit/1/jetty-orb…
+a52e6850f070dc9f7a2a51d0b25dfaafd49b0b9bf8196db6c0b3c5b7c94d8d38 | https://jcenter.bintray.com/org/glassfish/jaxb/jaxb-bom/2.2.11/jaxb-bom-2.2…
+37bcaee8ebb04362c8352a5bf6221b86967ecdab5164c696b10b9a2bb587b2aa | https://jcenter.bintray.com/org/glassfish/jaxb/jaxb-core/2.2.11/jaxb-core-2…
+ec31409f203bcabf99534f59231ec0576d875d4d4b7349b09566a7a8c8179b24 | https://jcenter.bintray.com/org/glassfish/jaxb/jaxb-core/2.2.11/jaxb-core-2…
+a874f2351cfba8e2946be3002d10c18a6da8f21b52ba2acf52f2b85d5520ed70 | https://jcenter.bintray.com/org/glassfish/jaxb/jaxb-runtime/2.2.11/jaxb-run…
+e5327b31b595ab8143e97836d5ccdf85feb91e7ff5666f7b26913632facca4aa | https://jcenter.bintray.com/org/glassfish/jaxb/jaxb-runtime/2.2.11/jaxb-run…
+272a3ccad45a4511351920cd2a8633c53cab8d5220c7a92954da5526bb5eafea | https://jcenter.bintray.com/org/glassfish/jaxb/txw2/2.2.11/txw2-2.2.11.jar
+8514cb724b4fca59a5cf272b632e539bd0a0f3cacf1844082d0a173a86406bd8 | https://jcenter.bintray.com/org/glassfish/jaxb/txw2/2.2.11/txw2-2.2.11.pom
+66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9 | https://jcenter.bintray.com/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.…
+fde386a7905173a1b103de6ab820727584b50d0e32282e2797787c20a64ffa93 | https://jcenter.bintray.com/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.…
+70f418efbb506c5155da5f9a5a33262ea08a9e4d7fea186aa9015c41a7224ac2 | https://jcenter.bintray.com/org/hamcrest/hamcrest-integration/1.3/hamcrest-…
+42f0be9bf98c12dacdcb99dd141d83d4dc5bb7c37a6f26684cd3ff2287667fba | https://jcenter.bintray.com/org/hamcrest/hamcrest-integration/1.3/hamcrest-…
+711d64522f9ec410983bd310934296da134be4254a125080a0416ec178dfad1c | https://jcenter.bintray.com/org/hamcrest/hamcrest-library/1.3/hamcrest-libr…
+1ceb4bfb0f098ae29b935044b2363e11323313fe3ed2055df8b79737d5056277 | https://jcenter.bintray.com/org/hamcrest/hamcrest-library/1.3/hamcrest-libr…
+6d535f94efb663bdb682c9f27a50335394688009642ba7a9677504bc1be4129b | https://jcenter.bintray.com/org/hamcrest/hamcrest-parent/1.3/hamcrest-paren…
+ace2a10dc8e2d5fd34925ecac03e4988b2c0f851650c94b8cef49ba1bd111478 | https://jcenter.bintray.com/org/jetbrains/annotations/13.0/annotations-13.0…
+965aeb2bedff369819bdde1bf7a0b3b89b8247dd69c88b86375d76163bb8c397 | https://jcenter.bintray.com/org/jetbrains/annotations/13.0/annotations-13.0…
+acb770bfe2faffd3704a5d79ad855ecf41a91165bb4ef4bab179b7529fb892d4 | https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-android-extensions/…
+a422c43a10feb4b0a4a426100229ce4e8b5df45077948edd0eec509a552ec583 | https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-android-extensions/…
+00f5c978f4884a7659b9d613981e4479b3227a9506e8622dc423e29e4e1d3380 | https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-annotation-processi…
+014db56312c2b7d402264d225d08c0a4c1c3bf98f8f02f1d41ba66cd30ba6783 | https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-annotation-processi…
+9729763ff014afdb7eb506a5f579da6974ab47a04a639971f916647a3877d9ef | https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-build-common/1.2.41…
+80c1295507a4f456dde8362c7796e561c461613ccc89c040e55e87e8c2000d47 | https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-build-common/1.2.41…
+e2ab5aaf76d3c63974ad667e3aeae48e80488d06420f08ec5b81df102ac5e51e | https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-compiler-embeddable…
+fff6a1348be06114fd7fefed7199233358206c538ab0cfe7f59d34e4c0f9779f | https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-compiler-embeddable…
+206ca2239053a335276e58fa41db466fffc4bf8b4a27cc63069d52abc14c9572 | https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-compiler-runner/1.2…
+782191c19e99ac17bf9ae030dc0160f45d0d9c07daaf095d62e837bdfa82a67f | https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-compiler-runner/1.2…
+e0c4e37c03d4a48d2fcf6ca5925d3cc09eabefac09e354fd9dd0655b37e708e2 | https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-daemon-client/1.2.4…
+895a8d2f076e99fceacc334c7f248890b785235737f2b2015576ea52323bb389 | https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-daemon-client/1.2.4…
+ba436f75e06013dc4b8015ba147c1146ec6cd17aa4ed1f7e2c5fecd26d945ac1 | https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-gradle-plugin/1.2.4…
+607f658e54da3a79989c3cf9f78d410d111bc623ab3386b42682a790109dae04 | https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-gradle-plugin/1.2.4…
+51ddb2077ac425c1619b9c150c5534f8a36a3cff46657e72cd4e33376537c0c5 | https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-gradle-plugin-api/1…
+ab86c4ce4a437ef53c5eadfce390003c6f3941e80ce65fa49f2964016432c6aa | https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-gradle-plugin-api/1…
+4f48a872bad6e4d9c053f4ad610d11e4012ad7e58dc19a03dd5eb811f36069dd | https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-reflect/1.2.0/kotli…
+f35215da1bed69e3d60735d76221d7012cd1a5bc0a30f6f7421719ada463b4dd | https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-reflect/1.2.0/kotli…
+1bab75771dfa2bb5949cd383ceaedf6f8d354fa0d677804fc5a39e320bab70d3 | https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-reflect/1.2.41/kotl…
+59bd71c9eb0029386c34da8fe324e5adb77e7f653bae22c36e5ba7cfaf7d2ffd | https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-reflect/1.2.41/kotl…
+3c6a25008fb927815fd6b03f0b33694d53d24078c966d1ca54ab6019d5552ecb | https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-script-runtime/1.2.…
+eb1fec93b39883a644c416504c136a609af6283d3e90fc09664f01ca5d299da2 | https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-script-runtime/1.2.…
+358700f7a5b932bce30ebb0010641a9cade4b8499a60845717b2e22a39697f92 | https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib/1.1.60/kotli…
+05cfd9f5ac0b41910703a8925f7211a495909b27a2ffdd1c5106f1689aeafcd4 | https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib/1.2.0/kotlin…
+ca9778da4afbcd421b09384b257c9de47f610aec5c9165e0209228d25a337a20 | https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib/1.2.0/kotlin…
+f0595b9ed88ddc6fd66bddf68c56c6f2f6c4b17faa51e43e478acad32b05303e | https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib/1.2.41/kotli…
+9fb5e136d7d550300ebf6f61e22d1bb14193e08a41f21fab474b1f2a44e0de33 | https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib/1.2.41/kotli…
+4c895c270b87f5fec2a2796e1d89c15407ee821de961527c28588bb46afbc68b | https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib/1.2.71/kotli…
+713db77c9a0c47a670f95c23b0051b9bd942b3a0ea1f6cc9bb5d9eaba1fa75ae | https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib/1.2.71/kotli…
+63999687ff2fce8a592dd180ffbbf8f1d21c26b4044c55cdc74ff3cf3b3cf328 | https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-common/1.2.7…
+a8c3ed5892032b9e9395524a4da2953975c99628b932df3336b25d546e7c6693 | https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-common/1.2.7…
+b136bd61b240e07d4d92ce00d3bd1dbf584400a7bf5f220c2f3cd22446858082 | https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.2.71/…
+941426d95526c828e794791a1da889b62f1f29e0220cf2f2e8dc09b6197080b3 | https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.2.71/…
+ac3c8abf47790b64b4f7e2509a53f0c145e061ac1612a597520535d199946ea9 | https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.2.71/…
+845c33f0e9ed5f66bca2d7ed39873f3e75920c5e33de984c25c48760f79594b3 | https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.2.71/…
+c7a20fb951d437797afe8980aff6c1e5a03f310c661ba58ba1d4fa90cb0f2926 | https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-jre7/1.2.0/k…
+2077417c22d3ab7734ce35385e9c3f4721840fa8df925edb19abe3eea8507348 | https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-jre7/1.2.0/k…
+633524eee6ef1941f7cb1dab7ee3927b0a221ceee9047aeb5515f4cbb990c82a | https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-jre8/1.2.0/k…
+6b7a74be21c57056eed1c1606524c3b6381ba091a98925fd934567c4a524ac38 | https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-jre8/1.2.0/k…
+1917871c8deb468307a584680c87a44572f5a8b0b98c6d397fc0f5f86596dbe7 | https://jcenter.bintray.com/org/jetbrains/trove4j/trove4j/20160824/trove4j-…
+5c415a9d8585200de4be1947e15291cc79f599b06249375f5c9ea22d4b2d090f | https://jcenter.bintray.com/org/jetbrains/trove4j/trove4j/20160824/trove4j-…
+a31ff7d77163c0deb09e7fee59ad35ae44c2cee2cc8552a116ccd1583d813fb4 | https://jcenter.bintray.com/org/jvnet/staxex/stax-ex/1.7.7/stax-ex-1.7.7.jar
+27cb450b6c367a00bd8362519907f84defac7b12086c64d4d6e97e33ab873ead | https://jcenter.bintray.com/org/jvnet/staxex/stax-ex/1.7.7/stax-ex-1.7.7.pom
+d5831ee4f71055800821a34a3051cf1ed5b3702f295ffebd50f65fb5d81a71b8 | https://jcenter.bintray.com/org/mockito/mockito-core/1.10.19/mockito-core-1…
+715268d800bacd07236ee1e6f4407650e61cf979733bc262e4de15fbd13b920d | https://jcenter.bintray.com/org/mockito/mockito-core/1.10.19/mockito-core-1…
+c74330cc6b806c804fd37e74487b4fe5d7c2750c5e15fbc6efa13bdee1bdef80 | https://jcenter.bintray.com/org/objenesis/objenesis/2.1/objenesis-2.1.jar
+4054f186137e3b849a7c23c9e846cd57d8a2fe32c17d4c62bd420512d74c3d3f | https://jcenter.bintray.com/org/objenesis/objenesis/2.1/objenesis-2.1.pom
+343b1a3093410e3fb26c66998423ab389c3a7441cd1a8859bd327dd15b479aa4 | https://jcenter.bintray.com/org/objenesis/objenesis-parent/2.1/objenesis-pa…
+56057490cbc1eeae6227e6eb5c6d5b324b77429b8a78d15027c77d491ef9c675 | https://jcenter.bintray.com/org/ow2/asm/asm/5.0.1/asm-5.0.1.jar
+260cc48a58764afbcadec4a9b41877c5aa826c760ae3b6b1db8bde44074c7c41 | https://jcenter.bintray.com/org/ow2/asm/asm/5.0.1/asm-5.0.1.pom
+d2da399a9967c69f0a21739256fa79d284222c223082cacadc17372244764b54 | https://jcenter.bintray.com/org/ow2/asm/asm/5.1/asm-5.1.jar
+6d079b5abf39f323baaccc68463beef5cf2e9574f333dd749ae96753f00eb205 | https://jcenter.bintray.com/org/ow2/asm/asm/5.1/asm-5.1.pom
+dd8971c74a4e697899a8e95caae4ea8760ea6c486dc6b97b1795e75760420461 | https://jcenter.bintray.com/org/ow2/asm/asm/6.0/asm-6.0.jar
+c2bc497e197112e699085426bbb45b1ab0be8002da68267a3b1f450a0312c32e | https://jcenter.bintray.com/org/ow2/asm/asm/6.0/asm-6.0.pom
+a34658f5c5de4b573eef21131cc32cc25f7b66407944f312b28ec2e56abb1fa9 | https://jcenter.bintray.com/org/ow2/asm/asm-analysis/5.1/asm-analysis-5.1.j…
+81120db4d5490c4f0e9789e1178d2bac231fcff2618bd80f8ef6ff03c550d59b | https://jcenter.bintray.com/org/ow2/asm/asm-analysis/5.1/asm-analysis-5.1.p…
+2f1a6387219c3a6cc4856481f221b03bd9f2408a326d416af09af5d6f608c1f4 | https://jcenter.bintray.com/org/ow2/asm/asm-analysis/6.0/asm-analysis-6.0.j…
+d3aaf42e40e3e24aabda53b5de4de5e17cb78e06549bf37312dca6c77e251054 | https://jcenter.bintray.com/org/ow2/asm/asm-analysis/6.0/asm-analysis-6.0.p…
+fb1cb7fa27d892712ced8fbf8d027eb5052ecd3999dba1ba47824357accb40e7 | https://jcenter.bintray.com/org/ow2/asm/asm-commons/5.0.1/asm-commons-5.0.1…
+c3fb02564ca173e45548d7a91aca1efe341db11da2656199d559773e7ae15edf | https://jcenter.bintray.com/org/ow2/asm/asm-commons/5.0.1/asm-commons-5.0.1…
+97b3786e1f55e74bddf8ad102bf50e33bbcbc1f6b7fd7b36f0bbbb25cd4981be | https://jcenter.bintray.com/org/ow2/asm/asm-commons/5.1/asm-commons-5.1.jar
+cd36b31f1495f4fe55a936dd00607abdd945e1f8074549225a04c402d1d35750 | https://jcenter.bintray.com/org/ow2/asm/asm-commons/5.1/asm-commons-5.1.pom
+9884c02d47244364e1fb27675b5ef3b206a2d2d3141ac77f57fd771a175c2a2f | https://jcenter.bintray.com/org/ow2/asm/asm-parent/5.0.1/asm-parent-5.0.1.p…
+85ec8258fafc283f61647e6a11b404890821c11db6fcf550779ecf7a14151007 | https://jcenter.bintray.com/org/ow2/asm/asm-parent/5.1/asm-parent-5.1.pom
+791d064bb9ecc9a46d43bc9efecd74c91464dfc451f321b802d2261e2ccd7d14 | https://jcenter.bintray.com/org/ow2/asm/asm-parent/6.0/asm-parent-6.0.pom
+ff2aceed10da9930a44f6c8f81c6372d5e55eb59c4e0ea9d37f77dfd765fa9fa | https://jcenter.bintray.com/org/ow2/asm/asm-tree/5.0.1/asm-tree-5.0.1.jar
+401429d864e4c28b0ef7bc9213ac7b48989f8a9a26db200abb8c65f41f5a503e | https://jcenter.bintray.com/org/ow2/asm/asm-tree/5.0.1/asm-tree-5.0.1.pom
+c0de2bbc4cb8297419659813ecd4ed1d077ed1dd5c1f5544cc5143e493e84c10 | https://jcenter.bintray.com/org/ow2/asm/asm-tree/5.1/asm-tree-5.1.jar
+fb5369fc7ea4b2e3cf8d6f20243f1d97f81341bf818b179cd8dbd1da7a781a21 | https://jcenter.bintray.com/org/ow2/asm/asm-tree/5.1/asm-tree-5.1.pom
+887998fb69727c8759e4d253f856822801e33f9fd4caa566b3ac58ee92106215 | https://jcenter.bintray.com/org/ow2/asm/asm-tree/6.0/asm-tree-6.0.jar
+36887e0d7fdb185a92378a38ea45e596a97f10f385c5d050eb6252454ee701b4 | https://jcenter.bintray.com/org/ow2/asm/asm-tree/6.0/asm-tree-6.0.pom
+ee032c39ae5e3cd099148fbba9a2124f9ed613e5cb93e03ee0fa8808ce364040 | https://jcenter.bintray.com/org/ow2/asm/asm-util/5.1/asm-util-5.1.jar
+0c0e9d1857c250d1d71b5c6be7b8cc29afe55e7419a90d13bbe968ae5bd7240e | https://jcenter.bintray.com/org/ow2/asm/asm-util/5.1/asm-util-5.1.pom
+51215c67d2c068d8b7d2f6f80f51372a098075deccc448d4bdd7b987ba8328fb | https://jcenter.bintray.com/org/ow2/ow2/1.3/ow2-1.3.pom
+8eab08facfe2a8cd22f6a09f4378f012a5985c0d4f4ad4e203e00f75b5568458 | https://jcenter.bintray.com/org/robolectric/annotations/3.8/annotations-3.8…
+bf40b33056435efecf61ca46a0920af23ccc1660202f64d554aee41192db921f | https://jcenter.bintray.com/org/robolectric/annotations/3.8/annotations-3.8…
+042575dbc95dc82ec046d13438ccda578917ce786d2f464cba0eb18da1f412cb | https://jcenter.bintray.com/org/robolectric/junit/3.8/junit-3.8.jar
+61e4385874b356b8fb471551a0e3896639235162b3e027368897a96c4c9ab2bd | https://jcenter.bintray.com/org/robolectric/junit/3.8/junit-3.8.pom
+6d11e6d39df8eda837c52319cf8d6bef424df45be6f29b3a731707832eb6ffc1 | https://jcenter.bintray.com/org/robolectric/resources/3.8/resources-3.8.jar
+f5c0786b4db83e511a9e3fb2057a62d6861eb763507e2c6c8a07775d77938b5c | https://jcenter.bintray.com/org/robolectric/resources/3.8/resources-3.8.pom
+34908fc858e6e4113be2cf97fe55d3ffa4462bf7183d466542582ca1898ce60a | https://jcenter.bintray.com/org/robolectric/robolectric/3.8/robolectric-3.8…
+10ac87594ff278171fd93b060ce8f6ff728017cb947a1ac9eb4b41ac15c8c62b | https://jcenter.bintray.com/org/robolectric/robolectric/3.8/robolectric-3.8…
+cc257dc75c5af9e62a43572ac89dff4d8520427307cf973e6b663c88fb000720 | https://jcenter.bintray.com/org/robolectric/sandbox/3.8/sandbox-3.8.jar
+1ed4828519379b818869109119fb58ea8507cd0ac3d3d81399d74cd3c4968b21 | https://jcenter.bintray.com/org/robolectric/sandbox/3.8/sandbox-3.8.pom
+28bc24cb5c4b4030852cebebfd5f12536d03088892cb3c8b1d1379297087aca8 | https://jcenter.bintray.com/org/robolectric/shadowapi/3.8/shadowapi-3.8.jar
+d829088fff1f348db140a8360269e829e9bcdc9fa05dc8facfbcf377c5ebbc45 | https://jcenter.bintray.com/org/robolectric/shadowapi/3.8/shadowapi-3.8.pom
+83548db7249edf1af87e1a1f4d8f4eec3e85d6220161da601e6f6398476911b2 | https://jcenter.bintray.com/org/robolectric/shadows-framework/3.8/shadows-f…
+57da4b662882bb49b58d09fa3226e7c42a34e4030cf9f71ec2779e8334ffda70 | https://jcenter.bintray.com/org/robolectric/shadows-framework/3.8/shadows-f…
+e945d04d40e37554e02d4be1bc3abf9bede45375c843aa36d10ccb6b63edbf34 | https://jcenter.bintray.com/org/robolectric/utils/3.8/utils-3.8.jar
+00f42db29b1d9dcb7a7f92602a92e40d053be3030c6efd030e3f9858ceb60c99 | https://jcenter.bintray.com/org/robolectric/utils/3.8/utils-3.8.pom
+50cadbcd70d80cf627661628e9d5163fe4f0757b87e89e68b43663b509c031d5 | https://jcenter.bintray.com/org/simpleframework/simple-common/6.0.1/simple-…
+70cc10a9e0b028dd98ca870354afc45eb61eebbd5c6b247b9dd00b4af2b9279a | https://jcenter.bintray.com/org/simpleframework/simple-common/6.0.1/simple-…
+ef5ff4dc0257c1eebed07da22b4695ffdd3030da8d224282fb9c565b56cf2f24 | https://jcenter.bintray.com/org/simpleframework/simple-http/6.0.1/simple-ht…
+1870cb5f561ac94760064c5eff8d4259692dd5845680113e78ed9b239e6cf34a | https://jcenter.bintray.com/org/simpleframework/simple-http/6.0.1/simple-ht…
+1bd627d7252500462075f4a08cd0db4dbbf1ccecc08b093709551b54c8649085 | https://jcenter.bintray.com/org/simpleframework/simple-transport/6.0.1/simp…
+616da56b2e90bf055b90436800259a8f82715f8e03307c512483328380a51248 | https://jcenter.bintray.com/org/simpleframework/simple-transport/6.0.1/simp…
+fbd7b254e02d8aef60c418a5f0e14a783b38a16162caffb2d2a16ccd5d2c09b4 | https://jcenter.bintray.com/org/slf4j/slf4j-android/1.7.25/slf4j-android-1.…
+bd9b9cb1a3987b1427f7a18babe7f92078e32bbe2e1dca6dced00cc0e3a077a9 | https://jcenter.bintray.com/org/slf4j/slf4j-android/1.7.25/slf4j-android-1.…
+18c4a0095d5c1da6b817592e767bb23d29dd2f560ad74df75ff3961dbde25b79 | https://jcenter.bintray.com/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar
+7cd9d7a0b5d93dfd461a148891b43509cf403a9c7f9fb49060d3554df1c81e1e | https://jcenter.bintray.com/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.pom
+18f5c52120db036e88d6136f8839c832d074bdda95c756c6f429249d2db54ac6 | https://jcenter.bintray.com/org/slf4j/slf4j-parent/1.7.25/slf4j-parent-1.7.…
+c513995cf019d9213d4fda666589937b2bf1bea5c4cdd337e6170e80b18406ee | https://jcenter.bintray.com/org/sonatype/oss/oss-parent/4/oss-parent-4.pom
+b51f8867c92b6a722499557fc3a1fdea77bdf9ef574722fe90ce436a29559454 | https://jcenter.bintray.com/org/sonatype/oss/oss-parent/7/oss-parent-7.pom
+fb40265f982548212ff82e362e59732b2187ec6f0d80182885c14ef1f982827a | https://jcenter.bintray.com/org/sonatype/oss/oss-parent/9/oss-parent-9.pom
+d4e441fda1b3ad70b266793cc4b6d02bec8720875b796fadc063fc713f948549 | https://jcenter.bintray.com/org/yaml/snakeyaml/1.24/snakeyaml-1.24-android.…
+174d423722256823edbe2af8d7e3385c4645cf72382a22da0485b3b674394f37 | https://jcenter.bintray.com/org/yaml/snakeyaml/1.24/snakeyaml-1.24.pom
+34e08ee62116071cbb69c0ed70d15a7a5b208d62798c59f2120bb8929324cb63 | https://jcenter.bintray.com/xmlpull/xmlpull/1.1.3.1/xmlpull-1.1.3.1.jar
+8f10ffd8df0d3e9819c8cc8402709c6b248bc53a954ef6e45470d9ae3a5735fb | https://jcenter.bintray.com/xmlpull/xmlpull/1.1.3.1/xmlpull-1.1.3.1.pom
+bfc90e9e32d0eab1f397fb974b5f150a815188382ac41f372a7149d5bc178008 | https://jcenter.bintray.com/xpp3/xpp3_min/1.1.4c/xpp3_min-1.1.4c.jar
+b5b46ac0c09da41b04dbc753456b48912856a7ffbb1490676910b510c471d13f | https://jcenter.bintray.com/xpp3/xpp3_min/1.1.4c/xpp3_min-1.1.4c.pom
+3a616a32f433e9e23f556b38575c31b013613d3ae85206263b7625fe1f4c151a | https://maven.google.com/android/arch/core/common/1.1.1/common-1.1.1.jar
+eb91acbeeaccc7fa382f88b02a22d5eddf314665bbb8fed090c067b703f50a5c | https://maven.google.com/android/arch/core/common/1.1.1/common-1.1.1.pom
+c3215aa5873311b3f88a6f4e4a3c25ad89971bc127de8c3e1291c57f93a05c39 | https://maven.google.com/android/arch/core/runtime/1.1.1/runtime-1.1.1.aar
+30453099142d085d801460a20d7e02a3f4d3004238879eaeb62083f59f1193a9 | https://maven.google.com/android/arch/core/runtime/1.1.1/runtime-1.1.1.pom
+8d378e88ebd5189e09eef623414812c868fd90aa519d6160e2311fb8b81cff56 | https://maven.google.com/android/arch/lifecycle/common/1.1.1/common-1.1.1.j…
+1742e74f222d06ea26f811191adf18e4cb74213b785e3f5d0d930224e83b4e82 | https://maven.google.com/android/arch/lifecycle/common/1.1.1/common-1.1.1.p…
+7078b5c8ccb94203df9cc2a463c69cf0021596e6cf966d78fbfd697aaafe0630 | https://maven.google.com/android/arch/lifecycle/common-java8/1.1.1/common-j…
+24ae9a6ad8234173ba20eef298fbd56ed3dff618698cedbbe6b0515d24862d0a | https://maven.google.com/android/arch/lifecycle/common-java8/1.1.1/common-j…
+429426b2feec2245ffc5e75b3b5309bedb36159cf06dc71843ae43526ac289b6 | https://maven.google.com/android/arch/lifecycle/extensions/1.1.1/extensions…
+e7289037e703c2608f46a727deab8937a312a922537f6d9bdfba5a56cd8da50a | https://maven.google.com/android/arch/lifecycle/extensions/1.1.1/extensions…
+50ab0490c1ff1a7cfb4e554032998b080888946d0dd424f39900efc4a1bcd750 | https://maven.google.com/android/arch/lifecycle/livedata/1.1.1/livedata-1.1…
+e8db306738739a616a74c38533a91cc066ee194fd45f492f188164e6cb1b856e | https://maven.google.com/android/arch/lifecycle/livedata/1.1.1/livedata-1.1…
+d6fdd8b985d6178d7ea2f16986a24e83f1bee936b74d43167c69e08d3cc12c50 | https://maven.google.com/android/arch/lifecycle/livedata-core/1.1.1/livedat…
+67a11cd85fd5c96ecdb84538e1eb58d7be59200e7d36d99943f31ecb514fe2a1 | https://maven.google.com/android/arch/lifecycle/livedata-core/1.1.1/livedat…
+c4e4be66c1b2f0abec593571454e1de14013f7e0f96bf2a9f212931a48cae550 | https://maven.google.com/android/arch/lifecycle/runtime/1.1.1/runtime-1.1.1…
+c7a7d3c2a9d6c21d8b6d470933b9472c733a4799b3ff702081b608adf1c7e592 | https://maven.google.com/android/arch/lifecycle/runtime/1.1.1/runtime-1.1.1…
+7de29cfaba77d6b5d5be234c57f6812d0150d087e63941af22ba1d1f8e2bc96a | https://maven.google.com/android/arch/lifecycle/viewmodel/1.1.1/viewmodel-1…
+deae2518ee1d17db319fbaf4055e32d591d58569eb9ccad53d8d323cf1840555 | https://maven.google.com/android/arch/lifecycle/viewmodel/1.1.1/viewmodel-1…
+aba9445ffb0cb0070958cb9f37bf6ac6e4b789bcfc51ab4f6e168ea1d502c532 | https://maven.google.com/com/android/databinding/baseLibrary/3.1.4/baseLibr…
+1b93a8eac30f0fc74cb8af788da446f45144b6f5b1c9c3c71968110defe58699 | https://maven.google.com/com/android/databinding/baseLibrary/3.1.4/baseLibr…
+8b42d25a8b5c238f8c550d04a6301101a6f67e8945061fa38eeb4c2fb414ad4f | https://maven.google.com/com/android/databinding/compilerCommon/3.1.4/compi…
+a9f962192a31e347e58dce048d5654e6b171aa6602305b5501bbd7b5a9326369 | https://maven.google.com/com/android/databinding/compilerCommon/3.1.4/compi…
+271ecbc906cda8dcd9e655ba0473129c3408a4189c806f616c378e6fd18fb3b7 | https://maven.google.com/com/android/support/animated-vector-drawable/28.0.…
+d4783f9cce5b193cb59486fa9fd9f06e828fe4d2d9a5744fab372b9a4a95ecca | https://maven.google.com/com/android/support/animated-vector-drawable/28.0.…
+a3a8e5230359746ed91801579b5fbe4668e3b1c4e6a14c7d67c8f58cb0311752 | https://maven.google.com/com/android/support/appcompat-v7/28.0.0/appcompat-…
+d9f2abe237eab1b651694c0d292dea9ec5b341ae70bfaafffbbb5d46b78c5e17 | https://maven.google.com/com/android/support/appcompat-v7/28.0.0/appcompat-…
+115bde87721f7334579b0c735f60dd7c98af1bb7f34010c5b0553b95dc351aa2 | https://maven.google.com/com/android/support/asynclayoutinflater/28.0.0/asy…
+790f1d0ca7c1a65d5afb40baf5b5423fa3163f6f90a47f3193ae0c8bb11c6e78 | https://maven.google.com/com/android/support/asynclayoutinflater/28.0.0/asy…
+bc9e6b0e06ce1205f1db34f0e6193019613d19cfeb54cdccea722340d1c60f26 | https://maven.google.com/com/android/support/cardview-v7/28.0.0/cardview-v7…
+887ea96fc365743d8735b0446df3fbe77eb5a2e203acab1423346aa3319d8395 | https://maven.google.com/com/android/support/cardview-v7/28.0.0/cardview-v7…
+93c258c8a09f531a267653829742c0f8f6da0e348b11cb8655b0855628f2d4f0 | https://maven.google.com/com/android/support/collections/28.0.0/collections…
+f6c4146b8b2029e52971402d1c29ed59d2a98b4fab33ef8e6f44233ac0cf27ba | https://maven.google.com/com/android/support/collections/28.0.0/collections…
+9dfacd80423dc979048fbaed83c0ee543c46259feb2417377e79a656888d3892 | https://maven.google.com/com/android/support/coordinatorlayout/28.0.0/coord…
+cb83674d682f81daf7b2d43e965a18b83ef4f5bb02a69d14bb20175753361a4f | https://maven.google.com/com/android/support/coordinatorlayout/28.0.0/coord…
+87feffe742b8d62ca8a9833abe564838bf6a672e31c7ad1306ec4006adf90d21 | https://maven.google.com/com/android/support/cursoradapter/28.0.0/cursorada…
+5727103ce28357bce8f74655c0994508d55d060f9ec6dafba0103e7fe55f275b | https://maven.google.com/com/android/support/cursoradapter/28.0.0/cursorada…
+2da4044cffa390448dd77e31e9179fc84a1e4c896668880d35082a4bd30cd300 | https://maven.google.com/com/android/support/customtabs/28.0.0/customtabs-2…
+4f48673d6c35084926d683cdd68334a89106eb72436ffbbb30ef0a7400038021 | https://maven.google.com/com/android/support/customtabs/28.0.0/customtabs-2…
+98db03845f994e08248bf701c1ff0ccaa12e70f94251ec9272900f0f694e072b | https://maven.google.com/com/android/support/customview/28.0.0/customview-2…
+187c2729dfd51ef8db5963598d14da67bad5ceb4ea5252f382044249327010e5 | https://maven.google.com/com/android/support/customview/28.0.0/customview-2…
+7874ad1904eedc74aa41cffffb7f759d8990056f3bbbc9264911651c67c42f5f | https://maven.google.com/com/android/support/design/28.0.0/design-28.0.0.aar
+ba16a815266a3b5ce69d57e4c40ba7eb22ee91b8016f2fa3a9d73bd6917e31b4 | https://maven.google.com/com/android/support/design/28.0.0/design-28.0.0.pom
+47cdcd3e9302b7b064923f05487a5c03babbd9bbda4726b71e97791fab5d4779 | https://maven.google.com/com/android/support/documentfile/28.0.0/documentfi…
+5ffda693e34d152463f8a9a6c00407fb11747a2271c278e082a287abad3f9cba | https://maven.google.com/com/android/support/documentfile/28.0.0/documentfi…
+8f6809afae4793550c37461c9810e954ae6a23dbb4d23e5333bf18148df1150a | https://maven.google.com/com/android/support/drawerlayout/28.0.0/drawerlayo…
+424f2d0b4a3ac46e0ad5349192ad0ecdc0bfcb10ed91767a08230cd16a3cfe36 | https://maven.google.com/com/android/support/drawerlayout/28.0.0/drawerlayo…
+7bc7ee86a0db39a4b51956f3e89842d2bd962118d57d779eb6ed6b34ba0677ea | https://maven.google.com/com/android/support/interpolator/28.0.0/interpolat…
+296b5f5eaa5cb38f67bca092aaf56bf6d23a13aa07cd81a377f861f52d609f9b | https://maven.google.com/com/android/support/interpolator/28.0.0/interpolat…
+920b85efd72dc33e915b0f88a883fe73b88483c6df8751a741e17611f2460341 | https://maven.google.com/com/android/support/loader/28.0.0/loader-28.0.0.aar
+9a9bad607f4b946d1503fe9b751af156da361e642e86f4fb5355b89b9557e8df | https://maven.google.com/com/android/support/loader/28.0.0/loader-28.0.0.pom
+d287c823af5fdde72c099fcfc5f630efe9687af7a914343ae6fd92de32c8a806 | https://maven.google.com/com/android/support/localbroadcastmanager/28.0.0/l…
+351a941335421113dff16b1ff9d4618bbcb093fd1508fc8639f18c5533313091 | https://maven.google.com/com/android/support/localbroadcastmanager/28.0.0/l…
+ecf6098572e23b5155bab3b9a82b2fd1530eda6c6c157745e0f5287c66eec60c | https://maven.google.com/com/android/support/multidex/1.0.3/multidex-1.0.3.…
+c84c0e5e72761812e0140aee7d9d1a803de90668ea56efd0cfe7d23d7482e084 | https://maven.google.com/com/android/support/multidex/1.0.3/multidex-1.0.3.…
+b48db30d7e96af32f400af4b91d3b95481d8fff3146278190eb3b922d3846f15 | https://maven.google.com/com/android/support/multidex-instrumentation/1.0.2…
+c7a755c35a13737ab78ef7090b945dc1156421d845f3c86e8227858a6d95611b | https://maven.google.com/com/android/support/multidex-instrumentation/1.0.2…
+317202dddb953d152d0677dbd8bb3b9d8ef8dcd0bdee0da4f40c98826e4960e6 | https://maven.google.com/com/android/support/palette-v7/28.0.0/palette-v7-2…
+b609f2c1a2fb3edc2f9ed02214660c90e16103d992307ae531e2a1a5bae82138 | https://maven.google.com/com/android/support/palette-v7/28.0.0/palette-v7-2…
+4be8a812d73e4a80e35b91ceae127def3f0bb9726bf3bc439aa0cc81503f5728 | https://maven.google.com/com/android/support/print/28.0.0/print-28.0.0.aar
+e15dd914e64f5cfcbd91aeb1b921fd6ead39c21926e171a4955dd12c849c6e78 | https://maven.google.com/com/android/support/print/28.0.0/print-28.0.0.pom
+eb296414c1f6d4c7b522f69fe50588ea85297855db0e7806c24eb4f75409587d | https://maven.google.com/com/android/support/recyclerview-v7/28.0.0/recycle…
+3b280edfcf646b1f51256b2b6b581d8b0194514fd248666c3dfdc0a04edb8686 | https://maven.google.com/com/android/support/recyclerview-v7/28.0.0/recycle…
+d1d234f66a1b36a9aee9b94fa6c66f97128c0828078c8e889e9037ec898cd600 | https://maven.google.com/com/android/support/slidingpanelayout/28.0.0/slidi…
+be47ac0d8fd8bdd783071596c5ea271362484752d282fb8c3421d1853ad02619 | https://maven.google.com/com/android/support/slidingpanelayout/28.0.0/slidi…
+3eae72fcf02a175efa1377886e6500e6147f92104ff43ee92b9b69d59357b90d | https://maven.google.com/com/android/support/support-annotations/26.1.0/sup…
+5d5b9414f02d3fa0ee7526b8d5ddae0da67c8ecc8c4d63ffa6cf91488a93b927 | https://maven.google.com/com/android/support/support-annotations/28.0.0/sup…
+a086481e014492fd3a4d5f4459875b8a70a201258f0b225836212ee29df0091a | https://maven.google.com/com/android/support/support-annotations/28.0.0/sup…
+e17e3b01dbea3f9ea1c86943292f903ca93d2231c6242e456e0b6a9c5817118a | https://maven.google.com/com/android/support/support-compat/28.0.0/support-…
+6b79a06c2282fc0f961cfd826a26ad41ff5c457b0c11d9a6b6a63e51f53d961a | https://maven.google.com/com/android/support/support-compat/28.0.0/support-…
+bbc7f65fc95649464733af373361532ab5f9f3b749c3badaa2bbf27e574b6c6f | https://maven.google.com/com/android/support/support-core-ui/28.0.0/support…
+708ad4a6a48ce625aee395fd0625ae5441fee8f0e25861406603f765e679b544 | https://maven.google.com/com/android/support/support-core-ui/28.0.0/support…
+c81e1e98ca3cb2edae002c69cf35b22aec364b8cb2f1042c97e206eb5790ac41 | https://maven.google.com/com/android/support/support-core-utils/28.0.0/supp…
+86a744b8739e8b354d0ecaec35dd943dea9a66f0296a3a9c1eb384fc93a4eaf7 | https://maven.google.com/com/android/support/support-core-utils/28.0.0/supp…
+3772fc738ada86824ba1a4b3f197c3dbd67b7ddcfe2c9db1de95ef2e3487a915 | https://maven.google.com/com/android/support/support-fragment/28.0.0/suppor…
+d24bdade5b77b26b82d39beda9fa0f42bcdf61cb5661a3c66ddfde3f77869b07 | https://maven.google.com/com/android/support/support-fragment/28.0.0/suppor…
+266eff9605f515013eee1ebdbd8818a9270696dc807f34bbcc5fc11fb61a22c7 | https://maven.google.com/com/android/support/support-media-compat/28.0.0/su…
+e88505a92565f4c0fabb1c9a40326a339a2d51ee843c8a097828a3a85c934f27 | https://maven.google.com/com/android/support/support-media-compat/28.0.0/su…
+8b9031381c678d628c9e47b566ae1d161e1c9710f7855c759beeac7596cecf30 | https://maven.google.com/com/android/support/support-v4/28.0.0/support-v4-2…
+428da44d913e410db4dfcf732faa0082283e4eb6563a98a0bfb92022460a4dd4 | https://maven.google.com/com/android/support/support-v4/28.0.0/support-v4-2…
+f658986d968172bccfed28578471c96050780fe5e133861e4d331069cc373f4d | https://maven.google.com/com/android/support/support-vector-drawable/28.0.0…
+1e54416142b0f1274db09bbea1808f5cf9311c895bb0d84adaa18a7b5132aadc | https://maven.google.com/com/android/support/support-vector-drawable/28.0.0…
+a3b41f7f6730866b49865e86e49f988d4858699765f534300fb2ff5f9325e712 | https://maven.google.com/com/android/support/swiperefreshlayout/28.0.0/swip…
+c2e08d32b75d98a844f20be02510c830f7e5b53f64907af2270a898d59dc872f | https://maven.google.com/com/android/support/swiperefreshlayout/28.0.0/swip…
+f40bf62e26e6f95a9c376c4e318415a77053b7dbb7ec12688eb6fab93dffdf73 | https://maven.google.com/com/android/support/test/espresso/espresso-core/3.…
+29dbc557ae45cb16194324a542925f229e08a39a8b2303559d945d6f9383922a | https://maven.google.com/com/android/support/test/espresso/espresso-core/3.…
+c6485150f9f4aea1ce9d138f3d60d82ebed3fe35b340a8b1dc975ff01f3b17b2 | https://maven.google.com/com/android/support/test/espresso/espresso-idling-…
+943f87635934def570d7c32a111aa12639e4942c24beb948db6bbfb47e40d605 | https://maven.google.com/com/android/support/test/espresso/espresso-idling-…
+38ef4fa98a32dc55550ff49bb36a583e178b3a9b830fcb8dcc27bfc4254bc2bc | https://maven.google.com/com/android/support/test/monitor/1.0.2/monitor-1.0…
+9ee5eff3c8ad31da64ab1d5269f1eb8b2cad5628249f482decfc7bf0869c5ac6 | https://maven.google.com/com/android/support/test/monitor/1.0.2/monitor-1.0…
+7ddad387d1a16d4dbdbefacee070d34574e565b008117c1a163edac8ae02a6aa | https://maven.google.com/com/android/support/test/rules/1.0.2/rules-1.0.2.a…
+060847574369f86628e548438710bead0ce5da411358d2a5dbad52a4120ebb61 | https://maven.google.com/com/android/support/test/rules/1.0.2/rules-1.0.2.p…
+f04b9ae342975ba1cb3e4a06e13426e3e6b8a73faa45acba604493d83c9a4f00 | https://maven.google.com/com/android/support/test/runner/1.0.2/runner-1.0.2…
+ec65b3e544985d13e88a7cba4adb5ba49fbe624e2d97da0c9f4fc4eb1d5899a5 | https://maven.google.com/com/android/support/test/runner/1.0.2/runner-1.0.2…
+45d09fc51284c17bbab300f5122512ac7d7348a6d23bda2051648bbe76cc9aa5 | https://maven.google.com/com/android/support/transition/28.0.0/transition-2…
+771e8fe3b4dc0be4289db8e542bf134d7a032d8addedea070a3e951dc016d078 | https://maven.google.com/com/android/support/transition/28.0.0/transition-2…
+60eb1cb08f71b65c3f6123135e03ebeb5930b5e126e1e5b2ac91b386908c9d02 | https://maven.google.com/com/android/support/versionedparcelable/28.0.0/ver…
+e7d6f726e702b418998fab6284df2f509f5acdf9203ced37c8d1274f9e38447b | https://maven.google.com/com/android/support/versionedparcelable/28.0.0/ver…
+013c4c53058758ec104dbae970be58159f75dfe342ba8b937d15ff5282e35ffc | https://maven.google.com/com/android/support/viewpager/28.0.0/viewpager-28.…
+080bba6573f6a4a9b2af443bf4ecb2a7ac4302a027274cc9bf9fdd51f409430e | https://maven.google.com/com/android/support/viewpager/28.0.0/viewpager-28.…
+c731d3801ca37633eb6c90dbfa621ca41a83530cc87cdcd18d104ea951bbc9b7 | https://maven.google.com/com/android/tools/analytics-library/protos/26.1.4/…
+cc206a5df0288f3aeae4f5ce8044524c33991f351187574499ac47b0a8bd9687 | https://maven.google.com/com/android/tools/analytics-library/protos/26.1.4/…
+2f371f5b1f551e85ab08be4d6a2873471b3d44afd1ebf6aa3298f3b796bf691f | https://maven.google.com/com/android/tools/analytics-library/protos/26.2.1/…
+c7758a7ca3a1d03b26fe4ef14532f4ffbe83c7f28ee3c9146986573fc8b92e3e | https://maven.google.com/com/android/tools/analytics-library/protos/26.2.1/…
+56f7e670b8c2c44faa118948bb4ce17bcfa19c22cb937d64c935f8c91de00722 | https://maven.google.com/com/android/tools/analytics-library/shared/26.1.4/…
+b5660feebbd20c49365bac2c09ea6bc4a90788fbdb0df1c1ab5c5661b0188fd4 | https://maven.google.com/com/android/tools/analytics-library/shared/26.1.4/…
+4c1e4e705fa4d45f23aaea230557f6508155012d9c296337787c1d7b26a97f5a | https://maven.google.com/com/android/tools/analytics-library/shared/26.2.1/…
+4eacca0543cb52098c7a322b76eb431e1e27ceaaf2094a099dde6c0639a3ef01 | https://maven.google.com/com/android/tools/analytics-library/shared/26.2.1/…
+66d5b6faeaa04d6c3c423a9052febdc46e037c00ac6622d21f7ca8e2509feff9 | https://maven.google.com/com/android/tools/analytics-library/tracker/26.1.4…
+9cba044b92daf07c7cfad01884dcc3929dd7a6d73a3ccc6d294562e44312e700 | https://maven.google.com/com/android/tools/analytics-library/tracker/26.1.4…
+4a624ecc976539f755ddb0bb8dfc2dd3d08326cfec59a098dbd70f701ca7fb75 | https://maven.google.com/com/android/tools/analytics-library/tracker/26.2.1…
+fd1923c63290e6cdb1362483218fd140cb15b82ec537d1a50447bb23acd05f90 | https://maven.google.com/com/android/tools/analytics-library/tracker/26.2.1…
+608a93f89489d2b7b6940cb5456fa9c588a967b7a30177b252f50ec8c5175980 | https://maven.google.com/com/android/tools/annotations/26.1.4/annotations-2…
+dfb322069b0a3641b61f0705cd503212dd9844931f1643d8daf7dab20c84d8c4 | https://maven.google.com/com/android/tools/annotations/26.1.4/annotations-2…
+7391c6a1e080174b96e64ceb078dadd31ce4d8a2d2fee0ec65be202126f90f24 | https://maven.google.com/com/android/tools/annotations/26.2.1/annotations-2…
+64d79783e2dffc1fec58146051bdd93a2fca23113a5b8443db6eb1d77dedfdec | https://maven.google.com/com/android/tools/annotations/26.2.1/annotations-2…
+20a5111ef908e8cbab6c0a0e3ae1c031fa1460ed6bb00b4f621e9e93e6fac9f4 | https://maven.google.com/com/android/tools/build/aapt2-proto/0.1.0/aapt2-pr…
+6ca265a30441628d070e4abe03b3c3c9ddadbcf3a06283ba0d6506baaaa23bc1 | https://maven.google.com/com/android/tools/build/aapt2-proto/0.1.0/aapt2-pr…
+59adc336a67965866dadf6c0e1b9752b8f00535f87bf6cf12dbf7a57e7874575 | https://maven.google.com/com/android/tools/build/apksig/3.1.4/apksig-3.1.4.…
+436069cea7a08cc9dba247e5011655b7ae2d5f81878f278e3c6fd6b0e333cfc9 | https://maven.google.com/com/android/tools/build/apksig/3.1.4/apksig-3.1.4.…
+fe273ff4ac0d36f868a527bc00688d0049c25ee31fdb3333eef6ad582c54950b | https://maven.google.com/com/android/tools/build/builder/3.1.4/builder-3.1.…
+976aa72898099aa358983ed0c2b382b760752a62462c9ac9e9270f5dc0279e18 | https://maven.google.com/com/android/tools/build/builder/3.1.4/builder-3.1.…
+6e8d8cbf2a0c2c55a092e6d6d5ae1fe32d717bb3630846de9e844e5e6b140a3f | https://maven.google.com/com/android/tools/build/builder-model/3.1.4/builde…
+da176d1b16546a4ca987a4721a48480c038329ebb0cc90e4bd48d463d1f2c146 | https://maven.google.com/com/android/tools/build/builder-model/3.1.4/builde…
+a9f68e6abcec122f9cb5ad352d3f05a3eb03acbcdca95e4d25c16310c2c965ff | https://maven.google.com/com/android/tools/build/builder-model/3.2.1/builde…
+4d2a35833cb9afee4d37b68c16280f8afc64de0e7cecdac1022dbafa2473e31f | https://maven.google.com/com/android/tools/build/builder-model/3.2.1/builde…
+1f4ff1ce845b5f3723591757ffc7b0f1cb984d516e8390587f47f12a87dc4fe2 | https://maven.google.com/com/android/tools/build/builder-test-api/3.1.4/bui…
+6ed593017d9b10398b83eccf26024e2ea9983487ea660c3b66706d8a6eb9b129 | https://maven.google.com/com/android/tools/build/builder-test-api/3.1.4/bui…
+533ac6c2b5884bb54967a33791f2628dfdfac7981af39417a333b43d4379b6be | https://maven.google.com/com/android/tools/build/builder-test-api/3.2.1/bui…
+16c4e26de8c9ce509a2e81eb4c571d5d6a6e792d9425dbc710dca93793a4e12d | https://maven.google.com/com/android/tools/build/builder-test-api/3.2.1/bui…
+3bdb56f0bfabcd26ef63e58700f0d7e5087cd1e95e1abe2aa2e4b300b5616f15 | https://maven.google.com/com/android/tools/build/bundletool/0.1.0-alpha01/b…
+6c6776338f04a28676ab0d4ad13a1ada690998f4a843068cd3af7589f6d3e188 | https://maven.google.com/com/android/tools/build/bundletool/0.1.0-alpha01/b…
+0f4c65c004b1176c0d9a1964792a367458f62bc849c69b1a4671e7c5ac18b7b7 | https://maven.google.com/com/android/tools/build/gradle/3.1.4/gradle-3.1.4.…
+2562cf19179a3aabeeae2b84da936709fbf9c0c1ff36ec61830e3c7e1dd644b3 | https://maven.google.com/com/android/tools/build/gradle/3.1.4/gradle-3.1.4.…
+d1ea749963fc7588f5fcad1858d9b80c96e3c8e09ffa9328fdbb2afbb2c41a63 | https://maven.google.com/com/android/tools/build/gradle-api/3.1.4/gradle-ap…
+527cd7f78d5c1a0fef6acf1e89284187a5e7c905065011dc984822bf27645666 | https://maven.google.com/com/android/tools/build/gradle-api/3.1.4/gradle-ap…
+aa5e52540de16873a7636ea41add40a3ceed139025a692fd3018bbeea4361dda | https://maven.google.com/com/android/tools/build/gradle-core/3.1.4/gradle-c…
+614f205bfaecc0a4e23157a6526571d791e45fca37203e6ac127dde50f9231ce | https://maven.google.com/com/android/tools/build/gradle-core/3.1.4/gradle-c…
+3d61b467d5a2f5a49b3efba86e0b9d171e0fd8988b5f8688fc596db09b7a8cb1 | https://maven.google.com/com/android/tools/build/manifest-merger/26.1.4/man…
+3ba08827c0469c302f04feec69915612f7e37587ae4ed3ccf6d8a5955d90b277 | https://maven.google.com/com/android/tools/build/manifest-merger/26.1.4/man…
+8830573263361035d38cfdcb51e2db94029c93865b21334f5fbf8a27984281a6 | https://maven.google.com/com/android/tools/build/manifest-merger/26.2.1/man…
+56c44bf0b7adc2d174ec5a93502c9188ac3e5c48668a732fbb161d08d54dbe19 | https://maven.google.com/com/android/tools/build/manifest-merger/26.2.1/man…
+4de4a3d05e1c534c2db9e4588bf34082bb2bd232d8abb9727c430290ce225740 | https://maven.google.com/com/android/tools/build/transform-api/2.0.0-deprec…
+7c62f3856e8abca1d79257925f26c12668693f5d95904056bbac88605cfd8575 | https://maven.google.com/com/android/tools/build/transform-api/2.0.0-deprec…
+3d5b574de3255d0b3ef2346cb2cf15b0475a2092d759c901af67de3b4bd62d47 | https://maven.google.com/com/android/tools/common/26.1.4/common-26.1.4.jar
+3e16cab88f80a04cbf37a3b2beb706140b0498243edd94fa60799d5097fdaf75 | https://maven.google.com/com/android/tools/common/26.1.4/common-26.1.4.pom
+a50aab2d6411ff68f4004a87c7e93d87d8e980a0ec3b352246549897ea2d78e5 | https://maven.google.com/com/android/tools/common/26.2.1/common-26.2.1.jar
+c5bd83a597baf99567c4469795d155c1928dc738e0eff398d96e38f8ad78b21f | https://maven.google.com/com/android/tools/common/26.2.1/common-26.2.1.pom
+a3a3126b8215c550b6db6626c8ed650cdaa0c62c7b37a9a73fc7e7aca584ff7f | https://maven.google.com/com/android/tools/ddms/ddmlib/26.1.4/ddmlib-26.1.4…
+b986e81e244c1e77ae5b0f0e1cf5f0183284741a1a27676af85a3bfe4fce092f | https://maven.google.com/com/android/tools/ddms/ddmlib/26.1.4/ddmlib-26.1.4…
+a4bf0a29a19980bf27269465cc782064656750b77c26728f82f9e148b705218b | https://maven.google.com/com/android/tools/ddms/ddmlib/26.2.1/ddmlib-26.2.1…
+79ba9d3e1f1d5b975a9e29d9261bd449c730f152ed4c5ebb3e297719eff050f0 | https://maven.google.com/com/android/tools/ddms/ddmlib/26.2.1/ddmlib-26.2.1…
+c50a8362a38c44c0e9f1b9e3b486d5f76c2f61294138c65769ebb6ab832c08ce | https://maven.google.com/com/android/tools/dvlib/26.1.4/dvlib-26.1.4.jar
+5a70c2cf91aff0b4220a55a64eebdca83fc43920a349f74141bbc7b2dc89adf7 | https://maven.google.com/com/android/tools/dvlib/26.1.4/dvlib-26.1.4.pom
+72a83bf2839b1df9b1fbf67ba45d1bfb9f966cd774da4320c762b2be8f1688aa | https://maven.google.com/com/android/tools/dvlib/26.2.1/dvlib-26.2.1.jar
+1ca1b14c0281275a58b67cd5e3af180d65a105340d89f0766e6bd0eee6047281 | https://maven.google.com/com/android/tools/dvlib/26.2.1/dvlib-26.2.1.pom
+1e0a5d4bf41fdd752050a78adaec421da232284000282200df9b83ffaaf019b9 | https://maven.google.com/com/android/tools/external/com-intellij/intellij-c…
+a91fc3a2d29675cd426411c7411ba31383cda32ae522e986c2d579847e6afc3b | https://maven.google.com/com/android/tools/external/com-intellij/intellij-c…
+4925ad1892c2687cb1a63427d440ef519c8c59215fefe0dc5d541d5d411fcafe | https://maven.google.com/com/android/tools/external/com-intellij/intellij-c…
+7cd28289534ac8effe3c4f18eccffc79eb5774c271da390ba49a34961e692881 | https://maven.google.com/com/android/tools/external/com-intellij/intellij-c…
+f8d7fd8923070038dd35ff719d874ce968ea67684efa511169538ea1e8e4dc4a | https://maven.google.com/com/android/tools/external/com-intellij/kotlin-com…
+688257f7afea3b0783641d4b4e7039bc54bf779d223371665f742deb513fa2fc | https://maven.google.com/com/android/tools/external/com-intellij/kotlin-com…
+daa064fd708f340ee25fb9823c4c74104ac77f1370b76d907eb9ae6daec0a2ae | https://maven.google.com/com/android/tools/external/com-intellij/kotlin-com…
+1ccfc320980199e8bd65bcaa061514711aa7a8a8a46e420bf7be7a441565fb01 | https://maven.google.com/com/android/tools/external/com-intellij/kotlin-com…
+c63e7ab2cb4eeeb1970c9856858cac6b55229e30833fb648bd7c3a6afda0eb9e | https://maven.google.com/com/android/tools/external/org-jetbrains/uast/26.1…
+2eec0c09c1a378f726c6c27d0f9b9225ae16ef7019cfb93ce418731ce96c1510 | https://maven.google.com/com/android/tools/external/org-jetbrains/uast/26.1…
+f10f7258d2ab9189562cc0f9ad838c0378fdba439229173390a99de02ebac75b | https://maven.google.com/com/android/tools/external/org-jetbrains/uast/26.2…
+aa377092896a6dc69da9fcc84eecb410b7db12508581c43505bc921d8e90829b | https://maven.google.com/com/android/tools/external/org-jetbrains/uast/26.2…
+d911c9ed7ce2e8845d1892cd1ee35058132774d4874b6cdbc2540ee2c9c5bfa8 | https://maven.google.com/com/android/tools/layoutlib/layoutlib-api/26.1.4/l…
+960454dd6f5126928cbf01cffc5f472f7001d206e4c00e22531d11329a4c4224 | https://maven.google.com/com/android/tools/layoutlib/layoutlib-api/26.1.4/l…
+ddbf4fca123733fa011595b1cc1f4ac2937ed327b60990711fafc33c775c2ade | https://maven.google.com/com/android/tools/layoutlib/layoutlib-api/26.2.1/l…
+21e06d8c4fb95d389b66a0613dd8dbb6cc88a336931035b61c6a71db174abca7 | https://maven.google.com/com/android/tools/layoutlib/layoutlib-api/26.2.1/l…
+16c85d801af757e0c82f7802b7dcffc1e7cbaac80da25c1273de9ed5b91009cf | https://maven.google.com/com/android/tools/lint/lint/26.1.4/lint-26.1.4.jar
+41bcf09fad000d8b3e9627ddc465aad18e0b32bc4583aa76b6d0511a1d4e5769 | https://maven.google.com/com/android/tools/lint/lint/26.1.4/lint-26.1.4.pom
+7848b82ae988b90dee259ae7c7e86e05cbf52db6cd21c8bbd38ce7df08f3f8c5 | https://maven.google.com/com/android/tools/lint/lint/26.2.1/lint-26.2.1.jar
+445ce6f3c911a11c0f4a1dff662baa5e2a9a6524281a4b60226cf25dd225b548 | https://maven.google.com/com/android/tools/lint/lint/26.2.1/lint-26.2.1.pom
+988b8ee8b36f0bf09e93441aa123b75edfda642b1b093457579fc70b2e8d0f56 | https://maven.google.com/com/android/tools/lint/lint-api/26.1.4/lint-api-26…
+4551f7d0a1ea7f992adeaf650bbdc44fa5549b078d1cf6f4d6567bd1a8a96729 | https://maven.google.com/com/android/tools/lint/lint-api/26.1.4/lint-api-26…
+3b57e739de567b98bc9ab56c2c0ee66fc026b4adf5843e8f9804ca0666a6f66e | https://maven.google.com/com/android/tools/lint/lint-api/26.2.1/lint-api-26…
+8c3ad3303516cfcb96aa367757a429dbd5f6b6fa63e0c3bff4213b63fe76f69b | https://maven.google.com/com/android/tools/lint/lint-api/26.2.1/lint-api-26…
+f460c6426b63cd433ece0fb3efb7df8a8a272ae6b9d0ae9e900bc3a375e8dedc | https://maven.google.com/com/android/tools/lint/lint-checks/26.1.4/lint-che…
+23b8ceddf4ceb710253d914ea2cfe6ae7a469b94320898a11a1518f5a0957de3 | https://maven.google.com/com/android/tools/lint/lint-checks/26.1.4/lint-che…
+c86f4cc9aaee722ee4ad70062f7b5af91e9b041914af27adc09f545ab0fb3bc6 | https://maven.google.com/com/android/tools/lint/lint-checks/26.2.1/lint-che…
+d5760172fe3dedec8f1304420bc304c0c2cae1ee24972bba7ad9c03bf0ac679e | https://maven.google.com/com/android/tools/lint/lint-checks/26.2.1/lint-che…
+bf3b6cabf653a0570502d4fa8c8d0176dd13231fd16d4ebb8ff2d9650fa0f2bd | https://maven.google.com/com/android/tools/lint/lint-gradle/26.1.4/lint-gra…
+061e6b607a334c5d99a5fe117f1eef289c365ee448f576ee22f6428a1df1d5e1 | https://maven.google.com/com/android/tools/lint/lint-gradle/26.1.4/lint-gra…
+86c6d960418d3bcc9fea4066c6edcf495fb49371ae7d2eaced7f7391f0e5375a | https://maven.google.com/com/android/tools/lint/lint-gradle-api/26.1.4/lint…
+ce252401baac01a283e9dac15fbc56fec99384624a822a3a5c42adebb43b1f2d | https://maven.google.com/com/android/tools/lint/lint-gradle-api/26.1.4/lint…
+b2580f943fc447084ebde59dfe5685dddbc746c37308015872545a06fbc04495 | https://maven.google.com/com/android/tools/lint/lint-kotlin/26.1.4/lint-kot…
+68265a6aea4b1f23cf7d56bc403f94d28c5ea744381a2e9a7eb059f9c9ffc5d5 | https://maven.google.com/com/android/tools/lint/lint-kotlin/26.1.4/lint-kot…
+7a6a5d2b18f69cf1b900d857c2632b4c683713c533295933b8b759f8cab4a877 | https://maven.google.com/com/android/tools/lint/lint-kotlin/26.2.1/lint-kot…
+c4c54f08f4dbdd379d6a9d6d3e1d66e0f2106d849591112742784ae62678b3c2 | https://maven.google.com/com/android/tools/lint/lint-kotlin/26.2.1/lint-kot…
+b410e8967ee4577f39728a3b7b0f4076cb94e3b7c0d612484ac4543c54ea5357 | https://maven.google.com/com/android/tools/repository/26.1.4/repository-26.…
+ea46784bb4581223fae4ae7724ef3d99d382af89fde235086793e26ad7f236fa | https://maven.google.com/com/android/tools/repository/26.1.4/repository-26.…
+fa74dae09103faef703df38550ad8fa244c5b6d1bf90d6198be932292b3d9cc1 | https://maven.google.com/com/android/tools/repository/26.2.1/repository-26.…
+eb078adfb208eae7524d00d0ce03196a2c81353db78c7f9613885c19690cf2de | https://maven.google.com/com/android/tools/repository/26.2.1/repository-26.…
+789d3d193d75f1ddafb803e8fd27880d9b35268843fb4e91965b09814f3c9eab | https://maven.google.com/com/android/tools/sdk-common/26.1.4/sdk-common-26.…
+bb9a31ef138f0fb569ca5c417a9a0d25bf7bf5c46583bd04177e2ee6ce97d228 | https://maven.google.com/com/android/tools/sdk-common/26.1.4/sdk-common-26.…
+759d4b292ca69a35cf961fca377b54158fc6c88108978006999442e80a011cf4 | https://maven.google.com/com/android/tools/sdk-common/26.2.1/sdk-common-26.…
+dabf483508f36704e8a1d7c29cda5135ad9cdb6169f556908182954ee88e0b1f | https://maven.google.com/com/android/tools/sdk-common/26.2.1/sdk-common-26.…
+7a897ebc2b30c884fc152aba3b9c1f68276211bbd0ca6af7fe5f9d89ab7ee80a | https://maven.google.com/com/android/tools/sdklib/26.1.4/sdklib-26.1.4.jar
+f04bca1a944890691628b1364383757bdff1f527b1839842d132157c4ddc6f01 | https://maven.google.com/com/android/tools/sdklib/26.1.4/sdklib-26.1.4.pom
+248df7ad5eac4aeb6f96c394c76760de4b7b89ac056e54d0c21a739368b91b45 | https://maven.google.com/com/android/tools/sdklib/26.2.1/sdklib-26.2.1.jar
+7031d2d09683996ac126074be3de6df9b3de80f7e0f10b80a6e8754f69c80028 | https://maven.google.com/com/android/tools/sdklib/26.2.1/sdklib-26.2.1.pom
+2fa630c3928a0e0d8a5db4b1563c8e532457d75e6876937c0c9663bd0e1d2724 | https://plugins.gradle.org/m2/org/mozilla/apilint/apilint/0.2.1/apilint-0.2…
+acbf3da508a767dad51a8e9505b760f53547c758005157eae0b15f1674229559 | https://plugins.gradle.org/m2/org/mozilla/apilint/apilint/0.2.1/apilint-0.2…
diff --git a/projects/firefox/mozconfig-android-aarch64 b/projects/firefox/mozconfig-android-aarch64
index 2a9eb67..f5c1474 100644
--- a/projects/firefox/mozconfig-android-aarch64
+++ b/projects/firefox/mozconfig-android-aarch64
@@ -1,6 +1,8 @@
mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/obj-aarch64-linux-android
mk_add_options MOZ_APP_DISPLAYNAME="Tor Browser"
export MOZILLA_OFFICIAL=1
+CC="clang"
+CXX="clang++"
ac_add_options --enable-optimize
ac_add_options --enable-official-branding
@@ -9,13 +11,9 @@ ac_add_options --enable-application=mobile/android
ac_add_options --target=aarch64-linux-android
ac_add_options --with-android-ndk=/var/tmp/dist/android-toolchain/android-ndk
ac_add_options --with-android-sdk=/var/tmp/dist/android-toolchain/android-sdk-linux
-ac_add_options --with-gradle=/var/tmp/dist/android-toolchain/gradle/gradle-4.1/bin/gradle
+ac_add_options --with-gradle=/var/tmp/dist/android-toolchain/gradle/gradle-4.10.2/bin/gradle
ac_add_options --with-android-version=21
-# Android NDK does not contain llvm-config so set clang path in options
-ac_add_options --with-libclang-path=/var/tmp/dist/android-toolchain/android-ndk/arm64/lib64
-ac_add_options --with-clang-path=/var/tmp/dist/android-toolchain/android-ndk/arm64/bin/clang
-
ac_add_options --with-android-distribution-directory=@TOPSRCDIR@/mobile/android/torbrowser
ac_add_options --with-l10n-base=/var/tmp/dist/locales
@@ -40,11 +38,7 @@ ac_add_options --enable-strip
ac_add_options --disable-tests
ac_add_options --disable-debug
ac_add_options --disable-rust-debug
-ac_add_options --disable-maintenance-service
ac_add_options --disable-crashreporter
ac_add_options --disable-webrtc
ac_add_options --without-google-play-services
-
-# Let's make sure no preference is enabling either Adobe's or Google's CDM.
-ac_add_options --disable-eme
diff --git a/projects/firefox/mozconfig-android-armv7 b/projects/firefox/mozconfig-android-armv7
index 6dde8b1..75e1d78 100644
--- a/projects/firefox/mozconfig-android-armv7
+++ b/projects/firefox/mozconfig-android-armv7
@@ -1,6 +1,8 @@
mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/obj-arm-linux-androideabi
mk_add_options MOZ_APP_DISPLAYNAME="Tor Browser"
export MOZILLA_OFFICIAL=1
+CC="clang"
+CXX="clang++"
ac_add_options --enable-optimize
ac_add_options --enable-official-branding
@@ -9,13 +11,9 @@ ac_add_options --enable-application=mobile/android
ac_add_options --target=arm-linux-androideabi
ac_add_options --with-android-ndk=/var/tmp/dist/android-toolchain/android-ndk
ac_add_options --with-android-sdk=/var/tmp/dist/android-toolchain/android-sdk-linux
-ac_add_options --with-gradle=/var/tmp/dist/android-toolchain/gradle/gradle-4.1/bin/gradle
+ac_add_options --with-gradle=/var/tmp/dist/android-toolchain/gradle/gradle-4.10.2/bin/gradle
ac_add_options --with-android-version=16
-# Android NDK does not contain llvm-config so set clang path in options
-ac_add_options --with-libclang-path=/var/tmp/dist/android-toolchain/android-ndk/arm/lib64
-ac_add_options --with-clang-path=/var/tmp/dist/android-toolchain/android-ndk/arm/bin/clang
-
ac_add_options --with-android-distribution-directory=@TOPSRCDIR@/mobile/android/torbrowser
ac_add_options --with-l10n-base=/var/tmp/dist/locales
@@ -40,11 +38,7 @@ ac_add_options --enable-strip
ac_add_options --disable-tests
ac_add_options --disable-debug
ac_add_options --disable-rust-debug
-ac_add_options --disable-maintenance-service
ac_add_options --disable-crashreporter
ac_add_options --disable-webrtc
ac_add_options --without-google-play-services
-
-# Let's make sure no preference is enabling either Adobe's or Google's CDM.
-ac_add_options --disable-eme
diff --git a/projects/firefox/mozconfig-android-x86 b/projects/firefox/mozconfig-android-x86
index b332f52..be1efd6 100644
--- a/projects/firefox/mozconfig-android-x86
+++ b/projects/firefox/mozconfig-android-x86
@@ -1,21 +1,19 @@
mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/obj-i386-linux-android
mk_add_options MOZ_APP_DISPLAYNAME="Tor Browser"
export MOZILLA_OFFICIAL=1
+CC="clang"
+CXX="clang++"
ac_add_options --enable-optimize
ac_add_options --enable-official-branding
ac_add_options --enable-application=mobile/android
-ac_add_options --target=i386-linux-android
+ac_add_options --target=i686-linux-android
ac_add_options --with-android-ndk=/var/tmp/dist/android-toolchain/android-ndk
ac_add_options --with-android-sdk=/var/tmp/dist/android-toolchain/android-sdk-linux
-ac_add_options --with-gradle=/var/tmp/dist/android-toolchain/gradle/gradle-4.1/bin/gradle
+ac_add_options --with-gradle=/var/tmp/dist/android-toolchain/gradle/gradle-4.10.2/bin/gradle
ac_add_options --with-android-version=16
-# Android NDK does not contain llvm-config so set clang path in options
-ac_add_options --with-libclang-path=/var/tmp/dist/android-toolchain/android-ndk/x86/lib64
-ac_add_options --with-clang-path=/var/tmp/dist/android-toolchain/android-ndk/x86/bin/clang
-
ac_add_options --with-android-distribution-directory=@TOPSRCDIR@/mobile/android/torbrowser
ac_add_options --with-l10n-base=/var/tmp/dist/locales
@@ -40,11 +38,7 @@ ac_add_options --enable-strip
ac_add_options --disable-tests
ac_add_options --disable-debug
ac_add_options --disable-rust-debug
-ac_add_options --disable-maintenance-service
ac_add_options --disable-crashreporter
ac_add_options --disable-webrtc
ac_add_options --without-google-play-services
-
-# Let's make sure no preference is enabling either Adobe's or Google's CDM.
-ac_add_options --disable-eme
1
0

[tor-browser-build/master] Bug 30461: Update tor-android-service Project to Use Android Toolchain (Firefox 68)
by gk@torproject.org 01 Sep '19
by gk@torproject.org 01 Sep '19
01 Sep '19
commit 98a22a9b3e74dd73a62af60830ad2f5a6019dbba
Author: sisbell <shane.isbell(a)gmail.com>
Date: Wed Jul 17 02:30:09 2019 -0700
Bug 30461: Update tor-android-service Project to Use Android Toolchain (Firefox 68)
---
projects/tor-android-service/build | 9 +-
projects/tor-android-service/config | 8 +-
projects/tor-android-service/disable-daemon.patch | 19 +
.../gradle-dependencies-list.txt | 447 +++++++++++++--------
projects/tor-android-service/gradle.patch | 37 --
projects/tor-android-service/maven-local.patch | 23 ++
.../tor-android-service/remove-native-build.patch | 17 +
7 files changed, 339 insertions(+), 221 deletions(-)
diff --git a/projects/tor-android-service/build b/projects/tor-android-service/build
index 10c2f04..69f6147 100644
--- a/projects/tor-android-service/build
+++ b/projects/tor-android-service/build
@@ -2,8 +2,6 @@
[% c("var/set_default_env") -%]
output_dir=[% dest_dir %]/[% c('filename') %]
gradle_repo=$rootdir/[% c('input_files_by_name/gradle-dependencies') %]
-export GRADLE_MAVEN_REPO="file://$gradle_repo"
-
# The download script assumes artifact package name is the complete URL path.
# In some cases this is incorrect, so copy those artifacts to correct location
cp -r $gradle_repo/dl/android/maven2/* $gradle_repo
@@ -15,10 +13,11 @@ mkdir -p /var/tmp/build $output_dir
[% pc(c('var/compiler'), 'var/setup', { compiler_tarfile => c('input_files_by_name/' _ c('var/compiler')) }) %]
tar -C /var/tmp/build -xf [% project %]-[% c('version') %].tar.gz
-# Patch projects
cd /var/tmp/build/[% project %]-[% c('version') %]
-patch -p1 < $rootdir/gradle.patch
patch -p1 < $rootdir/require-api.patch
+patch -p1 < $rootdir/remove-native-build.patch
+patch -p1 < $rootdir/disable-daemon.patch
+patch -p1 < $rootdir/maven-local.patch
# Remove native files, otherwise build will fail after gradle.patch
rm -fR service/src/main/jni
@@ -28,7 +27,7 @@ rm service/libs/*
cp $rootdir/[% c('input_files_by_name/topl') %]/*{.aar,.jar} service/libs/
# Build Android Libraries and Apps
-$GRADLE_HOME/gradle-4.1/bin/gradle --offline -P androidplugin=3.0.1 -P appcompatVersion=23.4.0 -P compileVersion=26 -P targetVersion=26 -P minVersion=16 assembleRelease -x lint
+$GRADLE_HOME/gradle-4.10.2/bin/gradle --offline --no-daemon -P androidplugin=3.1.0 -P appcompatVersion=28.0.0 -P compileVersion=28 -P targetVersion=28 -P minVersion=16 -Dmaven.repo.local=$gradle_repo assembleRelease -x lint
# Package
cp jsocksAndroid/build/outputs/aar/* service/build/outputs/aar/* $output_dir
diff --git a/projects/tor-android-service/config b/projects/tor-android-service/config
index 9a90ebd..cc9eded 100644
--- a/projects/tor-android-service/config
+++ b/projects/tor-android-service/config
@@ -11,7 +11,7 @@ var:
container:
use_container: 1
# this should be updated when the list of gradle dependencies is changed
- gradle_dependencies_version: 2
+ gradle_dependencies_version: 3
targets:
android:
@@ -26,7 +26,9 @@ input_files:
- filename: 'gradle-dependencies-[% c("var/gradle_dependencies_version") %]'
name: gradle-dependencies
exec: '[% INCLUDE "fetch-gradle-dependencies" %]'
- - filename: gradle.patch
- - filename: require-api.patch
- project: tor-onion-proxy-library
name: topl
+ - filename: require-api.patch
+ - filename: remove-native-build.patch
+ - filename: disable-daemon.patch
+ - filename: maven-local.patch
diff --git a/projects/tor-android-service/disable-daemon.patch b/projects/tor-android-service/disable-daemon.patch
new file mode 100644
index 0000000..5156d77
--- /dev/null
+++ b/projects/tor-android-service/disable-daemon.patch
@@ -0,0 +1,19 @@
+diff --git a/gradle.properties b/gradle.properties
+index 75f5aba..27d94ab 100644
+--- a/gradle.properties
++++ b/gradle.properties
+@@ -6,7 +6,6 @@
+ # http://www.gradle.org/docs/current/userguide/build_environment.html
+ # Specifies the JVM arguments used for the daemon process.
+ # The setting is particularly useful for tweaking memory settings.
+-org.gradle.jvmargs=-Xmx1536m
+ # When configured, Gradle will run in incubating parallel mode.
+ # This option should only be used with decoupled projects. More details, visit
+ # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:…
+@@ -21,4 +20,4 @@ androidplugin=3.4.0
+ appcompatVersion=28.0.0
+ compileVersion=28
+ targetVersion=28
+-minVersion=21
+\ No newline at end of file
++minVersion=21
diff --git a/projects/tor-android-service/gradle-dependencies-list.txt b/projects/tor-android-service/gradle-dependencies-list.txt
index 96e5f1b..cd04462 100644
--- a/projects/tor-android-service/gradle-dependencies-list.txt
+++ b/projects/tor-android-service/gradle-dependencies-list.txt
@@ -1,183 +1,278 @@
# On how to update dependencies see projects/common/how-to-create-gradle-dependencies-list.txt
# Don't forget to update var/gradle_dependencies_version when modifying this file
sha256sum | url
-f0c98c571e93a7cb4dd18df0fa308f0963e7a0620ac2d4244e61e709d03ad6be | https://repo1.maven.org/maven2/com/google/j2objc/j2objc-annotations/1.1/j2o…
-965aeb2bedff369819bdde1bf7a0b3b89b8247dd69c88b86375d76163bb8c397 | https://repo1.maven.org/maven2/org/jetbrains/annotations/13.0/annotations-1…
-3d6eba428555a558de046b5d76eacc1f5a54b4f5f20b84d636ed7aff18aa48c3 | https://repo1.maven.org/maven2/org/apache/httpcomponents/project/7/project-…
-31629566148e8a47688ae43b420abc3ecd783ed15b33bebc00824bf24c9b15aa | https://repo1.maven.org/maven2/org/apache/httpcomponents/httpmime/4.1/httpm…
-905721a0eea90a81534abb7ee6ef4ea2e5e645fa1def0a5cd88402df1b46c9ed | https://repo1.maven.org/maven2/com/google/code/findbugs/jsr305/1.3.9/jsr305…
-bd9b9cb1a3987b1427f7a18babe7f92078e32bbe2e1dca6dced00cc0e3a077a9 | https://repo1.maven.org/maven2/org/slf4j/slf4j-android/1.7.25/slf4j-android…
-58aa4df8faae90e484c0bc47494a1ec97dc51fe53eae2b4a70d60ea7489cdf8c | https://dl.google.com/dl/android/maven2/com/android/tools/external/com-inte…
-2c1542faf343185b7cab9c3d55c8ae5471d6d095d3887a4adefdbdf2984dc0b6 | https://repo1.maven.org/maven2/org/apache/commons/commons-compress/1.12/com…
-467ae650442e876867379094e7518dfdd67d22c5352ebd39808c84259e9790ba | https://repo1.maven.org/maven2/org/apache/commons/commons-parent/25/commons…
-2068320bd6bad744c3673ab048f67e30bef8f518996fa380033556600669905d | https://repo1.maven.org/maven2/org/codehaus/mojo/animal-sniffer-annotations…
-c3c99bf58182889fe86315e9a01473ee2c95540b9dedef898cec64554d925c54 | https://repo1.maven.org/maven2/com/android/tools/annotations/24.5.0/annotat…
-1eaf9182e1977c1c50a70edbfbf70536398c68990bfaafc9f0e9899041201539 | https://repo1.maven.org/maven2/com/google/guava/guava-parent/22.0/guava-par…
-43edcc0fc3bd8520bf60066f54088f272e39aa856d25cdd6ca9ee4d8f5c32666 | https://dl.google.com/dl/android/maven2/com/android/support/support-vector-…
-a9d65daccc5afca97372936246ac49fb587423e005606e7981b0efc66b0e9385 | https://dl.google.com/dl/android/maven2/com/android/tools/annotations/26.0.…
-bcb7ce66a9c629fa7c723a767b6430e1a383e8d4dd543d603dcb0ad1b855b8b2 | https://dl.google.com/dl/android/maven2/com/android/support/animated-vector…
-cb4cfad870bf563a07199f3ebea5763f0dec440fcda0b318640b1feaa788656b | https://repo1.maven.org/maven2/com/google/errorprone/error_prone_annotation…
-e4c7afb8f0d7aa159318d42a011cc2c9b0525d820973cbca5318bec6c649cecc | https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java/3.0.0/prot…
-45eb0d6e49430271b5fb385c53fae0b81d6ad3eae465a7a8d948217bcae1e86d | https://repo1.maven.org/maven2/com/android/tools/external/lombok/lombok-ast…
+3a616a32f433e9e23f556b38575c31b013613d3ae85206263b7625fe1f4c151a | https://dl.google.com/dl/android/maven2/android/arch/core/common/1.1.1/comm…
+eb91acbeeaccc7fa382f88b02a22d5eddf314665bbb8fed090c067b703f50a5c | https://dl.google.com/dl/android/maven2/android/arch/core/common/1.1.1/comm…
+c3215aa5873311b3f88a6f4e4a3c25ad89971bc127de8c3e1291c57f93a05c39 | https://dl.google.com/dl/android/maven2/android/arch/core/runtime/1.1.1/run…
+30453099142d085d801460a20d7e02a3f4d3004238879eaeb62083f59f1193a9 | https://dl.google.com/dl/android/maven2/android/arch/core/runtime/1.1.1/run…
+8d378e88ebd5189e09eef623414812c868fd90aa519d6160e2311fb8b81cff56 | https://dl.google.com/dl/android/maven2/android/arch/lifecycle/common/1.1.1…
+1742e74f222d06ea26f811191adf18e4cb74213b785e3f5d0d930224e83b4e82 | https://dl.google.com/dl/android/maven2/android/arch/lifecycle/common/1.1.1…
+50ab0490c1ff1a7cfb4e554032998b080888946d0dd424f39900efc4a1bcd750 | https://dl.google.com/dl/android/maven2/android/arch/lifecycle/livedata/1.1…
+e8db306738739a616a74c38533a91cc066ee194fd45f492f188164e6cb1b856e | https://dl.google.com/dl/android/maven2/android/arch/lifecycle/livedata/1.1…
+d6fdd8b985d6178d7ea2f16986a24e83f1bee936b74d43167c69e08d3cc12c50 | https://dl.google.com/dl/android/maven2/android/arch/lifecycle/livedata-cor…
+67a11cd85fd5c96ecdb84538e1eb58d7be59200e7d36d99943f31ecb514fe2a1 | https://dl.google.com/dl/android/maven2/android/arch/lifecycle/livedata-cor…
+c4e4be66c1b2f0abec593571454e1de14013f7e0f96bf2a9f212931a48cae550 | https://dl.google.com/dl/android/maven2/android/arch/lifecycle/runtime/1.1.…
+c7a7d3c2a9d6c21d8b6d470933b9472c733a4799b3ff702081b608adf1c7e592 | https://dl.google.com/dl/android/maven2/android/arch/lifecycle/runtime/1.1.…
+7de29cfaba77d6b5d5be234c57f6812d0150d087e63941af22ba1d1f8e2bc96a | https://dl.google.com/dl/android/maven2/android/arch/lifecycle/viewmodel/1.…
+deae2518ee1d17db319fbaf4055e32d591d58569eb9ccad53d8d323cf1840555 | https://dl.google.com/dl/android/maven2/android/arch/lifecycle/viewmodel/1.…
+788dd6aa22a49fecd1d7125b717c46103025bb647f9b50b6cb70f58e0962884d | https://dl.google.com/dl/android/maven2/com/android/databinding/baseLibrary…
+79d0d2111187b8af3ad3635d815595f7b50c49685463784fe6bd7c3f897358e3 | https://dl.google.com/dl/android/maven2/com/android/databinding/baseLibrary…
+5c7d7b188eb06a074a0c7131fc5a22cd9f3fc2cd5810ec32222d18cffdf8144f | https://dl.google.com/dl/android/maven2/com/android/databinding/compilerCom…
+cbe7dab110aa887f6d7ae1ed209eb679e1334a154f1f02b8a92a693fea6299a0 | https://dl.google.com/dl/android/maven2/com/android/databinding/compilerCom…
+271ecbc906cda8dcd9e655ba0473129c3408a4189c806f616c378e6fd18fb3b7 | https://dl.google.com/dl/android/maven2/com/android/support/animated-vector…
+d4783f9cce5b193cb59486fa9fd9f06e828fe4d2d9a5744fab372b9a4a95ecca | https://dl.google.com/dl/android/maven2/com/android/support/animated-vector…
+a3a8e5230359746ed91801579b5fbe4668e3b1c4e6a14c7d67c8f58cb0311752 | https://dl.google.com/dl/android/maven2/com/android/support/appcompat-v7/28…
+d9f2abe237eab1b651694c0d292dea9ec5b341ae70bfaafffbbb5d46b78c5e17 | https://dl.google.com/dl/android/maven2/com/android/support/appcompat-v7/28…
+115bde87721f7334579b0c735f60dd7c98af1bb7f34010c5b0553b95dc351aa2 | https://dl.google.com/dl/android/maven2/com/android/support/asynclayoutinfl…
+790f1d0ca7c1a65d5afb40baf5b5423fa3163f6f90a47f3193ae0c8bb11c6e78 | https://dl.google.com/dl/android/maven2/com/android/support/asynclayoutinfl…
+93c258c8a09f531a267653829742c0f8f6da0e348b11cb8655b0855628f2d4f0 | https://dl.google.com/dl/android/maven2/com/android/support/collections/28.…
+f6c4146b8b2029e52971402d1c29ed59d2a98b4fab33ef8e6f44233ac0cf27ba | https://dl.google.com/dl/android/maven2/com/android/support/collections/28.…
+9dfacd80423dc979048fbaed83c0ee543c46259feb2417377e79a656888d3892 | https://dl.google.com/dl/android/maven2/com/android/support/coordinatorlayo…
+cb83674d682f81daf7b2d43e965a18b83ef4f5bb02a69d14bb20175753361a4f | https://dl.google.com/dl/android/maven2/com/android/support/coordinatorlayo…
+87feffe742b8d62ca8a9833abe564838bf6a672e31c7ad1306ec4006adf90d21 | https://dl.google.com/dl/android/maven2/com/android/support/cursoradapter/2…
+5727103ce28357bce8f74655c0994508d55d060f9ec6dafba0103e7fe55f275b | https://dl.google.com/dl/android/maven2/com/android/support/cursoradapter/2…
+98db03845f994e08248bf701c1ff0ccaa12e70f94251ec9272900f0f694e072b | https://dl.google.com/dl/android/maven2/com/android/support/customview/28.0…
+187c2729dfd51ef8db5963598d14da67bad5ceb4ea5252f382044249327010e5 | https://dl.google.com/dl/android/maven2/com/android/support/customview/28.0…
+47cdcd3e9302b7b064923f05487a5c03babbd9bbda4726b71e97791fab5d4779 | https://dl.google.com/dl/android/maven2/com/android/support/documentfile/28…
+5ffda693e34d152463f8a9a6c00407fb11747a2271c278e082a287abad3f9cba | https://dl.google.com/dl/android/maven2/com/android/support/documentfile/28…
+8f6809afae4793550c37461c9810e954ae6a23dbb4d23e5333bf18148df1150a | https://dl.google.com/dl/android/maven2/com/android/support/drawerlayout/28…
+424f2d0b4a3ac46e0ad5349192ad0ecdc0bfcb10ed91767a08230cd16a3cfe36 | https://dl.google.com/dl/android/maven2/com/android/support/drawerlayout/28…
+7bc7ee86a0db39a4b51956f3e89842d2bd962118d57d779eb6ed6b34ba0677ea | https://dl.google.com/dl/android/maven2/com/android/support/interpolator/28…
+296b5f5eaa5cb38f67bca092aaf56bf6d23a13aa07cd81a377f861f52d609f9b | https://dl.google.com/dl/android/maven2/com/android/support/interpolator/28…
+920b85efd72dc33e915b0f88a883fe73b88483c6df8751a741e17611f2460341 | https://dl.google.com/dl/android/maven2/com/android/support/loader/28.0.0/l…
+9a9bad607f4b946d1503fe9b751af156da361e642e86f4fb5355b89b9557e8df | https://dl.google.com/dl/android/maven2/com/android/support/loader/28.0.0/l…
+d287c823af5fdde72c099fcfc5f630efe9687af7a914343ae6fd92de32c8a806 | https://dl.google.com/dl/android/maven2/com/android/support/localbroadcastm…
+351a941335421113dff16b1ff9d4618bbcb093fd1508fc8639f18c5533313091 | https://dl.google.com/dl/android/maven2/com/android/support/localbroadcastm…
+4be8a812d73e4a80e35b91ceae127def3f0bb9726bf3bc439aa0cc81503f5728 | https://dl.google.com/dl/android/maven2/com/android/support/print/28.0.0/pr…
+e15dd914e64f5cfcbd91aeb1b921fd6ead39c21926e171a4955dd12c849c6e78 | https://dl.google.com/dl/android/maven2/com/android/support/print/28.0.0/pr…
+d1d234f66a1b36a9aee9b94fa6c66f97128c0828078c8e889e9037ec898cd600 | https://dl.google.com/dl/android/maven2/com/android/support/slidingpanelayo…
+be47ac0d8fd8bdd783071596c5ea271362484752d282fb8c3421d1853ad02619 | https://dl.google.com/dl/android/maven2/com/android/support/slidingpanelayo…
+5d5b9414f02d3fa0ee7526b8d5ddae0da67c8ecc8c4d63ffa6cf91488a93b927 | https://dl.google.com/dl/android/maven2/com/android/support/support-annotat…
+a086481e014492fd3a4d5f4459875b8a70a201258f0b225836212ee29df0091a | https://dl.google.com/dl/android/maven2/com/android/support/support-annotat…
+e17e3b01dbea3f9ea1c86943292f903ca93d2231c6242e456e0b6a9c5817118a | https://dl.google.com/dl/android/maven2/com/android/support/support-compat/…
+6b79a06c2282fc0f961cfd826a26ad41ff5c457b0c11d9a6b6a63e51f53d961a | https://dl.google.com/dl/android/maven2/com/android/support/support-compat/…
+bbc7f65fc95649464733af373361532ab5f9f3b749c3badaa2bbf27e574b6c6f | https://dl.google.com/dl/android/maven2/com/android/support/support-core-ui…
+708ad4a6a48ce625aee395fd0625ae5441fee8f0e25861406603f765e679b544 | https://dl.google.com/dl/android/maven2/com/android/support/support-core-ui…
+c81e1e98ca3cb2edae002c69cf35b22aec364b8cb2f1042c97e206eb5790ac41 | https://dl.google.com/dl/android/maven2/com/android/support/support-core-ut…
+86a744b8739e8b354d0ecaec35dd943dea9a66f0296a3a9c1eb384fc93a4eaf7 | https://dl.google.com/dl/android/maven2/com/android/support/support-core-ut…
+3772fc738ada86824ba1a4b3f197c3dbd67b7ddcfe2c9db1de95ef2e3487a915 | https://dl.google.com/dl/android/maven2/com/android/support/support-fragmen…
+d24bdade5b77b26b82d39beda9fa0f42bcdf61cb5661a3c66ddfde3f77869b07 | https://dl.google.com/dl/android/maven2/com/android/support/support-fragmen…
+f658986d968172bccfed28578471c96050780fe5e133861e4d331069cc373f4d | https://dl.google.com/dl/android/maven2/com/android/support/support-vector-…
+1e54416142b0f1274db09bbea1808f5cf9311c895bb0d84adaa18a7b5132aadc | https://dl.google.com/dl/android/maven2/com/android/support/support-vector-…
+a3b41f7f6730866b49865e86e49f988d4858699765f534300fb2ff5f9325e712 | https://dl.google.com/dl/android/maven2/com/android/support/swiperefreshlay…
+c2e08d32b75d98a844f20be02510c830f7e5b53f64907af2270a898d59dc872f | https://dl.google.com/dl/android/maven2/com/android/support/swiperefreshlay…
+60eb1cb08f71b65c3f6123135e03ebeb5930b5e126e1e5b2ac91b386908c9d02 | https://dl.google.com/dl/android/maven2/com/android/support/versionedparcel…
+e7d6f726e702b418998fab6284df2f509f5acdf9203ced37c8d1274f9e38447b | https://dl.google.com/dl/android/maven2/com/android/support/versionedparcel…
+013c4c53058758ec104dbae970be58159f75dfe342ba8b937d15ff5282e35ffc | https://dl.google.com/dl/android/maven2/com/android/support/viewpager/28.0.…
+080bba6573f6a4a9b2af443bf4ecb2a7ac4302a027274cc9bf9fdd51f409430e | https://dl.google.com/dl/android/maven2/com/android/support/viewpager/28.0.…
+80c134366b35e375d2ed22158d8958f3732366fa80980df76bd632371368eb96 | https://dl.google.com/dl/android/maven2/com/android/tools/analytics-library…
+5a3f320877640666ea483eb6764e6d407c283c324d4d45b38db9d5fbfc8bdf8b | https://dl.google.com/dl/android/maven2/com/android/tools/analytics-library…
+9772cb36f7498ca30f0accf25911560753fbe9167c3af58e8b00e7eb6ac1f7c3 | https://dl.google.com/dl/android/maven2/com/android/tools/analytics-library…
+8c5adb944e161657e866270783fb92a4a6bf2c1e5d3211a98b7ab1b3b7c91cb2 | https://dl.google.com/dl/android/maven2/com/android/tools/analytics-library…
+ed9d26dce59d2e5b436702da2f7c57d52754c3afbc558872db30ac110279967d | https://dl.google.com/dl/android/maven2/com/android/tools/analytics-library…
+77fa615c35438801d49a487f82b6426d5f55c516b7a287d975c25432dc77af7a | https://dl.google.com/dl/android/maven2/com/android/tools/analytics-library…
+cd69e90c331faa78ae5e65509a2ac9df452d1ee2bad7cf3034f073fc1c1305af | https://dl.google.com/dl/android/maven2/com/android/tools/annotations/26.1.…
+59ac55c581df73ba7efdc454c9134a63330db42f62053a675f36ad22265e3b6b | https://dl.google.com/dl/android/maven2/com/android/tools/annotations/26.1.…
+20a5111ef908e8cbab6c0a0e3ae1c031fa1460ed6bb00b4f621e9e93e6fac9f4 | https://dl.google.com/dl/android/maven2/com/android/tools/build/aapt2-proto…
+6ca265a30441628d070e4abe03b3c3c9ddadbcf3a06283ba0d6506baaaa23bc1 | https://dl.google.com/dl/android/maven2/com/android/tools/build/aapt2-proto…
+fa7c629e1ef9e8e3bedd647431f5d023ba87b5ad536c3a79497e2cd8c40f40be | https://dl.google.com/dl/android/maven2/com/android/tools/build/apksig/3.1.…
+48b9884f3c8d7765749723a8224299fa73bdb453c54126529c274305bc37077d | https://dl.google.com/dl/android/maven2/com/android/tools/build/apksig/3.1.…
+2166e41cacbce74d2573afd585b719b826f34863d7d9e9db1103e61686857ad1 | https://dl.google.com/dl/android/maven2/com/android/tools/build/builder/3.1…
+01b97e89902e1a85de0d7a6708d56dca8b8ca4c496f2710e777f3c74e2dd9660 | https://dl.google.com/dl/android/maven2/com/android/tools/build/builder/3.1…
+3101fdd6ae78f7fd4a2f5fd15c50d2fc321f2978f2e732e2c9729bdafd85fdf7 | https://dl.google.com/dl/android/maven2/com/android/tools/build/builder-mod…
+31641a4746e77cec3e3375c9973530f82a389bead83099f32dcfc38137695557 | https://dl.google.com/dl/android/maven2/com/android/tools/build/builder-mod…
+51642702f1610ac3802c930983ba37737cfa1aedce849de2071f14b9fe6a6f3a | https://dl.google.com/dl/android/maven2/com/android/tools/build/builder-tes…
+0aa1569bf11a2f78d202b63ef747f82a3ba0c3affaa6ff2f5071620264d2648e | https://dl.google.com/dl/android/maven2/com/android/tools/build/builder-tes…
+3bdb56f0bfabcd26ef63e58700f0d7e5087cd1e95e1abe2aa2e4b300b5616f15 | https://dl.google.com/dl/android/maven2/com/android/tools/build/bundletool/…
+6c6776338f04a28676ab0d4ad13a1ada690998f4a843068cd3af7589f6d3e188 | https://dl.google.com/dl/android/maven2/com/android/tools/build/bundletool/…
+f05f7bcfa15bbc61a197b6f575a0ad4a1ef750f9e906e29e4362a7059ba7616d | https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle/3.1.…
+dc417b6aa3ec6ff879b13720a11f463aa00f1f9ab7c33b9fe4006de67c29cd52 | https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle/3.1.…
+b74049d19d3cf68a74da30e88e2d10b1e5127a555de32ccabde05cbbf36211d7 | https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle-api/…
+075e524b0db8885e885806f6fc7e6832c7af3c74dd7806b9c59a2ce321fd1f32 | https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle-api/…
+3233ce076be21d977a817abfe7d937739f7a1d6dac30a497df30124989d2da85 | https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle-core…
+8d5bbd5948e49bbc51f42c029d3a4bf8f2b8b495c8e25fc0cf0efc9df5f07054 | https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle-core…
+a096805a7e0fb3dc10fa47c325186bebb55bbf5c77cb54dd4b1c71b723692628 | https://dl.google.com/dl/android/maven2/com/android/tools/build/manifest-me…
+041cda360c68cb182a9b2cfae639d4b3590f714181b756452905aff9a4e5e2ed | https://dl.google.com/dl/android/maven2/com/android/tools/build/manifest-me…
+4de4a3d05e1c534c2db9e4588bf34082bb2bd232d8abb9727c430290ce225740 | https://dl.google.com/dl/android/maven2/com/android/tools/build/transform-a…
+7c62f3856e8abca1d79257925f26c12668693f5d95904056bbac88605cfd8575 | https://dl.google.com/dl/android/maven2/com/android/tools/build/transform-a…
+b24e096cdd8ca1c38ce34f722bfea3e60ce5017a0c637af6b229d9bc3fc3a14a | https://dl.google.com/dl/android/maven2/com/android/tools/common/26.1.0/com…
+7d90ddec5f11b616aa80ff306bd818d1133f3cffafca88cc3e2bdd659863c75b | https://dl.google.com/dl/android/maven2/com/android/tools/common/26.1.0/com…
+6d95df7310eecf36772e74e25bf9dcffe8d1caf3614fb173443f5a5d6c937fe1 | https://dl.google.com/dl/android/maven2/com/android/tools/ddms/ddmlib/26.1.…
+674c6cc0741b9babe0f154734d826c4313889bf8a9e6b3ca8af8c1bf206ebbf5 | https://dl.google.com/dl/android/maven2/com/android/tools/ddms/ddmlib/26.1.…
+3790edb05c95577ea2cf3430158b494ffef7f3fce90cd7da1b68e5d52c2e2812 | https://dl.google.com/dl/android/maven2/com/android/tools/dvlib/26.1.0/dvli…
+6b93985e7deda921224dccd63031eeb9b282c00eff3103b3cca4dfd945b0d7e9 | https://dl.google.com/dl/android/maven2/com/android/tools/dvlib/26.1.0/dvli…
+4e5f6ffcc1fd9634c506324cb42e43c495cceab6e164c0e3f1ccfaf6e3d05863 | https://dl.google.com/dl/android/maven2/com/android/tools/external/com-inte…
+75ce4eefabd4027b1eba98fa52ae3b51a13d7e394df8f844a6c8c2340600a7c2 | https://dl.google.com/dl/android/maven2/com/android/tools/external/com-inte…
+9ee2e54b8f61651f7a6213bb10f14368b0e79abe213588aba916c7ad43d9af17 | https://dl.google.com/dl/android/maven2/com/android/tools/external/com-inte…
+815df2f2fddf91ec4c02133b7576f5311f62c11c3c6e3d5eb11c93275849818b | https://dl.google.com/dl/android/maven2/com/android/tools/external/com-inte…
+1a228bae07b7037c856247af7a4a6f05615e61d95c206fea4284a028272a3969 | https://dl.google.com/dl/android/maven2/com/android/tools/external/org-jetb…
+42a84e03f9af2dd6b233a101bf46e9e5598a26eb009aba95d83eca52b01e0c41 | https://dl.google.com/dl/android/maven2/com/android/tools/external/org-jetb…
+29da0f2265bf14cea484bb492813318c9268afc0aac85e625ba6d0e85382ef61 | https://dl.google.com/dl/android/maven2/com/android/tools/layoutlib/layoutl…
+2a587e265c5ce8aa01d4f2a5958a6c8cd4d56f28d1dcdbfb53daadb1158a898f | https://dl.google.com/dl/android/maven2/com/android/tools/layoutlib/layoutl…
+6096c358ab6c0494e1b7d802d2f9016eed62207450b940ecc4fc29b14817c2f1 | https://dl.google.com/dl/android/maven2/com/android/tools/lint/lint/26.1.0/…
+1e6048277ba9356bbb5db9f929642b9e01e3171495601a510c6e15736ba42f4e | https://dl.google.com/dl/android/maven2/com/android/tools/lint/lint/26.1.0/…
+f0ab6b1143a5735185bb6176eed6ee7f4dbdb8b4ce7a840faf43f19ae59602eb | https://dl.google.com/dl/android/maven2/com/android/tools/lint/lint-api/26.…
+9d15d02d7e44be94dee79a44b29b95d3707376f9a27390223049bb158bb31b21 | https://dl.google.com/dl/android/maven2/com/android/tools/lint/lint-api/26.…
+2b1656bd710b8690dc19244a1061279c937d67bfc8697117497532e83d732aa9 | https://dl.google.com/dl/android/maven2/com/android/tools/lint/lint-checks/…
+12ace827e21f7d198e37419cc8aa4340af629bad22b132f53efe4b2bbc3b3cd6 | https://dl.google.com/dl/android/maven2/com/android/tools/lint/lint-checks/…
+ec9d6afcfed18e6c768898fc98be209a8a0fd18a3cfd707f700964e8a22953b6 | https://dl.google.com/dl/android/maven2/com/android/tools/lint/lint-gradle/…
+02f5d794ea6c15a19b885cf06257b96fe65b2f09cc7f1c2cf4f93355a0b639fe | https://dl.google.com/dl/android/maven2/com/android/tools/lint/lint-gradle/…
+165576ede06d1a6466ded082938d162ed98bbdfb5e829874a18ffb58e59ec2ad | https://dl.google.com/dl/android/maven2/com/android/tools/lint/lint-gradle-…
+6743e37575c3138fe821ff1afd78d4545db8b0e850efac139dff36bb6590d46b | https://dl.google.com/dl/android/maven2/com/android/tools/lint/lint-gradle-…
+3827bd989d317c419f62913a1f5fed6f10daaed7f7434a009eea2595ad87da3c | https://dl.google.com/dl/android/maven2/com/android/tools/lint/lint-kotlin/…
+8336ad360b60e0922c9f81fe030724be1627c148d9c214f8b6c4bb563df05d6b | https://dl.google.com/dl/android/maven2/com/android/tools/lint/lint-kotlin/…
+e65a921804a1daa865c73fa8e68286d22353434f60612fc61f5e584dd6d88e32 | https://dl.google.com/dl/android/maven2/com/android/tools/repository/26.1.0…
+e9344a57c53db3a11520d160da91482d0f491c08edde34bc1c5b4fb5baf798f1 | https://dl.google.com/dl/android/maven2/com/android/tools/repository/26.1.0…
+38954e8d9c297d62846ac7bcddc7a5758a184ec1b05092e5e1089650be4962b0 | https://dl.google.com/dl/android/maven2/com/android/tools/sdk-common/26.1.0…
+02554156b6af9aafbb34da23ad09ccc93383657b47b2ac8e151ec325966a8e72 | https://dl.google.com/dl/android/maven2/com/android/tools/sdk-common/26.1.0…
+d4ebd42e1dbc81281085cdf5b56cebb183a9b8aeae51a84f53ff84774abcc94e | https://dl.google.com/dl/android/maven2/com/android/tools/sdklib/26.1.0/sdk…
+8971cb4273045b0af916ce6ebeb140527b9ebc917319ce5d1ea266362690e4dd | https://dl.google.com/dl/android/maven2/com/android/tools/sdklib/26.1.0/sdk…
+c3c99bf58182889fe86315e9a01473ee2c95540b9dedef898cec64554d925c54 | https://repo.maven.apache.org/maven2/com/android/tools/annotations/24.5.0/a…
+c98f1b0978cfd24712c27388e040c50ce0692252b3aa9448603d9efa05ebe8a8 | https://repo.maven.apache.org/maven2/com/google/auto/auto-parent/3/auto-par…
+6cac9421439b39b9f4aa76738ced039462a69911c410f2c372c196b0f4b7f4cf | https://repo.maven.apache.org/maven2/com/google/auto/value/auto-value/1.5.2…
+901fb1440a0ef8e0c0553a7bb44c0b89647bf53c8822642eea0b57173c7c688d | https://repo.maven.apache.org/maven2/com/google/auto/value/auto-value/1.5.2…
+905721a0eea90a81534abb7ee6ef4ea2e5e645fa1def0a5cd88402df1b46c9ed | https://repo.maven.apache.org/maven2/com/google/code/findbugs/jsr305/1.3.9/…
+feab9191311c3d7aeef2b66d6064afc80d3d1d52d980fb07ae43c78c987ba93a | https://repo.maven.apache.org/maven2/com/google/code/findbugs/jsr305/1.3.9/…
+2d43eb5ea9e133d2ee2405cc14f5ee08951b8361302fdd93494a3a997b508d32 | https://repo.maven.apache.org/maven2/com/google/code/gson/gson/2.7/gson-2.7…
+723936ec07b87b210a44ef8058f32f56e3d56442218dfbf8f4e538a927160ede | https://repo.maven.apache.org/maven2/com/google/code/gson/gson/2.7/gson-2.7…
+871e8c737322301f0cc8acfe39a2960c4579d9d8666aeea5298bb6fcc9e4272b | https://repo.maven.apache.org/maven2/com/google/code/gson/gson-parent/2.7/g…
+2d9484f4c649f708f47f9a479465fc729770ee65617dca3011836602264f6439 | https://repo.maven.apache.org/maven2/com/googlecode/json-simple/json-simple…
+47a89be0fa0fedd476db5fd2c83487654d2a119c391f83a142be876667cf7dab | https://repo.maven.apache.org/maven2/com/googlecode/json-simple/json-simple…
+757bfe906193b8b651e79dc26cd67d6b55d0770a2cdfb0381591504f779d4a76 | https://repo.maven.apache.org/maven2/com/googlecode/juniversalchardet/juniv…
+7846399b35c7cd642a9b3a000c3e2d62d04eb37a4547b6933cc8b18bcc2f086b | https://repo.maven.apache.org/maven2/com/googlecode/juniversalchardet/juniv…
+cb4cfad870bf563a07199f3ebea5763f0dec440fcda0b318640b1feaa788656b | https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_anno…
+9144127192d6f612c2366825dceaeb23b0d53130b83e0bf1ffe107d1470a8487 | https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_anno…
+de3c873b5dc06060f7a2a4d9b872a3f4dc1955c18095ef9702d13477e437782a | https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_anno…
+180a588bb8b4ed7cc554578b0dbfdb1aecfb3380922173df6541da18ee230911 | https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_anno…
+cf149955279b07d4f11e817985c1164a69e930d73db7441b43a6ef53bbd286c4 | https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_pare…
+c6b6d61ddb8f6b3bf29e8dafe35ff5d5a1ea90304b457e05657c1e7b8063a143 | https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_pare…
+cd6db17a11a31ede794ccbd1df0e4d9750f640234731f21cff885a9997277e81 | https://repo.maven.apache.org/maven2/com/google/google/1/google-1.pom
+1158e94c7de4da480873f0b4ab4a1da14c0d23d4b1902cc94a58a6f0f9ab579e | https://repo.maven.apache.org/maven2/com/google/guava/guava/22.0/guava-22.0…
+bfadb3b40f65dd6de1666d6b29f8bb54031396c76eeef4146cf9f28255f8bf33 | https://repo.maven.apache.org/maven2/com/google/guava/guava/22.0/guava-22.0…
+1eaf9182e1977c1c50a70edbfbf70536398c68990bfaafc9f0e9899041201539 | https://repo.maven.apache.org/maven2/com/google/guava/guava-parent/22.0/gua…
+2994a7eb78f2710bd3d3bfb639b2c94e219cedac0d4d084d516e78c16dddecf6 | https://repo.maven.apache.org/maven2/com/google/j2objc/j2objc-annotations/1…
+f0c98c571e93a7cb4dd18df0fa308f0963e7a0620ac2d4244e61e709d03ad6be | https://repo.maven.apache.org/maven2/com/google/j2objc/j2objc-annotations/1…
+c4828e28d7c0a930af9387510b3bada7daa5c04d7c25a75c7b8b081f1c257ddd | https://repo.maven.apache.org/maven2/com/google/jimfs/jimfs/1.1/jimfs-1.1.j…
+efa86e5cd922f17b472fdfcae57234d8d4ac3e148b6250737dfce454af7a7a44 | https://repo.maven.apache.org/maven2/com/google/jimfs/jimfs/1.1/jimfs-1.1.p…
+c71555751e57e0ef912870e8ac9625ae782502a6a5b9c19ccf83b2a97d8b26bd | https://repo.maven.apache.org/maven2/com/google/jimfs/jimfs-parent/1.1/jimf…
+dce7e66b32456a1b1198da0caff3a8acb71548658391e798c79369241e6490a4 | https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java/3.4.…
+83f17ba86c5fa1a15a3a3c8030d4ce42ef21c1d39b65db6cc004a8eeb2c59406 | https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java/3.4.…
+4189e0be5ab15cf2330f70b24fbdc75ca37514f188388fce8580ce16a9a68052 | https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java-util…
+89c43073e7eaa0eaba72a4a36ae1b6bfdfe5d81bb9d0e156aee05e4a72de3cb8 | https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-java-util…
+24909c552842c0eb7a4c769d631a43cbef5a9a10c1640f2bdbd1ea149c573a47 | https://repo.maven.apache.org/maven2/com/google/protobuf/protobuf-parent/3.…
+54b34e941b8e1414bd3e40d736efd3481772dc26db3296f6aa45cec9f6203d86 | https://repo.maven.apache.org/maven2/commons-codec/commons-codec/1.6/common…
+a06e35d3fff3a6b813d94894ebf3e498f9540c864c5b39ae783907e3a6c72889 | https://repo.maven.apache.org/maven2/commons-codec/commons-codec/1.6/common…
+cc6a41dc3eaacc9e440a6bd0d2890b20d36b4ee408fe2d67122f328bb6e01581 | https://repo.maven.apache.org/maven2/commons-io/commons-io/2.4/commons-io-2…
+b2b5dd46cf998fa626eb6f8a1c114f6167c8d392694164e62533e5898e9b31f2 | https://repo.maven.apache.org/maven2/commons-io/commons-io/2.4/commons-io-2…
+ce6f913cad1f0db3aad70186d65c5bc7ffcc9a99e3fe8e0b137312819f7c362f | https://repo.maven.apache.org/maven2/commons-logging/commons-logging/1.1.1/…
+d0f2e16d054e8bb97add9ca26525eb2346f692809fcd2a28787da8ceb3c35ee8 | https://repo.maven.apache.org/maven2/commons-logging/commons-logging/1.1.1/…
+8e108c92027bb428196f10fa11cffbe589f7648a6af2016d652279385fdfd789 | https://repo.maven.apache.org/maven2/com/squareup/javapoet/1.8.0/javapoet-1…
+b3760f40f19e735b2cd418f7656335d926d1d9413e10982a1c9695b64edbb647 | https://repo.maven.apache.org/maven2/com/squareup/javapoet/1.8.0/javapoet-1…
+fcfb09fb0ea0aa97d3cfe7ea792398081348e468f126b3603cb3803f240197f0 | https://repo.maven.apache.org/maven2/com/squareup/javawriter/2.5.0/javawrit…
+e1abd7f1116cf5e0c59947693e2189208ec94296b2a3394c959e3511d399a7b0 | https://repo.maven.apache.org/maven2/com/squareup/javawriter/2.5.0/javawrit…
+1d8518e3ac7532a104e4f7be77def37c982e530723c6bdb3d67708cce2b0c2c4 | https://repo.maven.apache.org/maven2/com/sun/activation/all/1.2.0/all-1.2.0…
+993302b16cd7056f21e779cc577d175a810bb4900ef73cd8fbf2b50f928ba9ce | https://repo.maven.apache.org/maven2/com/sun/activation/javax.activation/1.…
+f879b6e945854c6900b0dbee1c8384d7ab3de7e157fd7ac84937405c416d2a5e | https://repo.maven.apache.org/maven2/com/sun/activation/javax.activation/1.…
+c3071277f89b162982606b4e65c92077212efb6cbf1bdc365c51bd0b57ac818c | https://repo.maven.apache.org/maven2/com/sun/istack/istack-commons/2.21/ist…
+c33e67a0807095f02a0e2da139412dd7c4f9cc1a4c054b3e434f96831ba950f4 | https://repo.maven.apache.org/maven2/com/sun/istack/istack-commons-runtime/…
+ebe7137b5fbfd050545f9a7f3f339ae55beb0b53755071b4fd62aa024c626d1c | https://repo.maven.apache.org/maven2/com/sun/istack/istack-commons-runtime/…
+b25e0693de21cb92b039a2e4608f396590fb8773108f10d6dc9f1465f03b5be9 | https://repo.maven.apache.org/maven2/com/sun/xml/bind/jaxb-bom-ext/2.2.11/j…
+b5301b711c01547e571b615f9a0832ee525d34a4ce3372f53907a87cf20b0480 | https://repo.maven.apache.org/maven2/com/sun/xml/bind/mvn/jaxb-parent/2.2.1…
+21918cb8e4eda67f24251e909a5d81672201d93604c4ffbf33522ad836a58e90 | https://repo.maven.apache.org/maven2/com/sun/xml/bind/mvn/jaxb-runtime-pare…
+9a398c699a5d3f3b56f1056c68890ede25d94a12d98eabc2a473733e6ab2362c | https://repo.maven.apache.org/maven2/com/sun/xml/bind/mvn/jaxb-txw-parent/2…
+27a77db909f3c2833c0b1a37c55af1db06045118ad2eed96ce567b6632bce038 | https://repo.maven.apache.org/maven2/com/sun/xml/fastinfoset/FastInfoset/1.…
+b7505e0ecf7d495b4daa3e6569f71611d1a789dc531cbd92a2025922ff2655d3 | https://repo.maven.apache.org/maven2/com/sun/xml/fastinfoset/FastInfoset/1.…
+fd0857899f1067e0287c2ffd91e38f967a26bd405b83a34650c2742cee9fc261 | https://repo.maven.apache.org/maven2/com/sun/xml/fastinfoset/fastinfoset-pr…
+74fa208043740642f7e6eb09faba15965218ad2f50ce3020efb100136e4b591c | https://repo.maven.apache.org/maven2/it/unimi/dsi/fastutil/7.2.0/fastutil-7…
+953b116521a73575eee990e3f2c36a892fb088bb2d9a3027c82193cb7a013ef7 | https://repo.maven.apache.org/maven2/it/unimi/dsi/fastutil/7.2.0/fastutil-7…
+b5e60cd8b7b5ff01ce4a74c5dd008f4fbd14ced3495d0b47b85cfedc182211f2 | https://repo.maven.apache.org/maven2/javax/xml/bind/jaxb-api/2.2.12-b140109…
+2092a7d8d9bc5698c59b094bdea46622915c48c83ae66d5b5ad549c7bf16155b | https://repo.maven.apache.org/maven2/javax/xml/bind/jaxb-api/2.2.12-b140109…
+281440811268e65d9e266b3cc898297e214e04f09740d0386ceeb4a8923d63bf | https://repo.maven.apache.org/maven2/net/java/jvnet-parent/1/jvnet-parent-1…
+30f5789efa39ddbf96095aada3fc1260c4561faf2f714686717cb2dc5049475a | https://repo.maven.apache.org/maven2/net/java/jvnet-parent/3/jvnet-parent-3…
+471395735549495297c8ff939b9a32e08b91302020ff773586d27e497abb8fbb | https://repo.maven.apache.org/maven2/net/java/jvnet-parent/4/jvnet-parent-4…
+26c5856e954b5f864db76f13b86919b59c6eecf9fd930b96baa8884626baf2f5 | https://repo.maven.apache.org/maven2/net/sf/jopt-simple/jopt-simple/4.9/jop…
+7af7e2d8b24b4798f04c2b7da24c9fbd1b7557b4e017c2054481565916079092 | https://repo.maven.apache.org/maven2/net/sf/jopt-simple/jopt-simple/4.9/jop…
+f264dd9f79a1fde10ce5ecc53221eff24be4c9331c830b7d52f2f08a7b633de2 | https://repo.maven.apache.org/maven2/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0.jar
+31ce606f4e9518936299bb0d27c978fa61e185fd1de7c9874fe959a53e34a685 | https://repo.maven.apache.org/maven2/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0.pom
+1d2e883717b8ab7d3fcc9fa01034d165809a9c94daa6303a838f11e4d36adc86 | https://repo.maven.apache.org/maven2/net/sf/proguard/proguard-base/5.3.3/pr…
+e51efb2ec140b2849b9880fb161cb6e30dd672368a534c1f47ab46d7f537d9ca | https://repo.maven.apache.org/maven2/net/sf/proguard/proguard-base/5.3.3/pr…
+f34b3a0b62cdb468eb7e8335de4edc87958dc299306c2b4ba8ea15e6a4be106a | https://repo.maven.apache.org/maven2/net/sf/proguard/proguard-gradle/5.3.3/…
+f26bdec2b9496470c0ce63b0d290816e8000ef018daaa259597ebae947fd690f | https://repo.maven.apache.org/maven2/net/sf/proguard/proguard-gradle/5.3.3/…
+0288414509c625b8dd544384fbd29f502bdc8b4f86cfc26625aa23eef9fa6057 | https://repo.maven.apache.org/maven2/net/sf/proguard/proguard-parent/5.3.3/…
+a32de739cfdf515774e696f91aa9697d2e7731e5cb5045ca8a4b657f8b1b4fb4 | https://repo.maven.apache.org/maven2/org/antlr/antlr4/4.5.3/antlr4-4.5.3.jar
+8a4e4b32eedaa72976a757e12cf1dfe742725db0b7311bf176dd937ba4236384 | https://repo.maven.apache.org/maven2/org/antlr/antlr4/4.5.3/antlr4-4.5.3.pom
+401877d5e70ad599e9b6cff18434ea0332f637b51f8ec68352646c836f9bb2a4 | https://repo.maven.apache.org/maven2/org/antlr/antlr4-master/4.5.3/antlr4-m…
+ff513db0361fd41237bef4784968bc15aae478d4ec0a9496f811072ccaf3841d | https://repo.maven.apache.org/maven2/org/apache/apache/13/apache-13.pom
+9f85ff2fd7d6cb3097aa47fb419ee7f0ebe869109f98aba9f4eca3f49e74a40e | https://repo.maven.apache.org/maven2/org/apache/apache/16/apache-16.pom
+9e9323a26ba8eb2394efef0c96d31b70df570808630dc147cab1e73541cc5194 | https://repo.maven.apache.org/maven2/org/apache/apache/4/apache-4.pom
+4946e60a547c8eda69f3bc23c5b6f0dadcf8469ea49b1d1da7de34aecfcf18dd | https://repo.maven.apache.org/maven2/org/apache/apache/9/apache-9.pom
+2c1542faf343185b7cab9c3d55c8ae5471d6d095d3887a4adefdbdf2984dc0b6 | https://repo.maven.apache.org/maven2/org/apache/commons/commons-compress/1.…
+b787d574c851505e76212968b9ae1641ea79804aef7f5a2cee2a01cd4055213a | https://repo.maven.apache.org/maven2/org/apache/commons/commons-compress/1.…
+fb8c5e55e30a7addb4ff210858a0e8d2494ed6757bbe19012da99d51586c3cbb | https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/22/c…
+467ae650442e876867379094e7518dfdd67d22c5352ebd39808c84259e9790ba | https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/25/c…
+87cd27e1a02a5c3eb6d85059ce98696bb1b44c2b8b650f0567c86df60fa61da7 | https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/39/c…
+8bd632c00bdf80a7de36c22b60f12452c147d8eca2f00d79d66699ebe7daa02a | https://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/5/co…
+362e9324ee7c697e21279e20077b52737ddef3f1b2c1a7abe5ad34b465145550 | https://repo.maven.apache.org/maven2/org/apache/httpcomponents/httpclient/4…
+f5a0a1eeaa100ed36aa83eca562d5dbb7e9b045c98b44db7da4745e9d9a20328 | https://repo.maven.apache.org/maven2/org/apache/httpcomponents/httpclient/4…
+5215b648798c6c8d9b9cde3642d3bfb5a4cc894b7c8411004352e7de5d119827 | https://repo.maven.apache.org/maven2/org/apache/httpcomponents/httpcomponen…
+52b6fd2eaf2240e14dbe752f1fa884270cc668d6f350e8e7f65f6033a8172d69 | https://repo.maven.apache.org/maven2/org/apache/httpcomponents/httpcomponen…
+164e7a9cf23a4e63bbc961f8db7d965d53d685710660a88249641f91d36f83a4 | https://repo.maven.apache.org/maven2/org/apache/httpcomponents/httpcomponen…
+e5e82da4cc66c8d917bbf743e3c0752efe8522735e7fc9dbddb65bccea81cfe9 | https://repo.maven.apache.org/maven2/org/apache/httpcomponents/httpcore/4.2…
+b6eb99f1362b8344ca5400d57a35c49e3504f23f3dee304fdb879d4d953f4bc6 | https://repo.maven.apache.org/maven2/org/apache/httpcomponents/httpcore/4.2…
+31629566148e8a47688ae43b420abc3ecd783ed15b33bebc00824bf24c9b15aa | https://repo.maven.apache.org/maven2/org/apache/httpcomponents/httpmime/4.1…
+db3cd95bec1001605e1653f2843e8542e712fa2bb672fd9c8c1ace86c57673d1 | https://repo.maven.apache.org/maven2/org/apache/httpcomponents/httpmime/4.1…
+21bb4d44dff54e33a37c11af69859a714202ae00969aab5453eba7276688f8ec | https://repo.maven.apache.org/maven2/org/apache/httpcomponents/project/4.1.…
+3d6eba428555a558de046b5d76eacc1f5a54b4f5f20b84d636ed7aff18aa48c3 | https://repo.maven.apache.org/maven2/org/apache/httpcomponents/project/7/pr…
+7043dee4e9e7175e93e0b36f45b1ec1ecb893c5f755667e8b916eb8dd201c6ca | https://repo.maven.apache.org/maven2/org/bouncycastle/bcpkix-jdk15on/1.56/b…
+321668fc474a73140eb9cc73c779f1ebb9f60948aade3beddee082ecefcf0259 | https://repo.maven.apache.org/maven2/org/bouncycastle/bcpkix-jdk15on/1.56/b…
+963e1ee14f808ffb99897d848ddcdb28fa91ddda867eb18d303e82728f878349 | https://repo.maven.apache.org/maven2/org/bouncycastle/bcprov-jdk15on/1.56/b…
+8fdc3336e7b01873193ba9c48b87de7d788dc0954d1eb45c322492627a4b5c6e | https://repo.maven.apache.org/maven2/org/bouncycastle/bcprov-jdk15on/1.56/b…
+6b87237de8c2e1740cf80627c7f3ce3e15de1930bb250c55a1eca94fa3e014df | https://repo.maven.apache.org/maven2/org/codehaus/codehaus-parent/4/codehau…
+6a56af4bd48903d56bec62821876cadefafd007360cc6bd0d8f7aa8d72b38be4 | https://repo.maven.apache.org/maven2/org/codehaus/groovy/groovy-all/2.4.12/…
+a8cd12c8da17b31e0fb46e64f7d3fc2e63344ca13815bade32a2d54fa2dedd3c | https://repo.maven.apache.org/maven2/org/codehaus/groovy/groovy-all/2.4.12/…
+2068320bd6bad744c3673ab048f67e30bef8f518996fa380033556600669905d | https://repo.maven.apache.org/maven2/org/codehaus/mojo/animal-sniffer-annot…
+1879f19a05991e3ed95910b96689333396b0c467a215dc4d1f90018404b72a26 | https://repo.maven.apache.org/maven2/org/codehaus/mojo/animal-sniffer-annot…
+f51550a06b1410bd4962cb0e71df0b921a60a7ef47bfa9c4825a14be72316eea | https://repo.maven.apache.org/maven2/org/codehaus/mojo/animal-sniffer-paren…
+3e395d6fbc43c09a3774cac8694ce527398305ea3fd5492d80e25af27d382a9c | https://repo.maven.apache.org/maven2/org/codehaus/mojo/mojo-parent/34/mojo-…
+a52e6850f070dc9f7a2a51d0b25dfaafd49b0b9bf8196db6c0b3c5b7c94d8d38 | https://repo.maven.apache.org/maven2/org/glassfish/jaxb/jaxb-bom/2.2.11/jax…
+37bcaee8ebb04362c8352a5bf6221b86967ecdab5164c696b10b9a2bb587b2aa | https://repo.maven.apache.org/maven2/org/glassfish/jaxb/jaxb-core/2.2.11/ja…
+ec31409f203bcabf99534f59231ec0576d875d4d4b7349b09566a7a8c8179b24 | https://repo.maven.apache.org/maven2/org/glassfish/jaxb/jaxb-core/2.2.11/ja…
+a874f2351cfba8e2946be3002d10c18a6da8f21b52ba2acf52f2b85d5520ed70 | https://repo.maven.apache.org/maven2/org/glassfish/jaxb/jaxb-runtime/2.2.11…
+e5327b31b595ab8143e97836d5ccdf85feb91e7ff5666f7b26913632facca4aa | https://repo.maven.apache.org/maven2/org/glassfish/jaxb/jaxb-runtime/2.2.11…
+272a3ccad45a4511351920cd2a8633c53cab8d5220c7a92954da5526bb5eafea | https://repo.maven.apache.org/maven2/org/glassfish/jaxb/txw2/2.2.11/txw2-2.…
+8514cb724b4fca59a5cf272b632e539bd0a0f3cacf1844082d0a173a86406bd8 | https://repo.maven.apache.org/maven2/org/glassfish/jaxb/txw2/2.2.11/txw2-2.…
+ace2a10dc8e2d5fd34925ecac03e4988b2c0f851650c94b8cef49ba1bd111478 | https://repo.maven.apache.org/maven2/org/jetbrains/annotations/13.0/annotat…
+965aeb2bedff369819bdde1bf7a0b3b89b8247dd69c88b86375d76163bb8c397 | https://repo.maven.apache.org/maven2/org/jetbrains/annotations/13.0/annotat…
+4f48a872bad6e4d9c053f4ad610d11e4012ad7e58dc19a03dd5eb811f36069dd | https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.…
+f35215da1bed69e3d60735d76221d7012cd1a5bc0a30f6f7421719ada463b4dd | https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.…
+05cfd9f5ac0b41910703a8925f7211a495909b27a2ffdd1c5106f1689aeafcd4 | https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.2…
+ca9778da4afbcd421b09384b257c9de47f610aec5c9165e0209228d25a337a20 | https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.2…
+c7a20fb951d437797afe8980aff6c1e5a03f310c661ba58ba1d4fa90cb0f2926 | https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jre…
+2077417c22d3ab7734ce35385e9c3f4721840fa8df925edb19abe3eea8507348 | https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jre…
+633524eee6ef1941f7cb1dab7ee3927b0a221ceee9047aeb5515f4cbb990c82a | https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jre…
+6b7a74be21c57056eed1c1606524c3b6381ba091a98925fd934567c4a524ac38 | https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jre…
+a31ff7d77163c0deb09e7fee59ad35ae44c2cee2cc8552a116ccd1583d813fb4 | https://repo.maven.apache.org/maven2/org/jvnet/staxex/stax-ex/1.7.7/stax-ex…
+27cb450b6c367a00bd8362519907f84defac7b12086c64d4d6e97e33ab873ead | https://repo.maven.apache.org/maven2/org/jvnet/staxex/stax-ex/1.7.7/stax-ex…
+d2da399a9967c69f0a21739256fa79d284222c223082cacadc17372244764b54 | https://repo.maven.apache.org/maven2/org/ow2/asm/asm/5.1/asm-5.1.jar
+6d079b5abf39f323baaccc68463beef5cf2e9574f333dd749ae96753f00eb205 | https://repo.maven.apache.org/maven2/org/ow2/asm/asm/5.1/asm-5.1.pom
+a34658f5c5de4b573eef21131cc32cc25f7b66407944f312b28ec2e56abb1fa9 | https://repo.maven.apache.org/maven2/org/ow2/asm/asm-analysis/5.1/asm-analy…
+81120db4d5490c4f0e9789e1178d2bac231fcff2618bd80f8ef6ff03c550d59b | https://repo.maven.apache.org/maven2/org/ow2/asm/asm-analysis/5.1/asm-analy…
+97b3786e1f55e74bddf8ad102bf50e33bbcbc1f6b7fd7b36f0bbbb25cd4981be | https://repo.maven.apache.org/maven2/org/ow2/asm/asm-commons/5.1/asm-common…
+cd36b31f1495f4fe55a936dd00607abdd945e1f8074549225a04c402d1d35750 | https://repo.maven.apache.org/maven2/org/ow2/asm/asm-commons/5.1/asm-common…
+85ec8258fafc283f61647e6a11b404890821c11db6fcf550779ecf7a14151007 | https://repo.maven.apache.org/maven2/org/ow2/asm/asm-parent/5.1/asm-parent-…
+c0de2bbc4cb8297419659813ecd4ed1d077ed1dd5c1f5544cc5143e493e84c10 | https://repo.maven.apache.org/maven2/org/ow2/asm/asm-tree/5.1/asm-tree-5.1.…
+fb5369fc7ea4b2e3cf8d6f20243f1d97f81341bf818b179cd8dbd1da7a781a21 | https://repo.maven.apache.org/maven2/org/ow2/asm/asm-tree/5.1/asm-tree-5.1.…
+ee032c39ae5e3cd099148fbba9a2124f9ed613e5cb93e03ee0fa8808ce364040 | https://repo.maven.apache.org/maven2/org/ow2/asm/asm-util/5.1/asm-util-5.1.…
+0c0e9d1857c250d1d71b5c6be7b8cc29afe55e7419a90d13bbe968ae5bd7240e | https://repo.maven.apache.org/maven2/org/ow2/asm/asm-util/5.1/asm-util-5.1.…
+51215c67d2c068d8b7d2f6f80f51372a098075deccc448d4bdd7b987ba8328fb | https://repo.maven.apache.org/maven2/org/ow2/ow2/1.3/ow2-1.3.pom
+fbd7b254e02d8aef60c418a5f0e14a783b38a16162caffb2d2a16ccd5d2c09b4 | https://repo.maven.apache.org/maven2/org/slf4j/slf4j-android/1.7.25/slf4j-a…
+bd9b9cb1a3987b1427f7a18babe7f92078e32bbe2e1dca6dced00cc0e3a077a9 | https://repo.maven.apache.org/maven2/org/slf4j/slf4j-android/1.7.25/slf4j-a…
+18c4a0095d5c1da6b817592e767bb23d29dd2f560ad74df75ff3961dbde25b79 | https://repo.maven.apache.org/maven2/org/slf4j/slf4j-api/1.7.25/slf4j-api-1…
+7cd9d7a0b5d93dfd461a148891b43509cf403a9c7f9fb49060d3554df1c81e1e | https://repo.maven.apache.org/maven2/org/slf4j/slf4j-api/1.7.25/slf4j-api-1…
+18f5c52120db036e88d6136f8839c832d074bdda95c756c6f429249d2db54ac6 | https://repo.maven.apache.org/maven2/org/slf4j/slf4j-parent/1.7.25/slf4j-pa…
+b51f8867c92b6a722499557fc3a1fdea77bdf9ef574722fe90ce436a29559454 | https://repo.maven.apache.org/maven2/org/sonatype/oss/oss-parent/7/oss-pare…
+fb40265f982548212ff82e362e59732b2187ec6f0d80182885c14ef1f982827a | https://repo.maven.apache.org/maven2/org/sonatype/oss/oss-parent/9/oss-pare…
ec3a75bebddbf19ff56a281cf5d1ad146169dcaa0e69d7b14f4aaba2e7775f34 | https://repo.spring.io/plugins-release/net/freehaven/tor/control/jtorctl/0.…
-963e1ee14f808ffb99897d848ddcdb28fa91ddda867eb18d303e82728f878349 | https://repo1.maven.org/maven2/org/bouncycastle/bcprov-jdk15on/1.56/bcprov-…
-f8fd874c37c89d5dfe5ec8190d94626512bd36ab2c2ac9d4b67515c5bee745cb | https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.1.3-2/k…
-cf7e3630e1929ddeffcb0315db2acb37182c92dd3af970111b6115592f64d077 | https://repo1.maven.org/maven2/org/jacoco/org.jacoco.core/0.7.4.20150226212…
-a20fb26c8de5b0ff7a3069e681fcf01ebefd2f3d24b832c3af22d981d7d4376b | https://dl.google.com/dl/android/maven2/com/android/tools/repository/26.0.1…
-85ec8258fafc283f61647e6a11b404890821c11db6fcf550779ecf7a14151007 | https://repo1.maven.org/maven2/org/ow2/asm/asm-parent/5.1/asm-parent-5.1.pom
-7af7e2d8b24b4798f04c2b7da24c9fbd1b7557b4e017c2054481565916079092 | https://repo1.maven.org/maven2/net/sf/jopt-simple/jopt-simple/4.9/jopt-simp…
-2994a7eb78f2710bd3d3bfb639b2c94e219cedac0d4d084d516e78c16dddecf6 | https://repo1.maven.org/maven2/com/google/j2objc/j2objc-annotations/1.1/j2o…
-ec4c74554312fac5116350164786f91b35c9e082fa4ea598bfa42b5db05d7abb | https://repo1.maven.org/maven2/org/jacoco/org.jacoco.core/0.7.4.20150226212…
-9cddda75f4a1b4469e73f44e7b61a3e897d0f657df4797f9106ffe88c4eeade0 | https://repo1.maven.org/maven2/org/eclipse/jdt/core/compiler/ecj/4.6.1/ecj-…
-81120db4d5490c4f0e9789e1178d2bac231fcff2618bd80f8ef6ff03c550d59b | https://repo1.maven.org/maven2/org/ow2/asm/asm-analysis/5.1/asm-analysis-5.…
-df5f5e4b6d2ddcde49ed5a4e7e3bf2cb7f87e0d9892e5b066f995c4d703b228f | https://dl.google.com/dl/android/maven2/com/android/tools/analytics-library…
-26c5856e954b5f864db76f13b86919b59c6eecf9fd930b96baa8884626baf2f5 | https://repo1.maven.org/maven2/net/sf/jopt-simple/jopt-simple/4.9/jopt-simp…
-6895e368fa59168428c78cdf300bb29352073f397d8f260af3de82df2c8b2448 | https://dl.google.com/dl/android/maven2/com/android/tools/analytics-library…
-fbd7b254e02d8aef60c418a5f0e14a783b38a16162caffb2d2a16ccd5d2c09b4 | https://repo1.maven.org/maven2/org/slf4j/slf4j-android/1.7.25/slf4j-android…
-23e6d006f7d07bb43ebc80b2e530c8cdd65bbabcaaf911c3f12e2ea26167178c | https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle-core…
-1ef71c25a9d46ae0ce023d02a5734e0b06fdf934fbc5948e20482526b22b4179 | https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle/3.0.…
-2d9484f4c649f708f47f9a479465fc729770ee65617dca3011836602264f6439 | https://repo1.maven.org/maven2/com/googlecode/json-simple/json-simple/1.1/j…
-b2b5dd46cf998fa626eb6f8a1c114f6167c8d392694164e62533e5898e9b31f2 | https://repo1.maven.org/maven2/commons-io/commons-io/2.4/commons-io-2.4.pom
-f51550a06b1410bd4962cb0e71df0b921a60a7ef47bfa9c4825a14be72316eea | https://repo1.maven.org/maven2/org/codehaus/mojo/animal-sniffer-parent/1.14…
-87cd27e1a02a5c3eb6d85059ce98696bb1b44c2b8b650f0567c86df60fa61da7 | https://repo1.maven.org/maven2/org/apache/commons/commons-parent/39/commons…
-aeb197158a2fb6bd2cb9233e22874f8051f82891dbd82b6b089f49e309f82e40 | https://dl.google.com/dl/android/maven2/com/android/tools/lint/lint/26.0.1/…
-54b34e941b8e1414bd3e40d736efd3481772dc26db3296f6aa45cec9f6203d86 | https://repo1.maven.org/maven2/commons-codec/commons-codec/1.6/commons-code…
-ce6f913cad1f0db3aad70186d65c5bc7ffcc9a99e3fe8e0b137312819f7c362f | https://repo1.maven.org/maven2/commons-logging/commons-logging/1.1.1/common…
-668eb6aeb3d038267e719deb55f38a4233a12602afb97e89da609c095394400a | https://dl.google.com/dl/android/maven2/com/android/tools/build/apksig/3.0.…
-5215b648798c6c8d9b9cde3642d3bfb5a4cc894b7c8411004352e7de5d119827 | https://repo1.maven.org/maven2/org/apache/httpcomponents/httpcomponents-cli…
-9144127192d6f612c2366825dceaeb23b0d53130b83e0bf1ffe107d1470a8487 | https://repo1.maven.org/maven2/com/google/errorprone/error_prone_annotation…
-b6eb99f1362b8344ca5400d57a35c49e3504f23f3dee304fdb879d4d953f4bc6 | https://repo1.maven.org/maven2/org/apache/httpcomponents/httpcore/4.2.5/htt…
-d2da399a9967c69f0a21739256fa79d284222c223082cacadc17372244764b54 | https://repo1.maven.org/maven2/org/ow2/asm/asm/5.1/asm-5.1.jar
-81f73f8b25b430f5a40a39727bbcef653a1d0868cc69233b44e4282ce5a94ff9 | https://dl.google.com/dl/android/maven2/com/android/tools/ddms/ddmlib/26.0.…
-757bfe906193b8b651e79dc26cd67d6b55d0770a2cdfb0381591504f779d4a76 | https://repo1.maven.org/maven2/com/googlecode/juniversalchardet/juniversalc…
-0ee5f691cbbedb69969b48374d27412f821959af5d2dffbabc424b607cdbbdf6 | https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.1.3-2/…
-536c45e8804de01321c478cfb994377f81f1e32897636616fa21b877fd137c6f | https://repo1.maven.org/maven2/org/eclipse/jdt/core/compiler/ecj/4.6.1/ecj-…
-cd36b31f1495f4fe55a936dd00607abdd945e1f8074549225a04c402d1d35750 | https://repo1.maven.org/maven2/org/ow2/asm/asm-commons/5.1/asm-commons-5.1.…
-fcfb09fb0ea0aa97d3cfe7ea792398081348e468f126b3603cb3803f240197f0 | https://repo1.maven.org/maven2/com/squareup/javawriter/2.5.0/javawriter-2.5…
-6d079b5abf39f323baaccc68463beef5cf2e9574f333dd749ae96753f00eb205 | https://repo1.maven.org/maven2/org/ow2/asm/asm/5.1/asm-5.1.pom
-8b870b3f2ee38bf15681acbc8b628df1ccf7c533190b5c79af9934b6cd66d451 | https://dl.google.com/dl/android/maven2/com/android/databinding/baseLibrary…
-e1abd7f1116cf5e0c59947693e2189208ec94296b2a3394c959e3511d399a7b0 | https://repo1.maven.org/maven2/com/squareup/javawriter/2.5.0/javawriter-2.5…
-9619e68f7eb36da3a28a60315f34320972badbad43749cc66712bb95b96a4ef3 | https://dl.google.com/dl/android/maven2/com/android/support/support-annotat…
-5d252585d47129cd667d96c92237383138a42edec5a8963a7dd44cd770faed91 | https://dl.google.com/dl/android/maven2/com/android/tools/lint/lint-checks/…
3369726ca2b0e3736c741ff3c22e06f707a1007ff20ccc5b5ba5d0d9a01ead30 | https://repo.spring.io/plugins-release/net/freehaven/tor/control/jtorctl/0.…
-f34b3a0b62cdb468eb7e8335de4edc87958dc299306c2b4ba8ea15e6a4be106a | https://repo1.maven.org/maven2/net/sf/proguard/proguard-gradle/5.3.3/progua…
-e899e02ec8ac6a73fb9c9c7cb9ebd9bfc4ce8263412285d5ec6f2df920880905 | https://dl.google.com/dl/android/maven2/com/android/tools/build/builder-mod…
-2a0475c2625fc27f80d3c5021130509b4068e0f984f2511e7a77a097de48b41d | https://dl.google.com/dl/android/maven2/com/android/tools/sdklib/26.0.1/sdk…
-e91a88dd0c5e99069b7f09d4a46b5e06f1e9c4c72fc0a8e987e25d86af480f01 | https://dl.google.com/dl/android/maven2/com/android/support/support-annotat…
-4f88a89142c64bf03906f84609594666e9694df56e3e6f05edfab8a68b39d837 | https://dl.google.com/dl/android/maven2/com/android/tools/annotations/26.0.…
-1f8c906d0de98ddfa81b1ce520ee52fbd280c222383b66cba89e16eafb626001 | https://dl.google.com/dl/android/maven2/com/android/databinding/baseLibrary…
-401877d5e70ad599e9b6cff18434ea0332f637b51f8ec68352646c836f9bb2a4 | https://repo1.maven.org/maven2/org/antlr/antlr4-master/4.5.3/antlr4-master-…
-1a56992fc50f838fd091b6b9701b30da64b00bd2fe76ad2c800212eb459b49e2 | https://repo1.maven.org/maven2/com/google/code/gson/gson/2.3/gson-2.3.pom
-803be394edb8dd7d1e678683ed85aee7f86a172c90f03e6198c8a49d4f342b99 | https://dl.google.com/dl/android/maven2/com/android/tools/build/builder/3.0…
-feab9191311c3d7aeef2b66d6064afc80d3d1d52d980fb07ae43c78c987ba93a | https://repo1.maven.org/maven2/com/google/code/findbugs/jsr305/1.3.9/jsr305…
-d0f2e16d054e8bb97add9ca26525eb2346f692809fcd2a28787da8ceb3c35ee8 | https://repo1.maven.org/maven2/commons-logging/commons-logging/1.1.1/common…
-1d2e883717b8ab7d3fcc9fa01034d165809a9c94daa6303a838f11e4d36adc86 | https://repo1.maven.org/maven2/net/sf/proguard/proguard-base/5.3.3/proguard…
-7e8bdca281bdcb6dad48a80854837f1c0ab46f31a0b292370e320f471f5b9cfd | https://dl.google.com/dl/android/maven2/com/android/tools/sdk-common/26.0.1…
-d7e368746fa68ca6ba63519fb0838be9a278d509a5fcee6cd4a778a119eae447 | https://dl.google.com/dl/android/maven2/com/android/support/appcompat-v7/23…
-7c62f3856e8abca1d79257925f26c12668693f5d95904056bbac88605cfd8575 | https://dl.google.com/dl/android/maven2/com/android/tools/build/transform-a…
-1158e94c7de4da480873f0b4ab4a1da14c0d23d4b1902cc94a58a6f0f9ab579e | https://repo1.maven.org/maven2/com/google/guava/guava/22.0/guava-22.0.jar
-a1e7d6b3efc1703c7c8f1b15ecf8757f17d0ac41f32c9a48481a5caf638c55db | https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java/3.0.0/prot…
-3e395d6fbc43c09a3774cac8694ce527398305ea3fd5492d80e25af27d382a9c | https://repo1.maven.org/maven2/org/codehaus/mojo/mojo-parent/34/mojo-parent…
-712d7c974d20b71ce730938a3dda8d23e87cfd16500e1c1a2c9ecc2c9ff0d323 | https://dl.google.com/dl/android/maven2/com/android/tools/build/apksig/3.0.…
-7cd9d7a0b5d93dfd461a148891b43509cf403a9c7f9fb49060d3554df1c81e1e | https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.…
-4de4a3d05e1c534c2db9e4588bf34082bb2bd232d8abb9727c430290ce225740 | https://dl.google.com/dl/android/maven2/com/android/tools/build/transform-a…
-e7a7a5810829dee924cec654a569a48301fcedd487f7b88710e816d127385f51 | https://dl.google.com/dl/android/maven2/com/android/tools/analytics-library…
-e336a35a1e102c2f11ce1ea7f0872df14e332374b8eacc0877e50f85f84c3d09 | https://dl.google.com/dl/android/maven2/com/android/support/animated-vector…
-63b465cc628f8c305702b12b26501cea236a3175db15b5a7356e98484aa63db5 | https://dl.google.com/dl/android/maven2/com/android/tools/build/builder-mod…
-7a3554c605e088e7e323b1084656243f0444fa353e2f2dee1f1a4204eb64ff09 | https://repo1.maven.org/maven2/org/jacoco/org.jacoco.report/0.7.4.201502262…
-164e7a9cf23a4e63bbc961f8db7d965d53d685710660a88249641f91d36f83a4 | https://repo1.maven.org/maven2/org/apache/httpcomponents/httpcomponents-cor…
-ee041b3beb682e8bbf2dc16b6edc233483cbc36bde27fd13996617a667b615a5 | https://dl.google.com/dl/android/maven2/com/android/tools/external/com-inte…
-cc6a41dc3eaacc9e440a6bd0d2890b20d36b4ee408fe2d67122f328bb6e01581 | https://repo1.maven.org/maven2/commons-io/commons-io/2.4/commons-io-2.4.jar
-51215c67d2c068d8b7d2f6f80f51372a098075deccc448d4bdd7b987ba8328fb | https://repo1.maven.org/maven2/org/ow2/ow2/1.3/ow2-1.3.pom
-e2f7b17610f9f0a2b55c019b7627be3d42ec142fde1db5caf8a34dbe3bb8dbcd | https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle-api/…
-5fe8a11e913086fb7ab505b930987f30cfa3f4b226d4bbbc68003ca4387ae40e | https://dl.google.com/dl/android/maven2/com/android/tools/lint/lint-api/26.…
-a34658f5c5de4b573eef21131cc32cc25f7b66407944f312b28ec2e56abb1fa9 | https://repo1.maven.org/maven2/org/ow2/asm/asm-analysis/5.1/asm-analysis-5.…
-4946e60a547c8eda69f3bc23c5b6f0dadcf8469ea49b1d1da7de34aecfcf18dd | https://repo1.maven.org/maven2/org/apache/apache/9/apache-9.pom
-150021a89ae6f252415cbfff5c3111bf87433776b997b68e6e71f37e5b696799 | https://dl.google.com/dl/android/maven2/com/android/support/support-vector-…
-b51f8867c92b6a722499557fc3a1fdea77bdf9ef574722fe90ce436a29559454 | https://repo1.maven.org/maven2/org/sonatype/oss/oss-parent/7/oss-parent-7.p…
-0288414509c625b8dd544384fbd29f502bdc8b4f86cfc26625aa23eef9fa6057 | https://repo1.maven.org/maven2/net/sf/proguard/proguard-parent/5.3.3/progua…
-70c458dcf6040317b41ddf50a7d53a02b8a85b0723b36cde9562c59e3cd11dae | https://dl.google.com/dl/android/maven2/com/android/tools/dvlib/26.0.1/dvli…
-faf82de0dc02e0c0ae327cd653f37255496b2e53fce280b3ab4cb34553a89086 | https://repo1.maven.org/maven2/com/intellij/annotations/12.0/annotations-12…
-bede73084ec812b916f686cc6e47625bd0756154bef589a4c2b419e54a393bf5 | https://dl.google.com/dl/android/maven2/com/android/tools/build/manifest-me…
-8fdc3336e7b01873193ba9c48b87de7d788dc0954d1eb45c322492627a4b5c6e | https://repo1.maven.org/maven2/org/bouncycastle/bcprov-jdk15on/1.56/bcprov-…
-0c0e9d1857c250d1d71b5c6be7b8cc29afe55e7419a90d13bbe968ae5bd7240e | https://repo1.maven.org/maven2/org/ow2/asm/asm-util/5.1/asm-util-5.1.pom
-052b0d2b58e5df4f30e4f64bdf5414473f6cfa10147f8f8d89cb0b63316ba8f3 | https://dl.google.com/dl/android/maven2/com/android/tools/build/manifest-me…
-e5e82da4cc66c8d917bbf743e3c0752efe8522735e7fc9dbddb65bccea81cfe9 | https://repo1.maven.org/maven2/org/apache/httpcomponents/httpcore/4.2.5/htt…
-0a640f956f4cdde8b5d3458a67ca67599eeb6f47349167a3f1afce7d60978027 | https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle-core…
-07f08b315c812406e9d497e1b592689742feb3950c1a713f95e2692d3e15b619 | https://dl.google.com/dl/android/maven2/com/android/tools/ddms/ddmlib/26.0.…
-e767a1248adb4843110457e839e504c2511649ee78f05a6a311ea7f23578894d | https://dl.google.com/dl/android/maven2/com/android/tools/build/builder-tes…
-18c4a0095d5c1da6b817592e767bb23d29dd2f560ad74df75ff3961dbde25b79 | https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.…
-953b116521a73575eee990e3f2c36a892fb088bb2d9a3027c82193cb7a013ef7 | https://repo1.maven.org/maven2/it/unimi/dsi/fastutil/7.2.0/fastutil-7.2.0.p…
-9466512cd8cf0bd66a8a3661685373f7b3deafded11096e044926ff5c82c7a4c | https://repo1.maven.org/maven2/com/google/code/gson/gson/2.3/gson-2.3.jar
-fb8c5e55e30a7addb4ff210858a0e8d2494ed6757bbe19012da99d51586c3cbb | https://repo1.maven.org/maven2/org/apache/commons/commons-parent/22/commons…
-ddb0fc5402b4cd8f31d5f29c830793d3ec00fd8ce60786254e5f0f132f0bdd8d | https://dl.google.com/dl/android/maven2/com/android/tools/lint/lint-api/26.…
-7846399b35c7cd642a9b3a000c3e2d62d04eb37a4547b6933cc8b18bcc2f086b | https://repo1.maven.org/maven2/com/googlecode/juniversalchardet/juniversalc…
-6b87237de8c2e1740cf80627c7f3ce3e15de1930bb250c55a1eca94fa3e014df | https://repo1.maven.org/maven2/org/codehaus/codehaus-parent/4/codehaus-pare…
-ff513db0361fd41237bef4784968bc15aae478d4ec0a9496f811072ccaf3841d | https://repo1.maven.org/maven2/org/apache/apache/13/apache-13.pom
-f2885288839f82f824a0c042922ae7f24ed0d55ce26a74b6a7c557e0b7e30c24 | https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.1.3-2/k…
-fcd77cba4ea3893429860b93da5d43f2e089f2ba8bdfa97ef724f410f404152a | https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle/3.0.…
-cf149955279b07d4f11e817985c1164a69e930d73db7441b43a6ef53bbd286c4 | https://repo1.maven.org/maven2/com/google/errorprone/error_prone_parent/2.0…
-cd6db17a11a31ede794ccbd1df0e4d9750f640234731f21cff885a9997277e81 | https://repo1.maven.org/maven2/com/google/google/1/google-1.pom
-97b3786e1f55e74bddf8ad102bf50e33bbcbc1f6b7fd7b36f0bbbb25cd4981be | https://repo1.maven.org/maven2/org/ow2/asm/asm-commons/5.1/asm-commons-5.1.…
-a32de739cfdf515774e696f91aa9697d2e7731e5cb5045ca8a4b657f8b1b4fb4 | https://repo1.maven.org/maven2/org/antlr/antlr4/4.5.3/antlr4-4.5.3.jar
-efa86e5cd922f17b472fdfcae57234d8d4ac3e148b6250737dfce454af7a7a44 | https://repo1.maven.org/maven2/com/google/jimfs/jimfs/1.1/jimfs-1.1.pom
-d3d96637b0e8e61046567b8c87b667dcf3cd31c7447f651cb58d6e6e744adfba | https://dl.google.com/dl/android/maven2/com/android/support/appcompat-v7/23…
-1879f19a05991e3ed95910b96689333396b0c467a215dc4d1f90018404b72a26 | https://repo1.maven.org/maven2/org/codehaus/mojo/animal-sniffer-annotations…
-949246020c08a0543389082af38268cdce4ee7a7a8218097369b9845752866cb | https://dl.google.com/dl/android/maven2/com/android/tools/lint/lint-checks/…
-a47c950c755747ca3093a05e9ec85d0e2f33cbd224909f571fe7577963a4d799 | https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.1.3-2/…
1917871c8deb468307a584680c87a44572f5a8b0b98c6d397fc0f5f86596dbe7 | https://repo.spring.io/plugins-release/org/jetbrains/trove4j/trove4j/201608…
-db3cd95bec1001605e1653f2843e8542e712fa2bb672fd9c8c1ace86c57673d1 | https://repo1.maven.org/maven2/org/apache/httpcomponents/httpmime/4.1/httpm…
-ee032c39ae5e3cd099148fbba9a2124f9ed613e5cb93e03ee0fa8808ce364040 | https://repo1.maven.org/maven2/org/ow2/asm/asm-util/5.1/asm-util-5.1.jar
-b27bbb9d269a97be8ff0ac480c0f09c9a953f62e6ff05d90fcbb0ddb4de97c77 | https://dl.google.com/dl/android/maven2/com/android/tools/common/26.0.1/com…
-ace2a10dc8e2d5fd34925ecac03e4988b2c0f851650c94b8cef49ba1bd111478 | https://repo1.maven.org/maven2/org/jetbrains/annotations/13.0/annotations-1…
-ecd46dc69f5212b35eb21d64db68072f956c000083030ff53e09d1f81487c580 | https://dl.google.com/dl/android/maven2/com/android/tools/external/org-jetb…
-8c6191e0dd8bfdc862332cb79b08185ac5b63565d405dac2605be4c2b19774bd | https://repo1.maven.org/maven2/com/android/tools/external/lombok/lombok-ast…
-10107898991129eff2042a41b1bfc2d72c4ea8e4babe429ae3aeb32c69c568de | https://dl.google.com/dl/android/maven2/com/android/tools/analytics-library…
-c71555751e57e0ef912870e8ac9625ae782502a6a5b9c19ccf83b2a97d8b26bd | https://repo1.maven.org/maven2/com/google/jimfs/jimfs-parent/1.1/jimfs-pare…
-7043dee4e9e7175e93e0b36f45b1ec1ecb893c5f755667e8b916eb8dd201c6ca | https://repo1.maven.org/maven2/org/bouncycastle/bcpkix-jdk15on/1.56/bcpkix-…
-f5a0a1eeaa100ed36aa83eca562d5dbb7e9b045c98b44db7da4745e9d9a20328 | https://repo1.maven.org/maven2/org/apache/httpcomponents/httpclient/4.2.6/h…
-2ba9c1cfec6b4a183b72a5ccc6cb2c83479d6ad7e931543c792292c1679a7f43 | https://dl.google.com/dl/android/maven2/com/android/tools/external/org-jetb…
-8d4006178fedef4255797b806167cf4a6774158eedabf96420693afbbd00fee3 | https://dl.google.com/dl/android/maven2/com/android/tools/analytics-library…
-47a89be0fa0fedd476db5fd2c83487654d2a119c391f83a142be876667cf7dab | https://repo1.maven.org/maven2/com/googlecode/json-simple/json-simple/1.1/j…
-a0d002465c0f611eedaaef2b2530707d2e9fb3a5c7ed66f53c556a12f714f43a | https://dl.google.com/dl/android/maven2/com/android/support/support-v4/23.4…
-e6531a278b4f632f198a6e45b9e11de1b2b678cd5a4e0fdff442f604c2439a42 | https://repo1.maven.org/maven2/org/jacoco/org.jacoco.report/0.7.4.201502262…
-c9a55463942128f0b7fad62b8bee5886d1cb1c733fb3b78507465b025e6a4031 | https://dl.google.com/dl/android/maven2/com/android/databinding/compilerCom…
-e30f1db6058f745f26112ef309f89becb27c617c7d9e4c6e02165a7620a92e6a | https://dl.google.com/dl/android/maven2/com/android/tools/common/26.0.1/com…
-31ce606f4e9518936299bb0d27c978fa61e185fd1de7c9874fe959a53e34a685 | https://repo1.maven.org/maven2/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0.pom
-38db692b5cbaf69d89b1fe5b0fc38a5cc83f898716f8bc64086fa17c25ea57d6 | https://dl.google.com/dl/android/maven2/com/android/tools/analytics-library…
5c415a9d8585200de4be1947e15291cc79f599b06249375f5c9ea22d4b2d090f | https://repo.spring.io/plugins-release/org/jetbrains/trove4j/trove4j/201608…
-f26bdec2b9496470c0ce63b0d290816e8000ef018daaa259597ebae947fd690f | https://repo1.maven.org/maven2/net/sf/proguard/proguard-gradle/5.3.3/progua…
-5dc327c690d031a11aa8f9f4cdc391fb938fbb7c7c143cc4bc60dd573d1fd1c9 | https://dl.google.com/dl/android/maven2/com/android/tools/build/builder/3.0…
-e824935c264b041e847b67808aee704f8cd47d698203259057e42f473e1f6f30 | https://dl.google.com/dl/android/maven2/com/android/databinding/compilerCom…
-362e9324ee7c697e21279e20077b52737ddef3f1b2c1a7abe5ad34b465145550 | https://repo1.maven.org/maven2/org/apache/httpcomponents/httpclient/4.2.6/h…
-8b0aa8a74e990ca8d633ab7bd1938530e921548df13fd4020224a61065378876 | https://dl.google.com/dl/android/maven2/com/android/tools/build/builder-tes…
-f264dd9f79a1fde10ce5ecc53221eff24be4c9331c830b7d52f2f08a7b633de2 | https://repo1.maven.org/maven2/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0.jar
-f8ab13b14be080fe2f617f90e55599760e4a1b4deeea5c595df63d0d6375ed6d | https://repo1.maven.org/maven2/com/intellij/annotations/12.0/annotations-12…
-a9660f8b64b74f474226c70a50187d8efcac448d32ce97756f408975aa52cdaa | https://dl.google.com/dl/android/maven2/com/android/tools/sdk-common/26.0.1…
-a06e35d3fff3a6b813d94894ebf3e498f9540c864c5b39ae783907e3a6c72889 | https://repo1.maven.org/maven2/commons-codec/commons-codec/1.6/commons-code…
-8a4e4b32eedaa72976a757e12cf1dfe742725db0b7311bf176dd937ba4236384 | https://repo1.maven.org/maven2/org/antlr/antlr4/4.5.3/antlr4-4.5.3.pom
-fb5369fc7ea4b2e3cf8d6f20243f1d97f81341bf818b179cd8dbd1da7a781a21 | https://repo1.maven.org/maven2/org/ow2/asm/asm-tree/5.1/asm-tree-5.1.pom
-6f52ba933a117bd67131b281214510ea30232b9807bfe569bc0c17e6a2d4018c | https://dl.google.com/dl/android/maven2/com/android/tools/repository/26.0.1…
-9f85ff2fd7d6cb3097aa47fb419ee7f0ebe869109f98aba9f4eca3f49e74a40e | https://repo1.maven.org/maven2/org/apache/apache/16/apache-16.pom
-e51efb2ec140b2849b9880fb161cb6e30dd672368a534c1f47ab46d7f537d9ca | https://repo1.maven.org/maven2/net/sf/proguard/proguard-base/5.3.3/proguard…
-2ec779741f72313fc6623d0f0e42b2450dd2425dd6ad319697e658aae9ae177b | https://dl.google.com/dl/android/maven2/com/android/tools/dvlib/26.0.1/dvli…
-24633fb1e62a9e4b1a25e2c1751d68be89e050b488652456e545b8019539137d | https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle-api/…
-13c1448f7ebb61f67e6fbd6cd5c188804c17c4d7e77c4b79b316ede4ef9cd9b3 | https://dl.google.com/dl/android/maven2/com/android/tools/lint/lint/26.0.1/…
-bfadb3b40f65dd6de1666d6b29f8bb54031396c76eeef4146cf9f28255f8bf33 | https://repo1.maven.org/maven2/com/google/guava/guava/22.0/guava-22.0.pom
-c4828e28d7c0a930af9387510b3bada7daa5c04d7c25a75c7b8b081f1c257ddd | https://repo1.maven.org/maven2/com/google/jimfs/jimfs/1.1/jimfs-1.1.jar
-fee07b2760ef3ed20f2edefa70504a29f9216d277adae56ce85778ee4b18cd04 | https://dl.google.com/dl/android/maven2/com/android/support/support-v4/23.4…
-6b5ad911a13a5c814c04be4376586eec15838158cb59b9f062ae138ddff1b861 | https://dl.google.com/dl/android/maven2/com/android/tools/layoutlib/layoutl…
-932e6bab9a24a7bc958bbdb7e29e04d083b473d11c4ba3fab1e9b7149579f272 | https://repo1.maven.org/maven2/com/google/protobuf/protobuf-parent/3.0.0/pr…
-b787d574c851505e76212968b9ae1641ea79804aef7f5a2cee2a01cd4055213a | https://repo1.maven.org/maven2/org/apache/commons/commons-compress/1.12/com…
-8bd632c00bdf80a7de36c22b60f12452c147d8eca2f00d79d66699ebe7daa02a | https://repo1.maven.org/maven2/org/apache/commons/commons-parent/5/commons-…
-52b6fd2eaf2240e14dbe752f1fa884270cc668d6f350e8e7f65f6033a8172d69 | https://repo1.maven.org/maven2/org/apache/httpcomponents/httpcomponents-cli…
-c0de2bbc4cb8297419659813ecd4ed1d077ed1dd5c1f5544cc5143e493e84c10 | https://repo1.maven.org/maven2/org/ow2/asm/asm-tree/5.1/asm-tree-5.1.jar
-18f5c52120db036e88d6136f8839c832d074bdda95c756c6f429249d2db54ac6 | https://repo1.maven.org/maven2/org/slf4j/slf4j-parent/1.7.25/slf4j-parent-1…
-e2b4935e76d91b5abec44de309f2c8bb8d1d2e6cc0b8790b43cb654f1e22c722 | https://dl.google.com/dl/android/maven2/com/android/tools/layoutlib/layoutl…
-f056ed61a281b3e230a63e4abf510c0d2f9bf7ff513cacb65a29538ba90ab177 | https://repo1.maven.org/maven2/org/jacoco/org.jacoco.build/0.7.4.2015022621…
-74fa208043740642f7e6eb09faba15965218ad2f50ce3020efb100136e4b591c | https://repo1.maven.org/maven2/it/unimi/dsi/fastutil/7.2.0/fastutil-7.2.0.j…
-fb40265f982548212ff82e362e59732b2187ec6f0d80182885c14ef1f982827a | https://repo1.maven.org/maven2/org/sonatype/oss/oss-parent/9/oss-parent-9.p…
-321668fc474a73140eb9cc73c779f1ebb9f60948aade3beddee082ecefcf0259 | https://repo1.maven.org/maven2/org/bouncycastle/bcpkix-jdk15on/1.56/bcpkix-…
-9e9323a26ba8eb2394efef0c96d31b70df570808630dc147cab1e73541cc5194 | https://repo1.maven.org/maven2/org/apache/apache/4/apache-4.pom
-cf251279505960889b6b281c26af0438656ebac3845e52791925cf7649cb15a6 | https://dl.google.com/dl/android/maven2/com/android/tools/sdklib/26.0.1/sdk…
-21bb4d44dff54e33a37c11af69859a714202ae00969aab5453eba7276688f8ec | https://repo1.maven.org/maven2/org/apache/httpcomponents/project/4.1.1/proj…
diff --git a/projects/tor-android-service/gradle.patch b/projects/tor-android-service/gradle.patch
deleted file mode 100644
index 3fff3e6..0000000
--- a/projects/tor-android-service/gradle.patch
+++ /dev/null
@@ -1,37 +0,0 @@
-diff --git a/build.gradle b/build.gradle
-index 671edab..d9ecfef 100644
---- a/build.gradle
-+++ b/build.gradle
-@@ -5,6 +5,7 @@ buildscript {
- repositories {
- google()
- mavenCentral()
-+ maven { url System.getenv("GRADLE_MAVEN_REPO") }
- }
- dependencies {
- classpath "com.android.tools.build:gradle:${androidplugin}"
-@@ -20,5 +21,6 @@ allprojects {
- mavenCentral()
- maven { url "https://repo.spring.io/plugins-release" }
- maven { url "https://raw.githubusercontent.com/guardianproject/gpmaven/master" }
-+ maven { url System.getenv("GRADLE_MAVEN_REPO") }
- }
- }
-\ No newline at end of file
-diff --git a/service/build.gradle b/service/build.gradle
-index b414557..ae3e203 100644
---- a/service/build.gradle
-+++ b/service/build.gradle
-@@ -16,12 +16,6 @@ android {
- }
- }
-
-- externalNativeBuild {
-- ndkBuild {
-- path "src/main/jni/Android.mk"
-- buildStagingDirectory "./outputs/ndk-build"
-- }
-- }
-
- lintOptions {
- abortOnError false
diff --git a/projects/tor-android-service/maven-local.patch b/projects/tor-android-service/maven-local.patch
new file mode 100644
index 0000000..c52a1d3
--- /dev/null
+++ b/projects/tor-android-service/maven-local.patch
@@ -0,0 +1,23 @@
+diff --git a/build.gradle b/build.gradle
+index 671edab..c7870e6 100644
+--- a/build.gradle
++++ b/build.gradle
+@@ -5,6 +5,7 @@ buildscript {
+ repositories {
+ google()
+ mavenCentral()
++ mavenLocal()
+ }
+ dependencies {
+ classpath "com.android.tools.build:gradle:${androidplugin}"
+@@ -18,7 +19,8 @@ allprojects {
+ repositories {
+ google()
+ mavenCentral()
++ mavenLocal()
+ maven { url "https://repo.spring.io/plugins-release" }
+ maven { url "https://raw.githubusercontent.com/guardianproject/gpmaven/master" }
+ }
+-}
+\ No newline at end of file
++}
diff --git a/projects/tor-android-service/remove-native-build.patch b/projects/tor-android-service/remove-native-build.patch
new file mode 100644
index 0000000..1ddcd94
--- /dev/null
+++ b/projects/tor-android-service/remove-native-build.patch
@@ -0,0 +1,17 @@
+diff --git a/service/build.gradle b/service/build.gradle
+index b414557..ae3e203 100644
+--- a/service/build.gradle
++++ b/service/build.gradle
+@@ -16,12 +16,6 @@ android {
+ }
+ }
+
+- externalNativeBuild {
+- ndkBuild {
+- path "src/main/jni/Android.mk"
+- buildStagingDirectory "./outputs/ndk-build"
+- }
+- }
+
+ lintOptions {
+ abortOnError false
1
0

[tor-browser-build/master] Bug 31567: NS_tsnprintf() does not handle %s correctly on Windows
by gk@torproject.org 01 Sep '19
by gk@torproject.org 01 Sep '19
01 Sep '19
commit a479eeb424496b781d7ea9cf7b2d9a6404d7c32f
Author: Georg Koppen <gk(a)torproject.org>
Date: Sun Sep 1 06:14:09 2019 +0000
Bug 31567: NS_tsnprintf() does not handle %s correctly on Windows
---
projects/mingw-w64-clang/31567_1.patch | 33 ++++++++++++++
projects/mingw-w64-clang/31567_2.patch | 82 ++++++++++++++++++++++++++++++++++
projects/mingw-w64-clang/build | 2 +
projects/mingw-w64-clang/config | 2 +
4 files changed, 119 insertions(+)
diff --git a/projects/mingw-w64-clang/31567_1.patch b/projects/mingw-w64-clang/31567_1.patch
new file mode 100644
index 0000000..be316ee
--- /dev/null
+++ b/projects/mingw-w64-clang/31567_1.patch
@@ -0,0 +1,33 @@
+From d9c7a5aa3ac8d29b98f28af71d862c2d3931e7d8 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Martin=20Storsj=C3=B6?= <martin(a)martin.st>
+Date: Sun, 1 Sep 2019 06:05:40 +0000
+Subject: [PATCH 1/2] This function was moved from inline in header to a
+ statically linked one in 52a34d52d6f5f1789d329abd4e, where the use of this
+ define was dropped.
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+As this function is statically linked, the caller can't control
+and change the behaviour of the function by defining
+UCRTBASE_PRINTF_DEFAULT_WIDE in the calling translation unit,
+but we should at least use the headers' default value (which currently
+is zero).
+
+Signed-off-by: Martin Storsjö <martin(a)martin.st>
+
+diff --git a/mingw-w64-crt/stdio/ucrt__vsnwprintf.c b/mingw-w64-crt/stdio/ucrt__vsnwprintf.c
+index bf9f4de2..c505c31e 100644
+--- a/mingw-w64-crt/stdio/ucrt__vsnwprintf.c
++++ b/mingw-w64-crt/stdio/ucrt__vsnwprintf.c
+@@ -10,6 +10,6 @@
+
+ int __cdecl _vsnwprintf(wchar_t * __restrict__ _Dest,size_t _Count,const wchar_t * __restrict__ _Format,va_list _Args) __MINGW_ATTRIB_DEPRECATED_SEC_WARN
+ {
+- return __stdio_common_vswprintf(UCRTBASE_PRINTF_LEGACY_VSPRINTF_NULL_TERMINATION, _Dest, _Count, _Format, NULL, _Args);
++ return __stdio_common_vswprintf(UCRTBASE_PRINTF_DEFAULT_WIDE | UCRTBASE_PRINTF_LEGACY_VSPRINTF_NULL_TERMINATION, _Dest, _Count, _Format, NULL, _Args);
+ }
+ int __cdecl (*__MINGW_IMP_SYMBOL(_vsnwprintf))(wchar_t *__restrict__, size_t, const wchar_t *__restrict__, va_list) = _vsnwprintf;
+--
+2.23.0.rc1
+
diff --git a/projects/mingw-w64-clang/31567_2.patch b/projects/mingw-w64-clang/31567_2.patch
new file mode 100644
index 0000000..12070aa
--- /dev/null
+++ b/projects/mingw-w64-clang/31567_2.patch
@@ -0,0 +1,82 @@
+From 44d0691f6fa51d2b3a0df911652c801635424e4e Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Martin=20Storsj=C3=B6?= <martin(a)martin.st>
+Date: Sun, 1 Sep 2019 06:08:24 +0000
+Subject: [PATCH 2/2] When __USE_MINGW_ANSI_STDIO is defined, we still call the
+ custom implementation bundled in libmingwex, which has the C99 standard
+ semantics for %s in wide format strings.
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+This matches how the wide stdio functions behave both when using
+msvcrt.dll, and in all versions of MSVC, even the modern ones that
+use ucrt.
+
+Signed-off-by: Martin Storsjö <martin(a)martin.st>
+
+diff --git a/mingw-w64-headers/crt/conio.h b/mingw-w64-headers/crt/conio.h
+index 363203c3..a92ee059 100644
+--- a/mingw-w64-headers/crt/conio.h
++++ b/mingw-w64-headers/crt/conio.h
+@@ -21,12 +21,13 @@
+ #define UCRTBASE_SCANF_LEGACY_WIDE_SPECIFIERS (0x0002)
+ #define UCRTBASE_SCANF_LEGACY_MSVCRT_COMPATIBILITY (0x0004)
+
+-// Default wide printfs and scanfs to the standard mode
++// Default wide printfs and scanfs to the legacy wide mode. Only code built
++// with -D__USE_MINGW_ANSI_STDIO=1 will expect the standard behaviour.
+ #ifndef UCRTBASE_PRINTF_DEFAULT_WIDE
+-#define UCRTBASE_PRINTF_DEFAULT_WIDE 0
++#define UCRTBASE_PRINTF_DEFAULT_WIDE UCRTBASE_PRINTF_LEGACY_WIDE_SPECIFIERS
+ #endif
+ #ifndef UCRTBASE_SCANF_DEFAULT_WIDE
+-#define UCRTBASE_SCANF_DEFAULT_WIDE 0
++#define UCRTBASE_SCANF_DEFAULT_WIDE UCRTBASE_SCANF_LEGACY_WIDE_SPECIFIERS
+ #endif
+ #endif
+
+diff --git a/mingw-w64-headers/crt/stdio.h b/mingw-w64-headers/crt/stdio.h
+index e183236d..e8d3c857 100644
+--- a/mingw-w64-headers/crt/stdio.h
++++ b/mingw-w64-headers/crt/stdio.h
+@@ -147,12 +147,13 @@ extern FILE (* __MINGW_IMP_SYMBOL(_iob))[]; /* A pointer to an array of FILE */
+ #define UCRTBASE_SCANF_LEGACY_WIDE_SPECIFIERS (0x0002)
+ #define UCRTBASE_SCANF_LEGACY_MSVCRT_COMPATIBILITY (0x0004)
+
+-// Default wide printfs and scanfs to the standard mode
++// Default wide printfs and scanfs to the legacy wide mode. Only code built
++// with -D__USE_MINGW_ANSI_STDIO=1 will expect the standard behaviour.
+ #ifndef UCRTBASE_PRINTF_DEFAULT_WIDE
+-#define UCRTBASE_PRINTF_DEFAULT_WIDE 0
++#define UCRTBASE_PRINTF_DEFAULT_WIDE UCRTBASE_PRINTF_LEGACY_WIDE_SPECIFIERS
+ #endif
+ #ifndef UCRTBASE_SCANF_DEFAULT_WIDE
+-#define UCRTBASE_SCANF_DEFAULT_WIDE 0
++#define UCRTBASE_SCANF_DEFAULT_WIDE UCRTBASE_SCANF_LEGACY_WIDE_SPECIFIERS
+ #endif
+ #endif
+
+diff --git a/mingw-w64-headers/crt/wchar.h b/mingw-w64-headers/crt/wchar.h
+index cd26e098..d1348bc2 100644
+--- a/mingw-w64-headers/crt/wchar.h
++++ b/mingw-w64-headers/crt/wchar.h
+@@ -247,12 +247,13 @@ extern FILE (* __MINGW_IMP_SYMBOL(_iob))[]; /* A pointer to an array of FILE */
+ #define UCRTBASE_SCANF_LEGACY_WIDE_SPECIFIERS (0x0002)
+ #define UCRTBASE_SCANF_LEGACY_MSVCRT_COMPATIBILITY (0x0004)
+
+-// Default wide printfs and scanfs to the standard mode
++// Default wide printfs and scanfs to the legacy wide mode. Only code built
++// with -D__USE_MINGW_ANSI_STDIO=1 will expect the standard behaviour.
+ #ifndef UCRTBASE_PRINTF_DEFAULT_WIDE
+-#define UCRTBASE_PRINTF_DEFAULT_WIDE 0
++#define UCRTBASE_PRINTF_DEFAULT_WIDE UCRTBASE_PRINTF_LEGACY_WIDE_SPECIFIERS
+ #endif
+ #ifndef UCRTBASE_SCANF_DEFAULT_WIDE
+-#define UCRTBASE_SCANF_DEFAULT_WIDE 0
++#define UCRTBASE_SCANF_DEFAULT_WIDE UCRTBASE_SCANF_LEGACY_WIDE_SPECIFIERS
+ #endif
+ #endif
+
+--
+2.23.0.rc1
+
diff --git a/projects/mingw-w64-clang/build b/projects/mingw-w64-clang/build
index 4226212..820346d 100644
--- a/projects/mingw-w64-clang/build
+++ b/projects/mingw-w64-clang/build
@@ -69,6 +69,8 @@ default_win32_winnt=0x601
cd $builddir/mingw-w64-clang
patch -p1 < $rootdir/mingw-winrt.patch
+patch -p1 < $rootdir/31567_1.patch
+patch -p1 < $rootdir/31567_2.patch
cd mingw-w64-headers
mkdir build && cd build
../configure --host=[% c("arch") %]-w64-mingw32 \
diff --git a/projects/mingw-w64-clang/config b/projects/mingw-w64-clang/config
index 203e12e..16adee8 100644
--- a/projects/mingw-w64-clang/config
+++ b/projects/mingw-w64-clang/config
@@ -36,3 +36,5 @@ input_files:
- project: llvm-mingw
name: llvm-mingw
- filename: mingw-winrt.patch
+ - filename: 31567_1.patch
+ - filename: 31567_2.patch
1
0

[tor-browser-build/maint-8.5] Pick up last missing sec patch for 60.9.0
by gk@torproject.org 01 Sep '19
by gk@torproject.org 01 Sep '19
01 Sep '19
commit 9f402a4e31d468eb8128ed6bb614244f5795b2a5
Author: Georg Koppen <gk(a)torproject.org>
Date: Sun Sep 1 19:57:12 2019 +0000
Pick up last missing sec patch for 60.9.0
---
projects/firefox/config | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/projects/firefox/config b/projects/firefox/config
index 351c802..41c6ad5 100644
--- a/projects/firefox/config
+++ b/projects/firefox/config
@@ -1,7 +1,7 @@
# vim: filetype=yaml sw=2
version: '[% c("abbrev") %]'
filename: 'firefox-[% c("version") %]-[% c("var/osname") %]-[% c("var/build_id") %]'
-git_hash: 'tor-browser-[% c("var/firefox_version") %]-[% c("var/torbrowser_branch") %]-1-build1'
+git_hash: 'tor-browser-[% c("var/firefox_version") %]-[% c("var/torbrowser_branch") %]-2-build1'
tag_gpg_id: 1
git_url: https://git.torproject.org/tor-browser.git
git_submodule: 1
1
0

[tor-browser-build/maint-8.5] Don't forget to pick up Torbutton for mobile
by gk@torproject.org 01 Sep '19
by gk@torproject.org 01 Sep '19
01 Sep '19
commit 9fc24ea9dc2b0f1f5f03db1b741a07754840b8ee
Author: Georg Koppen <gk(a)torproject.org>
Date: Sun Sep 1 20:03:53 2019 +0000
Don't forget to pick up Torbutton for mobile
---
projects/firefox/config | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/projects/firefox/config b/projects/firefox/config
index 41c6ad5..2d022aa 100644
--- a/projects/firefox/config
+++ b/projects/firefox/config
@@ -1,7 +1,7 @@
# vim: filetype=yaml sw=2
version: '[% c("abbrev") %]'
filename: 'firefox-[% c("version") %]-[% c("var/osname") %]-[% c("var/build_id") %]'
-git_hash: 'tor-browser-[% c("var/firefox_version") %]-[% c("var/torbrowser_branch") %]-2-build1'
+git_hash: 'tor-browser-[% c("var/firefox_version") %]-[% c("var/torbrowser_branch") %]-2-build2'
tag_gpg_id: 1
git_url: https://git.torproject.org/tor-browser.git
git_submodule: 1
1
0
commit 2353437dde3b31f697d6f02fa14caebe3d8e7bfe
Author: Georg Koppen <gk(a)torproject.org>
Date: Sun Sep 1 19:58:15 2019 +0000
Version bump for 8.5.5
---
rbm.conf | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/rbm.conf b/rbm.conf
index 0ad63c1..26176b2 100644
--- a/rbm.conf
+++ b/rbm.conf
@@ -24,10 +24,10 @@ buildconf:
git_signtag_opt: '-s'
var:
- torbrowser_version: '8.5.4'
- torbrowser_build: 'build2'
+ torbrowser_version: '8.5.5'
+ torbrowser_build: 'build1'
torbrowser_incremental_from:
- - 8.5.3
+ - 8.5.4
project_name: tor-browser
multi_lingual: 0
build_mar: 1
1
0

01 Sep '19
commit 944a0bc18ba68f5cabee167efe0e0f1045bc9d5d
Author: Georg Koppen <gk(a)torproject.org>
Date: Sun Sep 1 20:01:34 2019 +0000
Pick up Torbutton 2.1.13
---
toolkit/torproject/torbutton | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/toolkit/torproject/torbutton b/toolkit/torproject/torbutton
index 40b7d1375031..850024dd1bef 160000
--- a/toolkit/torproject/torbutton
+++ b/toolkit/torproject/torbutton
@@ -1 +1 @@
-Subproject commit 40b7d13750313a702a044db430622d933b09fb9e
+Subproject commit 850024dd1bef30256f0ef443d4761aa43a3b84f6
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Load torbutton in browser.xul on Android
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit 805ff051656dc22d11de026e01223352f39e7380
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Fri Aug 30 10:17:25 2019 -0400
Load torbutton in browser.xul on Android
---
mobile/android/chrome/content/browser.js | 4 ++++
mobile/android/chrome/content/browser.xul | 1 +
2 files changed, 5 insertions(+)
diff --git a/mobile/android/chrome/content/browser.js b/mobile/android/chrome/content/browser.js
index f8e9399f51c4..7fcee29f0c3c 100644
--- a/mobile/android/chrome/content/browser.js
+++ b/mobile/android/chrome/content/browser.js
@@ -243,6 +243,8 @@ var lazilyLoadedBrowserScripts = [
["CastingApps", "chrome://browser/content/CastingApps.js"],
["RemoteDebugger", "chrome://browser/content/RemoteDebugger.js"],
["gViewSourceUtils", "chrome://global/content/viewSourceUtils.js"],
+ ["torbuttonUtils", "chrome://torbutton/content/torbutton_utils.js"],
+ ["torbutton", "chrome://torbutton/content/torbutton.js"],
];
lazilyLoadedBrowserScripts.forEach(function(aScript) {
@@ -763,6 +765,8 @@ var BrowserApp = {
true
);
+ torbutton_init();
+
// We can't delay registering WebChannel listeners: if the first page is
// about:accounts, which can happen when starting the Firefox Account flow
// from the first run experience, or via the Firefox Account Status
diff --git a/mobile/android/chrome/content/browser.xul b/mobile/android/chrome/content/browser.xul
index 8072a7a1c6e5..71aa04df0ebf 100644
--- a/mobile/android/chrome/content/browser.xul
+++ b/mobile/android/chrome/content/browser.xul
@@ -4,6 +4,7 @@
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<?xml-stylesheet href="chrome://browser/content/browser.css" type="text/css"?>
+<?xml-stylesheet href="chrome://torbutton/skin/torbutton.css" type="text/css"?>
<window id="main-window"
onload="BrowserApp.startup();"
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 29238 - Prevent crash on Android after update
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit 8dbeac4a57547b530762a3a30cb7eea29df463d9
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Fri Mar 22 16:24:09 2019 +0000
Bug 29238 - Prevent crash on Android after update
---
mobile/android/base/AndroidManifest.xml.in | 8 --------
1 file changed, 8 deletions(-)
diff --git a/mobile/android/base/AndroidManifest.xml.in b/mobile/android/base/AndroidManifest.xml.in
index 228a7b6399b0..5f231e9ba83c 100644
--- a/mobile/android/base/AndroidManifest.xml.in
+++ b/mobile/android/base/AndroidManifest.xml.in
@@ -492,14 +492,6 @@
android:permission="android.permission.BIND_JOB_SERVICE" >
</service>
- <receiver
- android:name="org.mozilla.gecko.PackageReplacedReceiver"
- android:exported="false">
- <intent-filter>
- <action android:name="android.intent.action.MY_PACKAGE_REPLACED"></action>
- </intent-filter>
- </receiver>
-
<service
android:name="org.mozilla.gecko.telemetry.TelemetryUploadService"
android:permission="android.permission.BIND_JOB_SERVICE"
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 30573 - Sanitize old tabs and wait for tor before opening new tabs
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit dd5be6e82f301448b2c4d3290beeb3729e943817
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Wed May 29 14:05:07 2019 +0000
Bug 30573 - Sanitize old tabs and wait for tor before opening new tabs
---
.../base/java/org/mozilla/gecko/BrowserApp.java | 4 +-
.../base/java/org/mozilla/gecko/GeckoApp.java | 55 +++++++++++++++++++++-
2 files changed, 57 insertions(+), 2 deletions(-)
diff --git a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
index c2a463ad6ed1..f03548e30ced 100644
--- a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
+++ b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
@@ -1134,7 +1134,7 @@ public class BrowserApp extends GeckoApp
*
* mTorStatus provides synchronization across threads.
*/
- private boolean checkTorIsStarted() {
+ public boolean checkTorIsStarted() {
// When tor is started, true. Otherwise, false
mTorStatus = false;
BroadcastReceiver br = setupReceiveTorIsStartedAsync();
@@ -2120,6 +2120,7 @@ public class BrowserApp extends GeckoApp
finishAndShutdown(/* restart */ false);
}
}
+ super.handleMessage(event, message, callback);
break;
case "Sanitize:OpenTabs":
@@ -3019,6 +3020,7 @@ public class BrowserApp extends GeckoApp
// If we finished, then Tor bootstrapped 100%
mTorNeedsStart = false;
+ EventDispatcher.getInstance().dispatch("Tor:Ready", null);
// When bootstrapping completes, check if the Firstrun (onboarding) screens
// should be shown.
diff --git a/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java b/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java
index 9c66f56b0485..388d7c3b89a3 100644
--- a/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java
+++ b/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java
@@ -193,6 +193,10 @@ public abstract class GeckoApp extends GeckoActivity
protected Menu mMenu;
protected boolean mIsRestoringActivity;
+ protected boolean mIsSanitizeTabsEnabled = false;
+ protected boolean mIsSanitizeCompleted = false;
+ protected Object mIsSanitizeCompletedLock = new Object();
+
/** Tells if we're aborting app launch, e.g. if this is an unsupported device configuration. */
protected boolean mIsAbortingAppLaunch;
@@ -604,6 +608,12 @@ public abstract class GeckoApp extends GeckoActivity
for (final String clear : clearSet) {
clearObj.putBoolean(clear, true);
}
+
+ synchronized (mIsSanitizeCompletedLock) {
+ mIsSanitizeTabsEnabled = clearSet.contains("private.data.openTabs");
+ mIsSanitizeCompleted = false;
+ }
+
return clearObj;
}
@@ -788,6 +798,11 @@ public abstract class GeckoApp extends GeckoActivity
notifyAll();
}
+ } else if ("Sanitize:Finished".equals(event)) {
+ synchronized (mIsSanitizeCompletedLock) {
+ mIsSanitizeCompleted = true;
+ }
+
} else if ("SystemUI:Visibility".equals(event)) {
if (message.getBoolean("visible", true)) {
mMainLayout.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
@@ -1628,7 +1643,45 @@ public abstract class GeckoApp extends GeckoActivity
loadStartupTab(Tabs.LOADURL_NEW_TAB, action);
} else {
final int flags = getNewTabFlags();
- loadStartupTab(passedUri, intent, flags);
+ final BrowserApp browserApp = (BrowserApp) GeckoApp.this;
+
+ synchronized (mIsSanitizeCompletedLock) {
+ // If OpenTabs will be sanitized, then load the tab after Sanitize:Finished
+ // is received. If Tor isn't started, then load tabs after Tor:Ready, too. And
+ // if Gecko isn't loaded, then wait until the profile is loaded (avoiding the race
+ // between loading the page and checking if |browser.privatebrowsing.autoStart| is true.
+ EventDispatcher.getInstance().registerUiThreadListener(new BundleEventListener() {
+ // isSanitized is true if Sanitizing is enable and it is completed or if Sanitizing is disabled.
+ private boolean isSanitized = (mIsSanitizeTabsEnabled && mIsSanitizeCompleted) || !mIsSanitizeTabsEnabled;
+ private boolean isTorReady = browserApp.checkTorIsStarted();
+ private boolean isGeckoReady = GeckoThread.isRunning();
+
+ @Override
+ public void handleMessage(String event, GeckoBundle message, EventCallback callback) {
+ if ("Sanitize:Finished".equals(event)) {
+ EventDispatcher.getInstance().unregisterUiThreadListener(this, "Sanitize:Finished");
+ isSanitized = true;
+
+ } else if ("Tor:Ready".equals(event)) {
+ EventDispatcher.getInstance().unregisterUiThreadListener(this, "Tor:Ready");
+ isTorReady = true;
+ } else if ("Gecko:Ready".equals(event)) {
+ EventDispatcher.getInstance().unregisterUiThreadListener(this, "Gecko:Ready");
+ isGeckoReady = true;
+ } else if ("Tor:CheckIfReady".equals(event)) {
+ EventDispatcher.getInstance().unregisterUiThreadListener(this, "Tor:CheckIfReady");
+ }
+
+ if (isSanitized && isTorReady && isGeckoReady) {
+ loadStartupTab(passedUri, intent, flags);
+ }
+ }
+ }, "Sanitize:Finished", "Tor:Ready", "Tor:CheckIfReady", "Gecko:Ready");
+
+ // Run the event callback now, just in case Tor:Ready and Sanitize:Finished were
+ // dispatched before the listener was created.
+ EventDispatcher.getInstance().dispatch("Tor:CheckIfReady", null);
+ }
}
}
});
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Pick up latest Torbutton fixes
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit 28bf38065aacbb6db2b19b024081aad6da7a1c51
Author: Georg Koppen <gk(a)torproject.org>
Date: Sat Aug 31 19:45:55 2019 +0000
Pick up latest Torbutton fixes
---
toolkit/torproject/torbutton | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/toolkit/torproject/torbutton b/toolkit/torproject/torbutton
index 605decfd4ddc..0efb110e9bc6 160000
--- a/toolkit/torproject/torbutton
+++ b/toolkit/torproject/torbutton
@@ -1 +1 @@
-Subproject commit 605decfd4ddc81eb37da17172f48f92fd7f7e451
+Subproject commit 0efb110e9bc65e3289c58d093c32a25877f61e0b
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 24920 - Only create Private tabs if browser.privatebrowsing.autostart is true
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit 576ff6dcffff7ad57c21c4bc469b52566d8da3dd
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Mon May 27 15:55:33 2019 +0000
Bug 24920 - Only create Private tabs if browser.privatebrowsing.autostart is true
---
.../base/java/org/mozilla/gecko/BrowserApp.java | 9 +++++++
.../base/java/org/mozilla/gecko/GeckoApp.java | 31 ++++++++++++++++++++++
.../android/base/java/org/mozilla/gecko/Tabs.java | 7 ++++-
.../java/org/mozilla/gecko/tabs/TabsPanel.java | 4 +++
mobile/android/chrome/content/browser.js | 4 +--
5 files changed, 52 insertions(+), 3 deletions(-)
diff --git a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
index da25e3b395be..c2a463ad6ed1 100644
--- a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
+++ b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
@@ -3362,6 +3362,15 @@ public class BrowserApp extends GeckoApp
share.setActionProvider(provider);
+ // Change visibility of new_tab. This may be called before
+ // mOnlyPrivateTabs is set in GeckoApp::onCreate(). If the PrefHelper
+ // callback was not already called, then the visibility will be correctly set
+ // in the callback.
+ MenuItem newTabMenuItem = mMenu.findItem(R.id.new_tab);
+ if (newTabMenuItem != null) {
+ newTabMenuItem.setVisible(mOnlyPrivateTabs == false);
+ }
+
return true;
}
diff --git a/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java b/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java
index e01318dab422..9c66f56b0485 100644
--- a/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java
+++ b/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java
@@ -165,6 +165,8 @@ public abstract class GeckoApp extends GeckoActivity
*/
public static final String PREFS_IS_FIRST_RUN = "telemetry-isFirstRun";
+ public static final String PREFS_PRIVATEBROWSING_AUTOSTART = "browser.privatebrowsing.autostart";
+
public static final String SAVED_STATE_IN_BACKGROUND = "inBackground";
public static final String SAVED_STATE_PRIVATE_SESSION = "privateSession";
/**
@@ -352,6 +354,8 @@ public abstract class GeckoApp extends GeckoActivity
private boolean mPrivateBrowsingSessionOutdated;
private static final int MAX_PRIVATE_TABS_UPDATE_WAIT_MSEC = 500;
+ protected boolean mOnlyPrivateTabs = false;
+
private volatile HealthRecorder mHealthRecorder;
private volatile Locale mLastLocale;
@@ -1164,6 +1168,28 @@ public abstract class GeckoApp extends GeckoActivity
"ToggleChrome:Show",
null);
+ PrefsHelper.getPref(PREFS_PRIVATEBROWSING_AUTOSTART,
+ new PrefsHelper.PrefHandlerBase() {
+ @Override public void prefValue(String pref, boolean value) {
+ if (pref != PREFS_PRIVATEBROWSING_AUTOSTART) {
+ return;
+ }
+
+ mOnlyPrivateTabs = value;
+
+ // Change visibility here in case mMenu is initialized. If it is not initialized,
+ // then the visibility is set in BrowserApp::onCreateOptionsMenu().
+ if (mMenu != null) {
+ MenuItem newTabMenuItem = mMenu.findItem(R.id.new_tab);
+ if (newTabMenuItem != null) {
+ newTabMenuItem.setVisible(mOnlyPrivateTabs == false);
+ }
+ }
+
+ Tabs.getInstance().setOnlyPrivateTabs(mOnlyPrivateTabs);
+ }
+ });
+
Tabs.getInstance().attachToContext(this, mLayerView, getAppEventDispatcher());
Tabs.registerOnTabsChangedListener(this);
@@ -1202,6 +1228,7 @@ public abstract class GeckoApp extends GeckoActivity
}
// If we are doing a restore, read the session data so we can send it to Gecko later.
+
GeckoBundle restoreMessage = null;
if (!mIsRestoringActivity && mShouldRestore) {
final boolean isExternalURL = invokedWithExternalURL(getIntentURI(new SafeIntent(getIntent())));
@@ -2306,6 +2333,10 @@ public abstract class GeckoApp extends GeckoActivity
}
}
+ public boolean isOnlyPrivateTabs() {
+ return mOnlyPrivateTabs;
+ }
+
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
protected void finishAndShutdown(final boolean restart) {
ThreadUtils.assertOnUiThread();
diff --git a/mobile/android/base/java/org/mozilla/gecko/Tabs.java b/mobile/android/base/java/org/mozilla/gecko/Tabs.java
index 068d8cb7ca28..30c75b68aad8 100644
--- a/mobile/android/base/java/org/mozilla/gecko/Tabs.java
+++ b/mobile/android/base/java/org/mozilla/gecko/Tabs.java
@@ -106,6 +106,7 @@ public class Tabs implements BundleEventListener {
private ContentObserver mBookmarksContentObserver;
private PersistTabsRunnable mPersistTabsRunnable;
private int mPrivateClearColor;
+ private boolean mOnlyPrivateTabs = true;
// Close all tabs including normal and private tabs.
@RobocopTarget
@@ -211,6 +212,10 @@ public class Tabs implements BundleEventListener {
}
}
+ public synchronized void setOnlyPrivateTabs(boolean onlyPrivateTabs) {
+ mOnlyPrivateTabs = onlyPrivateTabs;
+ }
+
public void detachFromContext() {
mGeckoView = null;
}
@@ -1026,7 +1031,7 @@ public class Tabs implements BundleEventListener {
// delayLoad implies background tab
boolean background = delayLoad || (flags & LOADURL_BACKGROUND) != 0;
- boolean isPrivate = (flags & LOADURL_PRIVATE) != 0 || (intent != null && intent.getBooleanExtra(PRIVATE_TAB_INTENT_EXTRA, false));
+ boolean isPrivate = (flags & LOADURL_PRIVATE) != 0 || (intent != null && intent.getBooleanExtra(PRIVATE_TAB_INTENT_EXTRA, false)) || mOnlyPrivateTabs;
boolean userEntered = (flags & LOADURL_USER_ENTERED) != 0;
boolean desktopMode = (flags & LOADURL_DESKTOP) != 0;
boolean external = (flags & LOADURL_EXTERNAL) != 0;
diff --git a/mobile/android/base/java/org/mozilla/gecko/tabs/TabsPanel.java b/mobile/android/base/java/org/mozilla/gecko/tabs/TabsPanel.java
index 08c107ebb62d..fc27ac03c929 100644
--- a/mobile/android/base/java/org/mozilla/gecko/tabs/TabsPanel.java
+++ b/mobile/android/base/java/org/mozilla/gecko/tabs/TabsPanel.java
@@ -167,6 +167,10 @@ public class TabsPanel extends LinearLayout
final View tabNormal = mTabWidget.addTab(R.drawable.tabs_normal, R.string.tabs_normal);
mNormalTabsPanel = tabNormal instanceof ThemedImageButton ? ((ThemedImageButton) tabNormal) : null;
+ if (mActivity.isOnlyPrivateTabs()) {
+ tabNormal.setVisibility(View.GONE);
+ }
+
final View tabPrivate = mTabWidget.addTab(R.drawable.tabs_private, R.string.tabs_private);
mPrivateTabsPanel = tabPrivate instanceof ThemedImageButton ? ((ThemedImageButton) tabPrivate) : null;
if (mPrivateTabsPanel != null) {
diff --git a/mobile/android/chrome/content/browser.js b/mobile/android/chrome/content/browser.js
index e139e59a7f40..f8e9399f51c4 100644
--- a/mobile/android/chrome/content/browser.js
+++ b/mobile/android/chrome/content/browser.js
@@ -4410,9 +4410,9 @@ Tab.prototype = {
// Must be called after appendChild so the docShell has been created.
this.setActive(false);
- let isPrivate = "isPrivate" in aParams && aParams.isPrivate;
+ let isPrivate = (("isPrivate" in aParams) && aParams.isPrivate) || Services.prefs.getBoolPref("browser.privatebrowsing.autostart");
if (isPrivate) {
- attrs.privateBrowsingId = 1;
+ attrs['privateBrowsingId'] = 1;
}
this.browser.docShell.setOriginAttributes(attrs);
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 29859: Disable HLS support for now
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit 14b7000757ad06197cb4e088731171f0a6ff325a
Author: Georg Koppen <gk(a)torproject.org>
Date: Thu Mar 28 19:10:34 2019 +0000
Bug 29859: Disable HLS support for now
---
mobile/android/app/000-tor-browser-android.js | 3 +++
mobile/android/base/AppConstants.java.in | 2 +-
mobile/android/moz.configure | 2 +-
3 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/mobile/android/app/000-tor-browser-android.js b/mobile/android/app/000-tor-browser-android.js
index 02e3ef00c1b3..2410706bb5f5 100644
--- a/mobile/android/app/000-tor-browser-android.js
+++ b/mobile/android/app/000-tor-browser-android.js
@@ -57,5 +57,8 @@ pref("general.useragent.updates.url", "");
// Enable touch events on Android (highlighting text, etc)
pref("dom.w3c_touch_events.enabled", 2);
+// No HLS support for now due to browser freezing, see: #29859.
+pref("media.hls.enabled", false);
+
// Inherit locale from the OS, used for multi-locale builds
pref("intl.locale.requested", "");
diff --git a/mobile/android/base/AppConstants.java.in b/mobile/android/base/AppConstants.java.in
index 26047188841c..762db8d86a1b 100644
--- a/mobile/android/base/AppConstants.java.in
+++ b/mobile/android/base/AppConstants.java.in
@@ -382,7 +382,7 @@ public class AppConstants {
//#ifdef TOR_BROWSER_VERSION
return true;
//#else
- return false;
+ return true;
//#endif
}
}
diff --git a/mobile/android/moz.configure b/mobile/android/moz.configure
index c8ed3a9a59e1..cb536b790d94 100644
--- a/mobile/android/moz.configure
+++ b/mobile/android/moz.configure
@@ -92,7 +92,7 @@ project_flag('MOZ_SWITCHBOARD',
project_flag('MOZ_ANDROID_HLS_SUPPORT',
help='Enable HLS (HTTP Live Streaming) support (currently using the ExoPlayer library)',
- default=True)
+ default=False)
option(env='MOZ_ANDROID_ACTIVITY_STREAM',
help='Enable Activity Stream on Android (replacing the default HomePager)',
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 31058: Remove Linus' default bridges
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit 225b1f3bb0a021b52b69b915400266478fb2a264
Author: Georg Koppen <gk(a)torproject.org>
Date: Tue Jul 2 07:57:08 2019 +0000
Bug 31058: Remove Linus' default bridges
There are no default obfs3 bridges remaining after Linus' ones are gone.
Remove the UI and localization.
---
.../res/layout/preference_tor_network_select_bridge_type.xml | 11 -----------
.../java/org/mozilla/gecko/torbootstrap/TorPreferences.java | 3 ---
mobile/android/base/locales/en-US/torbrowser_strings.dtd | 1 -
mobile/android/base/strings.xml.in | 1 -
4 files changed, 16 deletions(-)
diff --git a/mobile/android/app/src/main/res/layout/preference_tor_network_select_bridge_type.xml b/mobile/android/app/src/main/res/layout/preference_tor_network_select_bridge_type.xml
index 2c1632bb8268..4ef5925e233d 100644
--- a/mobile/android/app/src/main/res/layout/preference_tor_network_select_bridge_type.xml
+++ b/mobile/android/app/src/main/res/layout/preference_tor_network_select_bridge_type.xml
@@ -74,17 +74,6 @@
android:textSize="16sp"
android:text="@string/pref_bridges_type_meek_azure"/>
<include layout="@xml/separator" />
- <RadioButton android:id="@+id/radio_pref_bridges_obfs3"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginTop="10sp"
- android:layout_marginBottom="10sp"
- android:buttonTint="@color/tor_bridges_select_builtin"
- android:fontFamily="Roboto-Regular"
- android:textColor="#DE000000"
- android:textSize="16sp"
- android:text="@string/pref_bridges_type_obfs3"/>
- <include layout="@xml/separator" />
</RadioGroup>
</LinearLayout>
diff --git a/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorPreferences.java b/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorPreferences.java
index 9e74c49f3f91..cb37f3867ca4 100644
--- a/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorPreferences.java
+++ b/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorPreferences.java
@@ -679,9 +679,6 @@ public class TorPreferences extends AppCompatPreferenceActivity {
case "meek":
buttonId = R.id.radio_pref_bridges_meek_azure;
break;
- case "obfs3":
- buttonId = R.id.radio_pref_bridges_obfs3;
- break;
}
if (buttonId != -1) {
diff --git a/mobile/android/base/locales/en-US/torbrowser_strings.dtd b/mobile/android/base/locales/en-US/torbrowser_strings.dtd
index f3fba468fc0e..8d000f90d561 100644
--- a/mobile/android/base/locales/en-US/torbrowser_strings.dtd
+++ b/mobile/android/base/locales/en-US/torbrowser_strings.dtd
@@ -54,7 +54,6 @@
<!-- When another PT is recommended, change TorNetworkBridgeSelectPreference::saveCurrentCheckedRadioButton(), too -->
<!ENTITY pref_bridges_type_obfs4 "obfs4 (recommended)">
<!ENTITY pref_bridges_type_meek_azure "meek-azure">
-<!ENTITY pref_bridges_type_obfs3 "obfs3">
<!ENTITY pref_tor_network_bridges_enabled_change_builtin "You\'re using a built-in bridge to connect to Tor. Change">
<!ENTITY pref_tor_network_bridges_enabled_change_custom "You\'re using a custom bridge to connect to Tor. Change">
<!ENTITY pref_tor_network_using_multiple_provided_bridges "You\'re using multiple custom bridges.">
diff --git a/mobile/android/base/strings.xml.in b/mobile/android/base/strings.xml.in
index 8ac8248ea1dc..9b016bd4cccd 100644
--- a/mobile/android/base/strings.xml.in
+++ b/mobile/android/base/strings.xml.in
@@ -101,7 +101,6 @@
<string name="pref_choice_tor_bridges_enabled_summary">&pref_choice_tor_bridges_enabled_summary;</string>
<string name="pref_bridges_type_obfs4">&pref_bridges_type_obfs4;</string>
<string name="pref_bridges_type_meek_azure">&pref_bridges_type_meek_azure;</string>
- <string name="pref_bridges_type_obfs3">&pref_bridges_type_obfs3;</string>
<string name="pref_tor_bridges_provide_manual_button_title">&pref_tor_bridges_provide_manual_button_title;</string>
<string name="pref_tor_bridges_provide_select_text_title">&pref_tor_bridges_provide_select_text_title;</string>
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Continue using non-adaptive icons and don't allow clear-text traffic
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit 144e2f64a8dbb3c84150d44fcdbab989f4aa4184
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Mon Jul 22 13:41:22 2019 +0000
Continue using non-adaptive icons and don't allow clear-text traffic
---
mobile/android/base/AndroidManifest.xml.in | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/mobile/android/base/AndroidManifest.xml.in b/mobile/android/base/AndroidManifest.xml.in
index 5f231e9ba83c..39c1899daa1f 100644
--- a/mobile/android/base/AndroidManifest.xml.in
+++ b/mobile/android/base/AndroidManifest.xml.in
@@ -24,13 +24,11 @@
#include FennecManifest_permissions.xml.in
<application android:label="@string/moz_app_displayname"
- android:icon="@mipmap/ic_launcher"
- android:logo="@drawable/logo"
+ android:icon="@drawable/icon"
android:name="@MOZ_ANDROID_APPLICATION_CLASS@"
android:hardwareAccelerated="true"
android:supportsRtl="true"
android:allowBackup="false"
- android:usesCleartextTraffic="true"
>
<meta-data android:name="com.sec.android.support.multiwindow" android:value="true"/>
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] libvpx provides already cpu_features
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit a55be20a2d69bb641f1bf254fd44df523604571d
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Thu Jun 27 20:57:21 2019 +0000
libvpx provides already cpu_features
---
media/libaom/moz.build | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/media/libaom/moz.build b/media/libaom/moz.build
index 5f169b39418d..b53f820abf06 100644
--- a/media/libaom/moz.build
+++ b/media/libaom/moz.build
@@ -94,10 +94,10 @@ if CONFIG['OS_TARGET'] == 'Android':
# the OS they're on, so do it for them.
DEFINES['__linux__'] = True
- if not CONFIG['MOZ_WEBRTC']:
- SOURCES += [
- '%%%s/sources/android/cpufeatures/cpu-features.c' % CONFIG['ANDROID_NDK'],
- ]
+ #if not CONFIG['MOZ_WEBRTC']:
+ # SOURCES += [
+ # '%%%s/sources/android/cpufeatures/cpu-features.c' % CONFIG['ANDROID_NDK'],
+ # ]
for f in SOURCES:
if f.endswith('sse2.c'):
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 25741 - TBA: Exclude unwanted Stumbler tests
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit c789cf909fdbca70d68cd833ce037a05bd13b604
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Mon Apr 16 13:47:48 2018 +0000
Bug 25741 - TBA: Exclude unwanted Stumbler tests
When the stumbler service is ifdef-disabled because MOZ_ANDROID_MLS_STUMBLER
is not defined, then the unit test compilation fails because some values are
never declared and defined. We exclude all testStumbler*.java files from
the robocop gecko test source tree.
---
mobile/android/app/build.gradle | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/mobile/android/app/build.gradle b/mobile/android/app/build.gradle
index 1267f849ee3a..c6a0bc45d56f 100644
--- a/mobile/android/app/build.gradle
+++ b/mobile/android/app/build.gradle
@@ -190,6 +190,11 @@ android {
androidTest {
java {
srcDir "${topsrcdir}/mobile/android/tests/browser/robocop/src"
+
+ if (!mozconfig.substs.MOZ_ANDROID_MLS_STUMBLER) {
+ exclude 'org/mozilla/gecko/tests/testStumbler*.java'
+ }
+
// Bug 1229149 tracks pushing this into a :services Gradle project.
srcDir "${topsrcdir}/mobile/android/services/src/androidTest/java"
srcDir "${topsrcdir}/mobile/android/tests/browser/junit3/src"
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 25741 - TBA: Move GCM Push prefs within preprocessor guard
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit f130103fc3403cb6c9dbedd314a7face0e4e42e7
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Sun Apr 15 14:19:38 2018 +0000
Bug 25741 - TBA: Move GCM Push prefs within preprocessor guard
Otherwise the preprocessor is sad because MOZ_ANDROID_GCM_SENDERID is
not defined. We don't need any of this, so we exclude it.
---
mobile/android/app/mobile.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/mobile/android/app/mobile.js b/mobile/android/app/mobile.js
index 3e13d0d81a5d..9d4f331e968f 100644
--- a/mobile/android/app/mobile.js
+++ b/mobile/android/app/mobile.js
@@ -813,13 +813,13 @@ pref("dom.serviceWorkers.enabled", true);
// click on mobile. This is to account for some devices being quite slow.
pref("dom.serviceWorkers.disable_open_click_delay", 5000);
+#ifdef MOZ_ANDROID_GCM
pref("dom.push.debug", false);
// The upstream autopush endpoint must have the Google API key corresponding to
// the App's sender ID; we bake this assumption directly into the URL.
pref("dom.push.serverURL", "https://updates.push.services.mozilla.com/v1/gcm/@MOZ_ANDROID_GCM_SENDERID@");
pref("dom.push.maxRecentMessageIDsPerSubscription", 0);
-#ifdef MOZ_ANDROID_GCM
pref("dom.push.enabled", true);
#endif
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 25741 - TBA: Add mozconfig for Android and pertinent branding files.
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit 00379cae99b3e3188cc7da47486adb5923c5c6bf
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Fri Feb 2 17:04:11 2018 +0000
Bug 25741 - TBA: Add mozconfig for Android and pertinent branding files.
Based on Orfox initial commits with fixup commits squashed and
rebranding Orfox -> Tor Browser
See original source from ce3fab3c90eb4a3892181ee36b037da04c785d99
https://github.com/guardianproject/tor-browser.git
Dropped symlinks
Also:
Bug 27125 - Move localized Tor Browser for Android strings into separate file
Bug 28622: Update Tor Browser icon for mobile
Bug 27472 - Export MOZILLA_OFFICIAL during Android build
Bug 30136: Use 'Tor Browser' as brand name on mobile, too
Bug 27111: Configure tor browser for mobile to load about:tor
- Add preferences.json: it is used to configure android specific
preferences
- Keep the ActivityStream HomePager closed when the user clicks in the
url bar
---
.mozconfig-android | 39 +++++++++++++++++++++
.../base/java/org/mozilla/gecko/BrowserApp.java | 3 +-
.../base/locales/en-US/torbrowser_strings.dtd | 5 +++
mobile/android/base/moz.build | 1 +
mobile/android/base/strings.xml.in | 1 +
mobile/android/branding/alpha/configure.sh | 8 +++++
mobile/android/branding/alpha/content/about.png | Bin 0 -> 30131 bytes
.../android/branding/alpha/content/favicon32.png | Bin 0 -> 1761 bytes
.../android/branding/alpha/content/favicon64.png | Bin 0 -> 4950 bytes
mobile/android/branding/alpha/content/jar.mn | 9 +++++
mobile/android/branding/alpha/content/moz.build | 7 ++++
.../android/branding/alpha/locales/en-US/brand.dtd | 13 +++++++
.../branding/alpha/locales/en-US/brand.properties | 10 ++++++
mobile/android/branding/alpha/locales/jar.mn | 13 +++++++
mobile/android/branding/alpha/locales/moz.build | 7 ++++
mobile/android/branding/alpha/moz.build | 7 ++++
.../branding/alpha/res/drawable-hdpi/icon.png | Bin 0 -> 6007 bytes
.../alpha/res/drawable-hdpi/large_icon.png | Bin 0 -> 15169 bytes
.../res/drawable-hdpi/search_widget_preview.png | Bin 0 -> 10119 bytes
.../alpha/res/drawable-nodpi/firstrun_welcome.png | Bin 0 -> 50140 bytes
.../branding/alpha/res/drawable-xhdpi/icon.png | Bin 0 -> 8778 bytes
.../alpha/res/drawable-xhdpi/large_icon.png | Bin 0 -> 22987 bytes
.../res/drawable-xhdpi/search_widget_preview.png | Bin 0 -> 13769 bytes
.../branding/alpha/res/drawable-xxhdpi/icon.png | Bin 0 -> 16140 bytes
.../alpha/res/drawable-xxhdpi/large_icon.png | Bin 0 -> 41886 bytes
.../res/drawable-xxhdpi/search_widget_preview.png | Bin 0 -> 26741 bytes
.../branding/alpha/res/drawable-xxxhdpi/icon.png | Bin 0 -> 24683 bytes
.../res/drawable-xxxhdpi/search_widget_preview.png | Bin 0 -> 34597 bytes
mobile/android/branding/nightly/configure.sh | 10 +++---
.../android/branding/nightly/content/favicon32.png | Bin 2020 -> 1928 bytes
.../android/branding/nightly/content/favicon64.png | Bin 5152 -> 5398 bytes
.../branding/nightly/locales/en-US/brand.dtd | 8 ++---
.../nightly/locales/en-US/brand.properties | 4 +--
.../branding/nightly/res/drawable-hdpi/icon.png | Bin 6307 -> 6578 bytes
.../nightly/res/drawable-hdpi/large_icon.png | Bin 14582 -> 17085 bytes
.../branding/nightly/res/drawable-xhdpi/icon.png | Bin 9490 -> 9884 bytes
.../nightly/res/drawable-xhdpi/large_icon.png | Bin 20843 -> 26206 bytes
.../branding/nightly/res/drawable-xxhdpi/icon.png | Bin 16480 -> 18335 bytes
.../nightly/res/drawable-xxhdpi/large_icon.png | Bin 36066 -> 49974 bytes
.../branding/nightly/res/drawable-xxxhdpi/icon.png | Bin 24541 -> 28434 bytes
mobile/android/branding/official/configure.sh | 7 ++--
.../branding/official/content/favicon32.png | Bin 2240 -> 2018 bytes
.../branding/official/content/favicon64.png | Bin 5324 -> 5527 bytes
.../branding/official/locales/en-US/brand.dtd | 10 +++---
.../official/locales/en-US/brand.properties | 6 ++--
.../branding/official/res/drawable-hdpi/icon.png | Bin 6136 -> 6634 bytes
.../official/res/drawable-hdpi/large_icon.png | Bin 14818 -> 17467 bytes
.../branding/official/res/drawable-xhdpi/icon.png | Bin 8877 -> 9814 bytes
.../official/res/drawable-xhdpi/large_icon.png | Bin 21192 -> 26333 bytes
.../branding/official/res/drawable-xxhdpi/icon.png | Bin 14818 -> 17467 bytes
.../official/res/drawable-xxhdpi/large_icon.png | Bin 34638 -> 46598 bytes
.../official/res/drawable-xxxhdpi/icon.png | Bin 21192 -> 26333 bytes
.../assets/distribution/preferences.json | 10 ++++++
.../mozbuild/action/generate_strings_xml.py | 3 +-
.../mozharness/mozilla/testing/testbase.py | 7 ++--
55 files changed, 159 insertions(+), 29 deletions(-)
diff --git a/.mozconfig-android b/.mozconfig-android
new file mode 100755
index 000000000000..2a7d75bb252f
--- /dev/null
+++ b/.mozconfig-android
@@ -0,0 +1,39 @@
+mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/obj-arm-linux-androideabi
+mk_add_options MOZ_APP_DISPLAYNAME="Tor Browser"
+export MOZILLA_OFFICIAL=1
+
+ac_add_options --enable-optimize
+ac_add_options --enable-official-branding
+
+# Android
+ac_add_options --enable-application=mobile/android
+ac_add_options --target=arm-linux-androideabi
+ac_add_options --with-android-ndk="$NDK_BASE" #Enter the android ndk location(ndk r17b)
+ac_add_options --with-android-sdk="$SDK_BASE" #Enter the android sdk location
+ac_add_options --with-branding=mobile/android/branding/alpha
+
+# Use Mozilla's Clang blobs
+CC="$HOME/.mozbuild/clang/bin/clang"
+CXX="$HOME/.mozbuild/clang/bin/clang++"
+
+ac_add_options --with-android-distribution-directory=@TOPSRCDIR@/mobile/android/torbrowser
+
+#enable ccache to set amount of cache assigned for build.
+ac_add_options --with-ccache
+
+ac_add_options --disable-tor-browser-update
+ac_add_options --disable-signmar
+ac_add_options --disable-verify-mar
+
+ac_add_options --enable-strip
+ac_add_options --disable-tests
+ac_add_options --disable-debug
+ac_add_options --disable-rust-debug
+
+ac_add_options --disable-updater
+ac_add_options --disable-crashreporter
+ac_add_options --disable-webrtc
+
+ac_add_options --without-google-play-services
+
+ac_add_options --enable-proxy-bypass-protection
diff --git a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
index a40a5f771373..7d4c03f7e5d2 100644
--- a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
+++ b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
@@ -2546,7 +2546,8 @@ public class BrowserApp extends GeckoApp
mBrowserToolbar.startEditing(url, animator);
- showHomePagerWithAnimator(panelId, null, animator);
+ // Don't show the HomePager when entering Edit mode
+ //showHomePagerWithAnimator(panelId, null, animator);
animator.start();
Telemetry.startUISession(TelemetryContract.Session.AWESOMESCREEN);
diff --git a/mobile/android/base/locales/en-US/torbrowser_strings.dtd b/mobile/android/base/locales/en-US/torbrowser_strings.dtd
new file mode 100644
index 000000000000..d23acc8a033a
--- /dev/null
+++ b/mobile/android/base/locales/en-US/torbrowser_strings.dtd
@@ -0,0 +1,5 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<!ENTITY firstrun_urlbar_subtext2 "A modern mobile browser from The Tor Project, the non-profit committed to a free and open web.">
diff --git a/mobile/android/base/moz.build b/mobile/android/base/moz.build
index 6d8ff304e5c9..8b81dfa97660 100644
--- a/mobile/android/base/moz.build
+++ b/mobile/android/base/moz.build
@@ -181,6 +181,7 @@ for f in ['res/values/strings.xml',
# The `locales/en-US/` will be rewritten to the locale-specific path.
'locales/en-US/android_strings.dtd',
'locales/en-US/sync_strings.dtd',
+ 'locales/en-US/torbrowser_strings.dtd',
]
generated_inputs = [
diff --git a/mobile/android/base/strings.xml.in b/mobile/android/base/strings.xml.in
index 8a64a84c7c45..c328bd6b512a 100644
--- a/mobile/android/base/strings.xml.in
+++ b/mobile/android/base/strings.xml.in
@@ -8,6 +8,7 @@
#includesubst @BRANDPATH@
#includesubst @STRINGSPATH@
#includesubst @SYNCSTRINGSPATH@
+#includesubst @TBSTRINGSPATH@
<!-- C-style format strings. -->
<!ENTITY formatI "%I">
diff --git a/mobile/android/branding/alpha/configure.sh b/mobile/android/branding/alpha/configure.sh
new file mode 100644
index 000000000000..4ec3e9c1041b
--- /dev/null
+++ b/mobile/android/branding/alpha/configure.sh
@@ -0,0 +1,8 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+MOZ_APP_DISPLAYNAME="Tor Browser Alpha"
+ANDROID_PACKAGE_NAME=org.torproject.torbrowser_alpha
+MOZ_UPDATER=
+MOZ_ANDROID_ANR_REPORTER=
diff --git a/mobile/android/branding/alpha/content/about.png b/mobile/android/branding/alpha/content/about.png
new file mode 100644
index 000000000000..2ca32a355fcd
Binary files /dev/null and b/mobile/android/branding/alpha/content/about.png differ
diff --git a/mobile/android/branding/alpha/content/favicon32.png b/mobile/android/branding/alpha/content/favicon32.png
new file mode 100644
index 000000000000..f3183767da37
Binary files /dev/null and b/mobile/android/branding/alpha/content/favicon32.png differ
diff --git a/mobile/android/branding/alpha/content/favicon64.png b/mobile/android/branding/alpha/content/favicon64.png
new file mode 100644
index 000000000000..56831e8ad596
Binary files /dev/null and b/mobile/android/branding/alpha/content/favicon64.png differ
diff --git a/mobile/android/branding/alpha/content/jar.mn b/mobile/android/branding/alpha/content/jar.mn
new file mode 100644
index 000000000000..9e2365645708
--- /dev/null
+++ b/mobile/android/branding/alpha/content/jar.mn
@@ -0,0 +1,9 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+geckoview.jar:
+% content branding %content/branding/ contentaccessible=yes
+ content/branding/about.png (about.png)
+ content/branding/favicon32.png (favicon32.png)
+ content/branding/favicon64.png (favicon64.png)
diff --git a/mobile/android/branding/alpha/content/moz.build b/mobile/android/branding/alpha/content/moz.build
new file mode 100644
index 000000000000..eb4454d28f88
--- /dev/null
+++ b/mobile/android/branding/alpha/content/moz.build
@@ -0,0 +1,7 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+JAR_MANIFESTS += ['jar.mn']
\ No newline at end of file
diff --git a/mobile/android/branding/alpha/locales/en-US/brand.dtd b/mobile/android/branding/alpha/locales/en-US/brand.dtd
new file mode 100644
index 000000000000..4d84be3466e9
--- /dev/null
+++ b/mobile/android/branding/alpha/locales/en-US/brand.dtd
@@ -0,0 +1,13 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<!ENTITY brandShortName "Alpha">
+<!ENTITY brandFullName "Tor Browser Alpha">
+<!-- LOCALIZATION NOTE (brandProductName):
+ This brand name can be used in messages where the product name needs to
+ remain unchanged across different versions (Nightly, Beta, etc.). -->
+<!ENTITY brandProductName "Tor Browser">
+<!ENTITY vendorShortName "The Tor Project">
+
+<!ENTITY brandPocket "">
diff --git a/mobile/android/branding/alpha/locales/en-US/brand.properties b/mobile/android/branding/alpha/locales/en-US/brand.properties
new file mode 100644
index 000000000000..2437e17b4712
--- /dev/null
+++ b/mobile/android/branding/alpha/locales/en-US/brand.properties
@@ -0,0 +1,10 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+brandShortName=Alpha
+brandFullName=Tor Browser Alpha
+# LOCALIZATION NOTE(brandProductName):
+# This brand name can be used in messages where the product name needs to
+# remain unchanged across different versions (Nightly, Beta, etc.).
+brandProductName=Tor Browser
diff --git a/mobile/android/branding/alpha/locales/jar.mn b/mobile/android/branding/alpha/locales/jar.mn
new file mode 100644
index 000000000000..60454ebba353
--- /dev/null
+++ b/mobile/android/branding/alpha/locales/jar.mn
@@ -0,0 +1,13 @@
+#filter substitution
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+[localization] @AB_CD@.jar:
+ branding (en-US/**/*.ftl)
+
+@AB_CD@.jar:
+% locale branding @AB_CD@ %locale/branding/
+# Branding only exists in en-US
+ locale/branding/brand.dtd (en-US/brand.dtd)
+ locale/branding/brand.properties (en-US/brand.properties)
diff --git a/mobile/android/branding/alpha/locales/moz.build b/mobile/android/branding/alpha/locales/moz.build
new file mode 100644
index 000000000000..eb4454d28f88
--- /dev/null
+++ b/mobile/android/branding/alpha/locales/moz.build
@@ -0,0 +1,7 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+JAR_MANIFESTS += ['jar.mn']
\ No newline at end of file
diff --git a/mobile/android/branding/alpha/moz.build b/mobile/android/branding/alpha/moz.build
new file mode 100644
index 000000000000..04084b1ace0f
--- /dev/null
+++ b/mobile/android/branding/alpha/moz.build
@@ -0,0 +1,7 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DIRS += ['content', 'locales']
diff --git a/mobile/android/branding/alpha/res/drawable-hdpi/icon.png b/mobile/android/branding/alpha/res/drawable-hdpi/icon.png
new file mode 100644
index 000000000000..4b8a5d2e48b6
Binary files /dev/null and b/mobile/android/branding/alpha/res/drawable-hdpi/icon.png differ
diff --git a/mobile/android/branding/alpha/res/drawable-hdpi/large_icon.png b/mobile/android/branding/alpha/res/drawable-hdpi/large_icon.png
new file mode 100644
index 000000000000..50f8777fc058
Binary files /dev/null and b/mobile/android/branding/alpha/res/drawable-hdpi/large_icon.png differ
diff --git a/mobile/android/branding/alpha/res/drawable-hdpi/search_widget_preview.png b/mobile/android/branding/alpha/res/drawable-hdpi/search_widget_preview.png
new file mode 100755
index 000000000000..508b2afc3480
Binary files /dev/null and b/mobile/android/branding/alpha/res/drawable-hdpi/search_widget_preview.png differ
diff --git a/mobile/android/branding/alpha/res/drawable-nodpi/firstrun_welcome.png b/mobile/android/branding/alpha/res/drawable-nodpi/firstrun_welcome.png
new file mode 100644
index 000000000000..5c9093331cff
Binary files /dev/null and b/mobile/android/branding/alpha/res/drawable-nodpi/firstrun_welcome.png differ
diff --git a/mobile/android/branding/alpha/res/drawable-xhdpi/icon.png b/mobile/android/branding/alpha/res/drawable-xhdpi/icon.png
new file mode 100644
index 000000000000..1bae7fa5fe70
Binary files /dev/null and b/mobile/android/branding/alpha/res/drawable-xhdpi/icon.png differ
diff --git a/mobile/android/branding/alpha/res/drawable-xhdpi/large_icon.png b/mobile/android/branding/alpha/res/drawable-xhdpi/large_icon.png
new file mode 100644
index 000000000000..371a1734d87c
Binary files /dev/null and b/mobile/android/branding/alpha/res/drawable-xhdpi/large_icon.png differ
diff --git a/mobile/android/branding/alpha/res/drawable-xhdpi/search_widget_preview.png b/mobile/android/branding/alpha/res/drawable-xhdpi/search_widget_preview.png
new file mode 100755
index 000000000000..885ca71b454f
Binary files /dev/null and b/mobile/android/branding/alpha/res/drawable-xhdpi/search_widget_preview.png differ
diff --git a/mobile/android/branding/alpha/res/drawable-xxhdpi/icon.png b/mobile/android/branding/alpha/res/drawable-xxhdpi/icon.png
new file mode 100644
index 000000000000..df944c11d700
Binary files /dev/null and b/mobile/android/branding/alpha/res/drawable-xxhdpi/icon.png differ
diff --git a/mobile/android/branding/alpha/res/drawable-xxhdpi/large_icon.png b/mobile/android/branding/alpha/res/drawable-xxhdpi/large_icon.png
new file mode 100644
index 000000000000..5e9bc0036a0d
Binary files /dev/null and b/mobile/android/branding/alpha/res/drawable-xxhdpi/large_icon.png differ
diff --git a/mobile/android/branding/alpha/res/drawable-xxhdpi/search_widget_preview.png b/mobile/android/branding/alpha/res/drawable-xxhdpi/search_widget_preview.png
new file mode 100755
index 000000000000..eab2a3440f2d
Binary files /dev/null and b/mobile/android/branding/alpha/res/drawable-xxhdpi/search_widget_preview.png differ
diff --git a/mobile/android/branding/alpha/res/drawable-xxxhdpi/icon.png b/mobile/android/branding/alpha/res/drawable-xxxhdpi/icon.png
new file mode 100644
index 000000000000..88005f727968
Binary files /dev/null and b/mobile/android/branding/alpha/res/drawable-xxxhdpi/icon.png differ
diff --git a/mobile/android/branding/alpha/res/drawable-xxxhdpi/search_widget_preview.png b/mobile/android/branding/alpha/res/drawable-xxxhdpi/search_widget_preview.png
new file mode 100755
index 000000000000..d04e82dcb360
Binary files /dev/null and b/mobile/android/branding/alpha/res/drawable-xxxhdpi/search_widget_preview.png differ
diff --git a/mobile/android/branding/nightly/configure.sh b/mobile/android/branding/nightly/configure.sh
index 69ef1f6b00d0..b4d43eb25a47 100644
--- a/mobile/android/branding/nightly/configure.sh
+++ b/mobile/android/branding/nightly/configure.sh
@@ -2,9 +2,7 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-MOZ_APP_DISPLAYNAME="Firefox Nightly"
-MOZ_UPDATER=1
-MOZ_ANDROID_ANR_REPORTER=1
-MOZ_ANDROID_SHARED_ID=org.mozilla.fennec.sharedID
-MOZ_ANDROID_GCM_SENDERID=965234145045
-MOZ_MMA_GCM_SENDERID=242693410970
\ No newline at end of file
+MOZ_APP_DISPLAYNAME="Tor Browser Nightly"
+ANDROID_PACKAGE_NAME=org.torproject.torbrowser_nightly
+MOZ_UPDATER=
+MOZ_ANDROID_ANR_REPORTER=
diff --git a/mobile/android/branding/nightly/content/favicon32.png b/mobile/android/branding/nightly/content/favicon32.png
index 23830c03fcd5..1331164c81f0 100644
Binary files a/mobile/android/branding/nightly/content/favicon32.png and b/mobile/android/branding/nightly/content/favicon32.png differ
diff --git a/mobile/android/branding/nightly/content/favicon64.png b/mobile/android/branding/nightly/content/favicon64.png
index d2214dcefe9a..eae8d730594e 100644
Binary files a/mobile/android/branding/nightly/content/favicon64.png and b/mobile/android/branding/nightly/content/favicon64.png differ
diff --git a/mobile/android/branding/nightly/locales/en-US/brand.dtd b/mobile/android/branding/nightly/locales/en-US/brand.dtd
index 0222f39f0016..6eaad721ca94 100644
--- a/mobile/android/branding/nightly/locales/en-US/brand.dtd
+++ b/mobile/android/branding/nightly/locales/en-US/brand.dtd
@@ -3,11 +3,11 @@
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<!ENTITY brandShortName "Nightly">
-<!ENTITY brandFullName "Mozilla Nightly">
+<!ENTITY brandFullName "Tor Browser Nightly">
<!-- LOCALIZATION NOTE (brandProductName):
This brand name can be used in messages where the product name needs to
remain unchanged across different versions (Nightly, Beta, etc.). -->
-<!ENTITY brandProductName "Firefox">
-<!ENTITY vendorShortName "Mozilla">
+<!ENTITY brandProductName "Tor Browser">
+<!ENTITY vendorShortName "The Tor Project">
-<!ENTITY brandPocket "Pocket">
+<!ENTITY brandPocket "">
diff --git a/mobile/android/branding/nightly/locales/en-US/brand.properties b/mobile/android/branding/nightly/locales/en-US/brand.properties
index 32ebbfac4ae4..1279e3752251 100644
--- a/mobile/android/branding/nightly/locales/en-US/brand.properties
+++ b/mobile/android/branding/nightly/locales/en-US/brand.properties
@@ -3,8 +3,8 @@
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
brandShortName=Nightly
-brandFullName=Mozilla Nightly
+brandFullName=Tor Browser Nightly
# LOCALIZATION NOTE(brandProductName):
# This brand name can be used in messages where the product name needs to
# remain unchanged across different versions (Nightly, Beta, etc.).
-brandProductName=Firefox
+brandProductName=Tor Browser
diff --git a/mobile/android/branding/nightly/res/drawable-hdpi/icon.png b/mobile/android/branding/nightly/res/drawable-hdpi/icon.png
index 68e024ad268a..756d37856e19 100644
Binary files a/mobile/android/branding/nightly/res/drawable-hdpi/icon.png and b/mobile/android/branding/nightly/res/drawable-hdpi/icon.png differ
diff --git a/mobile/android/branding/nightly/res/drawable-hdpi/large_icon.png b/mobile/android/branding/nightly/res/drawable-hdpi/large_icon.png
index 2ffc0ca909b9..6ce99c3a2124 100644
Binary files a/mobile/android/branding/nightly/res/drawable-hdpi/large_icon.png and b/mobile/android/branding/nightly/res/drawable-hdpi/large_icon.png differ
diff --git a/mobile/android/branding/nightly/res/drawable-xhdpi/icon.png b/mobile/android/branding/nightly/res/drawable-xhdpi/icon.png
index 0b5e1a175255..03fe48da2707 100644
Binary files a/mobile/android/branding/nightly/res/drawable-xhdpi/icon.png and b/mobile/android/branding/nightly/res/drawable-xhdpi/icon.png differ
diff --git a/mobile/android/branding/nightly/res/drawable-xhdpi/large_icon.png b/mobile/android/branding/nightly/res/drawable-xhdpi/large_icon.png
index 12f87594365c..f54c241c56eb 100644
Binary files a/mobile/android/branding/nightly/res/drawable-xhdpi/large_icon.png and b/mobile/android/branding/nightly/res/drawable-xhdpi/large_icon.png differ
diff --git a/mobile/android/branding/nightly/res/drawable-xxhdpi/icon.png b/mobile/android/branding/nightly/res/drawable-xxhdpi/icon.png
index 1ee12f2419eb..1288d3f106b0 100644
Binary files a/mobile/android/branding/nightly/res/drawable-xxhdpi/icon.png and b/mobile/android/branding/nightly/res/drawable-xxhdpi/icon.png differ
diff --git a/mobile/android/branding/nightly/res/drawable-xxhdpi/large_icon.png b/mobile/android/branding/nightly/res/drawable-xxhdpi/large_icon.png
index 37ac9d067e92..f5ffff4cd6b1 100644
Binary files a/mobile/android/branding/nightly/res/drawable-xxhdpi/large_icon.png and b/mobile/android/branding/nightly/res/drawable-xxhdpi/large_icon.png differ
diff --git a/mobile/android/branding/nightly/res/drawable-xxxhdpi/icon.png b/mobile/android/branding/nightly/res/drawable-xxxhdpi/icon.png
index 9128552b390e..d7d3f99c1d2c 100644
Binary files a/mobile/android/branding/nightly/res/drawable-xxxhdpi/icon.png and b/mobile/android/branding/nightly/res/drawable-xxxhdpi/icon.png differ
diff --git a/mobile/android/branding/official/configure.sh b/mobile/android/branding/official/configure.sh
index 5687537d358e..4da3d246d3c5 100644
--- a/mobile/android/branding/official/configure.sh
+++ b/mobile/android/branding/official/configure.sh
@@ -2,10 +2,7 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-MOZ_APP_DISPLAYNAME=Firefox
-ANDROID_PACKAGE_NAME=org.mozilla.firefox
+MOZ_APP_DISPLAYNAME="Tor Browser"
+ANDROID_PACKAGE_NAME=org.torproject.torbrowser
MOZ_UPDATER=
MOZ_ANDROID_ANR_REPORTER=
-MOZ_ANDROID_SHARED_ID=org.mozilla.firefox.sharedID
-MOZ_ANDROID_GCM_SENDERID=965234145045
-MOZ_MMA_GCM_SENDERID=242693410970
\ No newline at end of file
diff --git a/mobile/android/branding/official/content/favicon32.png b/mobile/android/branding/official/content/favicon32.png
index b6eb66068725..06992a00bc3e 100644
Binary files a/mobile/android/branding/official/content/favicon32.png and b/mobile/android/branding/official/content/favicon32.png differ
diff --git a/mobile/android/branding/official/content/favicon64.png b/mobile/android/branding/official/content/favicon64.png
index 1a8fc1ad0a65..4ef62a9617df 100644
Binary files a/mobile/android/branding/official/content/favicon64.png and b/mobile/android/branding/official/content/favicon64.png differ
diff --git a/mobile/android/branding/official/locales/en-US/brand.dtd b/mobile/android/branding/official/locales/en-US/brand.dtd
index 8942fe3e54d5..248c6567215a 100644
--- a/mobile/android/branding/official/locales/en-US/brand.dtd
+++ b/mobile/android/branding/official/locales/en-US/brand.dtd
@@ -2,12 +2,12 @@
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-<!ENTITY brandShortName "Firefox">
-<!ENTITY brandFullName "Mozilla Firefox">
+<!ENTITY brandShortName "Tor Browser">
+<!ENTITY brandFullName "Tor Browser">
<!-- LOCALIZATION NOTE (brandProductName):
This brand name can be used in messages where the product name needs to
remain unchanged across different versions (Nightly, Beta, etc.). -->
-<!ENTITY brandProductName "Firefox">
-<!ENTITY vendorShortName "Mozilla">
+<!ENTITY brandProductName "Tor Browser">
+<!ENTITY vendorShortName "The Tor Project">
-<!ENTITY brandPocket "Pocket">
+<!ENTITY brandPocket "">
diff --git a/mobile/android/branding/official/locales/en-US/brand.properties b/mobile/android/branding/official/locales/en-US/brand.properties
index 82cdf6f18c62..34636cab411c 100644
--- a/mobile/android/branding/official/locales/en-US/brand.properties
+++ b/mobile/android/branding/official/locales/en-US/brand.properties
@@ -2,9 +2,9 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-brandShortName=Firefox
-brandFullName=Mozilla Firefox
+brandShortName=Tor Browser
+brandFullName=Tor Browser
# LOCALIZATION NOTE(brandProductName):
# This brand name can be used in messages where the product name needs to
# remain unchanged across different versions (Nightly, Beta, etc.).
-brandProductName=Firefox
+brandProductName=Tor Browser
diff --git a/mobile/android/branding/official/res/drawable-hdpi/icon.png b/mobile/android/branding/official/res/drawable-hdpi/icon.png
index 370202c13fc7..8211871aae67 100644
Binary files a/mobile/android/branding/official/res/drawable-hdpi/icon.png and b/mobile/android/branding/official/res/drawable-hdpi/icon.png differ
diff --git a/mobile/android/branding/official/res/drawable-hdpi/large_icon.png b/mobile/android/branding/official/res/drawable-hdpi/large_icon.png
index 1815e0cabea9..bb81f8772b6d 100644
Binary files a/mobile/android/branding/official/res/drawable-hdpi/large_icon.png and b/mobile/android/branding/official/res/drawable-hdpi/large_icon.png differ
diff --git a/mobile/android/branding/official/res/drawable-xhdpi/icon.png b/mobile/android/branding/official/res/drawable-xhdpi/icon.png
index 6da9415761f0..39195e143042 100644
Binary files a/mobile/android/branding/official/res/drawable-xhdpi/icon.png and b/mobile/android/branding/official/res/drawable-xhdpi/icon.png differ
diff --git a/mobile/android/branding/official/res/drawable-xhdpi/large_icon.png b/mobile/android/branding/official/res/drawable-xhdpi/large_icon.png
index 3094479498bb..25d490e2fc0e 100644
Binary files a/mobile/android/branding/official/res/drawable-xhdpi/large_icon.png and b/mobile/android/branding/official/res/drawable-xhdpi/large_icon.png differ
diff --git a/mobile/android/branding/official/res/drawable-xxhdpi/icon.png b/mobile/android/branding/official/res/drawable-xxhdpi/icon.png
index 1815e0cabea9..bb81f8772b6d 100644
Binary files a/mobile/android/branding/official/res/drawable-xxhdpi/icon.png and b/mobile/android/branding/official/res/drawable-xxhdpi/icon.png differ
diff --git a/mobile/android/branding/official/res/drawable-xxhdpi/large_icon.png b/mobile/android/branding/official/res/drawable-xxhdpi/large_icon.png
index 0e2f73cb2ad4..d03e22132ffb 100644
Binary files a/mobile/android/branding/official/res/drawable-xxhdpi/large_icon.png and b/mobile/android/branding/official/res/drawable-xxhdpi/large_icon.png differ
diff --git a/mobile/android/branding/official/res/drawable-xxxhdpi/icon.png b/mobile/android/branding/official/res/drawable-xxxhdpi/icon.png
index 3094479498bb..25d490e2fc0e 100644
Binary files a/mobile/android/branding/official/res/drawable-xxxhdpi/icon.png and b/mobile/android/branding/official/res/drawable-xxxhdpi/icon.png differ
diff --git a/mobile/android/torbrowser/assets/distribution/preferences.json b/mobile/android/torbrowser/assets/distribution/preferences.json
new file mode 100644
index 000000000000..bebd14967d8e
--- /dev/null
+++ b/mobile/android/torbrowser/assets/distribution/preferences.json
@@ -0,0 +1,10 @@
+{
+ "ApplicationPreferences": {
+ "newtab.load_homepage": true
+ },
+ "AndroidPreferences": {
+ "homepage": "about:tor",
+ "startpane_enabled_after_57": true,
+ "startpane_enabled": true
+ }
+}
diff --git a/python/mozbuild/mozbuild/action/generate_strings_xml.py b/python/mozbuild/mozbuild/action/generate_strings_xml.py
index b60b480f0748..0b3ca6efb229 100644
--- a/python/mozbuild/mozbuild/action/generate_strings_xml.py
+++ b/python/mozbuild/mozbuild/action/generate_strings_xml.py
@@ -11,7 +11,7 @@ import buildconfig
from mozbuild import preprocessor
-def main(output, strings_xml, android_strings_dtd, sync_strings_dtd, locale=None):
+def main(output, strings_xml, android_strings_dtd, sync_strings_dtd, torbrowser_strings_dtd, locale=None):
if not locale:
raise ValueError('locale must be specified!')
@@ -23,6 +23,7 @@ def main(output, strings_xml, android_strings_dtd, sync_strings_dtd, locale=None
# Includes.
defines['STRINGSPATH'] = android_strings_dtd
defines['SYNCSTRINGSPATH'] = sync_strings_dtd
+ defines['TBSTRINGSPATH'] = torbrowser_strings_dtd
# Fennec branding is en-US only: see
# $(MOZ_BRANDING_DIRECTORY)/locales/jar.mn.
defines['BRANDPATH'] = '{}/{}/locales/en-US/brand.dtd'.format(
diff --git a/testing/mozharness/mozharness/mozilla/testing/testbase.py b/testing/mozharness/mozharness/mozilla/testing/testbase.py
index b392757f7ec1..8fc7fadedf21 100755
--- a/testing/mozharness/mozharness/mozilla/testing/testbase.py
+++ b/testing/mozharness/mozharness/mozilla/testing/testbase.py
@@ -473,8 +473,11 @@ You can set this by specifying --test-url URL
self._download_test_packages(suite_categories, extract_dirs)
self._download_installer()
- if self.config.get('download_symbols'):
- self._download_and_extract_symbols()
+ # When using --disable-crashreporter the symbols file
+ # "target.crashreporter-symbols.zip" won't be created,
+ # so we shouldn't try downloading it (and fail).
+ #if self.config.get('download_symbols'):
+ # self._download_and_extract_symbols()
# create_virtualenv is in VirtualenvMixin.
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 25741 - TBA: Disable features at compile-time
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit 91d7eba5e984f19d8e3af209e33f571c78001131
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Mon Apr 9 19:48:12 2018 +0000
Bug 25741 - TBA: Disable features at compile-time
MOZ_NATIVE_DEVICES for casting and the media player
MOZ_TELEMETRY_REPORTING for telemetry
MOZ_DATA_REPORTING for all data reporting preferences (crashreport, telemetry, geo)
---
mobile/android/confvars.sh | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/mobile/android/confvars.sh b/mobile/android/confvars.sh
index 77191834d240..e2fcd2f0bb4c 100644
--- a/mobile/android/confvars.sh
+++ b/mobile/android/confvars.sh
@@ -30,9 +30,22 @@ MOZ_ANDROID_BROWSER_INTENT_CLASS=org.mozilla.gecko.BrowserApp
MOZ_NO_SMART_CARDS=1
+# Adds MIME-type support for raw video
MOZ_RAW=1
# use custom widget for html:select
MOZ_USE_NATIVE_POPUP_WINDOWS=1
MOZ_APP_ID={aa3c5121-dab2-40e2-81ca-7ea25febc110}
+
+### Tor Browser for Android ###
+
+# Disables support at compile-time for casting (Mozilla Media Manager)
+# and prevents dependency on Google Play Services support
+unset MOZ_NATIVE_DEVICES
+
+# Disable telemetry at compile-time
+unset MOZ_TELEMETRY_REPORTING
+
+# Disable data reporting at compile-time
+unset MOZ_DATA_REPORTING
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 25741 - TBA: Add an AppConstant for TOR_BROWSER_VERSION
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit 7bcca0910e5ccd82858b5be0980437f61ce1df5f
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Fri Jan 19 20:13:58 2018 +0000
Bug 25741 - TBA: Add an AppConstant for TOR_BROWSER_VERSION
---
.../java/org/mozilla/gecko/TorBrowserTest.java | 27 ++++++++++++++++++++++
mobile/android/base/AppConstants.java.in | 15 ++++++++++++
mobile/android/base/generate_build_config.py | 3 ++-
mobile/android/geckoview/build.gradle | 1 +
4 files changed, 45 insertions(+), 1 deletion(-)
diff --git a/mobile/android/app/src/test/java/org/mozilla/gecko/TorBrowserTest.java b/mobile/android/app/src/test/java/org/mozilla/gecko/TorBrowserTest.java
new file mode 100644
index 000000000000..ae1d481807de
--- /dev/null
+++ b/mobile/android/app/src/test/java/org/mozilla/gecko/TorBrowserTest.java
@@ -0,0 +1,27 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+package org.mozilla.gecko;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mozilla.gecko.background.testhelpers.TestRunner;
+import org.mozilla.gecko.AppConstants;
+
+import static org.junit.Assert.*;
+
+(a)RunWith(TestRunner.class)
+public class TorBrowserTest {
+ /**
+ * Tests the compile-time constants are set.
+ */
+ @Test
+ public void testIsTorBrowser() {
+ assertTrue(AppConstants.isTorBrowser());
+ }
+
+ @Test
+ public void testTorBrowserVersion() {
+ assertEquals(AppConstants.TOR_BROWSER_VERSION, "9.0");
+ }
+}
diff --git a/mobile/android/base/AppConstants.java.in b/mobile/android/base/AppConstants.java.in
index 655a5e94cbb7..bfc594e7e801 100644
--- a/mobile/android/base/AppConstants.java.in
+++ b/mobile/android/base/AppConstants.java.in
@@ -357,4 +357,19 @@ public class AppConstants {
//#else
null;
//#endif
+
+ public static final String TOR_BROWSER_VERSION =
+//#ifdef TOR_BROWSER_VERSION
+ "@TOR_BROWSER_VERSION@";
+//#else
+ null;
+//#endif
+
+ public static final boolean isTorBrowser() {
+//#ifdef TOR_BROWSER_VERSION
+ return true;
+//#else
+ return false;
+//#endif
+ }
}
diff --git a/mobile/android/base/generate_build_config.py b/mobile/android/base/generate_build_config.py
index 4e079ce2e0cd..592a8ec9dae3 100644
--- a/mobile/android/base/generate_build_config.py
+++ b/mobile/android/base/generate_build_config.py
@@ -63,7 +63,8 @@ def _defines():
'MOZ_ANDROID_MAX_SDK_VERSION',
'MOZ_ANDROID_MIN_SDK_VERSION',
'MOZ_PKG_SPECIAL',
- 'MOZ_UPDATER'):
+ 'MOZ_UPDATER',
+ 'TOR_BROWSER_VERSION'):
if CONFIG[var]:
DEFINES[var] = CONFIG[var]
diff --git a/mobile/android/geckoview/build.gradle b/mobile/android/geckoview/build.gradle
index 84035fdce449..fe1b1ca7cb7a 100644
--- a/mobile/android/geckoview/build.gradle
+++ b/mobile/android/geckoview/build.gradle
@@ -89,6 +89,7 @@ android {
buildConfigField 'String', "MOZ_APP_DISPLAYNAME", "\"${mozconfig.substs.MOZ_APP_DISPLAYNAME}\"";
buildConfigField 'String', "MOZ_APP_UA_NAME", "\"${mozconfig.substs.MOZ_APP_UA_NAME}\"";
buildConfigField 'String', "MOZ_UPDATE_CHANNEL", "\"${mozconfig.substs.MOZ_UPDATE_CHANNEL}\"";
+ buildConfigField 'String', "TOR_BROWSER_VERSION", "\"${mozconfig.substs.TOR_BROWSER_VERSION}\"";
// MOZILLA_VERSION is oddly quoted from autoconf, but we don't have to handle it specially in Gradle.
buildConfigField 'String', "MOZILLA_VERSION", "\"${mozconfig.substs.MOZILLA_VERSION}\"";
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 25741 - TBA: Add default configure options in dedicated file
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit 83af6dee09ba7759bf8f9443baf09db02a5cc735
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Mon Jan 22 11:18:45 2018 +0000
Bug 25741 - TBA: Add default configure options in dedicated file
---
mobile/android/moz.configure | 9 ++++++--
mobile/android/torbrowser.configure | 43 +++++++++++++++++++++++++++++++++++++
2 files changed, 50 insertions(+), 2 deletions(-)
diff --git a/mobile/android/moz.configure b/mobile/android/moz.configure
index 3a0a8f9bcf2a..def87ba268f1 100644
--- a/mobile/android/moz.configure
+++ b/mobile/android/moz.configure
@@ -122,9 +122,12 @@ def fennec_nightly(nightly):
return bool(nightly)
-imply_option('MOZ_SERVICES_HEALTHREPORT', True)
-imply_option('MOZ_ANDROID_HISTORY', True)
imply_option('--enable-small-chunk-size', True)
+# Comment these so we can imply |False| in torbrowser.configure
+# The Build system doesn't allow multiple imply_option()
+# calls with the same key.
+#imply_option('MOZ_SERVICES_HEALTHREPORT', True)
+#imply_option('MOZ_ANDROID_HISTORY', True)
@depends(target)
def check_target(target):
@@ -135,6 +138,8 @@ def check_target(target):
'Build_Instructions/Simple_Firefox_for_Android_build '
'for more information about the necessary options.')
+include('torbrowser.configure')
+
include('../../toolkit/moz.configure')
include('../../build/moz.configure/android-sdk.configure')
include('../../build/moz.configure/java.configure')
diff --git a/mobile/android/torbrowser.configure b/mobile/android/torbrowser.configure
new file mode 100644
index 000000000000..5e3ab67dca6a
--- /dev/null
+++ b/mobile/android/torbrowser.configure
@@ -0,0 +1,43 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+# Set Tor Browser default config
+
+# Disable Android Beam (NFC integration)
+imply_option('MOZ_ANDROID_BEAM', False)
+
+
+imply_option('MOZ_ANDROID_DOWNLOAD_CONTENT_SERVICE', False)
+imply_option('MOZ_ANDROID_DOWNLOADS_INTEGRATION', False)
+imply_option('MOZ_ANDROID_EXCLUDE_FONTS', False)
+
+# Disable push notifications/messaging on nightly
+imply_option('MOZ_ANDROID_GCM', False)
+
+# Disable all history/bookmark/icon caching
+# (both in local sqlite DB and with Android integration)
+imply_option('MOZ_ANDROID_HISTORY', False)
+imply_option('MOZ_PLACES', False)
+
+# Disable the stumbler, Firefox shouldn't touch the network
+imply_option('MOZ_ANDROID_MLS_STUMBLER', False)
+
+# Disable uploading crash reports and dump files to an external server
+# This is still configured in old-configure. Uncomment when this moves
+# to the python config
+#imply_option('MOZ_CRASHREPORTER', False)
+
+# Disable uploading information about the browser configuration and
+# performance to an external server
+imply_option('MOZ_SERVICES_HEALTHREPORT', False)
+
+# Disable creating telemetry and data reports that are uploaded to an
+# external server
+# These aren't actually configure options. These are disabled in
+# confvars.sh, but they look like configure options so we'll document
+# them here, as well.
+#imply_option('MOZ_TELEMETRY_REPORTING', False)
+#imply_option('MOZ_DATA_REPORTING', False)
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 25741 - TBA: Add mobile-override of 000-tor-browser prefs
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit f0c4f9219012e04982d99f92c2808716bc8b9cc4
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Fri Jan 19 23:49:11 2018 +0000
Bug 25741 - TBA: Add mobile-override of 000-tor-browser prefs
---
.eslintignore | 3 ++
mobile/android/app/000-tor-browser-android.js | 61 +++++++++++++++++++++++++++
mobile/android/app/mobile.js | 4 ++
mobile/android/app/moz.build | 1 +
mobile/android/installer/package-manifest.in | 1 +
5 files changed, 70 insertions(+)
diff --git a/.eslintignore b/.eslintignore
index 2fc0d61fabe5..e8dbe3a037a3 100644
--- a/.eslintignore
+++ b/.eslintignore
@@ -227,6 +227,9 @@ media/webrtc/trunk/**
# mobile/android/ exclusions
mobile/android/tests/browser/chrome/tp5/**
+# uses `#include`
+mobile/android/app/000-tor-browser-android.js
+
# Uses `#filter substitution`
mobile/android/app/mobile.js
mobile/android/app/geckoview-prefs.js
diff --git a/mobile/android/app/000-tor-browser-android.js b/mobile/android/app/000-tor-browser-android.js
new file mode 100644
index 000000000000..02e3ef00c1b3
--- /dev/null
+++ b/mobile/android/app/000-tor-browser-android.js
@@ -0,0 +1,61 @@
+// Import all prefs from the canonical file
+// We override mobile-specific prefs below
+// Tor Browser for Android
+// Do not edit this file.
+
+#include ../../../browser/app/profile/000-tor-browser.js
+
+
+// Disable Presentation API
+pref("dom.presentation.controller.enabled", false);
+pref("dom.presentation.enabled", false);
+pref("dom.presentation.discoverable", false);
+pref("dom.presentation.discoverable.encrypted", false);
+pref("dom.presentation.discovery.enabled", false);
+pref("dom.presentation.receiver.enabled", false);
+
+pref("dom.audiochannel.audioCompeting", false);
+pref("dom.audiochannel.mediaControl", false);
+
+// Space separated list of URLs that are allowed to send objects (instead of
+// only strings) through webchannels. This list is duplicated in browser/app/profile/firefox.js
+pref("webchannel.allowObject.urlWhitelist", "");
+
+// Disable browser auto updaters
+pref("app.update.auto", false);
+pref("app.update.enabled", false);
+pref("browser.startup.homepage_override.mstone", "ignore");
+
+// Clear data on quit
+pref("privacy.clearOnShutdown.cache", true);
+pref("privacy.clearOnShutdown.cookies",true);
+pref("privacy.clearOnShutdown.downloads",true);
+pref("privacy.clearOnShutdown.formdata",true);
+pref("privacy.clearOnShutdown.history",true);
+pref("privacy.clearOnShutdown.offlineApps",true);
+pref("privacy.clearOnShutdown.passwords",true);
+pref("privacy.clearOnShutdown.sessions",true);
+pref("privacy.clearOnShutdown.siteSettings",true);
+
+// Disable Control media casting & mirroring features
+pref("browser.casting.enabled", false);
+pref("browser.mirroring.enabled", false);
+
+// Disable autoplay
+pref("media.autoplay.enabled", false);
+
+// controls if we want camera support
+pref("device.camera.enabled", false);
+pref("media.realtime_decoder.enabled", false);
+
+// Do not fetch updated per-site user-agent strings from Mozilla
+// See ua-update.json.in for the packaged UA override list
+// See https://bugzilla.mozilla.org/show_bug.cgi?id=897221
+pref("general.useragent.updates.enabled", false);
+pref("general.useragent.updates.url", "");
+
+// Enable touch events on Android (highlighting text, etc)
+pref("dom.w3c_touch_events.enabled", 2);
+
+// Inherit locale from the OS, used for multi-locale builds
+pref("intl.locale.requested", "");
diff --git a/mobile/android/app/mobile.js b/mobile/android/app/mobile.js
index 9d4f331e968f..1d69f082da27 100644
--- a/mobile/android/app/mobile.js
+++ b/mobile/android/app/mobile.js
@@ -483,7 +483,11 @@ pref("app.update.timerMinimumDelay", 30); // seconds
// used by update service to decide whether or not to
// automatically download an update
pref("app.update.autodownload", "wifi");
+#ifdef TOR_BROWSER_VERSION
+pref("app.update.url.android", "");
+#else
pref("app.update.url.android", "https://aus5.mozilla.org/update/4/%PRODUCT%/%VERSION%/%BUILD_ID%/%BUILD_TAR…");
+#endif
#ifdef MOZ_UPDATER
/* prefs used specifically for updating the app */
diff --git a/mobile/android/app/moz.build b/mobile/android/app/moz.build
index 8ff152f3b369..773c1a3979a8 100644
--- a/mobile/android/app/moz.build
+++ b/mobile/android/app/moz.build
@@ -49,6 +49,7 @@ if CONFIG['MOZ_PKG_SPECIAL']:
DEFINES['MOZ_PKG_SPECIAL'] = CONFIG['MOZ_PKG_SPECIAL']
JS_PREFERENCE_PP_FILES += [
+ '000-tor-browser-android.js',
'geckoview-prefs.js',
'mobile.js',
]
diff --git a/mobile/android/installer/package-manifest.in b/mobile/android/installer/package-manifest.in
index 3d014cbc6e67..2002a894fc51 100644
--- a/mobile/android/installer/package-manifest.in
+++ b/mobile/android/installer/package-manifest.in
@@ -168,6 +168,7 @@
#ifdef MOZ_GECKOVIEW_JAR
@BINPATH@/@PREF_DIR@/geckoview-prefs.js
#else
+@BINPATH@/@PREF_DIR@/000-tor-browser-android.js
@BINPATH@/@PREF_DIR@/mobile.js
#endif
@BINPATH@/@PREF_DIR@/channel-prefs.js
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 25741 - TBA: Remove sync option from preferences
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit da563f691147389df259b61f4f47c490257e8bf2
Author: Amogh Pradeep <amoghbl1(a)gmail.com>
Date: Fri Jul 17 13:27:07 2015 -0400
Bug 25741 - TBA: Remove sync option from preferences
We don't want this while the Sync subsystem is a proxy-bypass risk. We
can drop this when the feature is patched (Bug 1314778).
Signed-off-by: Amogh Pradeep <amoghbl1(a)gmail.com>
Also:
Bug 28507 - Don't call Push and Sync services during Sanitize
Bug 30086 - Prevent Sync-related crashes on Android
Bug 25741 - TBA: Only include Firefox Account permissions if we want them (using MOZ_ACCOUNT)
Bug 25741 - TBA: Neuter Firefox Accounts
---
.../android/app/src/main/res/xml/preferences.xml | 6 --
mobile/android/base/AndroidManifest.xml.in | 4 ++
.../android/base/FennecManifest_permissions.xml.in | 2 +
.../base/java/org/mozilla/gecko/BrowserApp.java | 8 ---
.../mozilla/gecko/home/CombinedHistoryPanel.java | 14 +++--
.../overlays/service/sharemethods/SendTab.java | 6 +-
.../base/locales/en-US/torbrowser_strings.dtd | 2 +
mobile/android/base/strings.xml.in | 2 +
mobile/android/modules/Sanitizer.jsm | 47 ++++++++------
.../org/mozilla/gecko/fxa/FirefoxAccounts.java | 73 +++++++++++++---------
.../gecko/fxa/authenticator/AndroidFxAccount.java | 13 +++-
11 files changed, 107 insertions(+), 70 deletions(-)
diff --git a/mobile/android/app/src/main/res/xml/preferences.xml b/mobile/android/app/src/main/res/xml/preferences.xml
index a9cec32ca3ef..f9c5c9e1ac53 100644
--- a/mobile/android/app/src/main/res/xml/preferences.xml
+++ b/mobile/android/app/src/main/res/xml/preferences.xml
@@ -9,12 +9,6 @@
xmlns:gecko="http://schemas.android.com/apk/res-auto"
android:enabled="false">
- <org.mozilla.gecko.preferences.SyncPreference android:key="android.not_a_preference.sync"
- android:title="@string/pref_sync"
- android:icon="@drawable/sync_avatar_default"
- android:summary="@string/pref_sync_summary"
- android:persistent="false" />
-
<org.mozilla.gecko.preferences.DefaultBrowserPreference
android:key="android.not_a_preference.default_browser.link"
android:persistent="false"
diff --git a/mobile/android/base/AndroidManifest.xml.in b/mobile/android/base/AndroidManifest.xml.in
index 17a34703e6e7..e61a3411b2e0 100644
--- a/mobile/android/base/AndroidManifest.xml.in
+++ b/mobile/android/base/AndroidManifest.xml.in
@@ -291,7 +291,9 @@
</intent-filter>
</receiver>
+#ifdef MOZ_ACCOUNT
#include ../services/manifests/FxAccountAndroidManifest_activities.xml.in
+#endif
#ifdef MOZ_CRASHREPORTER
<activity android:name="org.mozilla.gecko.CrashReporterActivity"
@@ -504,7 +506,9 @@
</intent-filter>
</service>
+#ifdef MOZ_ACCOUNT
#include ../services/manifests/FxAccountAndroidManifest_services.xml.in
+#endif
<service
android:name="org.mozilla.gecko.tabqueue.TabReceivedService"
diff --git a/mobile/android/base/FennecManifest_permissions.xml.in b/mobile/android/base/FennecManifest_permissions.xml.in
index ffa6d27a8b0d..f3e43bb4e3ca 100644
--- a/mobile/android/base/FennecManifest_permissions.xml.in
+++ b/mobile/android/base/FennecManifest_permissions.xml.in
@@ -1,5 +1,7 @@
+#ifdef MOZ_ACCOUNT
#include ../services/manifests/FxAccountAndroidManifest_permissions.xml.in
+#endif
<!-- Bug 1261302: we have two new permissions to request,
RECEIVE_BOOT_COMPLETED and the permission for push. We want to ask for
diff --git a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
index 7d4c03f7e5d2..80981eb87136 100644
--- a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
+++ b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
@@ -303,8 +303,6 @@ public class BrowserApp extends GeckoApp
private ReadingListHelper mReadingListHelper;
- private AccountsHelper mAccountsHelper;
-
private ExtensionPermissionsHelper mExtensionPermissionsHelper;
// The tab to be selected on editing mode exit.
@@ -839,7 +837,6 @@ public class BrowserApp extends GeckoApp
mSharedPreferencesHelper = new SharedPreferencesHelper(appContext);
mReadingListHelper = new ReadingListHelper(appContext, profile);
- mAccountsHelper = new AccountsHelper(appContext, profile);
mExtensionPermissionsHelper = new ExtensionPermissionsHelper(this);
if (AppConstants.MOZ_ANDROID_BEAM) {
@@ -1575,11 +1572,6 @@ public class BrowserApp extends GeckoApp
mReadingListHelper = null;
}
- if (mAccountsHelper != null) {
- mAccountsHelper.uninit();
- mAccountsHelper = null;
- }
-
if (mExtensionPermissionsHelper != null) {
mExtensionPermissionsHelper.uninit();
mExtensionPermissionsHelper = null;
diff --git a/mobile/android/base/java/org/mozilla/gecko/home/CombinedHistoryPanel.java b/mobile/android/base/java/org/mozilla/gecko/home/CombinedHistoryPanel.java
index 4080317cd65a..39905dd950de 100644
--- a/mobile/android/base/java/org/mozilla/gecko/home/CombinedHistoryPanel.java
+++ b/mobile/android/base/java/org/mozilla/gecko/home/CombinedHistoryPanel.java
@@ -244,10 +244,16 @@ public class CombinedHistoryPanel extends HomeFragment implements RemoteClientsD
syncSetupButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
- Telemetry.sendUIEvent(TelemetryContract.Event.ACTION, TelemetryContract.Method.BUTTON, "history_syncsetup");
- // This Activity will redirect to the correct Activity as needed.
- final Intent intent = new Intent(FxAccountConstants.ACTION_FXA_GET_STARTED);
- startActivity(intent);
+ // Tell the user this action is not supported
+ final AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(getActivity());
+ dialogBuilder.setMessage(R.string.sync_not_supported);
+ dialogBuilder.setNegativeButton(R.string.button_cancel, new AlertDialog.OnClickListener() {
+ @Override
+ public void onClick(final DialogInterface dialog, final int which) {
+ dialog.dismiss();
+ }
+ });
+ dialogBuilder.show();
}
});
diff --git a/mobile/android/base/java/org/mozilla/gecko/overlays/service/sharemethods/SendTab.java b/mobile/android/base/java/org/mozilla/gecko/overlays/service/sharemethods/SendTab.java
index 9382c2ec15f9..5babb74c4f88 100644
--- a/mobile/android/base/java/org/mozilla/gecko/overlays/service/sharemethods/SendTab.java
+++ b/mobile/android/base/java/org/mozilla/gecko/overlays/service/sharemethods/SendTab.java
@@ -165,7 +165,8 @@ public class SendTab extends ShareMethod {
}
// Have registered UIs offer to set up a Firefox Account.
- setOverrideIntentAction(FxAccountConstants.ACTION_FXA_GET_STARTED);
+ // Comment for Tor Browser
+ //setOverrideIntentAction(FxAccountConstants.ACTION_FXA_GET_STARTED);
}
/**
@@ -187,7 +188,8 @@ public class SendTab extends ShareMethod {
if (validGUIDs.isEmpty()) {
// Guess we'd better override. We have no clients.
// This does the broadcast for us.
- setOverrideIntentAction(FxAccountConstants.ACTION_FXA_GET_STARTED);
+ // Comment for Tor Browser
+ //setOverrideIntentAction(FxAccountConstants.ACTION_FXA_GET_STARTED);
return;
}
diff --git a/mobile/android/base/locales/en-US/torbrowser_strings.dtd b/mobile/android/base/locales/en-US/torbrowser_strings.dtd
index d23acc8a033a..b43134a0260b 100644
--- a/mobile/android/base/locales/en-US/torbrowser_strings.dtd
+++ b/mobile/android/base/locales/en-US/torbrowser_strings.dtd
@@ -3,3 +3,5 @@
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<!ENTITY firstrun_urlbar_subtext2 "A modern mobile browser from The Tor Project, the non-profit committed to a free and open web.">
+
+<!ENTITY sync_not_supported "Sync is not currently supported in Tor Browser on Android">
diff --git a/mobile/android/base/strings.xml.in b/mobile/android/base/strings.xml.in
index c328bd6b512a..5453bed65e71 100644
--- a/mobile/android/base/strings.xml.in
+++ b/mobile/android/base/strings.xml.in
@@ -54,6 +54,8 @@
<string name="firstrun_welcome_restricted">&onboard_start_restricted1;</string>
+ <string name="sync_not_supported">&sync_not_supported;</string>
+
<string name="bookmarks_title">&bookmarks_title;</string>
<string name="history_title">&history_title;</string>
diff --git a/mobile/android/modules/Sanitizer.jsm b/mobile/android/modules/Sanitizer.jsm
index f244e4a2008b..d3538d49e07f 100644
--- a/mobile/android/modules/Sanitizer.jsm
+++ b/mobile/android/modules/Sanitizer.jsm
@@ -183,18 +183,22 @@ Sanitizer.prototype = {
sss.clearAll();
// Clear push subscriptions
- await new Promise((resolve, reject) => {
- let push = Cc["@mozilla.org/push/Service;1"].getService(
- Ci.nsIPushService
- );
- push.clearForDomain("*", status => {
- if (Components.isSuccessCode(status)) {
- resolve();
- } else {
- reject(new Error("Error clearing push subscriptions: " + status));
- }
- });
- });
+ //await new Promise((resolve, reject) => {
+ // let push = Cc["@mozilla.org/push/Service;1"].getService(
+ // Ci.nsIPushService
+ // );
+ // push.clearForDomain("*", status => {
+ // if (Components.isSuccessCode(status)) {
+ // resolve();
+ // } else {
+ // reject(new Error("Error clearing push subscriptions: " + status));
+ // }
+ // });
+ //});
+
+ // Avoid throwing an error because Ci.nsIPushService isn't implemented
+ // All other clearing actions should succeed if we arrive here.
+ Promise.resolve();
TelemetryStopwatch.finish("FX_SANITIZE_SITESETTINGS", refObj);
},
@@ -491,14 +495,17 @@ Sanitizer.prototype = {
},
canClear: function(aCallback) {
- Accounts.anySyncAccountsExist()
- .then(aCallback)
- .catch(function(err) {
- Cu.reportError("Java-side synced tabs clearing failed: " + err);
- aCallback(false);
- });
- },
- },
+ //Accounts.anySyncAccountsExist()
+ // .then(aCallback)
+ // .catch(function(err) {
+ // Cu.reportError("Java-side synced tabs clearing failed: " + err);
+ // aCallback(false);
+ // });
+
+ // We can't clear syncedTabs because Sync is non-functional
+ aCallback(false);
+ }
+ }
},
};
diff --git a/mobile/android/services/src/main/java/org/mozilla/gecko/fxa/FirefoxAccounts.java b/mobile/android/services/src/main/java/org/mozilla/gecko/fxa/FirefoxAccounts.java
index 74b10c477237..a207f9b237ad 100644
--- a/mobile/android/services/src/main/java/org/mozilla/gecko/fxa/FirefoxAccounts.java
+++ b/mobile/android/services/src/main/java/org/mozilla/gecko/fxa/FirefoxAccounts.java
@@ -7,6 +7,7 @@ package org.mozilla.gecko.fxa;
import java.io.File;
import java.util.concurrent.CountDownLatch;
+import org.mozilla.gecko.AppConstants;
import org.mozilla.gecko.background.common.log.Logger;
import org.mozilla.gecko.fxa.authenticator.AccountPickler;
import org.mozilla.gecko.fxa.authenticator.AndroidFxAccount;
@@ -49,15 +50,22 @@ public class FirefoxAccounts {
* @return Firefox account objects.
*/
public static Account[] getFirefoxAccounts(final Context context) {
- final Account[] accounts =
- AccountManager.get(context).getAccountsByType(FxAccountConstants.ACCOUNT_TYPE);
- if (accounts.length > 0) {
- FirefoxAccountsUtils.optionallySeparateAccountsDuringFirstRun(context, accounts);
- return accounts;
- }
+ if (AppConstants.isTorBrowser()) {
+ return new Account[0];
+ } else {
+ // TBA: Conditionally disable this at run-time.
+ // XXX This will throw a java.lang.SecurityException because we don't declare
+ // the android.permission.GET_ACCOUNTS permission.
+ final Account[] accounts =
+ AccountManager.get(context).getAccountsByType(FxAccountConstants.ACCOUNT_TYPE);
+ if (accounts.length > 0) {
+ FirefoxAccountsUtils.optionallySeparateAccountsDuringFirstRun(context, accounts);
+ return accounts;
+ }
- final Account pickledAccount = getPickledAccount(context);
- return (pickledAccount != null) ? new Account[] {pickledAccount} : new Account[0];
+ final Account pickledAccount = getPickledAccount(context);
+ return (pickledAccount != null) ? new Account[] {pickledAccount} : new Account[0];
+ }
}
private static Account getPickledAccount(final Context context) {
@@ -111,9 +119,14 @@ public class FirefoxAccounts {
}
public static void logSyncOptions(Bundle syncOptions) {
- final boolean scheduleNow = syncOptions.getBoolean(ContentResolver.SYNC_EXTRAS_IGNORE_BACKOFF, false);
+ if (AppConstants.isTorBrowser()) {
+ // Don't log an erroneous message, this'll only confuse someone looking at the logs.
+ return;
+ } else {
+ final boolean scheduleNow = syncOptions.getBoolean(ContentResolver.SYNC_EXTRAS_IGNORE_BACKOFF, false);
- Logger.info(LOG_TAG, "Sync options -- scheduling now: " + scheduleNow);
+ Logger.info(LOG_TAG, "Sync options -- scheduling now: " + scheduleNow);
+ }
}
public static void requestImmediateSync(final Account account, String[] stagesToSync, String[] stagesToSkip, boolean ignoreSettings) {
@@ -145,28 +158,32 @@ public class FirefoxAccounts {
* @param stagesToSkip stage names to skip.
*/
protected static void requestSync(final Account account, final Bundle syncOptions, String[] stagesToSync, String[] stagesToSkip) {
- if (account == null) {
- throw new IllegalArgumentException("account must not be null");
- }
- if (syncOptions == null) {
- throw new IllegalArgumentException("syncOptions must not be null");
- }
+ if (AppConstants.isTorBrowser()) {
+ return;
+ } else {
+ if (account == null) {
+ throw new IllegalArgumentException("account must not be null");
+ }
+ if (syncOptions == null) {
+ throw new IllegalArgumentException("syncOptions must not be null");
+ }
- Utils.putStageNamesToSync(syncOptions, stagesToSync, stagesToSkip);
+ Utils.putStageNamesToSync(syncOptions, stagesToSync, stagesToSkip);
- Logger.info(LOG_TAG, "Requesting sync.");
- logSyncOptions(syncOptions);
+ Logger.info(LOG_TAG, "Requesting sync.");
+ logSyncOptions(syncOptions);
- // We get strict mode warnings on some devices, so make the request on a
- // background thread.
- ThreadPool.run(new Runnable() {
- @Override
- public void run() {
- for (String authority : AndroidFxAccount.DEFAULT_AUTHORITIES_TO_SYNC_AUTOMATICALLY_MAP.keySet()) {
- ContentResolver.requestSync(account, authority, syncOptions);
+ // We get strict mode warnings on some devices, so make the request on a
+ // background thread.
+ ThreadPool.run(new Runnable() {
+ @Override
+ public void run() {
+ for (String authority : AndroidFxAccount.DEFAULT_AUTHORITIES_TO_SYNC_AUTOMATICALLY_MAP.keySet()) {
+ ContentResolver.requestSync(account, authority, syncOptions);
+ }
}
- }
- });
+ });
+ }
}
/**
diff --git a/mobile/android/services/src/main/java/org/mozilla/gecko/fxa/authenticator/AndroidFxAccount.java b/mobile/android/services/src/main/java/org/mozilla/gecko/fxa/authenticator/AndroidFxAccount.java
index 4562559afc44..8d2b8bd2cd4a 100644
--- a/mobile/android/services/src/main/java/org/mozilla/gecko/fxa/authenticator/AndroidFxAccount.java
+++ b/mobile/android/services/src/main/java/org/mozilla/gecko/fxa/authenticator/AndroidFxAccount.java
@@ -29,6 +29,7 @@ import android.support.v4.content.LocalBroadcastManager;
import android.text.TextUtils;
import android.util.Log;
+import org.mozilla.gecko.AppConstants;
import org.mozilla.gecko.background.common.GlobalConstants;
import org.mozilla.gecko.background.common.log.Logger;
import org.mozilla.gecko.background.fxa.FxAccountUtils;
@@ -708,7 +709,11 @@ public class AndroidFxAccount {
* @param ignoreSettings whether we should check if syncing is allowed via in-app or system settings.
*/
public void requestImmediateSync(String[] stagesToSync, String[] stagesToSkip, boolean ignoreSettings) {
- FirefoxAccounts.requestImmediateSync(getAndroidAccount(), stagesToSync, stagesToSkip, ignoreSettings);
+ if (AppConstants.isTorBrowser()) {
+ return;
+ } else {
+ FirefoxAccounts.requestImmediateSync(getAndroidAccount(), stagesToSync, stagesToSkip, ignoreSettings);
+ }
}
/**
@@ -719,7 +724,11 @@ public class AndroidFxAccount {
* @param stagesToSkip stage names to skip; can be null to skip <b>no</b> known stages.
*/
public void requestEventualSync(String[] stagesToSync, String[] stagesToSkip) {
- FirefoxAccounts.requestEventualSync(getAndroidAccount(), stagesToSync, stagesToSkip);
+ if (AppConstants.isTorBrowser()) {
+ return;
+ } else {
+ FirefoxAccounts.requestEventualSync(getAndroidAccount(), stagesToSync, stagesToSkip);
+ }
}
public synchronized void setState(State state) {
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 25741 - TBA: Do not register Stumbler listener at start up
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit cee7a826fa47d7155ac902f093b6f7c07a4c0e55
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Wed Apr 25 01:55:44 2018 +0000
Bug 25741 - TBA: Do not register Stumbler listener at start up
---
mobile/android/base/java/org/mozilla/gecko/GeckoApp.java | 14 ++++++++++----
1 file changed, 10 insertions(+), 4 deletions(-)
diff --git a/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java b/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java
index 4f09e065c0c3..246ce55d0d23 100644
--- a/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java
+++ b/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java
@@ -96,7 +96,8 @@ import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.mozilla.geckoview.GeckoViewBridge;
-import org.mozilla.mozstumbler.service.mainthread.SafeReceiver;
+// SafeReceiver excluded at compile-time
+//import org.mozilla.mozstumbler.service.mainthread.SafeReceiver;
import java.io.File;
import java.util.ArrayList;
@@ -1008,9 +1009,13 @@ public abstract class GeckoApp extends GeckoActivity
// Tell Stumbler to register a local broadcast listener to listen for preference intents.
// We do this via intents since we can't easily access Stumbler directly,
// as it might be compiled outside of Fennec.
- final Intent stumblerIntent = new Intent(getApplicationContext(), SafeReceiver.class);
- stumblerIntent.setAction(INTENT_REGISTER_STUMBLER_LISTENER);
- getApplicationContext().sendBroadcast(stumblerIntent);
+ // Tor Browser: We don't want Fennec using or receiving Stumbler
+ // SafeReceiver excluded at compile-time
+ //if (!AppConstants.isTorBrowser()) {
+ // final Intent stumblerIntent = new Intent(getApplicationContext(), SafeReceiver.class);
+ // stumblerIntent.setAction(INTENT_REGISTER_STUMBLER_LISTENER);
+ // getApplicationContext().sendBroadcast(stumblerIntent);
+ //}
// Did the OS locale change while we were backgrounded? If so,
// we need to die so that Gecko will re-init add-ons that touch
@@ -1071,6 +1076,7 @@ public abstract class GeckoApp extends GeckoActivity
final String uri = getURIFromIntent(intent);
if (!TextUtils.isEmpty(uri)) {
// Start a speculative connection as soon as Gecko loads.
+ // XXX TBA: Check this doesn't leak, and is blocked by Tor bootstrap
GeckoThread.speculativeConnect(uri);
}
}
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 25741 - TBA: Disable telemetry and experiments
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit bb1e2de8f19b000acd81f15ea2e0d19ba276b11d
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Mon Apr 9 21:57:22 2018 +0000
Bug 25741 - TBA: Disable telemetry and experiments
---
mobile/android/base/java/org/mozilla/gecko/BrowserApp.java | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
index 80981eb87136..e7d490a552fe 100644
--- a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
+++ b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
@@ -64,6 +64,7 @@ import android.widget.Button;
import android.widget.ListView;
import android.widget.ViewFlipper;
+import org.mozilla.gecko.AppConstants;
import org.mozilla.gecko.AppConstants.Versions;
import org.mozilla.gecko.DynamicToolbar.VisibilityTransition;
import org.mozilla.gecko.Tabs.TabEvents;
@@ -631,7 +632,11 @@ public class BrowserApp extends GeckoApp
showSplashScreen = true;
safeStartingIntent = new SafeIntent(getIntent());
- isInAutomation = IntentUtils.getIsInAutomationFromEnvironment(safeStartingIntent);
+ // TBA: Disable Switchboard testing experiments and
+ // Telemetry-uploading by abusing the isInAutomation detection.
+ isInAutomation =
+ (IntentUtils.getIsInAutomationFromEnvironment(safeStartingIntent)
+ || AppConstants.isTorBrowser());
GeckoProfile.setIntentArgs(safeStartingIntent.getStringExtra("args"));
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 25741 - TBA: Disable QR Code reader by default
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit ea9068b111c5454b91b2017383c39cc4ac7bf1f2
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Mon Apr 9 22:36:53 2018 +0000
Bug 25741 - TBA: Disable QR Code reader by default
This is another accessibility and usability concern, so we allow
this as an opt-in.
---
mobile/android/app/src/main/res/xml/preferences_accessibility.xml | 2 +-
.../android/base/java/org/mozilla/gecko/toolbar/ToolbarEditLayout.java | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/mobile/android/app/src/main/res/xml/preferences_accessibility.xml b/mobile/android/app/src/main/res/xml/preferences_accessibility.xml
index c82006ee2473..c5afa4d8d644 100644
--- a/mobile/android/app/src/main/res/xml/preferences_accessibility.xml
+++ b/mobile/android/app/src/main/res/xml/preferences_accessibility.xml
@@ -23,6 +23,6 @@
<SwitchPreference android:key="android.not_a_preference.qrcode_enabled"
android:title="@string/pref_qrcode_enabled"
android:summary="@string/pref_qrcode_enabled_summary"
- android:defaultValue="true"/>
+ android:defaultValue="false"/>
</PreferenceScreen>
diff --git a/mobile/android/base/java/org/mozilla/gecko/toolbar/ToolbarEditLayout.java b/mobile/android/base/java/org/mozilla/gecko/toolbar/ToolbarEditLayout.java
index 1d53de172c47..a28847285350 100644
--- a/mobile/android/base/java/org/mozilla/gecko/toolbar/ToolbarEditLayout.java
+++ b/mobile/android/base/java/org/mozilla/gecko/toolbar/ToolbarEditLayout.java
@@ -324,7 +324,7 @@ public class ToolbarEditLayout extends ThemedLinearLayout {
return false;
}
return GeckoSharedPrefs.forApp(context)
- .getBoolean(GeckoPreferences.PREFS_QRCODE_ENABLED, true);
+ .getBoolean(GeckoPreferences.PREFS_QRCODE_ENABLED, false);
}
private void launchQRCodeReader() {
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 25741 - TBA: Conditionally require WIFI and NETWORK permissions
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit c60818fd0b1922514fab5d4d6dbef05d0ae70217
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Wed Apr 11 17:52:59 2018 +0000
Bug 25741 - TBA: Conditionally require WIFI and NETWORK permissions
Only require the {ACCESS,CHANGE}_WIFI_STATE and ACCESS_NETWORK_STATE
permissions if MOZ_ANDROID_NETWORK_STATE is defined in the preprocessor.
Also:
Bug 25741 - TBA: Conditionally require *_LOCATION permissions
Only require the {FINE,COURSE}_LOCATION permissions if
MOZ_ANDROID_LOCATION is defined in the preprocessor. Also
include location features (with gps).
Bug 25741 - TBA: Move CAMERA permission within MOZ_WEBRTC
Require the CAMERA permissions if MOZ_WEBRTC is defined in
the preprocessor.
Bug 25741 - TBA: Only include GCM permissions if we want them
Bug 26826 - Disable tab queue and delete SYSTEM_ALERT_WINDOW permission
Bug 24796 - Comment out excess permissions from GeckoView
The GeckoView AndroidManifest.xml is not preprocessed unlike Fennec's
manifest, so we can't use the ifdef preprocessor guards around the
permissions we do not want. Commenting the permissions is the
next-best-thing.
---
.../app/src/main/res/xml/preferences_general.xml | 1 +
.../src/main/res/xml/preferences_general_tablet.xml | 1 +
.../android/base/FennecManifest_permissions.xml.in | 18 ++++++++++++++----
.../android/geckoview/src/main/AndroidManifest.xml | 20 +++++++++++++++++---
mobile/android/moz.configure | 8 ++++++++
.../FxAccountAndroidManifest_permissions.xml.in | 2 ++
mobile/android/torbrowser.configure | 3 +++
7 files changed, 46 insertions(+), 7 deletions(-)
diff --git a/mobile/android/app/src/main/res/xml/preferences_general.xml b/mobile/android/app/src/main/res/xml/preferences_general.xml
index f148ae61b169..ef739db0c3d8 100644
--- a/mobile/android/app/src/main/res/xml/preferences_general.xml
+++ b/mobile/android/app/src/main/res/xml/preferences_general.xml
@@ -31,6 +31,7 @@
<SwitchPreference android:key="android.not_a_preference.tab_queue"
android:title="@string/pref_tab_queue_title"
android:summary="@string/pref_tab_queue_summary"
+ android:selectable="false"
android:defaultValue="false" />
<SwitchPreference android:key="android.not_a_preference.compact_tabs"
diff --git a/mobile/android/app/src/main/res/xml/preferences_general_tablet.xml b/mobile/android/app/src/main/res/xml/preferences_general_tablet.xml
index 903e9e315f59..aee9937f9759 100644
--- a/mobile/android/app/src/main/res/xml/preferences_general_tablet.xml
+++ b/mobile/android/app/src/main/res/xml/preferences_general_tablet.xml
@@ -43,6 +43,7 @@
<SwitchPreference android:key="android.not_a_preference.tab_queue"
android:title="@string/pref_tab_queue_title"
android:summary="@string/pref_tab_queue_summary"
+ android:selectable="false"
android:defaultValue="false" />
</PreferenceScreen>
diff --git a/mobile/android/base/FennecManifest_permissions.xml.in b/mobile/android/base/FennecManifest_permissions.xml.in
index f3e43bb4e3ca..796e28777aad 100644
--- a/mobile/android/base/FennecManifest_permissions.xml.in
+++ b/mobile/android/base/FennecManifest_permissions.xml.in
@@ -8,14 +8,23 @@
them during the same release, which should be Fennec 48. Therefore we
decouple the push permission from MOZ_ANDROID_GCM to let it ride ahead
(potentially) of the push feature. -->
+
+#ifdef MOZ_ANDROID_GCM
#include GcmAndroidManifest_permissions.xml.in
+#endif
#include SamsungAppStoreManifest_permissions.xml.in
+#ifdef MOZ_ANDROID_NETWORK_STATE
+ <!-- Android WIFI state -->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
+#endif
+
+#ifdef MOZ_ANDROID_LOCATION
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
+#endif
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
#ifdef MOZ_ANDROID_MLS_STUMBLER
@@ -25,7 +34,9 @@
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"/>
<uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT"/>
+#ifdef MOZ_ANDROID_LOCATION
<uses-permission android:name="com.android.browser.permission.READ_HISTORY_BOOKMARKS"/>
+#endif
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
@@ -34,13 +45,12 @@
<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
#endif
+#ifdef MOZ_ANDROID_LOCATION
<uses-feature android:name="android.hardware.location" android:required="false"/>
<uses-feature android:name="android.hardware.location.gps" android:required="false"/>
+#endif
<uses-feature android:name="android.hardware.touchscreen"/>
- <!-- Tab Queue -->
- <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
-
<!-- To be able to install updates and other downloaded APKs on API 26+ -->
<uses-permission-sdk-23 android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
@@ -55,10 +65,10 @@
<uses-feature android:name="android.hardware.audio.low_latency" android:required="false"/>
<uses-feature android:name="android.hardware.camera.any" android:required="false"/>
<uses-feature android:name="android.hardware.microphone" android:required="false"/>
-#endif
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" android:required="false"/>
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false"/>
+#endif
<!-- App requires OpenGL ES 2.0 -->
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
diff --git a/mobile/android/geckoview/src/main/AndroidManifest.xml b/mobile/android/geckoview/src/main/AndroidManifest.xml
index a14bb6b1750e..0d93ee53ee4b 100644
--- a/mobile/android/geckoview/src/main/AndroidManifest.xml
+++ b/mobile/android/geckoview/src/main/AndroidManifest.xml
@@ -2,20 +2,32 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.mozilla.geckoview">
+<!--#ifdef MOZ_ANDROID_NETWORK_STATE-->
+ <!--
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
+ -->
+<!--#endif-->
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
+<!--#ifdef MOZ_ANDROID_LOCATION-->
+ <!--
<uses-feature
android:name="android.hardware.location"
android:required="false"/>
<uses-feature
android:name="android.hardware.location.gps"
android:required="false"/>
+ -->
+<!--#endif-->
<uses-feature
android:name="android.hardware.touchscreen"
android:required="false"/>
+<!--#ifdef MOZ_WEBRTC-->
+ <!-- TODO preprocess AndroidManifest.xml so that we can
+ conditionally include WebRTC permissions based on MOZ_WEBRTC. -->
+ <!--
<uses-feature
android:name="android.hardware.camera"
android:required="false"/>
@@ -24,14 +36,16 @@
android:required="false"/>
<uses-feature
- android:name="android.hardware.audio.low_latency"
+ android:name="android.hardware.camera.any"
android:required="false"/>
<uses-feature
- android:name="android.hardware.microphone"
+ android:name="android.hardware.audio.low_latency"
android:required="false"/>
<uses-feature
- android:name="android.hardware.camera.any"
+ android:name="android.hardware.microphone"
android:required="false"/>
+ -->
+<!--#endif-->
<!-- GeckoView requires OpenGL ES 2.0 -->
<uses-feature
diff --git a/mobile/android/moz.configure b/mobile/android/moz.configure
index def87ba268f1..c8ed3a9a59e1 100644
--- a/mobile/android/moz.configure
+++ b/mobile/android/moz.configure
@@ -193,3 +193,11 @@ def check_android_gcm(android_gcm,
if not google_play_services:
die('You must specify --with-google-play-services when'
' building with MOZ_ANDROID_GCM=1')
+
+project_flag('MOZ_ANDROID_NETWORK_STATE',
+ help='Include permission for accessing WiFi/network state on Android',
+ default=False)
+
+project_flag('MOZ_ANDROID_LOCATION',
+ help='Include permission for accessing fine and course-grain Location on Android',
+ default=False)
diff --git a/mobile/android/services/manifests/FxAccountAndroidManifest_permissions.xml.in b/mobile/android/services/manifests/FxAccountAndroidManifest_permissions.xml.in
index d5c7e3e5c7dc..8498b8015855 100644
--- a/mobile/android/services/manifests/FxAccountAndroidManifest_permissions.xml.in
+++ b/mobile/android/services/manifests/FxAccountAndroidManifest_permissions.xml.in
@@ -1,5 +1,7 @@
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
+#ifdef MOZ_ANDROID_NETWORK_STATE
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
+#endif
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
diff --git a/mobile/android/torbrowser.configure b/mobile/android/torbrowser.configure
index 5e3ab67dca6a..ac30fde888a6 100644
--- a/mobile/android/torbrowser.configure
+++ b/mobile/android/torbrowser.configure
@@ -41,3 +41,6 @@ imply_option('MOZ_SERVICES_HEALTHREPORT', False)
# them here, as well.
#imply_option('MOZ_TELEMETRY_REPORTING', False)
#imply_option('MOZ_DATA_REPORTING', False)
+
+imply_option('MOZ_ANDROID_NETWORK_STATE', False);
+imply_option('MOZ_ANDROID_LOCATION', False);
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 25741 - TBA: Do not save browsing history by default
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit 02f75df3521e77f1515bb195a611e59e35578302
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Wed Apr 11 18:46:02 2018 +0000
Bug 25741 - TBA: Do not save browsing history by default
---
mobile/android/app/src/main/res/xml-v11/preferences_search.xml | 2 +-
mobile/android/app/src/main/res/xml/preferences_search.xml | 2 +-
mobile/android/base/java/org/mozilla/gecko/home/BrowserSearch.java | 2 +-
mobile/android/base/java/org/mozilla/gecko/home/SearchEngineRow.java | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/mobile/android/app/src/main/res/xml-v11/preferences_search.xml b/mobile/android/app/src/main/res/xml-v11/preferences_search.xml
index 937b05b617c6..a58bb7cece44 100644
--- a/mobile/android/app/src/main/res/xml-v11/preferences_search.xml
+++ b/mobile/android/app/src/main/res/xml-v11/preferences_search.xml
@@ -27,7 +27,7 @@
<CheckBoxPreference android:key="android.not_a_preference.search.search_history.enabled"
android:title="@string/pref_history_search_suggestions"
- android:defaultValue="true"
+ android:defaultValue="false"
android:persistent="true" />
</PreferenceScreen>
diff --git a/mobile/android/app/src/main/res/xml/preferences_search.xml b/mobile/android/app/src/main/res/xml/preferences_search.xml
index 440167fe5e2a..fc8c258821e1 100644
--- a/mobile/android/app/src/main/res/xml/preferences_search.xml
+++ b/mobile/android/app/src/main/res/xml/preferences_search.xml
@@ -34,7 +34,7 @@
<CheckBoxPreference android:key="android.not_a_preference.search.search_history.enabled"
android:title="@string/pref_history_search_suggestions"
- android:defaultValue="true"
+ android:defaultValue="false"
android:persistent="true" />
</PreferenceScreen>
diff --git a/mobile/android/base/java/org/mozilla/gecko/home/BrowserSearch.java b/mobile/android/base/java/org/mozilla/gecko/home/BrowserSearch.java
index 386f0494b75c..9e415cb454d7 100644
--- a/mobile/android/base/java/org/mozilla/gecko/home/BrowserSearch.java
+++ b/mobile/android/base/java/org/mozilla/gecko/home/BrowserSearch.java
@@ -278,7 +278,7 @@ public class BrowserSearch extends HomeFragment
super.onResume();
final SharedPreferences prefs = GeckoSharedPrefs.forApp(getContext());
- mSavedSearchesEnabled = prefs.getBoolean(GeckoPreferences.PREFS_HISTORY_SAVED_SEARCH, true);
+ mSavedSearchesEnabled = prefs.getBoolean(GeckoPreferences.PREFS_HISTORY_SAVED_SEARCH, false);
// Fetch engines if we need to.
if (mSearchEngines.isEmpty() || !Locale.getDefault().equals(mLastLocale)) {
diff --git a/mobile/android/base/java/org/mozilla/gecko/home/SearchEngineRow.java b/mobile/android/base/java/org/mozilla/gecko/home/SearchEngineRow.java
index 8d7eec1d839a..1d90f7bacf41 100644
--- a/mobile/android/base/java/org/mozilla/gecko/home/SearchEngineRow.java
+++ b/mobile/android/base/java/org/mozilla/gecko/home/SearchEngineRow.java
@@ -378,7 +378,7 @@ class SearchEngineRow extends ThemedRelativeLayout {
final int recycledSuggestionCount = mSuggestionView.getChildCount();
final SharedPreferences prefs = GeckoSharedPrefs.forApp(getContext());
- final boolean savedSearchesEnabled = prefs.getBoolean(GeckoPreferences.PREFS_HISTORY_SAVED_SEARCH, true);
+ final boolean savedSearchesEnabled = prefs.getBoolean(GeckoPreferences.PREFS_HISTORY_SAVED_SEARCH, false);
// Remove duplicates of search engine suggestions from saved searches.
List<String> searchHistorySuggestions = (rawSearchHistorySuggestions != null) ? rawSearchHistorySuggestions : new ArrayList<String>();
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 25741 - TBA: Disable the microphone by default
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit 6cb0b508fb19dda23310263620c9d8d07c14c7d2
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Mon Apr 9 22:20:16 2018 +0000
Bug 25741 - TBA: Disable the microphone by default
Deactivating this is an accessibility concern because this is used for
voice dictation, so users should have the option of re-enabling this.
This uses the Android Speech API.
---
mobile/android/app/src/main/res/xml/preferences_accessibility.xml | 2 +-
.../android/base/java/org/mozilla/gecko/toolbar/ToolbarEditLayout.java | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/mobile/android/app/src/main/res/xml/preferences_accessibility.xml b/mobile/android/app/src/main/res/xml/preferences_accessibility.xml
index c4fe86ed62c3..c82006ee2473 100644
--- a/mobile/android/app/src/main/res/xml/preferences_accessibility.xml
+++ b/mobile/android/app/src/main/res/xml/preferences_accessibility.xml
@@ -18,7 +18,7 @@
<SwitchPreference android:key="android.not_a_preference.voice_input_enabled"
android:title="@string/pref_voice_input"
android:summary="@string/pref_voice_input_summary"
- android:defaultValue="true"/>
+ android:defaultValue="false"/>
<SwitchPreference android:key="android.not_a_preference.qrcode_enabled"
android:title="@string/pref_qrcode_enabled"
diff --git a/mobile/android/base/java/org/mozilla/gecko/toolbar/ToolbarEditLayout.java b/mobile/android/base/java/org/mozilla/gecko/toolbar/ToolbarEditLayout.java
index 7c9a99fc5432..1d53de172c47 100644
--- a/mobile/android/base/java/org/mozilla/gecko/toolbar/ToolbarEditLayout.java
+++ b/mobile/android/base/java/org/mozilla/gecko/toolbar/ToolbarEditLayout.java
@@ -287,7 +287,7 @@ public class ToolbarEditLayout extends ThemedLinearLayout {
return false;
}
return GeckoSharedPrefs.forApp(context)
- .getBoolean(GeckoPreferences.PREFS_VOICE_INPUT_ENABLED, true);
+ .getBoolean(GeckoPreferences.PREFS_VOICE_INPUT_ENABLED, false);
}
void launchVoiceRecognizer() {
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 25741 - TBA: Adjust the User Agent String so it doesn't leak Android version
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit 268ff9c9220b648975f533afa8b488cca2c36dea
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Thu Apr 26 15:17:42 2018 +0000
Bug 25741 - TBA: Adjust the User Agent String so it doesn't leak Android version
---
mobile/android/base/AppConstants.java.in | 21 +++++++++++++++++----
1 file changed, 17 insertions(+), 4 deletions(-)
diff --git a/mobile/android/base/AppConstants.java.in b/mobile/android/base/AppConstants.java.in
index bfc594e7e801..26047188841c 100644
--- a/mobile/android/base/AppConstants.java.in
+++ b/mobile/android/base/AppConstants.java.in
@@ -145,20 +145,33 @@ public class AppConstants {
public static final String OS_TARGET = "@OS_TARGET@";
public static final String TARGET_XPCOM_ABI = "@TARGET_XPCOM_ABI@";
- public static final String USER_AGENT_BOT_LIKE = "Redirector/" + AppConstants.MOZ_APP_VERSION +
- " (Android; rv:" + AppConstants.MOZ_APP_VERSION + ")";
-
- public static final String USER_AGENT_FENNEC_MOBILE = "Mozilla/5.0 (Android " +
+ // TBA: Commented out, not used.
+ //public static final String USER_AGENT_BOT_LIKE = "Redirector/" + AppConstants.MOZ_APP_VERSION +
+ // " (Android; rv:" + AppConstants.MOZ_APP_VERSION + ")";
+
+ // TBA: Fennec's UAS now contains the Android version. Hard-code all users UAS
+ // so it matches the RFP string from necko.
+ // toolkit/components/resistfingerprinting/nsRFPService.h
+ public static final String USER_AGENT_FENNEC_MOBILE =
+//#ifdef TOR_BROWSER_VERSION
+ "Mozilla/5.0 (Android 6.0; Mobile; rv:68.0) Gecko/20100101 Firefox/68.0";
+//#else
+ "Mozilla/5.0 (Android " +
Build.VERSION.RELEASE + "; Mobile; rv:" +
AppConstants.MOZ_APP_VERSION + ") Gecko/" +
AppConstants.MOZ_APP_VERSION + " Firefox/" +
AppConstants.MOZ_APP_VERSION;
+//#endif
+//#ifdef TOR_BROWSER_VERSION
+ public static final String USER_AGENT_FENNEC_TABLET = USER_AGENT_FENNEC_MOBILE;
+//#else
public static final String USER_AGENT_FENNEC_TABLET = "Mozilla/5.0 (Android " +
Build.VERSION.RELEASE + "; Tablet; rv:" +
AppConstants.MOZ_APP_VERSION + ") Gecko/" +
AppConstants.MOZ_APP_VERSION + " Firefox/" +
AppConstants.MOZ_APP_VERSION;
+//#endif
public static final boolean MOZ_ANDROID_ANR_REPORTER =
//#ifdef MOZ_ANDROID_ANR_REPORTER
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 25741 - TBA: Disable all data reporting by default
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit 2d3e4864df1cec08bf6f085e21cdbdcf08f57c8c
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Wed Apr 11 20:37:43 2018 +0000
Bug 25741 - TBA: Disable all data reporting by default
This includes:
Telemetry
Geo-Location (Wi-Fi, Cellular location data, etc)
Health Report
---
mobile/android/app/src/main/res/xml/preferences_privacy.xml | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/mobile/android/app/src/main/res/xml/preferences_privacy.xml b/mobile/android/app/src/main/res/xml/preferences_privacy.xml
index 68a2066976c8..23be2f12121b 100644
--- a/mobile/android/app/src/main/res/xml/preferences_privacy.xml
+++ b/mobile/android/app/src/main/res/xml/preferences_privacy.xml
@@ -84,7 +84,8 @@
<CheckBoxPreference android:key="android.not_a_preference.app.geo.reportdata"
android:title="@string/datareporting_wifi_title"
- android:summary="@string/datareporting_wifi_geolocation_summary" />
+ android:summary="@string/datareporting_wifi_geolocation_summary"
+ android:defaultValue="false" />
<org.mozilla.gecko.preferences.AlignRightLinkPreference android:key="android.not_a_preference.geo.learn_more"
android:title="@string/pref_learn_more"
@@ -94,7 +95,7 @@
<CheckBoxPreference android:key="android.not_a_preference.healthreport.uploadEnabled"
android:title="@string/datareporting_fhr_title"
android:summary="@string/datareporting_fhr_summary2"
- android:defaultValue="true" />
+ android:defaultValue="false" />
</PreferenceCategory>
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 25741 - TBA: Disable GeckoNetworkManager
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit 075ad0a98f40d38d34cb4b8ddc49a72892662f1e
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Thu Apr 26 22:22:51 2018 +0000
Bug 25741 - TBA: Disable GeckoNetworkManager
The browser should not need information related to the network
interface or network state, tor should take care of that.
---
.../src/main/java/org/mozilla/geckoview/GeckoRuntime.java | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoRuntime.java b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoRuntime.java
index 6023e2512398..804b8f0000e9 100644
--- a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoRuntime.java
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoRuntime.java
@@ -118,14 +118,18 @@ public final class GeckoRuntime implements Parcelable {
Log.d(LOGTAG, "Lifecycle: onResume");
// Monitor network status and send change notifications to Gecko
// while active.
- GeckoNetworkManager.getInstance().start(GeckoAppShell.getApplicationContext());
+ if (BuildConfig.TOR_BROWSER_VERSION != "") {
+ GeckoNetworkManager.getInstance().start(GeckoAppShell.getApplicationContext());
+ }
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
void onPause() {
Log.d(LOGTAG, "Lifecycle: onPause");
// Stop monitoring network status while inactive.
- GeckoNetworkManager.getInstance().stop();
+ if (BuildConfig.TOR_BROWSER_VERSION != "") {
+ GeckoNetworkManager.getInstance().stop();
+ }
}
}
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Orfox: Centralized proxy applied to AbstractCommunicator and BaseResources.
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit 25134efbece613bf35a6456f1f472bc33e082e60
Author: Amogh Pradeep <amoghbl1(a)gmail.com>
Date: Fri Jun 12 02:07:45 2015 -0400
Orfox: Centralized proxy applied to AbstractCommunicator and BaseResources.
See Bug 1357997 for partial uplift.
Also:
Bug 28051 - Use our Orbot for proxying our connections
---
.../java/org/mozilla/gecko/util/ProxySelector.java | 25 +++++++++++++++++++++-
.../org/mozilla/gecko/sync/net/BaseResource.java | 7 ++++++
.../service/utils/AbstractCommunicator.java | 11 +++++++---
3 files changed, 39 insertions(+), 4 deletions(-)
diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/ProxySelector.java b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/ProxySelector.java
index 3940d3c84249..9515975f680a 100644
--- a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/ProxySelector.java
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/ProxySelector.java
@@ -29,6 +29,10 @@ import java.net.URLConnection;
import java.util.List;
public class ProxySelector {
+ private static final String TOR_PROXY_ADDRESS = "127.0.0.1";
+ private static final int TOR_SOCKS_PROXY_PORT = 9150;
+ private static final int TOR_HTTP_PROXY_PORT = 8218;
+
public static URLConnection openConnectionWithProxy(final URI uri) throws IOException {
java.net.ProxySelector ps = java.net.ProxySelector.getDefault();
Proxy proxy = Proxy.NO_PROXY;
@@ -39,7 +43,26 @@ public class ProxySelector {
}
}
- return uri.toURL().openConnection(proxy);
+ /* Ignore the proxy we found from the VM, only use Tor. We can probably
+ * safely use the logic in this class in the future. */
+ return uri.toURL().openConnection(getProxy());
+ }
+
+ public static Proxy getProxy() {
+ // TODO make configurable
+ return new Proxy(Proxy.Type.SOCKS, new InetSocketAddress(TOR_PROXY_ADDRESS, TOR_SOCKS_PROXY_PORT));
+ }
+
+ public static String getProxyHostAddress() {
+ return TOR_PROXY_ADDRESS;
+ }
+
+ public static int getSocksProxyPort() {
+ return TOR_SOCKS_PROXY_PORT;
+ }
+
+ public static int getHttpProxyPort() {
+ return TOR_HTTP_PROXY_PORT;
}
public ProxySelector() {
diff --git a/mobile/android/services/src/main/java/org/mozilla/gecko/sync/net/BaseResource.java b/mobile/android/services/src/main/java/org/mozilla/gecko/sync/net/BaseResource.java
index e85ccb855bff..51ebd6ce990f 100644
--- a/mobile/android/services/src/main/java/org/mozilla/gecko/sync/net/BaseResource.java
+++ b/mobile/android/services/src/main/java/org/mozilla/gecko/sync/net/BaseResource.java
@@ -23,9 +23,11 @@ import org.json.simple.JSONObject;
import org.mozilla.gecko.background.common.GlobalConstants;
import org.mozilla.gecko.background.common.log.Logger;
import org.mozilla.gecko.sync.ExtendedJSONObject;
+import org.mozilla.gecko.util.ProxySelector;
import ch.boye.httpclientandroidlib.Header;
import ch.boye.httpclientandroidlib.HttpEntity;
+import ch.boye.httpclientandroidlib.HttpHost;
import ch.boye.httpclientandroidlib.HttpResponse;
import ch.boye.httpclientandroidlib.HttpVersion;
import ch.boye.httpclientandroidlib.client.AuthCache;
@@ -40,6 +42,7 @@ import ch.boye.httpclientandroidlib.client.methods.HttpRequestBase;
import ch.boye.httpclientandroidlib.client.methods.HttpUriRequest;
import ch.boye.httpclientandroidlib.client.protocol.ClientContext;
import ch.boye.httpclientandroidlib.conn.ClientConnectionManager;
+import ch.boye.httpclientandroidlib.conn.params.ConnRoutePNames;
import ch.boye.httpclientandroidlib.conn.scheme.PlainSocketFactory;
import ch.boye.httpclientandroidlib.conn.scheme.Scheme;
import ch.boye.httpclientandroidlib.conn.scheme.SchemeRegistry;
@@ -215,6 +218,10 @@ public class BaseResource implements Resource {
// We could reuse these client instances, except that we mess around
// with their parameters… so we'd need a pool of some kind.
client = new DefaultHttpClient(getConnectionManager());
+ /* TBA: We need a HTTP Proxy here */
+ HttpHost defaultProxy = new HttpHost(ProxySelector.getProxyHostAddress(),
+ ProxySelector.getHttpProxyPort());
+ client.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, defaultProxy);
// TODO: Eventually we should use Apache HttpAsyncClient. It's not out of alpha yet.
// Until then, we synchronously make the request, then invoke our delegate's callback.
diff --git a/mobile/android/stumbler/java/org/mozilla/mozstumbler/service/utils/AbstractCommunicator.java b/mobile/android/stumbler/java/org/mozilla/mozstumbler/service/utils/AbstractCommunicator.java
index 4e30cb7deeb7..9b3ee98f89db 100644
--- a/mobile/android/stumbler/java/org/mozilla/mozstumbler/service/utils/AbstractCommunicator.java
+++ b/mobile/android/stumbler/java/org/mozilla/mozstumbler/service/utils/AbstractCommunicator.java
@@ -7,6 +7,7 @@ package org.mozilla.mozstumbler.service.utils;
import android.os.Build;
import android.util.Log;
+import org.mozilla.gecko.util.ProxySelector;
import org.mozilla.mozstumbler.service.AppGlobals;
import org.mozilla.mozstumbler.service.Prefs;
@@ -16,7 +17,7 @@ import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
-import java.net.URL;
+import java.net.URI;
public abstract class AbstractCommunicator {
@@ -72,8 +73,12 @@ public abstract class AbstractCommunicator {
if (sMozApiKey == null || prefs != null) {
sMozApiKey = prefs.getMozApiKey();
}
- URL url = new URL(getUrlString() + "?key=" + sMozApiKey);
- mHttpURLConnection = (HttpURLConnection) url.openConnection();
+
+ /* TBA: This was a URL, but the connection logic would simply
+ * convert the URL into a URI, and then later convert the URI back
+ * into a URL. Creating a URL at the beginning is only wasteful. */
+ URI uri = new URI(getUrlString() + "?key=" + sMozApiKey);
+ mHttpURLConnection = (HttpURLConnection) ProxySelector.openConnectionWithProxy(uri);
mHttpURLConnection.setRequestMethod("POST");
} catch (MalformedURLException e) {
throw new IllegalArgumentException(e);
1
0

31 Aug '19
commit 23afe32d66453837ddd5943332ff9b2d9579a5c4
Author: Amogh Pradeep <amoghbl1(a)gmail.com>
Date: Fri Jul 17 17:01:09 2015 -0400
Orfox: quit button added
Signed-off-by: Amogh Pradeep <amoghbl1(a)gmail.com>
---
mobile/android/base/java/org/mozilla/gecko/BrowserApp.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
index e7d490a552fe..4123acca9bbe 100644
--- a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
+++ b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
@@ -3277,7 +3277,7 @@ public class BrowserApp extends GeckoApp
!PrefUtils.getStringSet(prefs,
ClearOnShutdownPref.PREF,
new HashSet<String>()).isEmpty();
- aMenu.findItem(R.id.quit).setVisible(visible);
+ aMenu.findItem(R.id.quit).setVisible(true);
// If tab data is unavailable we disable most of the context menu and related items and
// return early.
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 26528 - Don't allow Fennec to use UpdateService when installed through the app store
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit 0f0feb2c29527d262bec46e0c02f8c3b0b72839f
Author: Igor Oliveira <igt0(a)torproject.org>
Date: Wed Jun 27 12:12:22 2018 -0300
Bug 26528 - Don't allow Fennec to use UpdateService when installed through the app store
App stores such as Google Play or F-Droid have their own update service.
The Fennec UpdateService should be used just when the user installs it
by themselves.
---
.../base/java/org/mozilla/gecko/preferences/GeckoPreferences.java | 4 ++--
.../base/java/org/mozilla/gecko/updater/UpdateServiceHelper.java | 2 +-
.../geckoview/src/main/java/org/mozilla/gecko/util/ContextUtils.java | 5 +++--
3 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/mobile/android/base/java/org/mozilla/gecko/preferences/GeckoPreferences.java b/mobile/android/base/java/org/mozilla/gecko/preferences/GeckoPreferences.java
index 3b9227e52e37..cd4a7ec48e1d 100644
--- a/mobile/android/base/java/org/mozilla/gecko/preferences/GeckoPreferences.java
+++ b/mobile/android/base/java/org/mozilla/gecko/preferences/GeckoPreferences.java
@@ -698,8 +698,8 @@ public class GeckoPreferences
i--;
continue;
}
- } else if (PREFS_UPDATER_AUTODOWNLOAD.equals(key)) {
- if (!AppConstants.MOZ_UPDATER || ContextUtils.isInstalledFromGooglePlay(this)) {
+ } else if (PREFS_UPDATER_AUTODOWNLOAD.equals(key)) {
+ if (!AppConstants.MOZ_UPDATER || ContextUtils.isInstalledFromAppStore(this)) {
preferences.removePreference(pref);
i--;
continue;
diff --git a/mobile/android/base/java/org/mozilla/gecko/updater/UpdateServiceHelper.java b/mobile/android/base/java/org/mozilla/gecko/updater/UpdateServiceHelper.java
index df66c914769d..4ea0b6c74f55 100644
--- a/mobile/android/base/java/org/mozilla/gecko/updater/UpdateServiceHelper.java
+++ b/mobile/android/base/java/org/mozilla/gecko/updater/UpdateServiceHelper.java
@@ -212,7 +212,7 @@ public class UpdateServiceHelper {
}
public static boolean isUpdaterEnabled(final Context context) {
- return AppConstants.MOZ_UPDATER && isEnabled && !ContextUtils.isInstalledFromGooglePlay(context);
+ return AppConstants.MOZ_UPDATER && isEnabled && !ContextUtils.isInstalledFromAppStore(context);
}
public static void setUpdateUrl(Context context, String url) {
diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/ContextUtils.java b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/ContextUtils.java
index 4fb88ea41574..248763761378 100644
--- a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/ContextUtils.java
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/ContextUtils.java
@@ -17,6 +17,7 @@ import android.text.TextUtils;
public class ContextUtils {
private static final String INSTALLER_GOOGLE_PLAY = "com.android.vending";
+ private static final String INSTALLER_FDROID = "org.fdroid.fdroid";
private ContextUtils() {}
@@ -41,14 +42,14 @@ public class ContextUtils {
}
}
- public static boolean isInstalledFromGooglePlay(final Context context) {
+ public static boolean isInstalledFromAppStore(final Context context) {
final String installerPackageName = context.getPackageManager().getInstallerPackageName(context.getPackageName());
if (TextUtils.isEmpty(installerPackageName)) {
return false;
}
- return INSTALLER_GOOGLE_PLAY.equals(installerPackageName);
+ return INSTALLER_GOOGLE_PLAY.equals(installerPackageName) || INSTALLER_FDROID.equals(installerPackageName);
}
public static boolean isApplicationDebuggable(final @NonNull Context context) {
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 25741 - TBA: Do not import bookmarks and history from native browser by default
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit d5971ab34f8a0675a19d34d008f09c44d73b7872
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Wed Apr 11 18:51:09 2018 +0000
Bug 25741 - TBA: Do not import bookmarks and history from native browser by default
---
mobile/android/app/src/main/res/values/arrays.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/mobile/android/app/src/main/res/values/arrays.xml b/mobile/android/app/src/main/res/values/arrays.xml
index 8aa0240c66ea..af7001b5e41f 100644
--- a/mobile/android/app/src/main/res/values/arrays.xml
+++ b/mobile/android/app/src/main/res/values/arrays.xml
@@ -48,8 +48,8 @@
<item>@string/history_title</item>
</string-array>
<string-array name="pref_import_android_defaults">
- <item>true</item>
- <item>true</item>
+ <item>false</item>
+ <item>false</item>
</string-array>
<string-array name="pref_import_android_values">
<item>android_import.data.bookmarks</item>
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 25741 - TBA: Clear state when the app exits, by default
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit b5bb9a8c09d4c4d9f1606a5c69f1b941e5b3ca3c
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Wed Apr 11 18:55:25 2018 +0000
Bug 25741 - TBA: Clear state when the app exits, by default
Do not delete downloaded files on exit.
These correspond with (in order):
private.data.openTabs
private.data.history
private.data.searchHistory
private.data.downloadFiles
private.data.formdata
private.data.cookies_sessions
private.data.cache
private.data.offlineApps
private.data.siteSettings
private.data.syncedTabs
---
mobile/android/app/src/main/res/values/arrays.xml | 20 ++++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/mobile/android/app/src/main/res/values/arrays.xml b/mobile/android/app/src/main/res/values/arrays.xml
index af7001b5e41f..83bfd4a3d0a7 100644
--- a/mobile/android/app/src/main/res/values/arrays.xml
+++ b/mobile/android/app/src/main/res/values/arrays.xml
@@ -71,7 +71,7 @@
<item>true</item>
<item>true</item>
<item>true</item>
- <item>true</item>
+ <item>false</item>
<item>true</item>
<item>true</item>
<item>true</item>
@@ -104,16 +104,16 @@
<item>private.data.syncedTabs</item>
</string-array>
<string-array name="pref_clear_on_exit_defaults">
+ <item>true</item>
+ <item>true</item>
+ <item>true</item>
<item>false</item>
- <item>false</item>
- <item>false</item>
- <item>false</item>
- <item>false</item>
- <item>false</item>
- <item>false</item>
- <item>false</item>
- <item>false</item>
- <item>false</item>
+ <item>true</item>
+ <item>true</item>
+ <item>true</item>
+ <item>true</item>
+ <item>true</item>
+ <item>true</item>
</string-array>
<string-array name="pref_restore_entries">
<item>@string/pref_restore_always</item>
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Orfox: hook up default panic trigger to "quit and clear"
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit bd41c7cefcc3e36c45d780b8c03f1d369f8ad4e1
Author: Hans-Christoph Steiner <hans(a)eds.org>
Date: Sat Nov 21 00:24:09 2015 +0100
Orfox: hook up default panic trigger to "quit and clear"
Signed-off-by: Amogh Pradeep <amoghbl1(a)gmail.com>
Also:
Bug 28507: Implement fallback to delete private data in the browser startup
When the TBA is forcefully closed, its private data is not deleted,
even if the history.clear_on_exit is set.
As fallback, this patch calls the Sanitize:ClearData event in the
browser startup to clean the private data if needed.
---
mobile/android/base/AndroidManifest.xml.in | 7 +++
.../base/java/org/mozilla/gecko/GeckoApp.java | 72 ++++++++++++++--------
2 files changed, 52 insertions(+), 27 deletions(-)
diff --git a/mobile/android/base/AndroidManifest.xml.in b/mobile/android/base/AndroidManifest.xml.in
index e61a3411b2e0..48809195dc57 100644
--- a/mobile/android/base/AndroidManifest.xml.in
+++ b/mobile/android/base/AndroidManifest.xml.in
@@ -171,6 +171,13 @@
<data android:pathPattern=".*\\.xpi" />
</intent-filter>
+ <!-- receive triggers from panickit apps -->
+ <intent-filter>
+ <action android:name="info.guardianproject.panic.action.TRIGGER" />
+
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+
#ifdef MOZ_ANDROID_BEAM
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED"/>
diff --git a/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java b/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java
index 9143536400e3..c988923e960f 100644
--- a/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java
+++ b/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java
@@ -139,6 +139,7 @@ public abstract class GeckoApp extends GeckoActivity
public static final String ACTION_INIT_PW = "org.mozilla.gecko.INIT_PW";
public static final String ACTION_SWITCH_TAB = "org.mozilla.gecko.SWITCH_TAB";
public static final String ACTION_SHUTDOWN = "org.mozilla.gecko.SHUTDOWN";
+ public static final String ACTION_PANIC_TRIGGER = "info.guardianproject.panic.action.TRIGGER";
public static final String INTENT_REGISTER_STUMBLER_LISTENER = "org.mozilla.gecko.STUMBLER_REGISTER_LOCAL_LISTENER";
@@ -581,42 +582,50 @@ public abstract class GeckoApp extends GeckoActivity
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.quit) {
- // Make sure the Guest Browsing notification goes away when we quit.
- GuestSession.hideNotification(this);
+ quitAndClear();
+ return true;
+ }
- final SharedPreferences prefs = getSharedPreferencesForProfile();
- final Set<String> clearSet = PrefUtils.getStringSet(
- prefs, ClearOnShutdownPref.PREF, new HashSet<String>());
+ return super.onOptionsItemSelected(item);
+ }
- final GeckoBundle clearObj = new GeckoBundle(clearSet.size());
- for (final String clear : clearSet) {
- clearObj.putBoolean(clear, true);
- }
+ private GeckoBundle createSanitizeData() {
+ final SharedPreferences prefs = getSharedPreferencesForProfile();
+ final Set<String> clearSet = PrefUtils.getStringSet(
+ prefs, ClearOnShutdownPref.PREF, new HashSet<String>());
- final GeckoBundle res = new GeckoBundle(2);
- res.putBundle("sanitize", clearObj);
+ final GeckoBundle clearObj = new GeckoBundle(clearSet.size());
+ for (final String clear : clearSet) {
+ clearObj.putBoolean(clear, true);
+ }
+ return clearObj;
+ }
- // If the user wants to clear open tabs, or else has opted out of session
- // restore and does want to clear history, we also want to prevent the current
- // session info from being saved.
- if (clearObj.containsKey("private.data.openTabs")) {
- res.putBoolean("dontSaveSession", true);
- } else if (clearObj.containsKey("private.data.history")) {
+ private void quitAndClear() {
+ // Make sure the Guest Browsing notification goes away when we quit.
+ GuestSession.hideNotification(this);
- final String sessionRestore =
- getSessionRestorePreference(getSharedPreferences());
- res.putBoolean("dontSaveSession", "quit".equals(sessionRestore));
- }
+ final GeckoBundle clearObj = createSanitizeData();
+ final GeckoBundle res = new GeckoBundle(2);
+ res.putBundle("sanitize", clearObj);
- EventDispatcher.getInstance().dispatch("Browser:Quit", res);
+ // If the user wants to clear open tabs, or else has opted out of session
+ // restore and does want to clear history, we also want to prevent the current
+ // session info from being saved.
+ if (clearObj.containsKey("private.data.openTabs")) {
+ res.putBoolean("dontSaveSession", true);
+ } else if (clearObj.containsKey("private.data.history")) {
- // We don't call shutdown here because this creates a race condition which
- // can cause the clearing of private data to fail. Instead, we shut down the
- // UI only after we're done sanitizing.
- return true;
+ final String sessionRestore =
+ getSessionRestorePreference(getSharedPreferences());
+ res.putBoolean("dontSaveSession", "quit".equals(sessionRestore));
}
- return super.onOptionsItemSelected(item);
+ EventDispatcher.getInstance().dispatch("Browser:Quit", res);
+
+ // We don't call shutdown here because this creates a race condition which
+ // can cause the clearing of private data to fail. Instead, we shut down the
+ // UI only after we're done sanitizing.
}
@Override
@@ -1160,6 +1169,13 @@ public abstract class GeckoApp extends GeckoActivity
mTextSelection.create();
final Bundle finalSavedInstanceState = savedInstanceState;
+
+ // When the browser is forcefully closed, its private data is not
+ // deleted, even if the history.clear_on_exit is set. Here we are calling
+ // the Sanitize:ClearData in the startup to make sure the private
+ // data was cleared.
+ EventDispatcher.getInstance().dispatch("Sanitize:ClearData", createSanitizeData());
+
ThreadUtils.postToBackgroundThread(new Runnable() {
@Override
public void run() {
@@ -1602,6 +1618,8 @@ public abstract class GeckoApp extends GeckoActivity
// Copy extras.
settingsIntent.putExtras(intent.getUnsafe());
startActivity(settingsIntent);
+ } else if (ACTION_PANIC_TRIGGER.equals(action)) {
+ quitAndClear();
}
mPromptService = new PromptService(this, getAppEventDispatcher());
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 25741 - TBA: top sites changed, used bookmarks icon temporarily.
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit 5e45176359a9131f70254e2b02af01bcd66f46c8
Author: Amogh Pradeep <amoghbl1(a)gmail.com>
Date: Thu Jun 18 04:14:18 2015 -0400
Bug 25741 - TBA: top sites changed, used bookmarks icon temporarily.
Adjust the Top Sites shown when a user taps on the URL bar.
Signed-off-by: Amogh Pradeep <amoghbl1(a)gmail.com>
---
.../res/drawable-hdpi/suggestedsites_checktor.png | Bin 0 -> 1286 bytes
.../suggestedsites_guardianproject.png | Bin 0 -> 1286 bytes
.../drawable-hdpi/suggestedsites_torproject.png | Bin 0 -> 1286 bytes
.../res/drawable-xhdpi/suggestedsites_checktor.png | Bin 0 -> 1626 bytes
.../suggestedsites_guardianproject.png | Bin 0 -> 1626 bytes
.../drawable-xhdpi/suggestedsites_torproject.png | Bin 0 -> 1626 bytes
.../drawable-xxhdpi/suggestedsites_checktor.png | Bin 0 -> 1626 bytes
.../suggestedsites_guardianproject.png | Bin 0 -> 1626 bytes
.../drawable-xxhdpi/suggestedsites_torproject.png | Bin 0 -> 1626 bytes
.../mozilla/gecko/util/UnusedResourcesUtil.java | 3 +++
.../components/search/searchplugins/duckduckgo.xml | 6 ++---
.../components/search/searchplugins/list.json | 26 +++++++++++++++---
mobile/locales/en-US/chrome/region.properties | 30 +++++++++++++--------
13 files changed, 47 insertions(+), 18 deletions(-)
diff --git a/mobile/android/app/src/main/res/drawable-hdpi/suggestedsites_checktor.png b/mobile/android/app/src/main/res/drawable-hdpi/suggestedsites_checktor.png
new file mode 100644
index 000000000000..a87c16e3d566
Binary files /dev/null and b/mobile/android/app/src/main/res/drawable-hdpi/suggestedsites_checktor.png differ
diff --git a/mobile/android/app/src/main/res/drawable-hdpi/suggestedsites_guardianproject.png b/mobile/android/app/src/main/res/drawable-hdpi/suggestedsites_guardianproject.png
new file mode 100644
index 000000000000..a87c16e3d566
Binary files /dev/null and b/mobile/android/app/src/main/res/drawable-hdpi/suggestedsites_guardianproject.png differ
diff --git a/mobile/android/app/src/main/res/drawable-hdpi/suggestedsites_torproject.png b/mobile/android/app/src/main/res/drawable-hdpi/suggestedsites_torproject.png
new file mode 100644
index 000000000000..a87c16e3d566
Binary files /dev/null and b/mobile/android/app/src/main/res/drawable-hdpi/suggestedsites_torproject.png differ
diff --git a/mobile/android/app/src/main/res/drawable-xhdpi/suggestedsites_checktor.png b/mobile/android/app/src/main/res/drawable-xhdpi/suggestedsites_checktor.png
new file mode 100644
index 000000000000..fa7f676310df
Binary files /dev/null and b/mobile/android/app/src/main/res/drawable-xhdpi/suggestedsites_checktor.png differ
diff --git a/mobile/android/app/src/main/res/drawable-xhdpi/suggestedsites_guardianproject.png b/mobile/android/app/src/main/res/drawable-xhdpi/suggestedsites_guardianproject.png
new file mode 100644
index 000000000000..fa7f676310df
Binary files /dev/null and b/mobile/android/app/src/main/res/drawable-xhdpi/suggestedsites_guardianproject.png differ
diff --git a/mobile/android/app/src/main/res/drawable-xhdpi/suggestedsites_torproject.png b/mobile/android/app/src/main/res/drawable-xhdpi/suggestedsites_torproject.png
new file mode 100644
index 000000000000..fa7f676310df
Binary files /dev/null and b/mobile/android/app/src/main/res/drawable-xhdpi/suggestedsites_torproject.png differ
diff --git a/mobile/android/app/src/main/res/drawable-xxhdpi/suggestedsites_checktor.png b/mobile/android/app/src/main/res/drawable-xxhdpi/suggestedsites_checktor.png
new file mode 100644
index 000000000000..fa7f676310df
Binary files /dev/null and b/mobile/android/app/src/main/res/drawable-xxhdpi/suggestedsites_checktor.png differ
diff --git a/mobile/android/app/src/main/res/drawable-xxhdpi/suggestedsites_guardianproject.png b/mobile/android/app/src/main/res/drawable-xxhdpi/suggestedsites_guardianproject.png
new file mode 100644
index 000000000000..fa7f676310df
Binary files /dev/null and b/mobile/android/app/src/main/res/drawable-xxhdpi/suggestedsites_guardianproject.png differ
diff --git a/mobile/android/app/src/main/res/drawable-xxhdpi/suggestedsites_torproject.png b/mobile/android/app/src/main/res/drawable-xxhdpi/suggestedsites_torproject.png
new file mode 100644
index 000000000000..fa7f676310df
Binary files /dev/null and b/mobile/android/app/src/main/res/drawable-xxhdpi/suggestedsites_torproject.png differ
diff --git a/mobile/android/base/java/org/mozilla/gecko/util/UnusedResourcesUtil.java b/mobile/android/base/java/org/mozilla/gecko/util/UnusedResourcesUtil.java
index 4056bd1a2ba5..af21ca27aadf 100644
--- a/mobile/android/base/java/org/mozilla/gecko/util/UnusedResourcesUtil.java
+++ b/mobile/android/base/java/org/mozilla/gecko/util/UnusedResourcesUtil.java
@@ -62,10 +62,13 @@ final class UnusedResourcesUtil {
public static final int[] USED_IN_SUGGESTEDSITES = {
R.drawable.suggestedsites_amazon,
+ R.drawable.suggestedsites_checktor,
R.drawable.suggestedsites_facebook,
+ R.drawable.suggestedsites_guardianproject,
R.drawable.suggestedsites_restricted_fxsupport,
R.drawable.suggestedsites_restricted_mozilla,
R.drawable.suggestedsites_twitter,
+ R.drawable.suggestedsites_torproject,
R.drawable.suggestedsites_webmaker,
R.drawable.suggestedsites_wikipedia,
R.drawable.suggestedsites_youtube,
diff --git a/mobile/android/components/search/searchplugins/duckduckgo.xml b/mobile/android/components/search/searchplugins/duckduckgo.xml
index 2e5d1d2802c4..9ff1b91a027a 100644
--- a/mobile/android/components/search/searchplugins/duckduckgo.xml
+++ b/mobile/android/components/search/searchplugins/duckduckgo.xml
@@ -11,13 +11,13 @@
<Param name="type" value="list"/>
</Url>
<!-- this is effectively x-moz-phonesearch, but search service expects a text/html entry -->
-<Url type="text/html" method="GET" template="https://duckduckgo.com/">
+<Url type="text/html" method="GET" template="https://duckduckgo.com/html/">
<Param name="q" value="{searchTerms}" />
<Param name="t" value="fpas" />
</Url>
-<Url type="application/x-moz-tabletsearch" method="GET" template="https://duckduckgo.com/">
+<Url type="application/x-moz-tabletsearch" method="GET" template="https://duckduckgo.com/html/">
<Param name="q" value="{searchTerms}" />
<Param name="t" value="ftas" />
</Url>
-<SearchForm>https://duckduckgo.com</SearchForm>
+<SearchForm>https://duckduckgo.com/html/</SearchForm>
</SearchPlugin>
diff --git a/mobile/android/components/search/searchplugins/list.json b/mobile/android/components/search/searchplugins/list.json
index 587a3ccba7ad..008039f48e01 100644
--- a/mobile/android/components/search/searchplugins/list.json
+++ b/mobile/android/components/search/searchplugins/list.json
@@ -1,14 +1,32 @@
{
"default": {
- "searchDefault": "Google",
- "searchOrder": ["Google", "Bing"],
+ "searchDefault": "DuckDuckGo",
+ "searchOrder": ["DuckDuckGo", "Google"],
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazondotcom", "ddg", "twitter", "wikipedia"
+ "ddg", "google", "bing", "amazondotcom", "twitter", "wikipedia"
]
},
"regionOverrides": {
"US": {
- "google-b-m": "google-b-1-m"
+ "ddg": "duckduckgo"
+ },
+ "KZ": {
+ "ddg": "duckduckgo"
+ },
+ "BY": {
+ "ddg": "duckduckgo"
+ },
+ "RU": {
+ "ddg": "duckduckgo"
+ },
+ "TR": {
+ "ddg": "duckduckgo"
+ },
+ "UA": {
+ "ddg": "duckduckgo"
+ },
+ "CN": {
+ "ddg": "duckduckgo"
}
},
"locales": {
diff --git a/mobile/locales/en-US/chrome/region.properties b/mobile/locales/en-US/chrome/region.properties
index a392e1f2fc5a..861c0ee495e3 100644
--- a/mobile/locales/en-US/chrome/region.properties
+++ b/mobile/locales/en-US/chrome/region.properties
@@ -27,19 +27,27 @@ browser.contentHandlers.types.0.uri=https://add.my.yahoo.com/rss?url=%s
# browser.suggestedsites.NAME.title=Displayed name
# browser.suggestedsites.NAME.url=Website URL
# browser.suggestedsites.NAME.bgcolor= Color (hex format)
-#
-# Note that if you remove or add items to this set, you need to adjust
-# mobile/android/tests/browser/robocop/testDistribution.java
-# to reflect the new set of IDs reported as tiles data.
-#
-browser.suggestedsites.list.0=facebook
-browser.suggestedsites.list.1=youtube
-browser.suggestedsites.list.2=amazon
+
+browser.suggestedsites.list.0=checktor
+browser.suggestedsites.list.1=torproject
+browser.suggestedsites.list.2=guardianproject
browser.suggestedsites.list.3=wikipedia
-browser.suggestedsites.list.4=twitter
+browser.suggestedsites.list.4=facebook
+
+browser.suggestedsites.checktor.title=Check Tor Connection
+browser.suggestedsites.checktor.url=https://check.torproject.org/
+browser.suggestedsites.checktor.bgcolor=#ffecf0f3
+
+browser.suggestedsites.torproject.title=The Tor Project
+browser.suggestedsites.torproject.url=https://www.torproject.org/
+browser.suggestedsites.torproject.bgcolor=#ffecf0f3
+
+browser.suggestedsites.guardianproject.title=The Guardian Project
+browser.suggestedsites.guardianproject.url=https://guardianproject.info/
+browser.suggestedsites.guardianproject.bgcolor=#ffecf0f3
-browser.suggestedsites.facebook.title=Facebook
-browser.suggestedsites.facebook.url=https://m.facebook.com/
+browser.suggestedsites.facebook.title=Facebook Onion Service
+browser.suggestedsites.facebook.url=https://m.facebookcorewwwi.onion
browser.suggestedsites.facebook.bgcolor=#3B5998
browser.suggestedsites.youtube.title=YouTube
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 25741 - TBA: Always Quit, do not restore the last session
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit 8273c9c80ee6670d947dfc13b5f7e461967c2504
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Wed Apr 11 20:42:04 2018 +0000
Bug 25741 - TBA: Always Quit, do not restore the last session
---
mobile/android/app/src/main/res/xml/preferences_advanced.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/mobile/android/app/src/main/res/xml/preferences_advanced.xml b/mobile/android/app/src/main/res/xml/preferences_advanced.xml
index db035eb66206..622ce38a370b 100644
--- a/mobile/android/app/src/main/res/xml/preferences_advanced.xml
+++ b/mobile/android/app/src/main/res/xml/preferences_advanced.xml
@@ -27,7 +27,7 @@
<ListPreference android:key="android.not_a_preference.restoreSession3"
android:title="@string/pref_restore"
- android:defaultValue="always"
+ android:defaultValue="quit"
android:entries="@array/pref_restore_entries"
android:entryValues="@array/pref_restore_values"
android:persistent="true" />
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 25696 - Implement alpha onboarding for Tor Browser for Android
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit 11c49bccc023231db699b8bef6c6d98681ae4c87
Author: Igor Oliveira <igt0(a)torproject.org>
Date: Mon Aug 6 00:12:26 2018 -0300
Bug 25696 - Implement alpha onboarding for Tor Browser for Android
- FirstrunTorPagerConfig.java: Create file that sets up all the views
in the pager.
- FirstrunPager.java: Update code to use the FirstrunTorPagerConfig.
- FirstrunLastPanel.java: Create view that adds a close handler in the
latest pager view.
Also:
Bug 25696 - Design of alpha onboarding for Tor Browser for Android
Bug 27125 - Move localized Tor Browser for Android strings into separate file
---
.../res/layout/firstrun_animation_container.xml | 10 +--
.../firstrun_basepanel_checkable_fragment.xml | 34 +++++----
mobile/android/app/src/main/res/values/colors.xml | 3 +
mobile/android/app/src/main/res/values/styles.xml | 7 ++
.../mozilla/gecko/firstrun/FirstrunLastPanel.java | 30 ++++++++
.../org/mozilla/gecko/firstrun/FirstrunPager.java | 18 ++---
.../gecko/firstrun/FirstrunPagerConfig.java | 1 +
.../org/mozilla/gecko/firstrun/FirstrunPanel.java | 2 +
.../gecko/firstrun/FirstrunTorPagerConfig.java | 81 +++++++++++++++++++++
.../java/org/mozilla/gecko/firstrun/LastPanel.java | 7 +-
.../android/base/locales/en-US/android_strings.dtd | 2 +-
.../base/locales/en-US/torbrowser_strings.dtd | 26 +++++++
mobile/android/base/strings.xml.in | 32 +++++++-
.../alpha/res/drawable-nodpi/figure_experience.png | Bin 0 -> 44299 bytes
.../alpha/res/drawable-nodpi/figure_network.png | Bin 0 -> 70302 bytes
.../alpha/res/drawable-nodpi/figure_onion.png | Bin 0 -> 139952 bytes
.../alpha/res/drawable-nodpi/figure_privacy.png | Bin 0 -> 61696 bytes
.../alpha/res/drawable-nodpi/figure_security.png | Bin 0 -> 52021 bytes
.../alpha/res/drawable-nodpi/figure_welcome.png | Bin 0 -> 83798 bytes
.../drawable-nodpi/home_tab_menu_strip_tor.9.png | Bin 0 -> 126 bytes
.../res/drawable-nodpi/figure_experience.png | Bin 0 -> 44299 bytes
.../nightly/res/drawable-nodpi/figure_network.png | Bin 0 -> 70302 bytes
.../nightly/res/drawable-nodpi/figure_onion.png | Bin 0 -> 139952 bytes
.../nightly/res/drawable-nodpi/figure_privacy.png | Bin 0 -> 61696 bytes
.../nightly/res/drawable-nodpi/figure_security.png | Bin 0 -> 52021 bytes
.../nightly/res/drawable-nodpi/figure_welcome.png | Bin 0 -> 83798 bytes
.../drawable-nodpi/home_tab_menu_strip_tor.9.png | Bin 0 -> 126 bytes
.../res/drawable-nodpi/figure_experience.png | Bin 0 -> 44299 bytes
.../official/res/drawable-nodpi/figure_network.png | Bin 0 -> 70302 bytes
.../official/res/drawable-nodpi/figure_onion.png | Bin 0 -> 139952 bytes
.../official/res/drawable-nodpi/figure_privacy.png | Bin 0 -> 61696 bytes
.../res/drawable-nodpi/figure_security.png | Bin 0 -> 52021 bytes
.../official/res/drawable-nodpi/figure_welcome.png | Bin 0 -> 83798 bytes
.../drawable-nodpi/home_tab_menu_strip_tor.9.png | Bin 0 -> 126 bytes
34 files changed, 215 insertions(+), 38 deletions(-)
diff --git a/mobile/android/app/src/main/res/layout/firstrun_animation_container.xml b/mobile/android/app/src/main/res/layout/firstrun_animation_container.xml
index 3e7225365c57..dd20466a8e1a 100644
--- a/mobile/android/app/src/main/res/layout/firstrun_animation_container.xml
+++ b/mobile/android/app/src/main/res/layout/firstrun_animation_container.xml
@@ -8,7 +8,7 @@
xmlns:gecko="http://schemas.android.com/apk/res-auto"
android:layout_height="match_parent"
android:layout_width="match_parent"
- android:background="@color/dark_transparent_overlay">
+ android:background="@android:color/white">
<org.mozilla.gecko.firstrun.FirstrunPager
android:id="@+id/firstrun_pager"
@@ -18,12 +18,12 @@
<org.mozilla.gecko.home.TabMenuStrip android:layout_width="match_parent"
android:layout_height="@dimen/tabs_strip_height"
- android:background="@color/firstrun_pager_header"
+ android:background="@android:color/white"
android:visibility="visible"
android:layout_gravity="top"
- gecko:strip="@drawable/home_tab_menu_strip"
- gecko:activeTextColor="@color/placeholder_grey"
- gecko:inactiveTextColor="@color/tab_text_color"
+ gecko:strip="@drawable/home_tab_menu_strip_tor"
+ gecko:activeTextColor="@color/tor_tab_active_text"
+ gecko:inactiveTextColor="@color/tor_tab_inactive_text"
gecko:tabsMarginLeft="@dimen/firstrun_tab_strip_content_start" />
</org.mozilla.gecko.firstrun.FirstrunPager>
diff --git a/mobile/android/app/src/main/res/layout/firstrun_basepanel_checkable_fragment.xml b/mobile/android/app/src/main/res/layout/firstrun_basepanel_checkable_fragment.xml
index 700ab20663ce..b0083511ae0d 100644
--- a/mobile/android/app/src/main/res/layout/firstrun_basepanel_checkable_fragment.xml
+++ b/mobile/android/app/src/main/res/layout/firstrun_basepanel_checkable_fragment.xml
@@ -13,31 +13,37 @@
<LinearLayout android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="@dimen/firstrun_min_height"
- android:background="@color/about_page_header_grey"
+ android:background="@color/tor_description_background_text"
android:gravity="center_horizontal"
android:orientation="vertical">
- <ImageView android:id="@+id/firstrun_image"
- android:layout_width="wrap_content"
- android:layout_height="@dimen/firstrun_background_height"
- android:layout_marginTop="30dp"
- android:layout_marginBottom="18dp"
- android:scaleType="fitCenter"
- android:layout_gravity="center"
- android:adjustViewBounds="true"/>
+ <LinearLayout android:layout_width="match_parent"
+ android:layout_height="@dimen/firstrun_background_height"
+ android:background="@android:color/white"
+ android:gravity="center"
+ android:layout_gravity="center">
+
+ <ImageView android:id="@+id/firstrun_image"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:scaleType="fitCenter"
+ android:layout_gravity="center"
+ android:adjustViewBounds="true"/>
+ </LinearLayout>
<TextView android:id="@+id/firstrun_text"
android:layout_width="@dimen/firstrun_content_width"
android:layout_height="wrap_content"
- android:gravity="center"
+ android:gravity="left"
android:textAppearance="@style/TextAppearance.FirstrunLight.Main"/>
<TextView android:id="@+id/firstrun_subtext"
android:layout_width="@dimen/firstrun_content_width"
android:layout_height="wrap_content"
android:paddingTop="20dp"
- android:gravity="center"
- android:textAppearance="@style/TextAppearance.FirstrunRegular.Body"/>
+ android:gravity="left"
+ android:lineSpacingExtra="5dp"
+ android:textAppearance="@style/TextAppearance.FirstrunTorRegular.Body"/>
<android.support.v7.widget.SwitchCompat
android:id="@+id/firstrun_switch"
@@ -47,10 +53,10 @@
android:visibility="invisible"/>
<TextView android:id="@+id/firstrun_link"
- android:layout_width="wrap_content"
+ android:layout_width="@dimen/firstrun_content_width"
android:layout_height="wrap_content"
android:layout_marginBottom="30dp"
- android:gravity="center"
+ android:gravity="left"
android:textAppearance="@style/TextAppearance.Link"
android:textAllCaps="true"
android:text="@string/firstrun_button_next"/>
diff --git a/mobile/android/app/src/main/res/values/colors.xml b/mobile/android/app/src/main/res/values/colors.xml
index d1be54da0233..f31f0e73198f 100644
--- a/mobile/android/app/src/main/res/values/colors.xml
+++ b/mobile/android/app/src/main/res/values/colors.xml
@@ -151,6 +151,9 @@
<color name="url_bar_shadow_private">#272727</color>
+ <color name="tor_tab_inactive_text">#484848</color>
+ <color name="tor_tab_active_text">#7D4698</color>
+ <color name="tor_description_background_text">#FAFAFA</color>
<!-- Restricted profiles palette -->
<color name="restricted_profile_background_gold">#ffffcb51</color>
diff --git a/mobile/android/app/src/main/res/values/styles.xml b/mobile/android/app/src/main/res/values/styles.xml
index 033aec05c806..a669933fca01 100644
--- a/mobile/android/app/src/main/res/values/styles.xml
+++ b/mobile/android/app/src/main/res/values/styles.xml
@@ -730,6 +730,7 @@
<style name="TextAppearance.FirstrunLight"/>
<style name="TextAppearance.FirstrunRegular"/>
+ <style name="TextAppearance.FirstrunTorRegular"/>
<style name="TextAppearance.FirstrunLight.Main">
<item name="android:textSize">20sp</item>
@@ -742,6 +743,12 @@
<item name="android:lineSpacingMultiplier">1.25</item>
</style>
+ <style name="TextAppearance.FirstrunTorRegular.Body">
+ <item name="android:textSize">16sp</item>
+ <item name="android:textColor">@color/ob_subtitle</item>
+ <item name="android:lineSpacingMultiplier">2</item>
+ </style>
+
<style name="TextAppearance.Link">
<item name="android:textSize">16sp</item>
<item name="android:textColor">@color/ob_click</item>
diff --git a/mobile/android/base/java/org/mozilla/gecko/firstrun/FirstrunLastPanel.java b/mobile/android/base/java/org/mozilla/gecko/firstrun/FirstrunLastPanel.java
new file mode 100644
index 000000000000..37ccda25d328
--- /dev/null
+++ b/mobile/android/base/java/org/mozilla/gecko/firstrun/FirstrunLastPanel.java
@@ -0,0 +1,30 @@
+/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.gecko.firstrun;
+
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import org.mozilla.gecko.R;
+
+public class FirstrunLastPanel extends FirstrunPanel {
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstance) {
+ final ViewGroup root = (ViewGroup) super.onCreateView(inflater, container, savedInstance);
+
+ root.findViewById(R.id.firstrun_link).setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ close();
+ }
+ });
+
+ return root;
+ }
+}
diff --git a/mobile/android/base/java/org/mozilla/gecko/firstrun/FirstrunPager.java b/mobile/android/base/java/org/mozilla/gecko/firstrun/FirstrunPager.java
index 01668978fa7b..d9465dd1939c 100644
--- a/mobile/android/base/java/org/mozilla/gecko/firstrun/FirstrunPager.java
+++ b/mobile/android/base/java/org/mozilla/gecko/firstrun/FirstrunPager.java
@@ -65,15 +65,7 @@ public class FirstrunPager extends RtlViewPager {
public void load(Context appContext, FragmentManager fm, final boolean useLocalValues,
final FirstrunAnimationContainer.OnFinishListener onFinishListener) {
- final List<FirstrunPagerConfig.FirstrunPanelConfig> panels;
-
- if (Restrictions.isRestrictedProfile(appContext)) {
- panels = FirstrunPagerConfig.getRestricted(appContext);
- } else if (FirefoxAccounts.firefoxAccountsExist(appContext)) {
- panels = FirstrunPagerConfig.forFxAUser(appContext, useLocalValues);
- } else {
- panels = FirstrunPagerConfig.getDefault(appContext, useLocalValues);
- }
+ final List<FirstrunTorPagerConfig.FirstrunTorPanelConfig> panels = FirstrunTorPagerConfig.getDefault(appContext);
setAdapter(new ViewPagerAdapter(fm, panels));
this.pagerNavigation = new FirstrunPanel.PagerNavigation() {
@@ -137,14 +129,14 @@ public class FirstrunPager extends RtlViewPager {
}
protected class ViewPagerAdapter extends FragmentPagerAdapter {
- private final List<FirstrunPagerConfig.FirstrunPanelConfig> panels;
+ private final List<FirstrunTorPagerConfig.FirstrunTorPanelConfig> panels;
private final Fragment[] fragments;
- public ViewPagerAdapter(FragmentManager fm, List<FirstrunPagerConfig.FirstrunPanelConfig> panels) {
+ public ViewPagerAdapter(FragmentManager fm, List<FirstrunTorPagerConfig.FirstrunTorPanelConfig> panels) {
super(fm);
this.panels = panels;
this.fragments = new Fragment[panels.size()];
- for (FirstrunPagerConfig.FirstrunPanelConfig panel : panels) {
+ for (FirstrunTorPagerConfig.FirstrunTorPanelConfig panel : panels) {
mDecor.onAddPagerView(panel.getTitle());
}
@@ -157,7 +149,7 @@ public class FirstrunPager extends RtlViewPager {
public Fragment getItem(int i) {
Fragment fragment = this.fragments[i];
if (fragment == null) {
- FirstrunPagerConfig.FirstrunPanelConfig panelConfig = panels.get(i);
+ FirstrunTorPagerConfig.FirstrunTorPanelConfig panelConfig = panels.get(i);
fragment = Fragment.instantiate(context, panelConfig.getClassname(), panelConfig.getArgs());
((FirstrunPanel) fragment).setPagerNavigation(pagerNavigation);
fragments[i] = fragment;
diff --git a/mobile/android/base/java/org/mozilla/gecko/firstrun/FirstrunPagerConfig.java b/mobile/android/base/java/org/mozilla/gecko/firstrun/FirstrunPagerConfig.java
index 2e5f54f3bd79..d04d179cdd0b 100644
--- a/mobile/android/base/java/org/mozilla/gecko/firstrun/FirstrunPagerConfig.java
+++ b/mobile/android/base/java/org/mozilla/gecko/firstrun/FirstrunPagerConfig.java
@@ -20,6 +20,7 @@ class FirstrunPagerConfig {
static final String KEY_IMAGE = "panelImage";
static final String KEY_MESSAGE = "panelMessage";
static final String KEY_SUBTEXT = "panelDescription";
+ static final String KEY_CTATEXT = "panelCtaText";
static List<FirstrunPanelConfig> getDefault(Context context, final boolean useLocalValues) {
final List<FirstrunPanelConfig> panels = new LinkedList<>();
diff --git a/mobile/android/base/java/org/mozilla/gecko/firstrun/FirstrunPanel.java b/mobile/android/base/java/org/mozilla/gecko/firstrun/FirstrunPanel.java
index 23f05ce23800..d9a3b06c88f8 100644
--- a/mobile/android/base/java/org/mozilla/gecko/firstrun/FirstrunPanel.java
+++ b/mobile/android/base/java/org/mozilla/gecko/firstrun/FirstrunPanel.java
@@ -36,10 +36,12 @@ public class FirstrunPanel extends Fragment {
final int image = args.getInt(FirstrunPagerConfig.KEY_IMAGE);
final String message = args.getString(FirstrunPagerConfig.KEY_MESSAGE);
final String subtext = args.getString(FirstrunPagerConfig.KEY_SUBTEXT);
+ final String ctatext = args.getString(FirstrunPagerConfig.KEY_CTATEXT);
((ImageView) root.findViewById(R.id.firstrun_image)).setImageDrawable(getResources().getDrawable(image));
((TextView) root.findViewById(R.id.firstrun_text)).setText(message);
((TextView) root.findViewById(R.id.firstrun_subtext)).setText(subtext);
+ ((TextView) root.findViewById(R.id.firstrun_link)).setText(ctatext);
final TextView messageView = root.findViewById(R.id.firstrun_text);
if (NO_MESSAGE.equals(message)) {
diff --git a/mobile/android/base/java/org/mozilla/gecko/firstrun/FirstrunTorPagerConfig.java b/mobile/android/base/java/org/mozilla/gecko/firstrun/FirstrunTorPagerConfig.java
new file mode 100644
index 000000000000..9881ba01dda3
--- /dev/null
+++ b/mobile/android/base/java/org/mozilla/gecko/firstrun/FirstrunTorPagerConfig.java
@@ -0,0 +1,81 @@
+/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.gecko.firstrun;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.util.Log;
+import org.mozilla.gecko.GeckoSharedPrefs;
+import org.mozilla.gecko.R;
+import org.mozilla.gecko.Telemetry;
+import org.mozilla.gecko.TelemetryContract;
+import org.mozilla.gecko.Experiments;
+
+import java.util.LinkedList;
+import java.util.List;
+
+public class FirstrunTorPagerConfig {
+ public static final String LOGTAG = "FirstrunPagerConfigTor";
+
+ public static final String KEY_IMAGE = "panelImage";
+ public static final String KEY_MESSAGE = "panelMessage";
+ public static final String KEY_SUBTEXT = "panelDescription";
+ public static final String KEY_CTATEXT = "panelCtaText";
+
+ private static Context mContext;
+
+ public static List<FirstrunTorPanelConfig> getDefault(Context context) {
+ mContext = context;
+ final List<FirstrunTorPanelConfig> panels = new LinkedList<>();
+ panels.add(SimplePanelConfigs.welcomeTorPanelConfig);
+ panels.add(SimplePanelConfigs.privacyPanelConfig);
+ panels.add(SimplePanelConfigs.torNetworkPanelConfig);
+ panels.add(SimplePanelConfigs.secSettingsPanelConfig);
+ panels.add(SimplePanelConfigs.tipsPanelConfig);
+ panels.add(SimplePanelConfigs.onionServicesPanelConfig);
+
+ return panels;
+ }
+
+ public static class FirstrunTorPanelConfig {
+
+ private String classname;
+ private String title;
+ private Bundle args;
+
+ public FirstrunTorPanelConfig(String classname, int title, int image, int message, int subtext, int ctatext) {
+ this.classname = classname;
+ this.title = mContext.getResources().getString(title);
+
+ this.args = new Bundle();
+ this.args.putInt(KEY_IMAGE, image);
+ this.args.putString(KEY_MESSAGE, mContext.getResources().getString(message));
+ this.args.putString(KEY_SUBTEXT, mContext.getResources().getString(subtext));
+ this.args.putString(KEY_CTATEXT, mContext.getResources().getString(ctatext));
+ }
+
+ public String getClassname() {
+ return this.classname;
+ }
+
+ public String getTitle() {
+ return this.title;
+ }
+
+ public Bundle getArgs() {
+ return args;
+ }
+ }
+
+ private static class SimplePanelConfigs {
+ public static final FirstrunTorPanelConfig welcomeTorPanelConfig = new FirstrunTorPanelConfig(FirstrunPanel.class.getName(), R.string.firstrun_welcome_tab_title, R.drawable.figure_welcome, R.string.firstrun_welcome_title, R.string.firstrun_welcome_message, R.string.firstrun_welcome_next);
+ public static final FirstrunTorPanelConfig privacyPanelConfig = new FirstrunTorPanelConfig(FirstrunPanel.class.getName(), R.string.firstrun_privacy_tab_title, R.drawable.figure_privacy, R.string.firstrun_privacy_title, R.string.firstrun_privacy_message, R.string.firstrun_privacy_next);
+ public static final FirstrunTorPanelConfig torNetworkPanelConfig = new FirstrunTorPanelConfig(FirstrunPanel.class.getName(), R.string.firstrun_tornetwork_tab_title, R.drawable.figure_network, R.string.firstrun_tornetwork_title, R.string.firstrun_tornetwork_message, R.string.firstrun_tornetwork_next);
+ public static final FirstrunTorPanelConfig secSettingsPanelConfig = new FirstrunTorPanelConfig(FirstrunPanel.class.getName(), R.string.firstrun_secsettings_tab_title, R.drawable.figure_security, R.string.firstrun_secsettings_title, R.string.firstrun_secsettings_message, R.string.firstrun_secsettings_next);
+ public static final FirstrunTorPanelConfig tipsPanelConfig = new FirstrunTorPanelConfig(FirstrunPanel.class.getName(), R.string.firstrun_tips_tab_title, R.drawable.figure_experience, R.string.firstrun_tips_title, R.string.firstrun_tips_message, R.string.firstrun_tips_next);
+ public static final FirstrunTorPanelConfig onionServicesPanelConfig = new FirstrunTorPanelConfig(LastPanel.class.getName(), R.string.firstrun_onionservices_tab_title, R.drawable.figure_onion, R.string.firstrun_onionservices_title, R.string.firstrun_onionservices_message, R.string.firstrun_onionservices_next);
+ }
+}
diff --git a/mobile/android/base/java/org/mozilla/gecko/firstrun/LastPanel.java b/mobile/android/base/java/org/mozilla/gecko/firstrun/LastPanel.java
index 54d99a3ceeda..55e262eea476 100644
--- a/mobile/android/base/java/org/mozilla/gecko/firstrun/LastPanel.java
+++ b/mobile/android/base/java/org/mozilla/gecko/firstrun/LastPanel.java
@@ -7,6 +7,7 @@ package org.mozilla.gecko.firstrun;
import android.graphics.Bitmap;
import android.os.Bundle;
+import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -14,8 +15,6 @@ import android.widget.ImageView;
import android.widget.TextView;
import org.mozilla.gecko.R;
-import org.mozilla.gecko.Telemetry;
-import org.mozilla.gecko.TelemetryContract;
public class LastPanel extends FirstrunPanel {
@Override
@@ -26,10 +25,11 @@ public class LastPanel extends FirstrunPanel {
final int image = args.getInt(FirstrunPagerConfig.KEY_IMAGE);
final String message = args.getString(FirstrunPagerConfig.KEY_MESSAGE);
final String subtext = args.getString(FirstrunPagerConfig.KEY_SUBTEXT);
+ final String ctatext = args.getString(FirstrunPagerConfig.KEY_CTATEXT);
((ImageView) root.findViewById(R.id.firstrun_image)).setImageDrawable(getResources().getDrawable(image));
((TextView) root.findViewById(R.id.firstrun_subtext)).setText(subtext);
- ((TextView) root.findViewById(R.id.firstrun_link)).setText(R.string.firstrun_welcome_button_browser);
+ ((TextView) root.findViewById(R.id.firstrun_link)).setText(ctatext);
final TextView messageView = root.findViewById(R.id.firstrun_text);
if (NO_MESSAGE.equals(message)) {
@@ -42,7 +42,6 @@ public class LastPanel extends FirstrunPanel {
root.findViewById(R.id.firstrun_link).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- Telemetry.sendUIEvent(TelemetryContract.Event.ACTION, TelemetryContract.Method.BUTTON, "firstrun-next");
close();
}
});
diff --git a/mobile/android/base/locales/en-US/android_strings.dtd b/mobile/android/base/locales/en-US/android_strings.dtd
index 643818d2bc7a..0e67ce1ce628 100644
--- a/mobile/android/base/locales/en-US/android_strings.dtd
+++ b/mobile/android/base/locales/en-US/android_strings.dtd
@@ -8,7 +8,7 @@
<!ENTITY firstrun_urlbar_subtext2 "A modern mobile browser from Mozilla, the non-profit committed to a free and open web.">
<!ENTITY newfirstrun_urlbar_subtext "Fast, private, and on your side.">
<!ENTITY firstrun_panel_title_privacy "Privacy">
-<!ENTITY firstrun_privacy_message "Browse like no one\'s watching">
+<!--!ENTITY firstrun_privacy_message "Browse like no one\'s watching"-->
<!ENTITY firstrun_privacy_subtext "Private Browsing with Tracking Protection blocks trackers while you browse and won’t remember your history when you finish browsing.">
<!ENTITY newfirstrun_privacy_subtext "Private browsing blocks ad trackers that follow you online.">
<!ENTITY firstrun_panel_title_customize "Customize">
diff --git a/mobile/android/base/locales/en-US/torbrowser_strings.dtd b/mobile/android/base/locales/en-US/torbrowser_strings.dtd
index b43134a0260b..f5a2ad2cd7fd 100644
--- a/mobile/android/base/locales/en-US/torbrowser_strings.dtd
+++ b/mobile/android/base/locales/en-US/torbrowser_strings.dtd
@@ -4,4 +4,30 @@
<!ENTITY firstrun_urlbar_subtext2 "A modern mobile browser from The Tor Project, the non-profit committed to a free and open web.">
+<!-- Location note: Tor First run messages -->
+<!ENTITY firstrun_welcome_tab_title "Welcome">
+<!ENTITY firstrun_welcome_title "You\'re ready.">
+<!ENTITY firstrun_welcome_message "Tor Browser offers the highest standard of privacy and security while browsing the web. You\'re now protected against tracking, surveillance, and censorship. This quick onboarding will show you how.">
+<!ENTITY firstrun_welcome_next "Start now">
+<!ENTITY firstrun_privacy_tab_title "Privacy">
+<!ENTITY firstrun_privacy_title "Snub trackers and snoopers.">
+<!ENTITY firstrun_privacy_message "Tor Browser isolates cookies and deletes your browser history after your session. These modifications ensure your privacy and security are protected in the browser. Click ‘Tor Network’ to learn how we protect you on the network level.">
+<!ENTITY firstrun_privacy_next "Go to Tor Network">
+<!ENTITY firstrun_tornetwork_tab_title "Tor Network">
+<!ENTITY firstrun_tornetwork_title "Travel a decentralized network.">
+<!ENTITY firstrun_tornetwork_message "Tor Browser connects you to the Tor network run by thousands of volunteers around the world. Unlike a VPN, there\'s no one point of failure or centralized entity you need to trust in order to enjoy the internet privately.">
+<!ENTITY firstrun_tornetwork_next "Next">
+<!ENTITY firstrun_secsettings_tab_title "Security">
+<!ENTITY firstrun_secsettings_title "Choose your experience.">
+<!ENTITY firstrun_secsettings_message "We also provide you with additional settings for bumping up your browser security. Our Security Settings allow you to block elements that could be used to attack your computer.">
+<!ENTITY firstrun_secsettings_next "Next">
+<!ENTITY firstrun_tips_tab_title "Tips">
+<!ENTITY firstrun_tips_title "Experience Tips.">
+<!ENTITY firstrun_tips_message "With all the security and privacy features provided by Tor, your experience while browsing the internet may be a little different. Things may be a bit slower and depending on your security level, some elements may not work or load. You may also be asked to prove you are a human and not a robot.">
+<!ENTITY firstrun_tips_next "Next">
+<!ENTITY firstrun_onionservices_tab_title "Onions">
+<!ENTITY firstrun_onionservices_title "Onion Services.">
+<!ENTITY firstrun_onionservices_message "Onion services are sites that end with a .onion that provide extra protections to publishers and visitors, including added safeguards against censorship. Onion services allow anyone to provide content and services anonymously.">
+<!ENTITY firstrun_onionservices_next "Go to explore">
+
<!ENTITY sync_not_supported "Sync is not currently supported in Tor Browser on Android">
diff --git a/mobile/android/base/strings.xml.in b/mobile/android/base/strings.xml.in
index 5453bed65e71..546dc31eb9c1 100644
--- a/mobile/android/base/strings.xml.in
+++ b/mobile/android/base/strings.xml.in
@@ -34,7 +34,7 @@
<string name="firstrun_urlbar_subtext">&firstrun_urlbar_subtext2;</string>
<string name="newfirstrun_urlbar_subtext">&newfirstrun_urlbar_subtext;</string>
<string name="firstrun_panel_title_privacy">&firstrun_panel_title_privacy;</string>
- <string name="firstrun_privacy_message">&firstrun_privacy_message;</string>
+ <!--string name="firstrun_privacy_message">&firstrun_privacy_message;</string-->
<string name="firstrun_privacy_subtext">&firstrun_privacy_subtext;</string>
<string name="newfirstrun_privacy_subtext">&newfirstrun_privacy_subtext;</string>
<string name="firstrun_panel_title_customize">&firstrun_panel_title_customize;</string>
@@ -56,6 +56,36 @@
<string name="sync_not_supported">&sync_not_supported;</string>
+ <string name="firstrun_welcome_tab_title">&firstrun_welcome_tab_title;</string>
+ <string name="firstrun_welcome_title">&firstrun_welcome_title;</string>
+ <string name="firstrun_welcome_message">&firstrun_welcome_message;</string>
+ <string name="firstrun_welcome_next">&firstrun_welcome_next;</string>
+
+ <string name="firstrun_privacy_tab_title">&firstrun_privacy_tab_title;</string>
+ <string name="firstrun_privacy_title">&firstrun_privacy_title;</string>
+ <string name="firstrun_privacy_message">&firstrun_privacy_message;</string>
+ <string name="firstrun_privacy_next">&firstrun_privacy_next;</string>
+
+ <string name="firstrun_tornetwork_tab_title">&firstrun_tornetwork_tab_title;</string>
+ <string name="firstrun_tornetwork_title">&firstrun_tornetwork_title;</string>
+ <string name="firstrun_tornetwork_message">&firstrun_tornetwork_message;</string>
+ <string name="firstrun_tornetwork_next">&firstrun_tornetwork_next;</string>
+
+ <string name="firstrun_secsettings_tab_title">&firstrun_secsettings_tab_title;</string>
+ <string name="firstrun_secsettings_title">&firstrun_secsettings_title;</string>
+ <string name="firstrun_secsettings_message">&firstrun_secsettings_message;</string>
+ <string name="firstrun_secsettings_next">&firstrun_secsettings_next;</string>
+
+ <string name="firstrun_tips_tab_title">&firstrun_tips_tab_title;</string>
+ <string name="firstrun_tips_title">&firstrun_tips_title;</string>
+ <string name="firstrun_tips_message">&firstrun_tips_message;</string>
+ <string name="firstrun_tips_next">&firstrun_tips_next;</string>
+
+ <string name="firstrun_onionservices_tab_title">&firstrun_onionservices_tab_title;</string>
+ <string name="firstrun_onionservices_title">&firstrun_onionservices_title;</string>
+ <string name="firstrun_onionservices_message">&firstrun_onionservices_message;</string>
+ <string name="firstrun_onionservices_next">&firstrun_onionservices_next;</string>
+
<string name="bookmarks_title">&bookmarks_title;</string>
<string name="history_title">&history_title;</string>
diff --git a/mobile/android/branding/alpha/res/drawable-nodpi/figure_experience.png b/mobile/android/branding/alpha/res/drawable-nodpi/figure_experience.png
new file mode 100644
index 000000000000..2eeeb1ccbd7d
Binary files /dev/null and b/mobile/android/branding/alpha/res/drawable-nodpi/figure_experience.png differ
diff --git a/mobile/android/branding/alpha/res/drawable-nodpi/figure_network.png b/mobile/android/branding/alpha/res/drawable-nodpi/figure_network.png
new file mode 100644
index 000000000000..62bf5e2d144d
Binary files /dev/null and b/mobile/android/branding/alpha/res/drawable-nodpi/figure_network.png differ
diff --git a/mobile/android/branding/alpha/res/drawable-nodpi/figure_onion.png b/mobile/android/branding/alpha/res/drawable-nodpi/figure_onion.png
new file mode 100644
index 000000000000..cbd8236f82e9
Binary files /dev/null and b/mobile/android/branding/alpha/res/drawable-nodpi/figure_onion.png differ
diff --git a/mobile/android/branding/alpha/res/drawable-nodpi/figure_privacy.png b/mobile/android/branding/alpha/res/drawable-nodpi/figure_privacy.png
new file mode 100644
index 000000000000..d9d56229aa8a
Binary files /dev/null and b/mobile/android/branding/alpha/res/drawable-nodpi/figure_privacy.png differ
diff --git a/mobile/android/branding/alpha/res/drawable-nodpi/figure_security.png b/mobile/android/branding/alpha/res/drawable-nodpi/figure_security.png
new file mode 100644
index 000000000000..0a0d47f75370
Binary files /dev/null and b/mobile/android/branding/alpha/res/drawable-nodpi/figure_security.png differ
diff --git a/mobile/android/branding/alpha/res/drawable-nodpi/figure_welcome.png b/mobile/android/branding/alpha/res/drawable-nodpi/figure_welcome.png
new file mode 100644
index 000000000000..274dea5c31a6
Binary files /dev/null and b/mobile/android/branding/alpha/res/drawable-nodpi/figure_welcome.png differ
diff --git a/mobile/android/branding/alpha/res/drawable-nodpi/home_tab_menu_strip_tor.9.png b/mobile/android/branding/alpha/res/drawable-nodpi/home_tab_menu_strip_tor.9.png
new file mode 100644
index 000000000000..a92420d11b8e
Binary files /dev/null and b/mobile/android/branding/alpha/res/drawable-nodpi/home_tab_menu_strip_tor.9.png differ
diff --git a/mobile/android/branding/nightly/res/drawable-nodpi/figure_experience.png b/mobile/android/branding/nightly/res/drawable-nodpi/figure_experience.png
new file mode 100644
index 000000000000..2eeeb1ccbd7d
Binary files /dev/null and b/mobile/android/branding/nightly/res/drawable-nodpi/figure_experience.png differ
diff --git a/mobile/android/branding/nightly/res/drawable-nodpi/figure_network.png b/mobile/android/branding/nightly/res/drawable-nodpi/figure_network.png
new file mode 100644
index 000000000000..62bf5e2d144d
Binary files /dev/null and b/mobile/android/branding/nightly/res/drawable-nodpi/figure_network.png differ
diff --git a/mobile/android/branding/nightly/res/drawable-nodpi/figure_onion.png b/mobile/android/branding/nightly/res/drawable-nodpi/figure_onion.png
new file mode 100644
index 000000000000..cbd8236f82e9
Binary files /dev/null and b/mobile/android/branding/nightly/res/drawable-nodpi/figure_onion.png differ
diff --git a/mobile/android/branding/nightly/res/drawable-nodpi/figure_privacy.png b/mobile/android/branding/nightly/res/drawable-nodpi/figure_privacy.png
new file mode 100644
index 000000000000..d9d56229aa8a
Binary files /dev/null and b/mobile/android/branding/nightly/res/drawable-nodpi/figure_privacy.png differ
diff --git a/mobile/android/branding/nightly/res/drawable-nodpi/figure_security.png b/mobile/android/branding/nightly/res/drawable-nodpi/figure_security.png
new file mode 100644
index 000000000000..0a0d47f75370
Binary files /dev/null and b/mobile/android/branding/nightly/res/drawable-nodpi/figure_security.png differ
diff --git a/mobile/android/branding/nightly/res/drawable-nodpi/figure_welcome.png b/mobile/android/branding/nightly/res/drawable-nodpi/figure_welcome.png
new file mode 100644
index 000000000000..274dea5c31a6
Binary files /dev/null and b/mobile/android/branding/nightly/res/drawable-nodpi/figure_welcome.png differ
diff --git a/mobile/android/branding/nightly/res/drawable-nodpi/home_tab_menu_strip_tor.9.png b/mobile/android/branding/nightly/res/drawable-nodpi/home_tab_menu_strip_tor.9.png
new file mode 100644
index 000000000000..a92420d11b8e
Binary files /dev/null and b/mobile/android/branding/nightly/res/drawable-nodpi/home_tab_menu_strip_tor.9.png differ
diff --git a/mobile/android/branding/official/res/drawable-nodpi/figure_experience.png b/mobile/android/branding/official/res/drawable-nodpi/figure_experience.png
new file mode 100644
index 000000000000..2eeeb1ccbd7d
Binary files /dev/null and b/mobile/android/branding/official/res/drawable-nodpi/figure_experience.png differ
diff --git a/mobile/android/branding/official/res/drawable-nodpi/figure_network.png b/mobile/android/branding/official/res/drawable-nodpi/figure_network.png
new file mode 100644
index 000000000000..62bf5e2d144d
Binary files /dev/null and b/mobile/android/branding/official/res/drawable-nodpi/figure_network.png differ
diff --git a/mobile/android/branding/official/res/drawable-nodpi/figure_onion.png b/mobile/android/branding/official/res/drawable-nodpi/figure_onion.png
new file mode 100644
index 000000000000..cbd8236f82e9
Binary files /dev/null and b/mobile/android/branding/official/res/drawable-nodpi/figure_onion.png differ
diff --git a/mobile/android/branding/official/res/drawable-nodpi/figure_privacy.png b/mobile/android/branding/official/res/drawable-nodpi/figure_privacy.png
new file mode 100644
index 000000000000..d9d56229aa8a
Binary files /dev/null and b/mobile/android/branding/official/res/drawable-nodpi/figure_privacy.png differ
diff --git a/mobile/android/branding/official/res/drawable-nodpi/figure_security.png b/mobile/android/branding/official/res/drawable-nodpi/figure_security.png
new file mode 100644
index 000000000000..0a0d47f75370
Binary files /dev/null and b/mobile/android/branding/official/res/drawable-nodpi/figure_security.png differ
diff --git a/mobile/android/branding/official/res/drawable-nodpi/figure_welcome.png b/mobile/android/branding/official/res/drawable-nodpi/figure_welcome.png
new file mode 100644
index 000000000000..274dea5c31a6
Binary files /dev/null and b/mobile/android/branding/official/res/drawable-nodpi/figure_welcome.png differ
diff --git a/mobile/android/branding/official/res/drawable-nodpi/home_tab_menu_strip_tor.9.png b/mobile/android/branding/official/res/drawable-nodpi/home_tab_menu_strip_tor.9.png
new file mode 100644
index 000000000000..a92420d11b8e
Binary files /dev/null and b/mobile/android/branding/official/res/drawable-nodpi/home_tab_menu_strip_tor.9.png differ
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 27016 - Create proxy connection during image download
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit 9ccc623f7ecb6e1031a2e43dad0f71ea5c6d8119
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Thu Aug 2 21:49:05 2018 +0000
Bug 27016 - Create proxy connection during image download
Picasso, the image retrieval library used by Fennec, ignores the network
proxy configuration. We override the openConnection() method and create
the connection using the configured proxy.
---
.../java/org/mozilla/gecko/home/ImageLoader.java | 22 ++++++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/mobile/android/base/java/org/mozilla/gecko/home/ImageLoader.java b/mobile/android/base/java/org/mozilla/gecko/home/ImageLoader.java
index 2bbd82a8df77..cbbe7babbba4 100644
--- a/mobile/android/base/java/org/mozilla/gecko/home/ImageLoader.java
+++ b/mobile/android/base/java/org/mozilla/gecko/home/ImageLoader.java
@@ -15,9 +15,14 @@ import com.squareup.picasso.Picasso;
import com.squareup.picasso.Downloader.Response;
import com.squareup.picasso.UrlConnectionDownloader;
+import org.mozilla.gecko.util.ProxySelector;
+
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
+import java.net.HttpURLConnection;
+import java.net.URI;
+import java.net.URISyntaxException;
import java.util.EnumSet;
import java.util.Set;
@@ -84,6 +89,23 @@ public class ImageLoader {
this.distribution = distribution;
}
+ @Override
+ protected HttpURLConnection openConnection(Uri path) throws IOException {
+ try {
+ // This is annoying, but |path| is an android.net.Uri and
+ // openConnectionWithProxy() accepts a java.net.URI
+ return (HttpURLConnection)ProxySelector.openConnectionWithProxy(
+ new URI(
+ path.getScheme(), path.getHost(), path.getPath(),
+ path.getEncodedFragment()));
+ } catch (URISyntaxException ex) {
+ // And android.net.Uri is more lenient than java.net.URI.
+ // Uri does not catch syntax errors which URI may catch.
+ // We'll re-throw this as an IOException
+ throw new IOException(ex.getMessage());
+ }
+ }
+
private Density getDensity(float factor) {
final DisplayMetrics dm = context.getResources().getDisplayMetrics();
final float densityDpi = dm.densityDpi * factor;
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 25906 - Imply false both Adjust and Leanplum configure options
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit 9c37ba57b2167f6902dd4464bf174ba63e21b013
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Fri Aug 3 18:32:46 2018 +0000
Bug 25906 - Imply false both Adjust and Leanplum configure options
These configure options should be false already, because we set
|--without-google-play-services| in .mozconfig-android. But, this
is another layer of certainty.
---
mobile/android/torbrowser.configure | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/mobile/android/torbrowser.configure b/mobile/android/torbrowser.configure
index ac30fde888a6..8f3462982dc7 100644
--- a/mobile/android/torbrowser.configure
+++ b/mobile/android/torbrowser.configure
@@ -44,3 +44,8 @@ imply_option('MOZ_SERVICES_HEALTHREPORT', False)
imply_option('MOZ_ANDROID_NETWORK_STATE', False);
imply_option('MOZ_ANDROID_LOCATION', False);
+
+# Exclude Leanplum MMA (marketing automation and user behavior)
+imply_option('MOZ_ANDROID_MMA', False);
+# Exclude Adjust (installation tracking)
+imply_option('MOZ_INSTALL_TRACKING', False);
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Orfox: disable screenshots and prevent page from being in "recent apps"
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit bed3d6ecd21cb55c4acbad2b8735bb692e5a8b68
Author: Hans-Christoph Steiner <hans(a)eds.org>
Date: Sat Nov 21 00:10:06 2015 +0100
Orfox: disable screenshots and prevent page from being in "recent apps"
Signed-off-by: Amogh Pradeep <amoghbl1(a)gmail.com>
---
mobile/android/base/java/org/mozilla/gecko/GeckoApp.java | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java b/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java
index 246ce55d0d23..9143536400e3 100644
--- a/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java
+++ b/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java
@@ -84,6 +84,7 @@ import android.view.MotionEvent;
import android.view.View;
import android.view.ViewTreeObserver;
import android.view.Window;
+import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
@@ -1099,6 +1100,9 @@ public abstract class GeckoApp extends GeckoActivity
super.onCreate(savedInstanceState);
+ // disable screenshots and pic in "recent apps"
+ getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
+
setContentView(getLayout());
// Set up Gecko layout.
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 28051 - Integrate Orbot and add dependencies
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit a627afad7b69ff3757fb791921d78281ad94c68b
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Wed Nov 14 17:36:53 2018 +0000
Bug 28051 - Integrate Orbot and add dependencies
Also:
Bug 28051 - Launch Orbot if it isn't running in the background
Bug 28329 - Part 2. Implement checking if the Tor service is running
Bug 28329 - Part 3. Remove OrbotActivity dependency
Bug 28051 - Stop the background service when we're quitting
If the user swips away the app, then initiate quitting as if the user
selected Quit from the menu.
---
build.gradle | 4 +
mobile/android/app/build.gradle | 13 ++
mobile/android/base/AndroidManifest.xml.in | 8 ++
.../base/java/org/mozilla/gecko/BrowserApp.java | 142 +++++++++++++++++++++
.../base/java/org/mozilla/gecko/GeckoApp.java | 10 ++
.../java/org/mozilla/gecko/GeckoApplication.java | 5 +
mobile/android/config/proguard/proguard.cfg | 14 ++
7 files changed, 196 insertions(+)
diff --git a/build.gradle b/build.gradle
index 8b91888b5d7f..95dfc2ed1323 100644
--- a/build.gradle
+++ b/build.gradle
@@ -32,6 +32,10 @@ allprojects {
url repository
}
}
+ // These are needed for Orbot's dependencies
+ maven { url "https://raw.githubusercontent.com/guardianproject/gpmaven/master" }
+ maven { url 'https://jitpack.io' }
+ jcenter()
}
task downloadDependencies() {
diff --git a/mobile/android/app/build.gradle b/mobile/android/app/build.gradle
index c6a0bc45d56f..be0ccdb1b13f 100644
--- a/mobile/android/app/build.gradle
+++ b/mobile/android/app/build.gradle
@@ -235,6 +235,14 @@ dependencies {
// to generate the `Application` class or fork the file on disk.
implementation "com.android.support:multidex:1.0.3"
+ // tor-android-services
+ implementation files('service-release.aar')
+ implementation files('jsocksAndroid-release.aar')
+
+ // Tor_Onion_Proxy_Library
+ implementation files('universal-0.0.3.jar')
+ implementation files('android-release.aar')
+
if (mozconfig.substs.MOZ_NATIVE_DEVICES) {
implementation "com.android.support:mediarouter-v7:$support_library_version"
implementation "com.google.android.gms:play-services-basement:$google_play_services_version"
@@ -277,6 +285,11 @@ dependencies {
// Including the Robotium JAR directly can cause issues with dexing.
androidTestImplementation 'com.jayway.android.robotium:robotium-solo:5.5.4'
+
+ // tor-android-service Dependencies
+ implementation 'net.freehaven.tor.control:jtorctl:0.2'
+ implementation 'org.slf4j:slf4j-api:1.7.25'
+ implementation 'org.slf4j:slf4j-android:1.7.25'
}
// TODO: (bug 1261486): This impl is not robust -
diff --git a/mobile/android/base/AndroidManifest.xml.in b/mobile/android/base/AndroidManifest.xml.in
index 48809195dc57..c60210e0332c 100644
--- a/mobile/android/base/AndroidManifest.xml.in
+++ b/mobile/android/base/AndroidManifest.xml.in
@@ -572,5 +572,13 @@
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
#endif
+ <!-- Define Orbotservice's TorService -->
+ <service
+ android:name="org.torproject.android.service.TorService"
+ android:enabled="true"
+ android:exported="false"
+ android:stopWithTask="true">
+ </service>
+
</application>
</manifest>
diff --git a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
index 4123acca9bbe..e0ef8e9c43d9 100644
--- a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
+++ b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
@@ -10,11 +10,13 @@ import android.annotation.TargetApi;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.DownloadManager;
+import android.content.BroadcastReceiver;
import android.content.ContentProviderClient;
import android.content.ContentResolver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
+import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
@@ -40,6 +42,8 @@ import android.support.annotation.StringRes;
import android.support.design.widget.Snackbar;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
+import android.support.v4.app.NotificationCompat;
+import android.support.v4.content.LocalBroadcastManager;
import android.support.v4.content.res.ResourcesCompat;
import android.support.v4.view.MenuItemCompat;
import android.text.TextUtils;
@@ -176,6 +180,9 @@ import org.mozilla.geckoview.DynamicToolbarAnimator;
import org.mozilla.geckoview.DynamicToolbarAnimator.PinReason;
import org.mozilla.geckoview.GeckoSession;
+import org.torproject.android.service.TorService;
+import org.torproject.android.service.TorServiceConstants;
+
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
@@ -251,6 +258,8 @@ public class BrowserApp extends GeckoApp
private HomeScreen mHomeScreen;
private TabsPanel mTabsPanel;
+ private boolean mTorNeedsStart = true;
+
private boolean showSplashScreen = false;
private SplashScreen splashScreen;
/**
@@ -1013,6 +1022,130 @@ public class BrowserApp extends GeckoApp
.buildAndShow();
}
+ /**
+ * Send the service a request for the current status.
+ * The response is sent as a broadcast. Capture that in
+ * receiveTorIsStartedAsync().
+ */
+ private void requestTorIsStartedAsync() {
+ Intent torServiceStatus = new Intent(this, TorService.class);
+ torServiceStatus.setAction(TorServiceConstants.ACTION_STATUS);
+ startService(torServiceStatus);
+ }
+
+ private BroadcastReceiver mLocalBroadcastReceiver;
+ private Boolean mTorStatus;
+
+ /**
+ * Setup the status receiver for broadcasts from the service.
+ * The response is sent as a broadcast. Create a background thread
+ * for receiving/handling the broadcast.
+ *
+ * This method is coupled with receiveTorIsStartedAsync(). They should
+ * be used together.
+ */
+ private BroadcastReceiver setupReceiveTorIsStartedAsync() {
+
+ // Create a thread specifically for defining the BroadcastReceiver
+ new Thread(new Runnable() {
+
+ @Override
+ public void run() {
+ mLocalBroadcastReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (action == null) {
+ return;
+ }
+
+ // We only want ACTION_STATUS messages
+ if (!action.equals(TorServiceConstants.ACTION_STATUS)) {
+ return;
+ }
+
+ // The current status has the EXTRA_STATUS key
+ String currentStatus =
+ intent.getStringExtra(TorServiceConstants.EXTRA_STATUS);
+
+ try {
+ synchronized (mTorStatus) {
+ mTorStatus = (currentStatus == TorServiceConstants.STATUS_ON);
+ mTorStatus.notify();
+ }
+ } catch (IllegalMonitorStateException e) {
+ // |synchronized| should prevent this
+ }
+ }
+ };
+
+ LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(BrowserApp.this);
+ lbm.registerReceiver(mLocalBroadcastReceiver,
+ new IntentFilter(TorServiceConstants.ACTION_STATUS));
+
+ }
+ }).start();
+
+ return mLocalBroadcastReceiver;
+ }
+
+ /**
+ * Receive the current status from the service.
+ * The response is sent as a broadcast. If it is not received within
+ * 1 second, then return false.
+ *
+ * This method is coupled with setupReceiveTorIsStartedAsync(). They
+ * should be used together.
+ */
+ private boolean receiveTorIsStartedAsync(BroadcastReceiver mLocalBroadcastReceiver, Boolean torStatus) {
+ // Wait until we're notified from the above thread, or we're
+ // interrupted by the timeout.
+ try {
+ // One thousand milliseconds = one second
+ final long oneSecTimeout = Math.round(Math.pow(10, 3));
+ synchronized (torStatus) {
+ // We wake from wait() because we reached the one second
+ // timeout, the BroadcastReceiver notified us, or we received
+ // a spurious wakeup. For all three cases, we can accept the
+ // current value of torStatus.
+ torStatus.wait(oneSecTimeout);
+ }
+ } catch (InterruptedException e) {
+ // ignore.
+ } catch (IllegalArgumentException e) {
+ // oneSecTimeout should never be negative
+ } catch (IllegalMonitorStateException e) {
+ // |synchronized| should take care of this
+ }
+
+ // Unregister the receiver
+ LocalBroadcastManager.getInstance(this).unregisterReceiver(mLocalBroadcastReceiver);
+
+ return torStatus;
+ }
+
+ /**
+ * Receive the current Tor status.
+ *
+ * Send a request for the current status and receive the response.
+ * Returns true if Tor is running, false otherwise.
+ *
+ * mTorStatus provides synchronization across threads.
+ */
+ private boolean checkTorIsStarted() {
+ // When tor is started, true. Otherwise, false
+ mTorStatus = false;
+ BroadcastReceiver br = setupReceiveTorIsStartedAsync();
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ requestTorIsStartedAsync();
+ }
+ }).start();
+
+ return receiveTorIsStartedAsync(br, mTorStatus);
+ }
+
private Class<?> getMediaPlayerManager() {
if (AppConstants.MOZ_MEDIA_PLAYER) {
try {
@@ -1124,6 +1257,13 @@ public class BrowserApp extends GeckoApp
for (BrowserAppDelegate delegate : delegates) {
delegate.onResume(this);
}
+
+ // isInAutomation is overloaded with isTorBrowser(), but here we actually
+ // need to know if we are in automation.
+ final SafeIntent intent = new SafeIntent(getIntent());
+ if (!IntentUtils.getIsInAutomationFromEnvironment(intent)) {
+ mTorNeedsStart = !checkTorIsStarted();
+ }
}
@Override
@@ -1641,6 +1781,8 @@ public class BrowserApp extends GeckoApp
MmaDelegate.flushResources(this);
+ mTorNeedsStart = true;
+
super.onDestroy();
}
diff --git a/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java b/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java
index c988923e960f..e01318dab422 100644
--- a/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java
+++ b/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java
@@ -100,6 +100,8 @@ import org.mozilla.geckoview.GeckoViewBridge;
// SafeReceiver excluded at compile-time
//import org.mozilla.mozstumbler.service.mainthread.SafeReceiver;
+import org.torproject.android.service.TorService;
+
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
@@ -623,6 +625,9 @@ public abstract class GeckoApp extends GeckoActivity
EventDispatcher.getInstance().dispatch("Browser:Quit", res);
+ Intent torService = new Intent(this, TorService.class);
+ stopService(torService);
+
// We don't call shutdown here because this creates a race condition which
// can cause the clearing of private data to fail. Instead, we shut down the
// UI only after we're done sanitizing.
@@ -2236,6 +2241,11 @@ public abstract class GeckoApp extends GeckoActivity
GeckoApplication.shutdown(!mRestartOnShutdown ? null : new Intent(
Intent.ACTION_MAIN, /* uri */ null, getApplicationContext(), getClass()));
}
+
+ if (isFinishing()) {
+ Log.i(LOGTAG, "onDestroy() is finishing.");
+ quitAndClear();
+ }
}
public void showSDKVersionError() {
diff --git a/mobile/android/base/java/org/mozilla/gecko/GeckoApplication.java b/mobile/android/base/java/org/mozilla/gecko/GeckoApplication.java
index dbd57d72ebc8..26e06b55ecfc 100644
--- a/mobile/android/base/java/org/mozilla/gecko/GeckoApplication.java
+++ b/mobile/android/base/java/org/mozilla/gecko/GeckoApplication.java
@@ -74,6 +74,8 @@ import java.lang.reflect.Method;
import java.net.URL;
import java.util.UUID;
+import org.torproject.android.service.util.Prefs;
+
public class GeckoApplication extends Application
implements HapticFeedbackDelegate,
SharedPreferences.OnSharedPreferenceChangeListener {
@@ -402,6 +404,9 @@ public class GeckoApplication extends Application
"Profile:Create",
null);
+ // Give Orbot the base Context
+ Prefs.setContext(context);
+
super.onCreate();
}
diff --git a/mobile/android/config/proguard/proguard.cfg b/mobile/android/config/proguard/proguard.cfg
index 175ec85518d9..711e66c4bfc6 100644
--- a/mobile/android/config/proguard/proguard.cfg
+++ b/mobile/android/config/proguard/proguard.cfg
@@ -170,6 +170,20 @@
-dontwarn java.lang.management.**
-dontwarn javax.management.**
+# XXX 68rebase Are these still needed?
+# From https://github.com/square/okhttp/blob/master/okhttp/src/main/resources/META…
+# JSR 305 annotations are for embedding nullability information.
+-dontwarn javax.annotation.**
+
+# A resource is loaded with a relative path so the package of this class must be preserved.
+-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase
+
+# Animal Sniffer compileOnly dependency to ensure APIs are compatible with older versions of Java.
+-dontwarn org.codehaus.mojo.animal_sniffer.*
+
+# OkHttp platform used only on JVM and when Conscrypt dependency is available.
+-dontwarn okhttp3.internal.platform.ConscryptPlatform
+
-include "adjust-keeps.cfg"
-include "leakcanary-keeps.cfg"
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 28329 - Part 1. Add new Tor resources
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit 1bd14a093ba7b397fe737941b6e75f0940030535
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Tue Feb 19 22:45:46 2019 +0000
Bug 28329 - Part 1. Add new Tor resources
---
.../main/res/color/tor_bridges_enabled_colors.xml | 10 ++++++
.../main/res/color/tor_bridges_select_builtin.xml | 8 +++++
.../res/drawable-nodpi/tor_bootstrap_onion.gif | Bin 0 -> 137518 bytes
.../app/src/main/res/drawable/ic_settings_24px.xml | 36 +++++++++++++++++++++
.../res/drawable/list_section_divider_material.xml | 19 +++++++++++
.../drawable/list_section_divider_mtrl_alpha.9.png | Bin 0 -> 164 bytes
.../app/src/main/res/drawable/rounded_corners.xml | 11 +++++++
.../src/main/res/drawable/tor_spinning_onion.xml | 12 +++++++
mobile/android/app/src/main/res/values/colors.xml | 2 ++
mobile/android/app/src/main/res/xml/separator.xml | 13 ++++++++
.../base/locales/en-US/torbrowser_strings.dtd | 32 ++++++++++++++++++
mobile/android/base/strings.xml.in | 29 +++++++++++++++++
12 files changed, 172 insertions(+)
diff --git a/mobile/android/app/src/main/res/color/tor_bridges_enabled_colors.xml b/mobile/android/app/src/main/res/color/tor_bridges_enabled_colors.xml
new file mode 100644
index 000000000000..a51ffd547c04
--- /dev/null
+++ b/mobile/android/app/src/main/res/color/tor_bridges_enabled_colors.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<!-- Used by the Bridges Enabled switch for correct coloring -->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_checked="true"
+ android:color="@color/tor_bootstrap_background" />
+ <item android:color="#808080" />
+</selector>
diff --git a/mobile/android/app/src/main/res/color/tor_bridges_select_builtin.xml b/mobile/android/app/src/main/res/color/tor_bridges_select_builtin.xml
new file mode 100644
index 000000000000..948ed552d539
--- /dev/null
+++ b/mobile/android/app/src/main/res/color/tor_bridges_select_builtin.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<!-- Used for changing the color of the radio button -->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:color="#808080" />
+</selector>
diff --git a/mobile/android/app/src/main/res/drawable-nodpi/tor_bootstrap_onion.gif b/mobile/android/app/src/main/res/drawable-nodpi/tor_bootstrap_onion.gif
new file mode 100755
index 000000000000..b9478997b5d6
Binary files /dev/null and b/mobile/android/app/src/main/res/drawable-nodpi/tor_bootstrap_onion.gif differ
diff --git a/mobile/android/app/src/main/res/drawable/ic_settings_24px.xml b/mobile/android/app/src/main/res/drawable/ic_settings_24px.xml
new file mode 100644
index 000000000000..c582193aa12d
--- /dev/null
+++ b/mobile/android/app/src/main/res/drawable/ic_settings_24px.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<!--
+ Downloaded from:
+ https://raw.githubusercontent.com/material-components/material-components-a…
+-->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="20"
+ android:viewportHeight="20"
+ tools:ignore="NewApi">
+
+ <path
+ android:pathData="M0,0 L20,0 L20,20 L0,20 L0,0 Z" />
+ <path
+ android:fillColor="?attr/colorControlNormal"
+ android:pathData="M15.95,10.78 C15.98,10.53,16,10.27,16,10 S15.98,9.47,15.94,9.22 L17.63,7.9 C17.78,7.78,17.82,7.56,17.73,7.39 L16.13,4.62 C16.03,4.44,15.82,4.38,15.64,4.44 L13.65,5.24 C13.23,4.92,12.79,4.66,12.3,4.46 L12,2.34 C11.97,2.14,11.8,2,11.6,2 L8.4,2 C8.2,2,8.04,2.14,8.01,2.34 L7.71,4.46 C7.22,4.66,6.77,4.93,6.36,5.24 L4.37,4.44 C4.19,4.37,3.98,4.44,3.88,4.62 L2.28,7.39 C2.18,7.57,2.22,7.78,2.38,7.9 L4.07,9.22 C4.03,9.47,4,9.74,4,10 S4.02,10.53,4.06,10.78 L2.37,12.1 C2.22,12.22,2.18,12.44,2.27,12.61 L3.87,15.38 C3.97,15.56,4.18,15.62,4.36,15.56 L6.35,14.76 C6.77,15.08,7.21,15.34,7.7,15.54 L8,17.66 C8.04,17.86,8.2,18,8.4,18 L11.6,18 C11.8,18,11.97,17.86,11.99,17.66 L12.29,15.54 C12.78,15.34,13.23,15.07,13.64,14.76 L15.63,15.56 C15.81,15.63,16.02,15.56,16.12,15.38 L17.72,12.61 C17.82,12.43,17.78,12.22,17.62,12.1 L15.95,10.78 Z M10,13 C8.35,13,7,11.65,7,10 S8.35,7,10,7 S13,8.35,13,10 S11.65,13,10,13 Z" />
+</vector>
diff --git a/mobile/android/app/src/main/res/drawable/list_section_divider_material.xml b/mobile/android/app/src/main/res/drawable/list_section_divider_material.xml
new file mode 100644
index 000000000000..dd66b88381fa
--- /dev/null
+++ b/mobile/android/app/src/main/res/drawable/list_section_divider_material.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- Based on:
+ https://android.googlesource.com/platform/frameworks/base/+/refs/heads/pie-…
+-->
+<nine-patch xmlns:android="http://schemas.android.com/apk/res/android"
+ android:src="@drawable/list_section_divider_mtrl_alpha"
+ android:tint="#ff000000"
+ android:alpha="0.12" />
diff --git a/mobile/android/app/src/main/res/drawable/list_section_divider_mtrl_alpha.9.png b/mobile/android/app/src/main/res/drawable/list_section_divider_mtrl_alpha.9.png
new file mode 100644
index 000000000000..12d8b2f4aa00
Binary files /dev/null and b/mobile/android/app/src/main/res/drawable/list_section_divider_mtrl_alpha.9.png differ
diff --git a/mobile/android/app/src/main/res/drawable/rounded_corners.xml b/mobile/android/app/src/main/res/drawable/rounded_corners.xml
new file mode 100644
index 000000000000..670da2fed66e
--- /dev/null
+++ b/mobile/android/app/src/main/res/drawable/rounded_corners.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<!-- Used for rounding the corners of a button -->
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="rectangle">
+ <solid android:color="#FFFFFF" />
+ <corners android:radius="5dp" />
+</shape>
diff --git a/mobile/android/app/src/main/res/drawable/tor_spinning_onion.xml b/mobile/android/app/src/main/res/drawable/tor_spinning_onion.xml
new file mode 100644
index 000000000000..e0909237886c
--- /dev/null
+++ b/mobile/android/app/src/main/res/drawable/tor_spinning_onion.xml
@@ -0,0 +1,12 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<vector android:height="24dp" android:viewportHeight="289"
+ android:viewportWidth="249" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
+ <path android:fillColor="#FF000000" android:pathData="M100.02,44.97C96.2,31.15 83.92,21.59 69.91,21.51V0c16.52,0 32.07,7.97 41.98,21.51V0h20.99v21.51C142.78,7.97 158.33,0 174.85,0v21.51c-14.01,0.08 -26.29,9.63 -30.12,23.45C203.49,54.97 41.26,54.97 100.02,44.97z"/>
+ <path android:fillColor="#FF000000" android:pathData="M123.92,52.47c-62.22,0 -112.65,50.44 -112.65,112.65c0,62.22 50.44,112.65 112.65,112.65V52.47z"/>
+ <path android:fillColor="#FF000000" android:pathData="M123.92,266.51c56,0 101.39,-45.39 101.39,-101.39c0,-56 -45.39,-101.39 -101.39,-101.39S22.53,109.13 22.53,165.12C22.53,221.12 67.92,266.51 123.92,266.51zM123.92,289.04C55.48,289.04 0,233.56 0,165.12S55.48,41.2 123.92,41.2s123.92,55.48 123.92,123.92S192.36,289.04 123.92,289.04z"/>
+ <path android:fillColor="#FF000000" android:pathData="M124.92,78.78v22.53c34.79,0.54 62.84,28.89 62.84,63.81c0,34.92 -28.04,63.28 -62.84,63.81v22.53c47.24,-0.54 85.37,-38.98 85.37,-86.34C210.29,117.76 172.16,79.32 124.92,78.78z"/>
+ <path android:fillColor="#FF000000" android:pathData="M123.92,116.31v22.53c14.52,0 26.29,11.77 26.29,26.29s-11.77,26.29 -26.29,26.29v22.53c26.96,0 48.82,-21.86 48.82,-48.82C172.74,138.16 150.88,116.31 123.92,116.31z"/>
+</vector>
diff --git a/mobile/android/app/src/main/res/values/colors.xml b/mobile/android/app/src/main/res/values/colors.xml
index f31f0e73198f..a013a5d50afc 100644
--- a/mobile/android/app/src/main/res/values/colors.xml
+++ b/mobile/android/app/src/main/res/values/colors.xml
@@ -154,6 +154,8 @@
<color name="tor_tab_inactive_text">#484848</color>
<color name="tor_tab_active_text">#7D4698</color>
<color name="tor_description_background_text">#FAFAFA</color>
+
+ <color name="tor_bootstrap_background">#420C5D</color>
<!-- Restricted profiles palette -->
<color name="restricted_profile_background_gold">#ffffcb51</color>
diff --git a/mobile/android/app/src/main/res/xml/separator.xml b/mobile/android/app/src/main/res/xml/separator.xml
new file mode 100644
index 000000000000..edd95cd90a3a
--- /dev/null
+++ b/mobile/android/app/src/main/res/xml/separator.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<!-- List item separator -->
+<View xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center_vertical"
+ android:textSize="8sp"
+ android:textStyle="bold"
+ android:background="@drawable/list_section_divider_material"/>
diff --git a/mobile/android/base/locales/en-US/torbrowser_strings.dtd b/mobile/android/base/locales/en-US/torbrowser_strings.dtd
index f5a2ad2cd7fd..f3fba468fc0e 100644
--- a/mobile/android/base/locales/en-US/torbrowser_strings.dtd
+++ b/mobile/android/base/locales/en-US/torbrowser_strings.dtd
@@ -30,4 +30,36 @@
<!ENTITY firstrun_onionservices_message "Onion services are sites that end with a .onion that provide extra protections to publishers and visitors, including added safeguards against censorship. Onion services allow anyone to provide content and services anonymously.">
<!ENTITY firstrun_onionservices_next "Go to explore">
+<!ENTITY tor_bootstrap_swipe_for_logs "Swipe to the left to see Tor logs">
+<!ENTITY tor_bootstrap_connect "Connect">
+<!ENTITY tor_bootstrap_starting_status "We are connecting to the Tor network...">
+
+<!ENTITY pref_tor_network_title "Network">
+<!ENTITY pref_tor_select_a_bridge_title "Select a Bridge">
+<!ENTITY pref_tor_provide_a_bridge_title "Provide a Bridge">
+
+<!ENTITY pref_category_tor_network_summary "Tor Browser connects you to the Tor Network run by thousands of volunteers around the world! Can these options help you?">
+<!ENTITY pref_category_tor_bridge_summary "Bridges are unlisted Tor relays that make it more difficult to block connections into the Tor network. Because of how some countries try to block Tor, certain bridges work in some countries but not others.">
+
+<!ENTITY pref_choice_tor_bridges_enabled_title "Internet is censored here">
+<!ENTITY pref_choice_tor_bridges_enabled_summary "Tap to configure a bridge to connect to Tor">
+
+<!ENTITY pref_tor_bridges_provide_manual_button_title "Provide a Bridge I know">
+<!ENTITY pref_tor_bridges_provide_select_text_title "Select a Bridge">
+<!ENTITY pref_tor_bridges_provide_manual_text_title "Enter Bridge">
+<!ENTITY pref_tor_bridges_provide_manual_summary "Enter the bridge information you received from a trusted source">
+<!ENTITY pref_tor_bridges_provide_manual_address_port_placeholder "address:port">
+<!ENTITY pref_tor_hint_type_one_per_line "Type one per line">
+
+<!-- When another PT is recommended, change TorNetworkBridgeSelectPreference::saveCurrentCheckedRadioButton(), too -->
+<!ENTITY pref_bridges_type_obfs4 "obfs4 (recommended)">
+<!ENTITY pref_bridges_type_meek_azure "meek-azure">
+<!ENTITY pref_bridges_type_obfs3 "obfs3">
+<!ENTITY pref_tor_network_bridges_enabled_change_builtin "You\'re using a built-in bridge to connect to Tor. Change">
+<!ENTITY pref_tor_network_bridges_enabled_change_custom "You\'re using a custom bridge to connect to Tor. Change">
+<!ENTITY pref_tor_network_using_multiple_provided_bridges "You\'re using multiple custom bridges.">
+<!ENTITY pref_tor_network_using_a_provided_bridge "You\'re using &formatS; bridge.">
+
+<!ENTITY tor_notify_user_about_error "An error occurred, please swipe for more information.">
+
<!ENTITY sync_not_supported "Sync is not currently supported in Tor Browser on Android">
diff --git a/mobile/android/base/strings.xml.in b/mobile/android/base/strings.xml.in
index 546dc31eb9c1..8ac8248ea1dc 100644
--- a/mobile/android/base/strings.xml.in
+++ b/mobile/android/base/strings.xml.in
@@ -86,6 +86,35 @@
<string name="firstrun_onionservices_message">&firstrun_onionservices_message;</string>
<string name="firstrun_onionservices_next">&firstrun_onionservices_next;</string>
+ <string name="pref_tor_network_title">&pref_tor_network_title;</string>
+ <string name="pref_tor_select_a_bridge_title">&pref_tor_select_a_bridge_title;</string>
+ <string name="pref_tor_provide_a_bridge_title">&pref_tor_provide_a_bridge_title;</string>
+ <string name="pref_category_tor_network_summary">&pref_category_tor_network_summary;</string>
+ <string name="pref_category_tor_bridge_summary">&pref_category_tor_bridge_summary;</string>
+ <string name="tor_notify_user_about_error">&tor_notify_user_about_error;</string>
+
+ <string name="tor_bootstrap_swipe_for_logs">&tor_bootstrap_swipe_for_logs;</string>
+ <string name="tor_bootstrap_connect">&tor_bootstrap_connect;</string>
+ <string name="tor_bootstrap_starting_status">&tor_bootstrap_starting_status;</string>
+
+ <string name="pref_choice_tor_bridges_enabled_title">&pref_choice_tor_bridges_enabled_title;</string>
+ <string name="pref_choice_tor_bridges_enabled_summary">&pref_choice_tor_bridges_enabled_summary;</string>
+ <string name="pref_bridges_type_obfs4">&pref_bridges_type_obfs4;</string>
+ <string name="pref_bridges_type_meek_azure">&pref_bridges_type_meek_azure;</string>
+ <string name="pref_bridges_type_obfs3">&pref_bridges_type_obfs3;</string>
+
+ <string name="pref_tor_bridges_provide_manual_button_title">&pref_tor_bridges_provide_manual_button_title;</string>
+ <string name="pref_tor_bridges_provide_select_text_title">&pref_tor_bridges_provide_select_text_title;</string>
+ <string name="pref_tor_bridges_provide_manual_text_title">&pref_tor_bridges_provide_manual_text_title;</string>
+ <string name="pref_tor_bridges_provide_manual_summary">&pref_tor_bridges_provide_manual_summary;</string>
+
+ <string name="pref_tor_bridges_provide_manual_address_port_placeholder">&pref_tor_bridges_provide_manual_address_port_placeholder;</string>
+ <string name="pref_tor_hint_type_one_per_line">&pref_tor_hint_type_one_per_line;</string>
+ <string name="pref_tor_network_bridges_enabled_change_custom">&pref_tor_network_bridges_enabled_change_custom;</string>
+ <string name="pref_tor_network_bridges_enabled_change_builtin">&pref_tor_network_bridges_enabled_change_builtin;</string>
+ <string name="pref_tor_network_using_multiple_provided_bridges">&pref_tor_network_using_multiple_provided_bridges;</string>
+ <string name="pref_tor_network_using_a_provided_bridge">&pref_tor_network_using_a_provided_bridge;</string>
+
<string name="bookmarks_title">&bookmarks_title;</string>
<string name="history_title">&history_title;</string>
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 28125 - Prevent non-Necko network connections
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit cf14b5eb0d976a53585266ae34dc81cf0e1e9b23
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Thu Oct 25 19:17:09 2018 +0000
Bug 28125 - Prevent non-Necko network connections
---
.../base/java/org/mozilla/gecko/SuggestClient.java | 5 ++
.../homepanel/topstories/PocketStoriesLoader.java | 5 ++
.../mozilla/gecko/distribution/Distribution.java | 5 ++
.../java/org/mozilla/gecko/dlc/BaseAction.java | 6 ++
.../java/org/mozilla/gecko/home/ImageLoader.java | 7 ++
.../mozilla/gecko/icons/loader/IconDownloader.java | 11 +++
.../mozilla/gecko/search/SearchEngineManager.java | 5 ++
.../org/mozilla/gecko/switchboard/SwitchBoard.java | 6 ++
.../gecko/media/GeckoMediaDrmBridgeV21.java | 6 ++
.../exoplayer2/upstream/DefaultHttpDataSource.java | 85 ++++++++++++----------
.../service/utils/AbstractCommunicator.java | 5 ++
11 files changed, 106 insertions(+), 40 deletions(-)
diff --git a/mobile/android/base/java/org/mozilla/gecko/SuggestClient.java b/mobile/android/base/java/org/mozilla/gecko/SuggestClient.java
index 0ebffeccdf21..137e53cc5c03 100644
--- a/mobile/android/base/java/org/mozilla/gecko/SuggestClient.java
+++ b/mobile/android/base/java/org/mozilla/gecko/SuggestClient.java
@@ -72,6 +72,11 @@ public class SuggestClient {
return mPrevResults;
ArrayList<String> suggestions = new ArrayList<String>();
+ if (AppConstants.isTorBrowser()) {
+ Log.i(LOGTAG, "This is Tor Browser. Skipping.");
+ return suggestions;
+ }
+
if (TextUtils.isEmpty(mSuggestTemplate) || TextUtils.isEmpty(query)) {
return suggestions;
}
diff --git a/mobile/android/base/java/org/mozilla/gecko/activitystream/homepanel/topstories/PocketStoriesLoader.java b/mobile/android/base/java/org/mozilla/gecko/activitystream/homepanel/topstories/PocketStoriesLoader.java
index 7ebead4cfa3f..516c13610047 100644
--- a/mobile/android/base/java/org/mozilla/gecko/activitystream/homepanel/topstories/PocketStoriesLoader.java
+++ b/mobile/android/base/java/org/mozilla/gecko/activitystream/homepanel/topstories/PocketStoriesLoader.java
@@ -124,6 +124,11 @@ public class PocketStoriesLoader extends AsyncTaskLoader<List<TopStory>> {
}
protected String makeAPIRequestWithKey(final String apiKey) {
+ if (AppConstants.isTorBrowser()) {
+ Log.i(LOGTAG, "This is Tor Browser. Skipping.");
+ return null;
+ }
+
HttpURLConnection connection = null;
final Uri uri = Uri.parse(GLOBAL_ENDPOINT)
diff --git a/mobile/android/base/java/org/mozilla/gecko/distribution/Distribution.java b/mobile/android/base/java/org/mozilla/gecko/distribution/Distribution.java
index 56340987207a..2e2d07d58914 100644
--- a/mobile/android/base/java/org/mozilla/gecko/distribution/Distribution.java
+++ b/mobile/android/base/java/org/mozilla/gecko/distribution/Distribution.java
@@ -555,6 +555,11 @@ public class Distribution {
return false;
}
+ if (AppConstants.isTorBrowser()) {
+ Log.i(LOGTAG, "This is Tor Browser. Skipping.");
+ return false;
+ }
+
URI uri = getReferredDistribution(referrer);
if (uri == null) {
return false;
diff --git a/mobile/android/base/java/org/mozilla/gecko/dlc/BaseAction.java b/mobile/android/base/java/org/mozilla/gecko/dlc/BaseAction.java
index 6e71bc13055e..486afe31a5cb 100644
--- a/mobile/android/base/java/org/mozilla/gecko/dlc/BaseAction.java
+++ b/mobile/android/base/java/org/mozilla/gecko/dlc/BaseAction.java
@@ -151,6 +151,12 @@ public abstract class BaseAction {
protected HttpURLConnection buildHttpURLConnection(String url)
throws UnrecoverableDownloadContentException, IOException {
try {
+ if (AppConstants.isTorBrowser()) {
+ String erdcl = "This is Tor Browser. Downloading is disabled for: " + url;
+ Log.i(LOGTAG, "This is Tor Browser. Skipping.");
+ throw new UnrecoverableDownloadContentException(erdcl);
+ }
+
System.setProperty("http.keepAlive", "true");
HttpURLConnection connection = (HttpURLConnection) ProxySelector.openConnectionWithProxy(new URI(url));
diff --git a/mobile/android/base/java/org/mozilla/gecko/home/ImageLoader.java b/mobile/android/base/java/org/mozilla/gecko/home/ImageLoader.java
index cbbe7babbba4..b6ea0249445c 100644
--- a/mobile/android/base/java/org/mozilla/gecko/home/ImageLoader.java
+++ b/mobile/android/base/java/org/mozilla/gecko/home/ImageLoader.java
@@ -15,6 +15,7 @@ import com.squareup.picasso.Picasso;
import com.squareup.picasso.Downloader.Response;
import com.squareup.picasso.UrlConnectionDownloader;
+import org.mozilla.gecko.AppConstants;
import org.mozilla.gecko.util.ProxySelector;
import java.io.File;
@@ -91,6 +92,12 @@ public class ImageLoader {
@Override
protected HttpURLConnection openConnection(Uri path) throws IOException {
+ if (AppConstants.isTorBrowser()) {
+ String err = "This is Tor Browser. Downloading is disabled for: " + path.toString();
+ Log.i(LOGTAG, "This is Tor Browser. Skipping.");
+ throw new IOException(err);
+ }
+
try {
// This is annoying, but |path| is an android.net.Uri and
// openConnectionWithProxy() accepts a java.net.URI
diff --git a/mobile/android/base/java/org/mozilla/gecko/icons/loader/IconDownloader.java b/mobile/android/base/java/org/mozilla/gecko/icons/loader/IconDownloader.java
index 4a03d440556d..84eb7736e94e 100644
--- a/mobile/android/base/java/org/mozilla/gecko/icons/loader/IconDownloader.java
+++ b/mobile/android/base/java/org/mozilla/gecko/icons/loader/IconDownloader.java
@@ -12,6 +12,7 @@ import android.support.annotation.Nullable;
import android.support.annotation.VisibleForTesting;
import android.util.Log;
+import org.mozilla.gecko.AppConstants;
import org.mozilla.gecko.GeckoApplication;
import org.mozilla.gecko.icons.decoders.FaviconDecoder;
import org.mozilla.gecko.icons.decoders.LoadFaviconResult;
@@ -132,6 +133,11 @@ public class IconDownloader implements IconLoader {
return null;
}
+ if (AppConstants.isTorBrowser()) {
+ Log.i(LOGTAG, "This is Tor Browser. Skipping.");
+ return null;
+ }
+
HttpURLConnection connection = null;
try {
@@ -183,6 +189,11 @@ public class IconDownloader implements IconLoader {
@VisibleForTesting
@NonNull
HttpURLConnection connectTo(String uri) throws URISyntaxException, IOException {
+ if (AppConstants.isTorBrowser()) {
+ Log.i(LOGTAG, "This is Tor Browser. Skipping.");
+ throw new IOException();
+ }
+
final HttpURLConnection connection = (HttpURLConnection) ProxySelector.openConnectionWithProxy(
new URI(uri));
diff --git a/mobile/android/base/java/org/mozilla/gecko/search/SearchEngineManager.java b/mobile/android/base/java/org/mozilla/gecko/search/SearchEngineManager.java
index eb1892ffdc6b..dbc3e7286d5a 100644
--- a/mobile/android/base/java/org/mozilla/gecko/search/SearchEngineManager.java
+++ b/mobile/android/base/java/org/mozilla/gecko/search/SearchEngineManager.java
@@ -379,6 +379,11 @@ public class SearchEngineManager implements SharedPreferences.OnSharedPreference
* @return String containing the country code
*/
private String fetchCountryCode() {
+ if (AppConstants.isTorBrowser()) {
+ Log.i(LOG_TAG, "This is Tor Browser. Skipping.");
+ return null;
+ }
+
// First, we look to see if we have a cached code.
final String region = GeckoSharedPrefs.forApp(context).getString(PREF_REGION_KEY, null);
if (region != null) {
diff --git a/mobile/android/base/java/org/mozilla/gecko/switchboard/SwitchBoard.java b/mobile/android/base/java/org/mozilla/gecko/switchboard/SwitchBoard.java
index e019c7d6eb77..1dc1b07aba5b 100644
--- a/mobile/android/base/java/org/mozilla/gecko/switchboard/SwitchBoard.java
+++ b/mobile/android/base/java/org/mozilla/gecko/switchboard/SwitchBoard.java
@@ -429,6 +429,12 @@ public class SwitchBoard {
HttpURLConnection connection = null;
InputStreamReader inputStreamReader = null;
BufferedReader bufferReader = null;
+
+ if (AppConstants.isTorBrowser()) {
+ Log.i(TAG, "This is Tor Browser. Skipping.");
+ return null;
+ }
+
try {
connection = (HttpURLConnection) ProxySelector.openConnectionWithProxy(url.toURI());
connection.setRequestProperty("User-Agent", HardwareUtils.isTablet() ?
diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/media/GeckoMediaDrmBridgeV21.java b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/media/GeckoMediaDrmBridgeV21.java
index 352d349477e0..dead9dd26570 100644
--- a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/media/GeckoMediaDrmBridgeV21.java
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/media/GeckoMediaDrmBridgeV21.java
@@ -31,6 +31,7 @@ import android.util.Log;
import org.mozilla.gecko.util.StringUtils;
import org.mozilla.gecko.util.ProxySelector;
+import org.mozilla.geckoview.BuildConfig;
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
public class GeckoMediaDrmBridgeV21 implements GeckoMediaDrm {
@@ -483,6 +484,11 @@ public class GeckoMediaDrmBridgeV21 implements GeckoMediaDrm {
@Override
protected Void doInBackground(final Void... params) {
+ if (BuildConfig.TOR_BROWSER_VERSION != "") {
+ Log.i(LOGTAG, "This is Tor Browser. Skipping.");
+ return null;
+ }
+
HttpURLConnection urlConnection = null;
BufferedReader in = null;
try {
diff --git a/mobile/android/geckoview/src/thirdparty/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.java b/mobile/android/geckoview/src/thirdparty/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.java
index 75e1f675c5eb..22e9e1ffcb9b 100644
--- a/mobile/android/geckoview/src/thirdparty/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.java
+++ b/mobile/android/geckoview/src/thirdparty/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.java
@@ -395,51 +395,56 @@ public class DefaultHttpDataSource implements HttpDataSource {
*/
private HttpURLConnection makeConnection(URL url, byte[] postBody, long position,
long length, boolean allowGzip, boolean followRedirects) throws IOException, URISyntaxException {
+ // AppConstants.isTorBrowser() is in base/, so it's not available in geckoview/
+ Log.i(TAG, "This is Tor Browser. Skipping.");
+ throw new IOException();
+
/**
* Tor Project modified the way the connection object was created. For the sake of
* simplicity, instead of duplicating the whole file we changed the connection object
* to use the ProxySelector.
*/
- HttpURLConnection connection = (HttpURLConnection) ProxySelector.openConnectionWithProxy(url.toURI());
-
- connection.setConnectTimeout(connectTimeoutMillis);
- connection.setReadTimeout(readTimeoutMillis);
- if (defaultRequestProperties != null) {
- for (Map.Entry<String, String> property : defaultRequestProperties.getSnapshot().entrySet()) {
- connection.setRequestProperty(property.getKey(), property.getValue());
- }
- }
- for (Map.Entry<String, String> property : requestProperties.getSnapshot().entrySet()) {
- connection.setRequestProperty(property.getKey(), property.getValue());
- }
- if (!(position == 0 && length == C.LENGTH_UNSET)) {
- String rangeRequest = "bytes=" + position + "-";
- if (length != C.LENGTH_UNSET) {
- rangeRequest += (position + length - 1);
- }
- connection.setRequestProperty("Range", rangeRequest);
- }
- connection.setRequestProperty("User-Agent", userAgent);
- if (!allowGzip) {
- connection.setRequestProperty("Accept-Encoding", "identity");
- }
- connection.setInstanceFollowRedirects(followRedirects);
- connection.setDoOutput(postBody != null);
- if (postBody != null) {
- connection.setRequestMethod("POST");
- if (postBody.length == 0) {
- connection.connect();
- } else {
- connection.setFixedLengthStreamingMode(postBody.length);
- connection.connect();
- OutputStream os = connection.getOutputStream();
- os.write(postBody);
- os.close();
- }
- } else {
- connection.connect();
- }
- return connection;
+ /* Dead code */
+ //HttpURLConnection connection = (HttpURLConnection) ProxySelector.openConnectionWithProxy(url.toURI());
+
+ //connection.setConnectTimeout(connectTimeoutMillis);
+ //connection.setReadTimeout(readTimeoutMillis);
+ //if (defaultRequestProperties != null) {
+ // for (Map.Entry<String, String> property : defaultRequestProperties.getSnapshot().entrySet()) {
+ // connection.setRequestProperty(property.getKey(), property.getValue());
+ // }
+ //}
+ //for (Map.Entry<String, String> property : requestProperties.getSnapshot().entrySet()) {
+ // connection.setRequestProperty(property.getKey(), property.getValue());
+ //}
+ //if (!(position == 0 && length == C.LENGTH_UNSET)) {
+ // String rangeRequest = "bytes=" + position + "-";
+ // if (length != C.LENGTH_UNSET) {
+ // rangeRequest += (position + length - 1);
+ // }
+ // connection.setRequestProperty("Range", rangeRequest);
+ //}
+ //connection.setRequestProperty("User-Agent", userAgent);
+ //if (!allowGzip) {
+ // connection.setRequestProperty("Accept-Encoding", "identity");
+ //}
+ //connection.setInstanceFollowRedirects(followRedirects);
+ //connection.setDoOutput(postBody != null);
+ //if (postBody != null) {
+ // connection.setRequestMethod("POST");
+ // if (postBody.length == 0) {
+ // connection.connect();
+ // } else {
+ // connection.setFixedLengthStreamingMode(postBody.length);
+ // connection.connect();
+ // OutputStream os = connection.getOutputStream();
+ // os.write(postBody);
+ // os.close();
+ // }
+ //} else {
+ // connection.connect();
+ //}
+ //return connection;
}
/**
diff --git a/mobile/android/stumbler/java/org/mozilla/mozstumbler/service/utils/AbstractCommunicator.java b/mobile/android/stumbler/java/org/mozilla/mozstumbler/service/utils/AbstractCommunicator.java
index 9b3ee98f89db..fc3248d72219 100644
--- a/mobile/android/stumbler/java/org/mozilla/mozstumbler/service/utils/AbstractCommunicator.java
+++ b/mobile/android/stumbler/java/org/mozilla/mozstumbler/service/utils/AbstractCommunicator.java
@@ -68,6 +68,11 @@ public abstract class AbstractCommunicator {
}
private void openConnectionAndSetHeaders() {
+ if (AppConstants.isTorBrowser()) {
+ Log.i(LOG_TAG, "This is Tor Browser. Skipping.");
+ throw new Exception();
+ }
+
try {
Prefs prefs = Prefs.getInstanceWithoutContext();
if (sMozApiKey == null || prefs != null) {
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 26690: Port padlock states for .onion services to mobile
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit daa148cebd3da69fa24739e2910d67b7480b4fdd
Author: Igor Oliveira <igt0(a)torproject.org>
Date: Mon Oct 29 12:30:14 2018 -0200
Bug 26690: Port padlock states for .onion services to mobile
Prior to this patch, TBA was showing onion services as insecure
connection and SSL/TLS ones as encrypted connections(lock icon).
This patch fixes the issue adding several new onion icons to indicate
all the various permutations of onions services hosted HTTP or HTTPS
pages.
---
.../app/src/main/res/drawable-hdpi/ic_onion.png | Bin 0 -> 807 bytes
.../main/res/drawable-hdpi/ic_onion_disabled.png | Bin 0 -> 975 bytes
.../src/main/res/drawable-hdpi/ic_onion_lock.png | Bin 0 -> 932 bytes
.../app/src/main/res/drawable-xhdpi/ic_onion.png | Bin 0 -> 1015 bytes
.../main/res/drawable-xhdpi/ic_onion_disabled.png | Bin 0 -> 1260 bytes
.../src/main/res/drawable-xhdpi/ic_onion_lock.png | Bin 0 -> 1275 bytes
.../app/src/main/res/drawable-xxhdpi/ic_onion.png | Bin 0 -> 1592 bytes
.../main/res/drawable-xxhdpi/ic_onion_disabled.png | Bin 0 -> 1892 bytes
.../src/main/res/drawable-xxhdpi/ic_onion_lock.png | Bin 0 -> 1899 bytes
.../app/src/main/res/drawable-xxxhdpi/ic_onion.png | Bin 0 -> 2099 bytes
.../res/drawable-xxxhdpi/ic_onion_disabled.png | Bin 0 -> 2526 bytes
.../main/res/drawable-xxxhdpi/ic_onion_lock.png | Bin 0 -> 2568 bytes
.../main/res/drawable/security_mode_icon_nm.xml | 9 +++++++++
.../main/res/drawable/security_mode_icon_pm.xml | 9 +++++++++
.../src/main/res/drawable/site_security_icon.xml | 10 +++++++++-
.../base/java/org/mozilla/gecko/SiteIdentity.java | 14 ++++++++++++++
.../mozilla/gecko/toolbar/SecurityModeUtil.java | 21 ++++++++++++++++-----
.../mozilla/gecko/toolbar/SiteIdentityPopup.java | 17 +++++++++++------
mobile/android/chrome/content/browser.js | 15 ++++++++++++++-
19 files changed, 82 insertions(+), 13 deletions(-)
diff --git a/mobile/android/app/src/main/res/drawable-hdpi/ic_onion.png b/mobile/android/app/src/main/res/drawable-hdpi/ic_onion.png
new file mode 100644
index 000000000000..1a61d982752b
Binary files /dev/null and b/mobile/android/app/src/main/res/drawable-hdpi/ic_onion.png differ
diff --git a/mobile/android/app/src/main/res/drawable-hdpi/ic_onion_disabled.png b/mobile/android/app/src/main/res/drawable-hdpi/ic_onion_disabled.png
new file mode 100644
index 000000000000..9669d12101fb
Binary files /dev/null and b/mobile/android/app/src/main/res/drawable-hdpi/ic_onion_disabled.png differ
diff --git a/mobile/android/app/src/main/res/drawable-hdpi/ic_onion_lock.png b/mobile/android/app/src/main/res/drawable-hdpi/ic_onion_lock.png
new file mode 100644
index 000000000000..b0f60fea5b28
Binary files /dev/null and b/mobile/android/app/src/main/res/drawable-hdpi/ic_onion_lock.png differ
diff --git a/mobile/android/app/src/main/res/drawable-xhdpi/ic_onion.png b/mobile/android/app/src/main/res/drawable-xhdpi/ic_onion.png
new file mode 100755
index 000000000000..074330c3a25a
Binary files /dev/null and b/mobile/android/app/src/main/res/drawable-xhdpi/ic_onion.png differ
diff --git a/mobile/android/app/src/main/res/drawable-xhdpi/ic_onion_disabled.png b/mobile/android/app/src/main/res/drawable-xhdpi/ic_onion_disabled.png
new file mode 100755
index 000000000000..09db37998d33
Binary files /dev/null and b/mobile/android/app/src/main/res/drawable-xhdpi/ic_onion_disabled.png differ
diff --git a/mobile/android/app/src/main/res/drawable-xhdpi/ic_onion_lock.png b/mobile/android/app/src/main/res/drawable-xhdpi/ic_onion_lock.png
new file mode 100755
index 000000000000..13799b7fa8f7
Binary files /dev/null and b/mobile/android/app/src/main/res/drawable-xhdpi/ic_onion_lock.png differ
diff --git a/mobile/android/app/src/main/res/drawable-xxhdpi/ic_onion.png b/mobile/android/app/src/main/res/drawable-xxhdpi/ic_onion.png
new file mode 100755
index 000000000000..711bb3c8d8fa
Binary files /dev/null and b/mobile/android/app/src/main/res/drawable-xxhdpi/ic_onion.png differ
diff --git a/mobile/android/app/src/main/res/drawable-xxhdpi/ic_onion_disabled.png b/mobile/android/app/src/main/res/drawable-xxhdpi/ic_onion_disabled.png
new file mode 100755
index 000000000000..0d931669abf3
Binary files /dev/null and b/mobile/android/app/src/main/res/drawable-xxhdpi/ic_onion_disabled.png differ
diff --git a/mobile/android/app/src/main/res/drawable-xxhdpi/ic_onion_lock.png b/mobile/android/app/src/main/res/drawable-xxhdpi/ic_onion_lock.png
new file mode 100755
index 000000000000..f7a5c29b4c17
Binary files /dev/null and b/mobile/android/app/src/main/res/drawable-xxhdpi/ic_onion_lock.png differ
diff --git a/mobile/android/app/src/main/res/drawable-xxxhdpi/ic_onion.png b/mobile/android/app/src/main/res/drawable-xxxhdpi/ic_onion.png
new file mode 100755
index 000000000000..97a0beabbe0c
Binary files /dev/null and b/mobile/android/app/src/main/res/drawable-xxxhdpi/ic_onion.png differ
diff --git a/mobile/android/app/src/main/res/drawable-xxxhdpi/ic_onion_disabled.png b/mobile/android/app/src/main/res/drawable-xxxhdpi/ic_onion_disabled.png
new file mode 100755
index 000000000000..aec29bf6238b
Binary files /dev/null and b/mobile/android/app/src/main/res/drawable-xxxhdpi/ic_onion_disabled.png differ
diff --git a/mobile/android/app/src/main/res/drawable-xxxhdpi/ic_onion_lock.png b/mobile/android/app/src/main/res/drawable-xxxhdpi/ic_onion_lock.png
new file mode 100755
index 000000000000..71df527b2a6a
Binary files /dev/null and b/mobile/android/app/src/main/res/drawable-xxxhdpi/ic_onion_lock.png differ
diff --git a/mobile/android/app/src/main/res/drawable/security_mode_icon_nm.xml b/mobile/android/app/src/main/res/drawable/security_mode_icon_nm.xml
index 0b6b496b0b34..bb0da0b843d2 100644
--- a/mobile/android/app/src/main/res/drawable/security_mode_icon_nm.xml
+++ b/mobile/android/app/src/main/res/drawable/security_mode_icon_nm.xml
@@ -28,5 +28,14 @@
<item
android:drawable="@drawable/ic_search_icon"
android:maxLevel="6" />
+ <item
+ android:drawable="@drawable/ic_onion"
+ android:maxLevel="7"/>
+ <item
+ android:drawable="@drawable/ic_onion_lock"
+ android:maxLevel="8"/>
+ <item
+ android:drawable="@drawable/ic_onion_disabled"
+ android:maxLevel="9"/>
</level-list>
diff --git a/mobile/android/app/src/main/res/drawable/security_mode_icon_pm.xml b/mobile/android/app/src/main/res/drawable/security_mode_icon_pm.xml
index edbd269040d1..be47d7fe081f 100644
--- a/mobile/android/app/src/main/res/drawable/security_mode_icon_pm.xml
+++ b/mobile/android/app/src/main/res/drawable/security_mode_icon_pm.xml
@@ -28,5 +28,14 @@
<item
android:drawable="@drawable/ic_search_icon"
android:maxLevel="6" />
+ <item
+ android:drawable="@drawable/ic_onion"
+ android:maxLevel="7"/>
+ <item
+ android:drawable="@drawable/ic_onion_lock"
+ android:maxLevel="8"/>
+ <item
+ android:drawable="@drawable/ic_onion_disabled"
+ android:maxLevel="9"/>
</level-list>
diff --git a/mobile/android/app/src/main/res/drawable/site_security_icon.xml b/mobile/android/app/src/main/res/drawable/site_security_icon.xml
index ac8624f861ad..f5f4c7775110 100644
--- a/mobile/android/app/src/main/res/drawable/site_security_icon.xml
+++ b/mobile/android/app/src/main/res/drawable/site_security_icon.xml
@@ -28,5 +28,13 @@
<item
android:drawable="@drawable/ic_search_icon"
android:maxLevel="6" />
-
+ <item
+ android:drawable="@drawable/ic_onion"
+ android:maxLevel="7"/>
+ <item
+ android:drawable="@drawable/ic_onion_lock"
+ android:maxLevel="8"/>
+ <item
+ android:drawable="@drawable/ic_onion_disabled"
+ android:maxLevel="9"/>
</level-list>
diff --git a/mobile/android/base/java/org/mozilla/gecko/SiteIdentity.java b/mobile/android/base/java/org/mozilla/gecko/SiteIdentity.java
index 79262586b8fe..0a1b92b75f96 100644
--- a/mobile/android/base/java/org/mozilla/gecko/SiteIdentity.java
+++ b/mobile/android/base/java/org/mozilla/gecko/SiteIdentity.java
@@ -25,6 +25,8 @@ public class SiteIdentity {
private String mCountry;
private String mVerifier;
private String mOrigin;
+ private boolean mIsOnionHost;
+ private boolean mHasCert;
public enum SecurityMode {
UNKNOWN,
@@ -59,6 +61,8 @@ public class SiteIdentity {
mCountry = null;
mVerifier = null;
mSecure = false;
+ mIsOnionHost = false;
+ mHasCert = false;
}
public void reset() {
@@ -108,6 +112,8 @@ public class SiteIdentity {
mVerifier = identityData.getString("verifier");
mSecure = identityData.getBoolean("secure");
mSecurityException = identityData.getBoolean("securityException");
+ mIsOnionHost = identityData.getBoolean("isOnionHost");
+ mHasCert = identityData.getBoolean("hasCert");
}
/* package */ void updateTrackingMode(final String trackingEvent) {
@@ -154,6 +160,14 @@ public class SiteIdentity {
return mSecure;
}
+ public boolean isOnionHost() {
+ return mIsOnionHost;
+ }
+
+ public boolean hasCert() {
+ return mHasCert;
+ }
+
public MixedMode getMixedModeActive() {
return mMixedModeActive;
}
diff --git a/mobile/android/base/java/org/mozilla/gecko/toolbar/SecurityModeUtil.java b/mobile/android/base/java/org/mozilla/gecko/toolbar/SecurityModeUtil.java
index ceb33b8e3acb..10bc83c279a1 100644
--- a/mobile/android/base/java/org/mozilla/gecko/toolbar/SecurityModeUtil.java
+++ b/mobile/android/base/java/org/mozilla/gecko/toolbar/SecurityModeUtil.java
@@ -35,6 +35,9 @@ public class SecurityModeUtil {
LOCK_SECURE(1),
LOCK_WARNING(-1), // not used for now. reserve for MixedDisplayContent icon, if any.
LOCK_INSECURE(3),
+ ONION(7),
+ ONION_ACTIVATE(8),
+ ONION_DISABLED(9),
WARNING(2),
TRACKING_CONTENT_BLOCKED(4),
TRACKING_CONTENT_LOADED(5);
@@ -100,6 +103,8 @@ public class SecurityModeUtil {
final MixedMode displayMixedMode = identity.getMixedModeDisplay();
final TrackingMode trackingMode = identity.getTrackingMode();
final boolean securityException = identity.isSecurityException();
+ final boolean isOnionHost = identity.isOnionHost();
+ final boolean hasCert = identity.hasCert();
if (securityException) {
return IconType.WARNING;
@@ -108,9 +113,9 @@ public class SecurityModeUtil {
} else if (trackingMode == TrackingMode.TRACKING_CONTENT_BLOCKED) {
return IconType.TRACKING_CONTENT_BLOCKED;
} else if (activeMixedMode == MixedMode.LOADED) {
- return IconType.LOCK_INSECURE;
+ return isOnionHost ? IconType.ONION_DISABLED : IconType.LOCK_INSECURE;
} else if (displayMixedMode == MixedMode.LOADED) {
- return IconType.WARNING;
+ return isOnionHost ? IconType.ONION_DISABLED : IconType.WARNING;
}
// Chrome-UI checking is after tracking/mixed-content, even for about: pages, as they
@@ -119,9 +124,15 @@ public class SecurityModeUtil {
return IconType.DEFAULT;
}
- return securityModeMap.containsKey(securityMode)
- ? securityModeMap.get(securityMode)
- : IconType.UNKNOWN;
+ if (securityMode == SecurityMode.UNKNOWN) {
+ return isOnionHost ? IconType.ONION : IconType.UNKNOWN;
+ } else if (securityMode == SecurityMode.IDENTIFIED) {
+ return isOnionHost ? (hasCert ? IconType.ONION_ACTIVATE : IconType.ONION) : IconType.LOCK_SECURE;
+ } else if (securityMode == SecurityMode.VERIFIED) {
+ return isOnionHost ? IconType.ONION_ACTIVATE : IconType.LOCK_SECURE;
+ } else {
+ return IconType.UNKNOWN;
+ }
}
/**
diff --git a/mobile/android/base/java/org/mozilla/gecko/toolbar/SiteIdentityPopup.java b/mobile/android/base/java/org/mozilla/gecko/toolbar/SiteIdentityPopup.java
index 831f69f2bf09..df67f0a9b9ed 100644
--- a/mobile/android/base/java/org/mozilla/gecko/toolbar/SiteIdentityPopup.java
+++ b/mobile/android/base/java/org/mozilla/gecko/toolbar/SiteIdentityPopup.java
@@ -144,8 +144,9 @@ public class SiteIdentityPopup extends AnchoredPopup implements BundleEventListe
init();
}
- final boolean isIdentityKnown = (siteIdentity.getSecurityMode() == SecurityMode.IDENTIFIED ||
- siteIdentity.getSecurityMode() == SecurityMode.VERIFIED);
+ final boolean isIdentityKnown = ((siteIdentity.getSecurityMode() == SecurityMode.IDENTIFIED ||
+ siteIdentity.getSecurityMode() == SecurityMode.VERIFIED) &&
+ siteIdentity.hasCert());
updateConnectionState(siteIdentity);
toggleIdentityKnownContainerVisibility(isIdentityKnown);
@@ -322,7 +323,8 @@ public class SiteIdentityPopup extends AnchoredPopup implements BundleEventListe
} else if (!siteIdentity.isSecure()) {
if (siteIdentity.getMixedModeActive() == MixedMode.LOADED) {
// Active Mixed Content loaded because user has disabled blocking.
- mIcon.setImageResource(R.drawable.ic_lock_disabled);
+ int resId = siteIdentity.isOnionHost() ? R.drawable.ic_onion_disabled : R.drawable.ic_lock_disabled;
+ mIcon.setImageResource(resId);
clearSecurityStateIcon();
mMixedContentActivity.setVisibility(View.VISIBLE);
mMixedContentActivity.setText(R.string.mixed_content_protection_disabled);
@@ -330,7 +332,8 @@ public class SiteIdentityPopup extends AnchoredPopup implements BundleEventListe
mLink.setVisibility(View.VISIBLE);
} else if (siteIdentity.getMixedModeDisplay() == MixedMode.LOADED) {
// Passive Mixed Content loaded.
- mIcon.setImageResource(R.drawable.ic_lock_inactive);
+ int resId = siteIdentity.isOnionHost() ? R.drawable.ic_onion_disabled : R.drawable.ic_lock_inactive;
+ mIcon.setImageResource(resId);
setSecurityStateIcon(R.drawable.ic_warning_major, 1);
mMixedContentActivity.setVisibility(View.VISIBLE);
if (siteIdentity.getMixedModeActive() == MixedMode.BLOCKED) {
@@ -342,7 +345,8 @@ public class SiteIdentityPopup extends AnchoredPopup implements BundleEventListe
} else {
// Unencrypted connection with no mixed content.
- mIcon.setImageResource(R.drawable.globe_light);
+ int resId = siteIdentity.isOnionHost() ? R.drawable.ic_onion : R.drawable.globe_light;
+ mIcon.setImageResource(resId);
clearSecurityStateIcon();
mMixedContentActivity.setVisibility(View.GONE);
@@ -361,7 +365,8 @@ public class SiteIdentityPopup extends AnchoredPopup implements BundleEventListe
} else {
// Connection is secure.
- mIcon.setImageResource(R.drawable.ic_lock);
+ int resId = siteIdentity.isOnionHost() ? (siteIdentity.hasCert() ? R.drawable.ic_onion_lock : R.drawable.ic_onion) : R.drawable.ic_lock;
+ mIcon.setImageResource(resId);
setSecurityStateIcon(R.drawable.img_check, 2);
mSecurityState.setTextColor(ContextCompat.getColor(mContext, R.color.affirmative_green));
diff --git a/mobile/android/chrome/content/browser.js b/mobile/android/chrome/content/browser.js
index c9cf0f128176..e139e59a7f40 100644
--- a/mobile/android/chrome/content/browser.js
+++ b/mobile/android/chrome/content/browser.js
@@ -6788,6 +6788,17 @@ var IdentityHandler = {
return result;
},
+ isOnionHost: function isOnionHost() {
+ try {
+ return this._uri.host.toLowerCase().endsWith(".onion");
+ } catch (e) {
+ // If something goes wrong (e.g. host is an exception
+ // because this is an about: page) just fall back
+ // on false.
+ return false;
+ }
+ },
+
/**
* Determines the identity mode corresponding to the icon we show in the urlbar.
*/
@@ -6913,6 +6924,8 @@ var IdentityHandler = {
};
result.host = this.getEffectiveHost();
+ result.isOnionHost = this.isOnionHost();
+ result.hasCert = !!this._lastStatus;
// Don't show identity data for pages with an unknown identity or if any
// mixed content is loaded (mixed display content is loaded by default).
@@ -6982,7 +6995,7 @@ var IdentityHandler = {
// Updating the tooltip value in those cases isn't critical.
// FIXME: Fixing bug 646690 would probably makes this check unnecessary
if (
- this._lastLocation.hostname &&
+ this._lastLocation.hostname && iData.cert &&
this._overrideService.hasMatchingOverride(
this._lastLocation.hostname,
this._lastLocation.port || 443,
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 28329 - Part 4. Add new Tor Bootstrapping and configuration screens
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit 385689ddc6c13420a40f1f813051ec0af99f306d
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Thu Mar 14 02:03:26 2019 +0000
Bug 28329 - Part 4. Add new Tor Bootstrapping and configuration screens
Also:
Bug 30214 - Kill background thread when Activity is null
Bug 30239 - Render Fragments after crash
Bug 29982 - Force single-pane UI on Tor Preferences
---
.../android/app/src/main/res/layout/gecko_app.xml | 5 +
.../preference_tor_network_bridge_summary.xml | 25 +
.../preference_tor_network_bridges_enabled.xml | 85 ++
...eference_tor_network_bridges_enabled_switch.xml | 15 +
.../preference_tor_network_provide_bridge.xml | 89 ++
.../preference_tor_network_select_bridge_type.xml | 128 +++
.../app/src/main/res/layout/tor_bootstrap.xml | 83 ++
.../layout/tor_bootstrap_animation_container.xml | 20 +
.../app/src/main/res/layout/tor_bootstrap_log.xml | 37 +
.../main/res/xml/preferences_tor_network_main.xml | 15 +
.../xml/preferences_tor_network_provide_bridge.xml | 27 +
.../preferences_tor_network_select_bridge_type.xml | 17 +
mobile/android/base/AndroidManifest.xml.in | 5 +
.../base/java/org/mozilla/gecko/BrowserApp.java | 52 +-
.../TorBootstrapAnimationContainer.java | 82 ++
.../gecko/torbootstrap/TorBootstrapLogPanel.java | 54 ++
.../gecko/torbootstrap/TorBootstrapLogger.java | 17 +
.../gecko/torbootstrap/TorBootstrapPager.java | 203 +++++
.../torbootstrap/TorBootstrapPagerConfig.java | 48 +
.../gecko/torbootstrap/TorBootstrapPanel.java | 575 ++++++++++++
.../gecko/torbootstrap/TorLogEventListener.java | 128 +++
.../mozilla/gecko/torbootstrap/TorPreferences.java | 975 +++++++++++++++++++++
22 files changed, 2680 insertions(+), 5 deletions(-)
diff --git a/mobile/android/app/src/main/res/layout/gecko_app.xml b/mobile/android/app/src/main/res/layout/gecko_app.xml
index f48e7fc9f3be..d6a6133496e2 100644
--- a/mobile/android/app/src/main/res/layout/gecko_app.xml
+++ b/mobile/android/app/src/main/res/layout/gecko_app.xml
@@ -63,6 +63,11 @@
android:layout_width="match_parent"
android:layout_height="match_parent"/>
+ <ViewStub android:id="@+id/tor_bootstrap_pager_stub"
+ android:layout="@layout/tor_bootstrap_animation_container"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"/>
+
</FrameLayout>
<View android:id="@+id/doorhanger_overlay"
diff --git a/mobile/android/app/src/main/res/layout/preference_tor_network_bridge_summary.xml b/mobile/android/app/src/main/res/layout/preference_tor_network_bridge_summary.xml
new file mode 100644
index 000000000000..d99b3c9543b0
--- /dev/null
+++ b/mobile/android/app/src/main/res/layout/preference_tor_network_bridge_summary.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:gravity="center_vertical" >
+ <TextView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/tor_network_bridge_summary"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingTop="30sp"
+ android:paddingBottom="30sp"
+ android:paddingLeft="20sp"
+ android:paddingRight="20sp"
+ android:textSize="16sp"
+ android:fontFamily="Roboto-Regular"
+ android:textColor="#DE000000"
+ android:lineSpacingMultiplier="1.43"
+ android:text="@string/pref_category_tor_bridge_summary" />
+</LinearLayout>
diff --git a/mobile/android/app/src/main/res/layout/preference_tor_network_bridges_enabled.xml b/mobile/android/app/src/main/res/layout/preference_tor_network_bridges_enabled.xml
new file mode 100644
index 000000000000..8d8e4f320ba7
--- /dev/null
+++ b/mobile/android/app/src/main/res/layout/preference_tor_network_bridges_enabled.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2006 The Android Open Source Project
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- Layout for a Preference in a PreferenceActivity. The
+ Preference is able to place a specific widget for its particular
+ type in the "widget_frame" layout.
+ This is a modified version of the default Android Preference layout,
+ See: https://android.googlesource.com/platform/frameworks/base/+/refs/heads/pie-…
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:gravity="center_vertical"
+ android:paddingEnd="?android:attr/scrollbarSize"
+ android:orientation="vertical"
+ android:background="?android:attr/selectableItemBackground" >
+ <TextView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/tor_network_configuration_summary"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingTop="30sp"
+ android:paddingBottom="30sp"
+ android:paddingLeft="20sp"
+ android:paddingRight="20sp"
+ android:textSize="16sp"
+ android:fontFamily="Roboto-Regular"
+ android:textColor="#DE000000"
+ android:lineSpacingMultiplier="1.43"
+ android:text="@string/pref_category_tor_network_summary" />
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center_vertical" >
+ <ImageView
+ android:id="@+android:id/icon"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ />
+ <RelativeLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="15dp"
+ android:layout_marginEnd="6dp"
+ android:layout_marginTop="6dp"
+ android:layout_marginBottom="12dp"
+ android:layout_weight="1">
+ <TextView android:id="@+android:id/title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:singleLine="true"
+ android:fontFamily="Roboto-Regular"
+ android:textSize="20sp"
+ android:textColor="#DE000000"
+ android:ellipsize="marquee"
+ android:fadingEdge="horizontal" />
+ <TextView android:id="@+android:id/summary"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@android:id/title"
+ android:layout_alignStart="@android:id/title"
+ android:fontFamily="Roboto-Regular"
+ android:textSize="16sp"
+ android:textColorLink="#8000FF"
+ android:clickable="true"
+ android:focusable="false"
+ android:maxLines="2" />
+ </RelativeLayout>
+ <!-- Preference should place its actual preference widget here. -->
+ <LinearLayout android:id="@+android:id/widget_frame"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:gravity="center_vertical" />
+ </LinearLayout>
+</LinearLayout>
diff --git a/mobile/android/app/src/main/res/layout/preference_tor_network_bridges_enabled_switch.xml b/mobile/android/app/src/main/res/layout/preference_tor_network_bridges_enabled_switch.xml
new file mode 100644
index 000000000000..3ab276f0916c
--- /dev/null
+++ b/mobile/android/app/src/main/res/layout/preference_tor_network_bridges_enabled_switch.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<Switch xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+android:id/switch_widget"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:focusable="false"
+ android:clickable="true"
+ android:thumbTint="@color/tor_bridges_enabled_colors"
+ android:trackTint="@color/tor_bridges_enabled_colors"
+ android:background="@null" />
diff --git a/mobile/android/app/src/main/res/layout/preference_tor_network_provide_bridge.xml b/mobile/android/app/src/main/res/layout/preference_tor_network_provide_bridge.xml
new file mode 100644
index 000000000000..9e72b44ae734
--- /dev/null
+++ b/mobile/android/app/src/main/res/layout/preference_tor_network_provide_bridge.xml
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:orientation="vertical"
+ android:paddingEnd="?android:attr/scrollbarSize"
+ android:gravity="center_vertical"
+ android:background="?android:attr/selectableItemBackground" >
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingLeft="16sp"
+ android:paddingRight="16sp"
+ android:orientation="vertical" >
+ <TextView android:id="@+android:id/title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:fontFamily="Roboto-Regular"
+ android:textSize="20sp"
+ android:textColor="#DE000000"
+ android:singleLine="true"
+ android:ellipsize="marquee"
+ android:fadingEdge="horizontal" />
+ <TextView android:id="@+android:id/summary"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingBottom="30sp"
+ android:fontFamily="Roboto-Regular"
+ android:textSize="16sp"
+ android:maxLines="4" />
+ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:gravity="center_vertical"
+ android:orientation="vertical" >
+ <EditText
+ android:id="@+id/tor_network_provide_bridge1"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="10dp"
+ android:inputType="text"
+ android:textSize="20sp"
+ android:fontFamily="Roboto-Regular"
+ android:paddingTop="22sp"
+ android:paddingLeft="16sp"
+ android:paddingBottom="22sp"
+ android:background="#DCDCDC"
+ android:hint="@string/pref_tor_bridges_provide_manual_address_port_placeholder" />
+ <EditText
+ android:id="@+id/tor_network_provide_bridge2"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="10dp"
+ android:inputType="text"
+ android:textSize="20sp"
+ android:fontFamily="Roboto-Regular"
+ android:paddingTop="22sp"
+ android:paddingLeft="16sp"
+ android:paddingBottom="22sp"
+ android:background="#DCDCDC"
+ android:hint="@string/pref_tor_bridges_provide_manual_address_port_placeholder" />
+ <EditText
+ android:id="@+id/tor_network_provide_bridge3"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:inputType="text"
+ android:textSize="20sp"
+ android:fontFamily="Roboto-Regular"
+ android:paddingTop="22sp"
+ android:paddingLeft="16sp"
+ android:paddingBottom="22sp"
+ android:background="#DCDCDC"
+ android:hint="@string/pref_tor_bridges_provide_manual_address_port_placeholder" />
+ </LinearLayout>
+ </LinearLayout>
+ <LinearLayout android:id="@+android:id/widget_frame"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:gravity="center_vertical"
+ android:orientation="vertical">
+ </LinearLayout>
+</LinearLayout>
diff --git a/mobile/android/app/src/main/res/layout/preference_tor_network_select_bridge_type.xml b/mobile/android/app/src/main/res/layout/preference_tor_network_select_bridge_type.xml
new file mode 100644
index 000000000000..2c1632bb8268
--- /dev/null
+++ b/mobile/android/app/src/main/res/layout/preference_tor_network_select_bridge_type.xml
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:orientation="vertical"
+ android:paddingEnd="?android:attr/scrollbarSize"
+ android:gravity="center_vertical"
+ android:background="?android:attr/selectableItemBackground" >
+
+ <!-- Include the Bridge description -->
+ <include layout="@layout/preference_tor_network_bridge_summary" />
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingLeft="20sp"
+ android:orientation="vertical" >
+ <LinearLayout
+ android:id="@+id/title_and_summary"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical" >
+ <TextView android:id="@+android:id/title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:fontFamily="Roboto-Regular"
+ android:textSize="20sp"
+ android:textColor="#DE000000"
+ android:singleLine="true"
+ android:ellipsize="marquee"
+ android:fadingEdge="horizontal" />
+ <TextView android:id="@+android:id/summary"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="40dp"
+ android:fontFamily="Roboto-Regular"
+ android:textSize="16sp"
+ android:maxLines="4" />
+ </LinearLayout>
+ <include layout="@xml/separator" />
+ <RadioGroup
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:paddingLeft="20sp"
+ android:visibility="gone"
+ android:layoutDirection="rtl"
+ android:id="@+id/pref_radio_group_builtin_bridges_type">
+ <RadioButton android:id="@+id/radio_pref_bridges_obfs4"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="10sp"
+ android:layout_marginBottom="10sp"
+ android:buttonTint="@color/tor_bridges_select_builtin"
+ android:fontFamily="Roboto-Regular"
+ android:textColor="#DE000000"
+ android:textSize="16sp"
+ android:text="@string/pref_bridges_type_obfs4"/>
+ <include layout="@xml/separator" />
+ <RadioButton android:id="@+id/radio_pref_bridges_meek_azure"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="10sp"
+ android:layout_marginBottom="10sp"
+ android:buttonTint="@color/tor_bridges_select_builtin"
+ android:fontFamily="Roboto-Regular"
+ android:textColor="#DE000000"
+ android:textSize="16sp"
+ android:text="@string/pref_bridges_type_meek_azure"/>
+ <include layout="@xml/separator" />
+ <RadioButton android:id="@+id/radio_pref_bridges_obfs3"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="10sp"
+ android:layout_marginBottom="10sp"
+ android:buttonTint="@color/tor_bridges_select_builtin"
+ android:fontFamily="Roboto-Regular"
+ android:textColor="#DE000000"
+ android:textSize="16sp"
+ android:text="@string/pref_bridges_type_obfs3"/>
+ <include layout="@xml/separator" />
+ </RadioGroup>
+ </LinearLayout>
+
+ <LinearLayout android:id="@+android:id/widget_frame"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:gravity="center_vertical"
+ android:orientation="vertical">
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:clickable="true"
+ android:paddingTop="20sp"
+ android:paddingLeft="20sp"
+ android:id="@+id/tor_network_provide_a_bridge"
+ android:orientation="vertical">
+ <TextView
+ android:id="@+id/tor_network_provide_a_bridge_title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:fontFamily="Roboto-Regular"
+ android:textSize="20sp"
+ android:textColor="#DE000000"
+ android:text="@string/pref_tor_bridges_provide_manual_button_title"
+ android:singleLine="true"
+ android:ellipsize="marquee"
+ android:fadingEdge="horizontal" />
+ <TextView
+ android:id="@+id/tor_network_provide_a_bridge_summary"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="30dp"
+ android:fontFamily="Roboto-Regular"
+ android:textSize="16sp"
+ android:text="@string/pref_tor_bridges_provide_manual_summary"
+ android:maxLines="4" />
+ <include layout="@xml/separator" />
+ </LinearLayout>
+</LinearLayout>
diff --git a/mobile/android/app/src/main/res/layout/tor_bootstrap.xml b/mobile/android/app/src/main/res/layout/tor_bootstrap.xml
new file mode 100644
index 000000000000..af9c7d11d3f2
--- /dev/null
+++ b/mobile/android/app/src/main/res/layout/tor_bootstrap.xml
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@color/tor_bootstrap_background">
+
+ <ImageView android:id="@+id/tor_bootstrap_settings_gear"
+ app:srcCompat="@drawable/ic_settings_24px"
+ android:tint="#ffffffff"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="25dp"
+ android:layout_marginRight="20dp"
+ android:layout_alignParentRight="true" />
+
+ <!-- These three elements are rendered in reverse order -->
+ <TextView android:id="@+id/tor_bootstrap_swipe_log"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:width="301dp"
+ android:height="24dp"
+ android:layout_marginBottom="20dp"
+ android:layout_centerHorizontal="true"
+ android:layout_alignParentBottom="true"
+ android:gravity="center"
+ android:visibility="invisible"
+ android:textSize="14sp"
+ android:fontFamily="Roboto-Regular"
+ android:textColor="#FFFFFFFF"
+ android:lineSpacingMultiplier="1.71"
+ android:text="@string/tor_bootstrap_swipe_for_logs"/>
+
+ <Button android:id="@+id/tor_bootstrap_connect"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="7dp"
+ android:width="144dp"
+ android:height="48dp"
+ android:textSize="14sp"
+ android:layout_above="@id/tor_bootstrap_swipe_log"
+ android:layout_centerHorizontal="true"
+ android:background="@drawable/rounded_corners"
+ android:fontFamily="Roboto-Medium"
+ android:textColor="@color/tor_bootstrap_background"
+ android:lineSpacingMultiplier="1.14"
+ android:text="@string/tor_bootstrap_connect" />
+
+ <TextView android:id="@+id/tor_bootstrap_last_status_message"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:width="301dp"
+ android:height="24dp"
+ android:layout_marginBottom="40dp"
+ android:layout_above="@id/tor_bootstrap_connect"
+ android:layout_centerHorizontal="true"
+ android:gravity="center"
+ android:singleLine="true"
+ android:textSize="14sp"
+ android:fontFamily="RobotoMono-Regular"
+ android:textColor="@android:color/white"
+ android:lineSpacingMultiplier="2"
+ android:visibility="invisible" />
+
+ <!-- Keep the src synchronized with TorBootstrapPanel::stopBootstrapping() -->
+ <ImageView android:id="@+id/tor_bootstrap_onion"
+ app:srcCompat="@drawable/tor_spinning_onion"
+ android:scaleType="fitCenter"
+ android:tint="#ffffffff"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:layout_marginBottom="37dp"
+ android:layout_marginRight="10dp"
+ android:layout_marginLeft="10dp"
+ android:layout_centerHorizontal="true"
+ android:layout_below="@id/tor_bootstrap_settings_gear"
+ android:layout_above="@id/tor_bootstrap_last_status_message" />
+</RelativeLayout>
diff --git a/mobile/android/app/src/main/res/layout/tor_bootstrap_animation_container.xml b/mobile/android/app/src/main/res/layout/tor_bootstrap_animation_container.xml
new file mode 100644
index 000000000000..04dfeb0f3509
--- /dev/null
+++ b/mobile/android/app/src/main/res/layout/tor_bootstrap_animation_container.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<org.mozilla.gecko.torbootstrap.TorBootstrapAnimationContainer xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:gecko="http://schemas.android.com/apk/res-auto"
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:background="@color/tor_bootstrap_background">
+
+ <org.mozilla.gecko.torbootstrap.TorBootstrapPager
+ android:id="@+id/tor_bootstrap_pager"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@color/tor_bootstrap_background">
+
+ </org.mozilla.gecko.torbootstrap.TorBootstrapPager>
+</org.mozilla.gecko.torbootstrap.TorBootstrapAnimationContainer>
diff --git a/mobile/android/app/src/main/res/layout/tor_bootstrap_log.xml b/mobile/android/app/src/main/res/layout/tor_bootstrap_log.xml
new file mode 100644
index 000000000000..c2f02d658d50
--- /dev/null
+++ b/mobile/android/app/src/main/res/layout/tor_bootstrap_log.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@color/tor_bootstrap_background">
+
+
+ <ImageView android:id="@+id/tor_bootstrap_settings_gear"
+ app:srcCompat="@drawable/ic_settings_24px"
+ android:tint="#ffffffff"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="25dp"
+ android:layout_marginRight="20dp"
+ android:layout_alignParentRight="true" />
+
+ <!-- Encapsulate the TextView within the ScrollView so the view is scrollable -->
+ <ScrollView android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:layout_below="@id/tor_bootstrap_settings_gear" >
+ <TextView android:id="@+id/tor_bootstrap_last_status_message"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textColor="@android:color/white"
+ android:fontFamily="RobotoMono-Regular"
+ android:textSize="14sp"
+ android:textIsSelectable="true"
+ android:layout_marginLeft="20dp"
+ android:layout_marginRight="20dp" />
+ </ScrollView>
+</RelativeLayout>
diff --git a/mobile/android/app/src/main/res/xml/preferences_tor_network_main.xml b/mobile/android/app/src/main/res/xml/preferences_tor_network_main.xml
new file mode 100644
index 000000000000..c397bd7c1fc9
--- /dev/null
+++ b/mobile/android/app/src/main/res/xml/preferences_tor_network_main.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:gecko="http://schemas.android.com/apk/res-auto"
+ android:enabled="true">
+ <SwitchPreference android:key="android.not_a_preference.tor.bridges.enabled"
+ android:title="@string/pref_choice_tor_bridges_enabled_title"
+ android:summaryOff="@string/pref_choice_tor_bridges_enabled_summary"
+ android:selectable="false"
+ android:layout="@layout/preference_tor_network_bridges_enabled"
+ android:widgetLayout="@layout/preference_tor_network_bridges_enabled_switch" />
+</PreferenceScreen>
diff --git a/mobile/android/app/src/main/res/xml/preferences_tor_network_provide_bridge.xml b/mobile/android/app/src/main/res/xml/preferences_tor_network_provide_bridge.xml
new file mode 100644
index 000000000000..e8346f4fec63
--- /dev/null
+++ b/mobile/android/app/src/main/res/xml/preferences_tor_network_provide_bridge.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:gecko="http://schemas.android.com/apk/res-auto"
+ android:enabled="true">
+
+
+ <!-- Ideally, this preference would not be needed. We would move the
+ summary into the tor.bridges.provide preference. However, there is
+ a bug in the layout where typing in the text field isn't shown until
+ the user presses the back button. This only occurs when the EditText
+ View is under the first ViewGroup under the ListView. -->
+ <Preference
+ android:layout="@layout/preference_tor_network_bridge_summary"
+ android:selectable="false"
+ android:shouldDisableView="false"
+ android:enabled="false"/>
+
+ <Preference
+ android:key="android.not_a_preference.tor.bridges.provide"
+ android:layout="@layout/preference_tor_network_provide_bridge"
+ android:title="@string/pref_tor_bridges_provide_manual_text_title"
+ android:summary="@string/pref_tor_bridges_provide_manual_summary" />
+</PreferenceScreen>
diff --git a/mobile/android/app/src/main/res/xml/preferences_tor_network_select_bridge_type.xml b/mobile/android/app/src/main/res/xml/preferences_tor_network_select_bridge_type.xml
new file mode 100644
index 000000000000..0bcc18c38997
--- /dev/null
+++ b/mobile/android/app/src/main/res/xml/preferences_tor_network_select_bridge_type.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:gecko="http://schemas.android.com/apk/res-auto"
+ android:enabled="true">
+
+ <Preference
+ android:key="android.not_a_preference.tor.bridges.type"
+ android:layout="@layout/preference_tor_network_select_bridge_type"
+ android:title="@string/pref_tor_bridges_provide_select_text_title"
+ android:summary="@string/pref_choice_tor_bridges_enabled_summary"
+ android:selectable="false"/>
+
+</PreferenceScreen>
diff --git a/mobile/android/base/AndroidManifest.xml.in b/mobile/android/base/AndroidManifest.xml.in
index c60210e0332c..228a7b6399b0 100644
--- a/mobile/android/base/AndroidManifest.xml.in
+++ b/mobile/android/base/AndroidManifest.xml.in
@@ -580,5 +580,10 @@
android:stopWithTask="true">
</service>
+ <activity android:name="org.mozilla.gecko.torbootstrap.TorPreferences"
+ android:theme="@style/Gecko.Preferences"
+ android:configChanges="orientation|screenSize|locale|layoutDirection"
+ android:excludeFromRecents="true"/>
+
</application>
</manifest>
diff --git a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
index e0ef8e9c43d9..da25e3b395be 100644
--- a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
+++ b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
@@ -153,6 +153,7 @@ import org.mozilla.gecko.toolbar.BrowserToolbar;
import org.mozilla.gecko.toolbar.BrowserToolbar.CommitEventSource;
import org.mozilla.gecko.toolbar.BrowserToolbar.TabEditingState;
import org.mozilla.gecko.toolbar.PwaConfirm;
+import org.mozilla.gecko.torbootstrap.TorBootstrapAnimationContainer;
import org.mozilla.gecko.updater.PostUpdateHandler;
import org.mozilla.gecko.updater.UpdateServiceHelper;
import org.mozilla.gecko.util.ActivityUtils;
@@ -255,6 +256,7 @@ public class BrowserApp extends GeckoApp
// We can't name the TabStrip class because it's not included on API 9.
private TabStripInterface mTabStrip;
private AnimatedProgressBar mProgressView;
+ private TorBootstrapAnimationContainer mTorBootstrapAnimationContainer;
private HomeScreen mHomeScreen;
private TabsPanel mTabsPanel;
@@ -390,7 +392,7 @@ public class BrowserApp extends GeckoApp
Log.d(LOGTAG, "BrowserApp.onTabChanged: " + tab.getId() + ": " + msg);
switch (msg) {
case SELECTED:
- if (Tabs.getInstance().isSelectedTab(tab) && mDynamicToolbar.isEnabled()) {
+ if (Tabs.getInstance().isSelectedTab(tab) && mDynamicToolbar.isEnabled() && !isTorBootstrapVisible()) {
final VisibilityTransition transition = (tab.getShouldShowToolbarWithoutAnimationOnFirstSelection()) ?
VisibilityTransition.IMMEDIATE : VisibilityTransition.ANIMATE;
mDynamicToolbar.setVisible(true, transition);
@@ -400,7 +402,7 @@ public class BrowserApp extends GeckoApp
}
// fall through
case LOCATION_CHANGE:
- if (Tabs.getInstance().isSelectedTab(tab)) {
+ if (Tabs.getInstance().isSelectedTab(tab) && !isTorBootstrapVisible()) {
updateHomePagerForTab(tab);
}
@@ -413,7 +415,7 @@ public class BrowserApp extends GeckoApp
if (Tabs.getInstance().isSelectedTab(tab)) {
invalidateOptionsMenu();
- if (mDynamicToolbar.isEnabled()) {
+ if (mDynamicToolbar.isEnabled() && !isTorBootstrapVisible()) {
mDynamicToolbar.setVisible(true, VisibilityTransition.ANIMATE);
}
}
@@ -1191,8 +1193,12 @@ public class BrowserApp extends GeckoApp
final SafeIntent intent = new SafeIntent(getIntent());
if (!IntentUtils.getIsInAutomationFromEnvironment(intent)) {
- // We can't show the first run experience until Gecko has finished initialization (bug 1077583).
- mOnboardingHelper.checkFirstRun();
+ if (mTorNeedsStart) {
+ showTorBootstrapPager();
+ } else {
+ // We can't show the first run experience until Gecko has finished initialization (bug 1077583).
+ mOnboardingHelper.checkFirstRun();
+ }
}
}
@@ -2627,6 +2633,11 @@ public class BrowserApp extends GeckoApp
return (SplashScreen) splashLayout.findViewById(R.id.splash_root);
}
+ private boolean isTorBootstrapVisible() {
+ return (mTorBootstrapAnimationContainer != null && mTorBootstrapAnimationContainer.isVisible()
+ && mHomeScreenContainer != null && mHomeScreenContainer.getVisibility() == View.VISIBLE);
+ }
+
/**
* Enters editing mode with the current tab's URL. There might be no
* tabs loaded by the time the user enters editing mode e.g. just after
@@ -2988,6 +2999,37 @@ public class BrowserApp extends GeckoApp
}
}
+ private void showTorBootstrapPager() {
+
+ if (mTorBootstrapAnimationContainer == null) {
+ // We can't use toggleToolbarChrome() because that uses INVISIBLE, but we need GONE
+ mBrowserChrome.setVisibility(View.GONE);
+ final ViewStub torBootstrapPagerStub = (ViewStub) findViewById(R.id.tor_bootstrap_pager_stub);
+ mTorBootstrapAnimationContainer = (TorBootstrapAnimationContainer) torBootstrapPagerStub.inflate();
+ mTorBootstrapAnimationContainer.load(this, getSupportFragmentManager());
+ mTorBootstrapAnimationContainer.registerOnFinishListener(new TorBootstrapAnimationContainer.OnFinishListener() {
+ @Override
+ public void onFinish() {
+ // Show the chrome again
+ toggleToolbarChrome(true);
+ // When the content loaded in the background (such as about:tor),
+ // it was loaded while mBrowserChrome was GONE. We should refresh the
+ // height now so the page is rendered correctly.
+ Tabs.getInstance().getSelectedTab().doReload(true);
+
+ // If we finished, then Tor bootstrapped 100%
+ mTorNeedsStart = false;
+
+ // When bootstrapping completes, check if the Firstrun (onboarding) screens
+ // should be shown.
+ mOnboardingHelper.checkFirstRun();
+ }
+ });
+ }
+
+ mHomeScreenContainer.setVisibility(View.VISIBLE);
+ }
+
private void showHomePager(String panelId, Bundle panelRestoreData) {
showHomePagerWithAnimator(panelId, panelRestoreData, null);
}
diff --git a/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorBootstrapAnimationContainer.java b/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorBootstrapAnimationContainer.java
new file mode 100644
index 000000000000..188e03df0092
--- /dev/null
+++ b/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorBootstrapAnimationContainer.java
@@ -0,0 +1,82 @@
+/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.gecko.torbootstrap;
+
+import android.app.Activity;
+import android.content.Context;
+import android.support.v4.app.FragmentManager;
+import android.util.AttributeSet;
+
+import android.view.View;
+import android.widget.LinearLayout;
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ObjectAnimator;
+import org.mozilla.gecko.R;
+import org.mozilla.gecko.firstrun.FirstrunAnimationContainer;
+
+/**
+ * A container for the bootstrapping flow.
+ *
+ * Mostly a modified version of FirstrunAnimationContainer
+ */
+public class TorBootstrapAnimationContainer extends FirstrunAnimationContainer {
+
+ public static interface OnFinishListener {
+ public void onFinish();
+ }
+
+ private TorBootstrapPager pager;
+ private boolean visible;
+
+ // Provides a callback so BrowserApp can execute an action
+ // when the bootstrapping is complete and the bootstrapping
+ // screen closes.
+ private OnFinishListener onFinishListener;
+
+ public TorBootstrapAnimationContainer(Context context) {
+ this(context, null);
+ }
+ public TorBootstrapAnimationContainer(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public void load(Activity activity, FragmentManager fm) {
+ visible = true;
+ pager = findViewById(R.id.tor_bootstrap_pager);
+ pager.load(activity, fm, new OnFinishListener() {
+ @Override
+ public void onFinish() {
+ hide();
+ }
+ });
+ }
+
+ public void hide() {
+ visible = false;
+ if (onFinishListener != null) {
+ onFinishListener.onFinish();
+ }
+ animateHide();
+ }
+
+ private void animateHide() {
+ final Animator alphaAnimator = ObjectAnimator.ofFloat(this, "alpha", 0);
+ alphaAnimator.setDuration(150);
+ alphaAnimator.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ TorBootstrapAnimationContainer.this.setVisibility(View.GONE);
+ }
+ });
+
+ alphaAnimator.start();
+ }
+
+ public void registerOnFinishListener(OnFinishListener listener) {
+ onFinishListener = listener;
+ }
+}
diff --git a/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorBootstrapLogPanel.java b/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorBootstrapLogPanel.java
new file mode 100644
index 000000000000..18d827cec216
--- /dev/null
+++ b/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorBootstrapLogPanel.java
@@ -0,0 +1,54 @@
+/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.gecko.torbootstrap;
+
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+import org.mozilla.gecko.R;
+
+/**
+ * Simple subclass of TorBootstrapPanel specifically for showing
+ * Tor and Orbot log entries.
+ */
+public class TorBootstrapLogPanel extends TorBootstrapPanel {
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstance) {
+ mRoot = (ViewGroup) inflater.inflate(R.layout.tor_bootstrap_log, container, false);
+
+ if (mRoot == null) {
+ Log.w(LOGTAG, "Inflating R.layout.tor_bootstrap returned null");
+ return null;
+ }
+
+ TorLogEventListener.addLogger(this);
+
+ return mRoot;
+ }
+
+ @Override
+ public void onViewCreated(View view, Bundle savedInstance) {
+ super.onViewCreated(view, savedInstance);
+ // Inherited from the super class
+ configureGearCogClickHandler();
+ }
+
+ // TODO Add a button for Go-to-bottom
+ @Override
+ public void updateStatus(String torServiceMsg, String newTorStatus) {
+ if (torServiceMsg == null) {
+ return;
+ }
+ TextView torLog = (TextView) mRoot.findViewById(R.id.tor_bootstrap_last_status_message);
+ torLog.append("- " + torServiceMsg + "\n");
+ }
+}
diff --git a/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorBootstrapLogger.java b/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorBootstrapLogger.java
new file mode 100644
index 000000000000..24c9321beb63
--- /dev/null
+++ b/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorBootstrapLogger.java
@@ -0,0 +1,17 @@
+/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.gecko.torbootstrap;
+
+import android.app.Activity;
+
+// Simple interface for a logger.
+//
+// The current implementers are TorBootstrapPanel and
+// TorBootstrapLogPanel.
+public interface TorBootstrapLogger {
+ public void updateStatus(String torServiceMsg, String newTorStatus);
+ public Activity getActivity();
+}
diff --git a/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorBootstrapPager.java b/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorBootstrapPager.java
new file mode 100644
index 000000000000..587806791e52
--- /dev/null
+++ b/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorBootstrapPager.java
@@ -0,0 +1,203 @@
+/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.gecko.torbootstrap;
+
+import android.app.Activity;
+import android.content.Context;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentManager;
+import android.support.v4.app.FragmentPagerAdapter;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.ViewGroup;
+import android.animation.Animator;
+import android.animation.AnimatorSet;
+import android.animation.ObjectAnimator;
+
+import org.mozilla.gecko.firstrun.FirstrunPager;
+
+import java.util.List;
+
+/**
+ * ViewPager containing our bootstrapping pages.
+ *
+ * Based on FirstrunPager for simplicity
+ */
+public class TorBootstrapPager extends FirstrunPager {
+
+ private Context context;
+ private Activity mActivity;
+ protected TorBootstrapPanel.PagerNavigation pagerNavigation;
+
+ public TorBootstrapPager(Context context) {
+ this(context, null);
+ }
+
+ public TorBootstrapPager(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ this.context = context;
+ }
+
+ @Override
+ public void addView(View child, int index, ViewGroup.LayoutParams params) {
+ super.addView(child, index, params);
+ }
+
+ // Load the default (hard-coded) panels from TorBootstrapPagerConfig
+ // Mostly copied from super
+ public void load(Activity activity, FragmentManager fm, final TorBootstrapAnimationContainer.OnFinishListener onFinishListener) {
+ mActivity = activity;
+ final List<TorBootstrapPagerConfig.TorBootstrapPanelConfig> panels = TorBootstrapPagerConfig.getDefaultBootstrapPanel();
+
+ this.pagerNavigation = new TorBootstrapPanel.PagerNavigation() {
+ @Override
+ public void next() {
+ // No-op implementation.
+ }
+
+ @Override
+ public void finish() {
+ if (onFinishListener != null) {
+ onFinishListener.onFinish();
+ }
+ }
+ };
+
+ ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(fm, panels);
+ setAdapter(viewPagerAdapter);
+
+ // The Fragments (Panels) should be attached to a parent View at this point (and
+ // the parent View should be |this|). If the Fragment's getParent() method returns
+ // |null|, then the Fragment was probably instantiated earlier by the FragmentManager
+ // (most likely because the app's state is being restored after it was killed by the
+ // system). If the parent View is not null, then the Fragment was instantiated below
+ // in the ViewPagerAdapter constructor.
+ //
+ // In the case where the Fragment's getParent() is null, then the Fragment was
+ // instantiated before TorBootstrapPager (|this|) was created. As a result, the
+ // fragment wasn't automatically added as a child View of the Pager (|this|) when it
+ // was created. Add the Fragments as children now.
+ //
+ // There may be a more Androidy-way of handling this.
+ for (int i = 0; i < viewPagerAdapter.getCount(); i++) {
+ Fragment fragment = viewPagerAdapter.getItem(i);
+ if (fragment == null) {
+ continue;
+ }
+
+ View fragmentView = fragment.getView();
+ if (fragmentView == null) {
+ continue;
+ }
+
+ if (fragmentView.getParent() == null) {
+ addView(fragmentView);
+ }
+ }
+
+ animateLoad();
+ }
+
+ // Copied from super
+ private void animateLoad() {
+ setTranslationY(500);
+ setAlpha(0);
+
+ final Animator translateAnimator = ObjectAnimator.ofFloat(this, "translationY", 0);
+ translateAnimator.setDuration(400);
+
+ final Animator alphaAnimator = ObjectAnimator.ofFloat(this, "alpha", 1);
+ alphaAnimator.setStartDelay(200);
+ alphaAnimator.setDuration(600);
+
+ final AnimatorSet set = new AnimatorSet();
+ set.playTogether(alphaAnimator, translateAnimator);
+ set.setStartDelay(400);
+
+ set.start();
+ }
+
+ // Provide an interface for inter-panel communication allowing
+ // the logging panel to stop the bootstrapping animation on the
+ // main panel.
+ public interface TorBootstrapController {
+ void startBootstrapping();
+ void stopBootstrapping();
+ }
+
+ // Mostly copied from FirstrunPager
+ protected class ViewPagerAdapter extends FragmentPagerAdapter implements TorBootstrapController {
+ private final List<TorBootstrapPagerConfig.TorBootstrapPanelConfig> panels;
+ private final Fragment[] fragments;
+
+ public ViewPagerAdapter(FragmentManager fm, List<TorBootstrapPagerConfig.TorBootstrapPanelConfig> panels) {
+ super(fm);
+ this.panels = panels;
+ this.fragments = getPagerPanels(fm);
+ }
+
+ private Fragment[] getPagerPanels(FragmentManager fm) {
+ Fragment[] fragments = new Fragment[panels.size()];
+ for (int i = 0; i < fragments.length; i++) {
+ TorBootstrapPagerConfig.TorBootstrapPanelConfig panelConfig = panels.get(i);
+
+ // Fragment tag is created as "android:switcher:" + viewId + ":" + id
+ // where |viewId| is the ID of the parent View container (in this case
+ // TorBootstrapPager is the parent View of the panels), and |id| is the
+ // position within the pager (in this case, it is |i| here)
+ // https://android.googlesource.com/platform/frameworks/support/+/refs/heads/m…
+ String fragmentTag = "android:switcher:" + TorBootstrapPager.this.getId() + ":" + i;
+
+ // If the Activity is being restored, then find the existing fragment. If the
+ // fragment doesn't exist, then instantiate it.
+ fragments[i] = fm.findFragmentByTag(fragmentTag);
+ if (fragments[i] == null) {
+ // We know the class is within the "org.mozilla.gecko.torbootstrap" package namespace
+ fragments[i] = Fragment.instantiate(mActivity.getApplicationContext(), panelConfig.getClassname());
+ }
+
+ ((TorBootstrapPanel) fragments[i]).setPagerNavigation(pagerNavigation);
+ ((TorBootstrapPanel) fragments[i]).setContext(mActivity);
+ ((TorBootstrapPanel) fragments[i]).setBootstrapController(this);
+ }
+ return fragments;
+ }
+
+ @Override
+ public Fragment getItem(int i) {
+ return fragments[i];
+ }
+
+ @Override
+ public int getCount() {
+ return panels.size();
+ }
+
+ public void startBootstrapping() {
+ if (fragments.length == 0) {
+ return;
+ }
+
+ TorBootstrapPanel mainPanel = (TorBootstrapPanel) getItem(0);
+ if (mainPanel == null) {
+ return;
+ }
+ mainPanel.startBootstrapping();
+ }
+
+ public void stopBootstrapping() {
+ if (fragments.length == 0) {
+ return;
+ }
+
+ TorBootstrapPanel mainPanel = (TorBootstrapPanel) getItem(0);
+ if (mainPanel == null) {
+ return;
+ }
+ mainPanel.stopBootstrapping();
+ }
+ }
+}
diff --git a/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorBootstrapPagerConfig.java b/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorBootstrapPagerConfig.java
new file mode 100644
index 000000000000..17454da91444
--- /dev/null
+++ b/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorBootstrapPagerConfig.java
@@ -0,0 +1,48 @@
+/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.gecko.torbootstrap;
+
+import android.util.Log;
+import org.mozilla.gecko.GeckoSharedPrefs;
+
+import java.util.LinkedList;
+import java.util.List;
+
+public class TorBootstrapPagerConfig {
+ public static final String LOGTAG = "TorBootstrapPagerConfig";
+
+ public static final String KEY_IMAGE = "imageRes";
+ public static final String KEY_TEXT = "textRes";
+ public static final String KEY_SUBTEXT = "subtextRes";
+ public static final String KEY_CTATEXT = "ctatextRes";
+
+ public static List<TorBootstrapPanelConfig> getDefaultBootstrapPanel() {
+ final List<TorBootstrapPanelConfig> panels = new LinkedList<>();
+ panels.add(SimplePanelConfigs.bootstrapPanelConfig);
+ panels.add(SimplePanelConfigs.torLogPanelConfig);
+
+ return panels;
+ }
+
+ public static class TorBootstrapPanelConfig {
+
+ private String classname;
+
+ public TorBootstrapPanelConfig(String classname) {
+ this.classname = classname;
+ }
+
+ public String getClassname() {
+ return this.classname;
+ }
+ }
+
+ private static class SimplePanelConfigs {
+ public static final TorBootstrapPanelConfig bootstrapPanelConfig = new TorBootstrapPanelConfig(TorBootstrapPanel.class.getName());
+ public static final TorBootstrapPanelConfig torLogPanelConfig = new TorBootstrapPanelConfig(TorBootstrapLogPanel.class.getName());
+
+ }
+}
diff --git a/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorBootstrapPanel.java b/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorBootstrapPanel.java
new file mode 100644
index 000000000000..54b1c41b1a9f
--- /dev/null
+++ b/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorBootstrapPanel.java
@@ -0,0 +1,575 @@
+/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.gecko.torbootstrap;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.graphics.drawable.Drawable;
+import android.os.Build;
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.support.v4.content.LocalBroadcastManager;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewTreeObserver;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.TextView;
+import android.util.Log;
+import org.mozilla.gecko.R;
+import org.mozilla.gecko.Telemetry;
+import org.mozilla.gecko.TelemetryContract;
+import org.mozilla.gecko.firstrun.FirstrunPanel;
+
+import org.torproject.android.service.OrbotConstants;
+import org.torproject.android.service.TorService;
+import org.torproject.android.service.TorServiceConstants;
+import org.torproject.android.service.util.TorServiceUtils;
+
+
+/**
+ * Tor Bootstrap panel (fragment/screen)
+ *
+ * This is based on the Firstrun Panel for simplicity.
+ */
+public class TorBootstrapPanel extends FirstrunPanel implements TorBootstrapLogger {
+
+ protected static final String LOGTAG = "TorBootstrap";
+
+ protected ViewGroup mRoot;
+ protected Activity mActContext;
+ protected TorBootstrapPager.TorBootstrapController mBootstrapController;
+
+ private ViewTreeLayoutListener mViewTreeLayoutListener;
+
+ // These are used by the background AlphaChanging thread for dynamically changing
+ // the alpha value of the Onion during bootstrap.
+ private int mOnionCurrentAlpha = 255;
+ // This is either +1 or -1, depending on the direction of the change.
+ private int mOnionCurrentAlphaDirection = -1;
+ private Object mOnionAlphaChangerLock = new Object();
+ private boolean mOnionAlphaChangerRunning = false;
+
+ // Runnable for changing the alpha of the Onion image every 100 milliseconds.
+ // It gradually increases and then decreases the alpha in the background and
+ // then applies the new alpha on the UI thread.
+ private Thread mChangeOnionAlphaThread = null;
+ final private class ChangeOnionAlphaRunnable implements Runnable {
+ @Override
+ public void run() {
+ while (true) {
+ synchronized(mOnionAlphaChangerLock) {
+ // Stop the animation and terminate this thread if the main thread
+ // set |mOnionAlphaChangerRunning| to |false| or if
+ // getActivity() returns |null|.
+ if (!mOnionAlphaChangerRunning || getActivity() == null) {
+ // Null the reference for this thread when we exit
+ mChangeOnionAlphaThread = null;
+ return;
+ }
+ }
+
+ // Choose the new value here, mOnionCurrentAlpha is set in setOnionAlphaValue()
+ // Increase by 5 if mOnionCurrentAlphaDirection is positive, and decrease by
+ // 5 if mOnionCurrentAlphaDirection is negative.
+ final int newAlpha = mOnionCurrentAlpha + mOnionCurrentAlphaDirection*5;
+ getActivity().runOnUiThread(new Runnable() {
+ public void run() {
+ setOnionAlphaValue(newAlpha);
+ }
+ });
+
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException e) {}
+ }
+ }
+ }
+
+ // Android tries scaling the image as a square. Create a modified ViewPort via padding
+ // top, left, right, and bottom such that the image aspect ratio is correct.
+ private void setOnionImgLayout() {
+ if (mRoot == null) {
+ Log.i(LOGTAG, "setOnionImgLayout: mRoot is null");
+ return;
+ }
+
+ ImageView onionImg = (ImageView) mRoot.findViewById(R.id.tor_bootstrap_onion);
+ if (onionImg == null) {
+ Log.i(LOGTAG, "setOnionImgLayout: onionImg is null");
+ return;
+ }
+
+ // Dimensions of the SVG. If the image is ever changed, update these values. The
+ // SVG viewport is 2dp wider due to clipping.
+ final double imgHeight = 289.;
+ final double imgWidth = 247.;
+
+ // Dimensions of the current ImageView
+ final int currentHeight = onionImg.getHeight();
+ final int currentWidth = onionImg.getWidth();
+
+ // If we only consider one dimension of the image, calculate the expected value
+ // of the other dimension (width vs. height).
+ final int expectedHeight = (int) (currentWidth*imgHeight/imgWidth);
+ final int expectedWidth = (int) (currentHeight*imgWidth/imgHeight);
+
+ // Set current values as default.
+ int newWidth = currentWidth;
+ int newHeight = currentHeight;
+
+ Log.d(LOGTAG, "Current Top=" + onionImg.getTop());
+ Log.d(LOGTAG, "Current Height=" + currentHeight);
+ Log.d(LOGTAG, "Current Width=" + currentWidth);
+ Log.d(LOGTAG, "Expected height=" + expectedHeight);
+ Log.d(LOGTAG, "Expected width=" + expectedWidth);
+
+ // Configure the width or height based on its expected value. This is based on
+ // the intuition that:
+ // - If the device is in portrait mode, then the device's height is (likely)
+ // greater than its width. When this is the case, then:
+ // - The image's View object is likely using all available vertical area
+ // (but the image is bounded by the width of the device due to
+ // maintaining the scaling factor).
+ // - However, the height and width of the graphic are equal (because
+ // Android enforces this).
+ // - The width should be less than the height (this is a property of
+ // the image itself).
+ // - The width should be proportional to the imgHeight and imgWidth
+ // defined above.
+ // Adjust the height when the current width is less than the expected width.
+ // The width is the limiting-factor, therefore choose the height proportional
+ // to the current width.
+ //
+ // - The opposite is likely true when the device is in landscape mode with
+ // respect to the height and width. Adjust the width when the height is less
+ // than the expected height. The height is the limiting-factor, therefore
+ // choose the width proportional to the current height.
+ //
+ // Subtract 1 from the expected value as a way of accounting for rounding
+ // error.
+ if (currentWidth < (expectedWidth - 1)) {
+ newHeight = expectedHeight;
+ } else if (currentHeight < (expectedHeight - 1)) {
+ newWidth = expectedWidth;
+ }
+
+ Log.d(LOGTAG, "New height=" + newHeight);
+ Log.d(LOGTAG, "New width=" + newWidth);
+
+ // Define the padding as the available space between the current height (as it
+ // is displayed to the user) and the new height (as it was calculated above).
+ int verticalPadding = currentHeight - newHeight;
+ int sidePadding = currentWidth - newWidth;
+ int leftPadding = 0;
+ int topPadding = 0;
+ int bottomPadding = 0;
+ int rightPadding = 0;
+
+ // If the width of the image is greater than 600dp, then cap it at 702x600 (HxW).
+ // Furthermore, if the width is "near" 600dp (within 100dp), then decrease the
+ // dimensions to 468x400 dp. This should "look" better on lower-resolution
+ // devices.
+ final int MAXIMUM_WIDTH = 600;
+ final int distanceFromMaxWidth = newWidth - MAXIMUM_WIDTH;
+ final boolean isNearMaxWidth = Math.abs(distanceFromMaxWidth) < 100;
+ if ((newWidth > MAXIMUM_WIDTH) || isNearMaxWidth) {
+ if (isNearMaxWidth) {
+ // If newWidth is near MAX_WIDTH, then add additional padding (therefore
+ // decreasing the width by an additional 200dp).
+ sidePadding += 200;
+ }
+
+ final int paddingSpaceAvailable = (distanceFromMaxWidth > 0) ? distanceFromMaxWidth : 0;
+ sidePadding += paddingSpaceAvailable;
+
+ final int newWidthWithoutPadding = currentWidth - sidePadding;
+
+ final int newHeightWithoutPadding = (int) (newWidthWithoutPadding*imgHeight/imgWidth);
+
+ Log.d(LOGTAG, "New width without padding=" + newWidthWithoutPadding);
+ Log.d(LOGTAG, "New height without padding=" + newHeightWithoutPadding);
+
+ verticalPadding = currentHeight - newHeightWithoutPadding;
+ }
+
+ Log.d(LOGTAG, "New top padding=" + verticalPadding);
+ Log.d(LOGTAG, "New side padding=" + sidePadding);
+
+ if (verticalPadding < 0) {
+ Log.i(LOGTAG, "vertical padding is " + verticalPadding);
+ verticalPadding = 0;
+ } else {
+ // Place 4/5 of padding at top, and 1/5 of padding at bottom.
+ topPadding = (verticalPadding*4)/5;
+ bottomPadding = verticalPadding/5;
+ }
+
+ if (sidePadding < 0) {
+ Log.i(LOGTAG, "side padding is " + sidePadding);
+ leftPadding = 0;
+ rightPadding = 0;
+ } else {
+ // Divide the padding equally on the left and right side.
+ leftPadding = sidePadding/2;
+ rightPadding = leftPadding;
+ }
+
+ // Create a padding-box around the image and let Android fill the box with
+ // the image. Android will scale the width and height independently, so the
+ // end result should be a correctly-sized graphic.
+ onionImg.setPadding(leftPadding, topPadding, rightPadding, bottomPadding);
+
+ // Separately scale x- and y-dimension.
+ onionImg.setScaleType(ImageView.ScaleType.FIT_XY);
+
+ // Invalidate the view because the image disappears (is not redrawn) sometimes when
+ // the screen is rotated.
+ onionImg.invalidate();
+ }
+
+ private class ViewTreeLayoutListener implements ViewTreeObserver.OnGlobalLayoutListener {
+ @Override
+ public void onGlobalLayout() {
+ TorBootstrapPanel.this.setOnionImgLayout();
+ }
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstance) {
+ mRoot = (ViewGroup) inflater.inflate(R.layout.tor_bootstrap, container, false);
+ if (mRoot == null) {
+ Log.w(LOGTAG, "Inflating R.layout.tor_bootstrap returned null");
+ return null;
+ }
+
+ Button connectButton = mRoot.findViewById(R.id.tor_bootstrap_connect);
+ if (connectButton == null) {
+ Log.w(LOGTAG, "Finding the Connect button failed. Did the ID change?");
+ return null;
+ }
+
+ connectButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ startBootstrapping();
+ }
+ });
+
+ if (Build.VERSION.SDK_INT > 20) {
+ // Round the button's edges, but only on API 21+. Earlier versions
+ // do not support this.
+ //
+ // This should be declared in the xml layout, however there is a bug
+ // preventing this (the XML attribute isn't actually defined in the
+ // SDK).
+ // https://issuetracker.google.com/issues/37036728
+ connectButton.setClipToOutline(true);
+ }
+
+ configureGearCogClickHandler();
+
+ TorLogEventListener.addLogger(this);
+
+ // Add a callback for notification when the layout is complete and all components
+ // are measured. Waiting until the layout is complete is necessary before we correctly
+ // set the size of the onion. Cache the listener so we may remove it later.
+ mViewTreeLayoutListener = new ViewTreeLayoutListener();
+ mRoot.getViewTreeObserver().addOnGlobalLayoutListener(mViewTreeLayoutListener);
+
+ return mRoot;
+ }
+
+ @Override
+ public void onDestroyView() {
+ // Inform the background AlphaChanging thread it should terminate.
+ synchronized(mOnionAlphaChangerLock) {
+ mOnionAlphaChangerRunning = false;
+ }
+
+ super.onDestroyView();
+ }
+
+ private void setOnionAlphaValue(int newAlpha) {
+ ImageView onionImg = (ImageView) mRoot.findViewById(R.id.tor_bootstrap_onion);
+ if (onionImg == null) {
+ return;
+ }
+
+ if (newAlpha > 255) {
+ // Cap this at 255 and change direction of animation
+ newAlpha = 255;
+
+ synchronized(mOnionAlphaChangerLock) {
+ mOnionCurrentAlphaDirection = -1;
+ }
+ } else if (newAlpha < 0) {
+ // Lower-bound this at 0 and change direction of animation
+ newAlpha = 0;
+
+ synchronized(mOnionAlphaChangerLock) {
+ mOnionCurrentAlphaDirection = 1;
+ }
+ }
+ onionImg.setImageAlpha(newAlpha);
+ mOnionCurrentAlpha = newAlpha;
+ }
+
+ public void updateStatus(String torServiceMsg, String newTorStatus) {
+ final String noticePrefix = "NOTICE: ";
+
+ if (torServiceMsg == null) {
+ return;
+ }
+
+ TextView torLog = (TextView) mRoot.findViewById(R.id.tor_bootstrap_last_status_message);
+ if (torLog == null) {
+ Log.w(LOGTAG, "updateStatus: torLog is null?");
+ }
+ // Only show Notice-level log messages on this panel
+ if (torServiceMsg.startsWith(noticePrefix)) {
+ // Drop the prefix
+ String msg = torServiceMsg.substring(noticePrefix.length());
+ torLog.setText(msg);
+ } else if (torServiceMsg.toLowerCase().contains("error")) {
+ torLog.setText(R.string.tor_notify_user_about_error);
+
+ // This may be a false-positive, but if we encountered an error within
+ // the OrbotService then there's likely nothing the user can do. This
+ // isn't persistent, so if they restart the app the button will be
+ // visible again.
+ Button connectButton = mRoot.findViewById(R.id.tor_bootstrap_connect);
+ if (connectButton == null) {
+ Log.w(LOGTAG, "updateStatus: Finding the Connect button failed. Did the ID change?");
+ } else {
+ TextView swipeLeftLog = (TextView) mRoot.findViewById(R.id.tor_bootstrap_swipe_log);
+ if (swipeLeftLog == null) {
+ Log.w(LOGTAG, "updateStatus: swipeLeftLog is null?");
+ }
+
+ // Abuse this by showing the log message despite not bootstrapping
+ toggleVisibleElements(true, torLog, connectButton, swipeLeftLog);
+ }
+ }
+
+ // Return to the browser when we reach 100% bootstrapped
+ if (torServiceMsg.contains(TorServiceConstants.TOR_CONTROL_PORT_MSG_BOOTSTRAP_DONE)) {
+ // Inform the background AlphaChanging thread it should terminate
+ synchronized(mOnionAlphaChangerLock) {
+ mOnionAlphaChangerRunning = false;
+ }
+ close();
+
+ // Remove the listener when we're done
+ mRoot.getViewTreeObserver().removeOnGlobalLayoutListener(mViewTreeLayoutListener);
+ }
+ }
+
+ public void setContext(Activity ctx) {
+ mActContext = ctx;
+ }
+
+ // Save the TorBootstrapController.
+ // This method won't be used by the main TorBootstrapPanel (|this|), but
+ // it will be used by its childen.
+ public void setBootstrapController(TorBootstrapPager.TorBootstrapController bootstrapController) {
+ mBootstrapController = bootstrapController;
+ }
+
+ private void startTorService() {
+ Intent torService = new Intent(getActivity(), TorService.class);
+ torService.setAction(TorServiceConstants.ACTION_START);
+ getActivity().startService(torService);
+ }
+
+ private void stopTorService() {
+ // First, stop the current bootstrapping process (if it's in progress)
+ // TODO Ideally, we'd DisableNetwork here, but that's not available.
+ Intent torService = new Intent(getActivity(), TorService.class);
+ getActivity().stopService(torService);
+ }
+
+ // Setup OnClick handler for the settings gear/cog
+ protected void configureGearCogClickHandler() {
+ if (mRoot == null) {
+ Log.w(LOGTAG, "configureGearCogClickHandler: mRoot is null?");
+ return;
+ }
+
+ final ImageView gearSettingsImage = mRoot.findViewById(R.id.tor_bootstrap_settings_gear);
+ if (gearSettingsImage == null) {
+ Log.w(LOGTAG, "configureGearCogClickHandler: gearSettingsImage is null?");
+ return;
+ }
+
+ gearSettingsImage.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ // The existance of the connect button is an indicator of the user
+ // interacting with the main bootstrapping screen or the loggin screen.
+ Button connectButton = mRoot.findViewById(R.id.tor_bootstrap_connect);
+ if (connectButton == null) {
+ Log.w(LOGTAG, "gearSettingsImage onClick: Finding the Connect button failed, proxying request.");
+
+ // If there isn't a connect button on this screen, then proxy the
+ // stopBootstrapping() request via the TorBootstrapController (which
+ // is the underlying PagerAdapter).
+ mBootstrapController.stopBootstrapping();
+ } else {
+ stopBootstrapping();
+ }
+ // Open Tor Network Settings preferences screen
+ Intent intent = new Intent(mActContext, TorPreferences.class);
+ mActContext.startActivity(intent);
+ }
+ });
+ }
+
+ private void toggleVisibleElements(boolean bootstrapping, TextView lastStatus, Button connect, TextView swipeLeft) {
+ final int connectVisible = bootstrapping ? View.INVISIBLE : View.VISIBLE;
+ final int infoTextVisible = bootstrapping ? View.VISIBLE : View.INVISIBLE;
+
+ if (connect != null) {
+ connect.setVisibility(connectVisible);
+ }
+ if (lastStatus != null) {
+ lastStatus.setVisibility(infoTextVisible);
+ }
+ if (swipeLeft != null) {
+ swipeLeft.setVisibility(infoTextVisible);
+ }
+ }
+
+ private void startBackgroundAlphaChangingThread() {
+ // If it is non-null, then this is a bug because the thread should null this reference when
+ // it terminates.
+ if (mChangeOnionAlphaThread != null) {
+ if (mChangeOnionAlphaThread.getState() == Thread.State.TERMINATED) {
+ // The thread likely terminated unexpectedly, null the reference.
+ // The thread should set this itself.
+ Log.i(LOGTAG, "mChangeOnionAlphaThread.getState(): is terminated");
+ mChangeOnionAlphaThread = null;
+ } else {
+ // The reference is not nulled in this case because another
+ // background thread would start otherwise. The thread is currently in
+ // an unknown state, simply set the Running flag as false.
+ Log.w(LOGTAG, "We're in an unexpected state. mChangeOnionAlphaThread.getState(): " + mChangeOnionAlphaThread.getState());
+
+ synchronized(mOnionAlphaChangerLock) {
+ mOnionAlphaChangerRunning = false;
+ }
+ }
+ }
+
+ // If the background thread is not currently running, then start it.
+ if (mChangeOnionAlphaThread == null) {
+ mChangeOnionAlphaThread = new Thread(new ChangeOnionAlphaRunnable());
+ if (mChangeOnionAlphaThread == null) {
+ Log.w(LOGTAG, "Instantiating a new ChangeOnionAlphaRunnable Thread failed.");
+ } else if (mChangeOnionAlphaThread.getState() == Thread.State.NEW) {
+ Log.i(LOGTAG, "Starting mChangeOnionAlphaThread");
+
+ // Synchronization across threads should not be necessary because there
+ // shouldn't be any other threads relying on mOnionAlphaChangerRunning.
+ // Do this purely for safety.
+ synchronized(mOnionAlphaChangerLock) {
+ mOnionAlphaChangerRunning = true;
+ }
+
+ mChangeOnionAlphaThread.start();
+ }
+ }
+ }
+
+ public void startBootstrapping() {
+ if (mRoot == null) {
+ Log.w(LOGTAG, "startBootstrapping: mRoot is null?");
+ return;
+ }
+ // Start bootstrap process and transition into the bootstrapping-tor-panel
+ Button connectButton = mRoot.findViewById(R.id.tor_bootstrap_connect);
+ if (connectButton == null) {
+ Log.w(LOGTAG, "startBootstrapping: connectButton is null?");
+ return;
+ }
+
+ ImageView onionImg = (ImageView) mRoot.findViewById(R.id.tor_bootstrap_onion);
+
+ Drawable drawableOnion = onionImg.getDrawable();
+
+ mOnionCurrentAlpha = 255;
+ // The onion should have 100% alpha, begin decreasing it.
+ mOnionCurrentAlphaDirection = -1;
+ startBackgroundAlphaChangingThread();
+
+ TextView torStatus = (TextView) mRoot.findViewById(R.id.tor_bootstrap_last_status_message);
+ if (torStatus == null) {
+ Log.w(LOGTAG, "startBootstrapping: torStatus is null?");
+ return;
+ }
+
+ TextView swipeLeftLog = (TextView) mRoot.findViewById(R.id.tor_bootstrap_swipe_log);
+ if (swipeLeftLog == null) {
+ Log.w(LOGTAG, "startBootstrapping: swipeLeftLog is null?");
+ return;
+ }
+
+ torStatus.setText(getString(R.string.tor_bootstrap_starting_status));
+
+ toggleVisibleElements(true, torStatus, connectButton, swipeLeftLog);
+ startTorService();
+ }
+
+ // This is public because this Pager may call this method if another Panel requests it.
+ public void stopBootstrapping() {
+ if (mRoot == null) {
+ Log.w(LOGTAG, "stopBootstrapping: mRoot is null?");
+ return;
+ }
+ // Transition from the animated bootstrapping panel to
+ // the static "Connect" panel
+ Button connectButton = mRoot.findViewById(R.id.tor_bootstrap_connect);
+ if (connectButton == null) {
+ Log.w(LOGTAG, "stopBootstrapping: connectButton is null?");
+ return;
+ }
+
+ ImageView onionImg = (ImageView) mRoot.findViewById(R.id.tor_bootstrap_onion);
+ if (onionImg == null) {
+ Log.w(LOGTAG, "stopBootstrapping: onionImg is null?");
+ return;
+ }
+
+ // Inform the background AlphaChanging thread it should terminate.
+ synchronized(mOnionAlphaChangerLock) {
+ mOnionAlphaChangerRunning = false;
+ }
+
+ Drawable drawableOnion = onionImg.getDrawable();
+
+ // Reset the onion's alpha value.
+ onionImg.setImageAlpha(255);
+
+ TextView torStatus = (TextView) mRoot.findViewById(R.id.tor_bootstrap_last_status_message);
+ if (torStatus == null) {
+ Log.w(LOGTAG, "stopBootstrapping: torStatus is null?");
+ return;
+ }
+
+ TextView swipeLeftLog = (TextView) mRoot.findViewById(R.id.tor_bootstrap_swipe_log);
+ if (swipeLeftLog == null) {
+ Log.w(LOGTAG, "stopBootstrapping: swipeLeftLog is null?");
+ return;
+ }
+
+ // Reset the displayed message
+ torStatus.setText("");
+
+ toggleVisibleElements(false, torStatus, connectButton, swipeLeftLog);
+ stopTorService();
+ }
+}
diff --git a/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorLogEventListener.java b/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorLogEventListener.java
new file mode 100644
index 000000000000..6218763475e5
--- /dev/null
+++ b/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorLogEventListener.java
@@ -0,0 +1,128 @@
+/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.gecko.torbootstrap;
+
+import android.app.Activity;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Handler;
+import android.os.Message;
+import android.support.v4.content.LocalBroadcastManager;
+
+import org.torproject.android.service.OrbotConstants;
+import org.torproject.android.service.TorService;
+import org.torproject.android.service.TorServiceConstants;
+import org.torproject.android.service.util.TorServiceUtils;
+
+import java.util.Vector;
+
+
+/**
+ * This is simply a container for capturing the log events and proxying them
+ * to the TorBootstrapLogger implementers (TorBootstrapPanel and TorBootstrapLogPanel now).
+ *
+ * This should be in BrowserApp, but that class/Activity is already too large,
+ * so this should be easier to reason about.
+ */
+public class TorLogEventListener {
+
+ private static Vector<TorBootstrapLogger> mLoggers;
+
+ private TorLogEventListener instance;
+ private static boolean isInitialized = false;
+
+ public TorLogEventListener getInstance(Context context) {
+ if (instance == null) {
+ instance = new TorLogEventListener();
+ }
+ return instance;
+ }
+
+ private synchronized static void initialize(Context context) {
+ LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(context);
+ lbm.registerReceiver(mLocalBroadcastReceiver,
+ new IntentFilter(TorServiceConstants.ACTION_STATUS));
+ lbm.registerReceiver(mLocalBroadcastReceiver,
+ new IntentFilter(TorServiceConstants.LOCAL_ACTION_LOG));
+
+ isInitialized = true;
+ // There should be at least two Loggers: TorBootstrapPanel
+ // and TorBootstrapLogPanel
+ mLoggers = new Vector<TorBootstrapLogger>(2);
+ }
+
+ public synchronized static void addLogger(TorBootstrapLogger logger) {
+ if (!isInitialized) {
+ // This is an assumption we're making. All Loggers are a subclass
+ // of an Activity.
+ Activity activity = logger.getActivity();
+ initialize(activity);
+ }
+
+ if (mLoggers.contains(logger)) {
+ return;
+ }
+ mLoggers.add(logger);
+ }
+
+ public synchronized static void deleteLogger(TorBootstrapLogger logger) {
+ mLoggers.remove(logger);
+ }
+
+ /**
+ * The state and log info from {@link TorService} are sent to the UI here in
+ * the form of a local broadcast. Regular broadcasts can be sent by any app,
+ * so local ones are used here so other apps cannot interfere with Orbot's
+ * operation.
+ *
+ * Copied from Orbot - OrbotMainActivity.java
+ */
+ private static BroadcastReceiver mLocalBroadcastReceiver = new BroadcastReceiver() {
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (action == null) {
+ return;
+ }
+
+ // This is only defined for log updates
+ if (!action.equals(TorServiceConstants.LOCAL_ACTION_LOG) &&
+ !action.equals(TorServiceConstants.ACTION_STATUS)) {
+ return;
+ }
+
+ Message msg = mStatusUpdateHandler.obtainMessage();
+
+ if (action.equals(TorServiceConstants.LOCAL_ACTION_LOG)) {
+ msg.obj = intent.getStringExtra(TorServiceConstants.LOCAL_EXTRA_LOG);
+ }
+
+ msg.getData().putString("status",
+ intent.getStringExtra(TorServiceConstants.EXTRA_STATUS));
+ mStatusUpdateHandler.sendMessage(msg);
+ }
+ };
+
+
+ // this is what takes messages or values from the callback threads or other non-mainUI threads
+ // and passes them back into the main UI thread for display to the user
+ private static Handler mStatusUpdateHandler = new Handler() {
+
+ @Override
+ public void handleMessage(final Message msg) {
+ String newTorStatus = msg.getData().getString("status");
+ String log = (String)msg.obj;
+
+ for (TorBootstrapLogger l : mLoggers) {
+ l.updateStatus(log, newTorStatus);
+ }
+ super.handleMessage(msg);
+ }
+ };
+}
diff --git a/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorPreferences.java b/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorPreferences.java
new file mode 100644
index 000000000000..9e74c49f3f91
--- /dev/null
+++ b/mobile/android/base/java/org/mozilla/gecko/torbootstrap/TorPreferences.java
@@ -0,0 +1,975 @@
+/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.gecko.torbootstrap;
+
+
+import android.app.Activity;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.graphics.Typeface;
+import android.os.Bundle;
+import android.preference.Preference;
+import android.preference.PreferenceFragment;
+import android.preference.PreferenceScreen;
+import android.preference.SwitchPreference;
+import android.support.v7.app.ActionBar;
+import android.text.style.ClickableSpan;
+import android.text.SpannableString;
+import android.text.Spanned;
+import android.text.method.LinkMovementMethod;
+import android.view.LayoutInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewGroup.LayoutParams;
+import android.view.ViewParent;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.LinearLayout;
+import android.widget.ListView;
+import android.widget.AdapterView;
+import android.widget.RadioButton;
+import android.widget.RadioGroup;
+import android.widget.Switch;
+import android.widget.TextView;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.util.Xml;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Vector;
+
+import org.mozilla.gecko.R;
+import org.mozilla.gecko.preferences.AppCompatPreferenceActivity;
+
+import org.torproject.android.service.util.Prefs;
+
+import org.xmlpull.v1.XmlPullParser;
+
+import static org.mozilla.gecko.preferences.GeckoPreferences.NON_PREF_PREFIX;
+
+
+/** TorPreferences provides the Tor-related preferences
+ *
+ * We configure bridges using either a set of built-in bridges where the user enables
+ * them based on bridge type (the name of the pluggable transport) or the user provides
+ * their own bridge (obtained from another person or BridgeDB, etc).
+ *
+ * This class (TorPreferences) is divided into multiple Fragments (screens). The first
+ * screen is where the user enables or disables Bridges. The second screen shows the
+ * user a list of built-in bridge types (obfs4, meek, etc) where they may select one of
+ * them. It shows a button they may press for providing their own bridge, as well. The
+ * third screen is where the user may provide (copy/paste) their own bridge.
+ *
+ * On the first screen, if bridges are currently enabled, then the switch/toggle is
+ * shown as enabled. In addition, the user is shown a message saying whether built-in or
+ * provided bridges are being used. There is a link, labeled "Change", where they
+ * transitioned to the appropriate screen for modifying the configuration if it is pressed.
+ *
+ * The second screen shows radio buttons for the built-in bridge types.
+ *
+ * The State of Bridges-Enabled:
+ * There are a few moving parts here, a higher-level description of how we expect this
+ * works, where "Enabled" is "Bridges Enabled", "Type" is "Bridge Type", and "Provided"
+ * is "Bridge Provided":
+ *
+ * We have five preferences:
+ * PREFS_BRIDGES_ENABLED
+ * PREFS_BRIDGES_TYPE
+ * PREFS_BRIDGES_PROVIDE
+ * pref_bridges_enabled (tor-android-service)
+ * pref_bridges_list (tor-android-service)
+ *
+ * These may be in following three end states where PREFS_BRIDGES_ENABLED and
+ * pref_bridges_enabled must always match, and pref_bridges_list must either match
+ * PREFS_BRIDGES_PROVIDE or contain type PREFS_BRIDGES_TYPE.
+ *
+ * PREFS_BRIDGES_ENABLED=false
+ * PREFS_BRIDGES_TYPE=null
+ * PREFS_BRIDGES_PROVIDE=null
+ * pref_bridges_enabled=false
+ * pref_bridges_list=null
+ *
+ * PREFS_BRIDGES_ENABLED=true
+ * PREFS_BRIDGES_TYPE=T1
+ * PREFS_BRIDGES_PROVIDE=null
+ * pref_bridges_enabled=true
+ * pref_bridges_list=T1
+ *
+ * PREFS_BRIDGES_ENABLED=true
+ * PREFS_BRIDGES_TYPE=null
+ * PREFS_BRIDGES_PROVIDE=X2
+ * pref_bridges_enabled=true
+ * pref_bridges_list=X2
+ *
+ * There are transition states where this is not consistent, for example when the
+ * "Bridges Enabled" switch is toggled but "Bridge Type" and "Bridge Provided" are null.
+ */
+
+public class TorPreferences extends AppCompatPreferenceActivity {
+ private static final String LOGTAG = "TorPreferences";
+
+ private static final String PREFS_BRIDGES_ENABLED = NON_PREF_PREFIX + "tor.bridges.enabled";
+ private static final String PREFS_BRIDGES_TYPE = NON_PREF_PREFIX + "tor.bridges.type";
+ private static final String PREFS_BRIDGES_PROVIDE = NON_PREF_PREFIX + "tor.bridges.provide";
+
+ private static final String[] sTorPreferenceFragments = {TorPreferences.TorNetworkBridgesEnabledPreference.class.getName(),
+ TorPreferences.TorNetworkBridgeSelectPreference.class.getName(),
+ TorPreferences.TorNetworkBridgeProvidePreference.class.getName()};
+ // Current displayed PreferenceFragment
+ private TorNetworkPreferenceFragment mFrag;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ // Begin with the first (Enable Bridges) fragment
+ getIntent().putExtra(EXTRA_SHOW_FRAGMENT, TorPreferences.TorNetworkBridgesEnabledPreference.class.getName());
+ getIntent().putExtra(EXTRA_NO_HEADERS, true);
+ super.onCreate(savedInstanceState);
+
+ mFrag = null;
+ }
+
+ // Save the current preference when the app is minimized or swiped away.
+ @Override
+ public void onStop() {
+ if (mFrag != null) {
+ mFrag.onSaveState();
+ }
+ super.onStop();
+ }
+
+ // This is needed because launching a fragment fails if this
+ // method doesn't return true.
+ @Override
+ protected boolean isValidFragment(String fragmentName) {
+ for (String frag : sTorPreferenceFragments) {
+ if (fragmentName.equals(frag)) {
+ return true;
+ }
+ }
+ Log.i(LOGTAG, "isValidFragment(): Returning false (" + fragmentName + ")");
+ return false;
+ }
+
+ public void setFragment(TorNetworkPreferenceFragment frag) {
+ mFrag = frag;
+ }
+
+ // Save the preference when the user returns to the previous screen using
+ // the back button
+ @Override
+ public void onBackPressed() {
+ if (mFrag != null) {
+ mFrag.onSaveState();
+ }
+ super.onBackPressed();
+ }
+
+ // Control the behavior when the Up button (back button in top-left
+ // corner) is pressed. Save the current preference and return to the
+ // previous screen.
+ @Override
+ public boolean onNavigateUp() {
+ super.onNavigateUp();
+
+ if (mFrag == null) {
+ Log.w(LOGTAG, "onNavigateUp(): mFrag is null");
+ return false;
+ }
+
+ // Handle the user pressing the Up button in the same way as
+ // we handle them pressing the Back button. Strictly, this
+ // isn't correct, but it will prevent confusion.
+ mFrag.onSaveState();
+
+ if (mFrag.getFragmentManager().getBackStackEntryCount() > 0) {
+ Log.i(LOGTAG, "onNavigateUp(): popping from backstatck");
+ mFrag.getFragmentManager().popBackStack();
+ } else {
+ Log.i(LOGTAG, "onNavigateUp(): finishing activity");
+ finish();
+ }
+ return true;
+ }
+
+ // Overriding this method is necessary because before Oreo the PreferenceActivity didn't
+ // correctly handle the Home button (Up button). This was implemented in Oreo (Android 8+,
+ // API 26+).
+ // https://android.googlesource.com/platform/frameworks/base/+/6af15ebcfec64d0…
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ if (item != null && item.getItemId() == android.R.id.home) {
+ Log.i(LOGTAG, "onOptionsItemSelected(): Home");
+ onNavigateUp();
+ return true;
+ }
+
+ return super.onOptionsItemSelected(item);
+ }
+
+ // Helper abstract Fragment with common methods
+ public static abstract class TorNetworkPreferenceFragment extends PreferenceFragment {
+ protected TorPreferences mTorPrefAct;
+
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+
+ // This is only ever a TorPreferences
+ mTorPrefAct = (TorPreferences) getActivity();
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ mTorPrefAct.setFragment(this);
+ }
+
+ // Implement this callback in child Fragments
+ public void onSaveState() {
+ }
+
+ // Helper method for walking a View hierarchy and printing the children
+ protected void walkViewTree(View view, int depth) {
+ if (view instanceof ViewGroup) {
+ ViewGroup vg = (ViewGroup) view;
+ int childIdx = 0;
+ for (; childIdx < vg.getChildCount(); childIdx++) {
+ walkViewTree(vg.getChildAt(childIdx), depth + 1);
+ }
+ }
+ Log.i(LOGTAG, "walkViewTree: " + depth + ": view: " + view);
+ Log.i(LOGTAG, "walkViewTree: " + depth + ": view id: " + view.getId());
+ Log.i(LOGTAG, "walkViewTree: " + depth + ": view is focused: " + view.isFocused());
+ Log.i(LOGTAG, "walkViewTree: " + depth + ": view is enabled: " + view.isEnabled());
+ Log.i(LOGTAG, "walkViewTree: " + depth + ": view is selected: " + view.isSelected());
+ Log.i(LOGTAG, "walkViewTree: " + depth + ": view is in touch mode: " + view.isInTouchMode());
+ Log.i(LOGTAG, "walkViewTree: " + depth + ": view is activated: " + view.isActivated());
+ Log.i(LOGTAG, "walkViewTree: " + depth + ": view is clickable: " + view.isClickable());
+ Log.i(LOGTAG, "walkViewTree: " + depth + ": view is focusable: " + view.isFocusable());
+ Log.i(LOGTAG, "walkViewTree: " + depth + ": view is FocusableInTouchMode: " + view.isFocusableInTouchMode());
+ }
+
+ // Helper returning the ListView
+ protected ListView getListView(View view) {
+ if (!(view instanceof ViewGroup) || view == null) {
+ return null;
+ }
+
+ View rawListView = view.findViewById(android.R.id.list);
+ if (!(rawListView instanceof ListView) || rawListView == null) {
+ return null;
+ }
+
+ return (ListView) rawListView;
+ }
+
+ // Get Bridges associated with the provided pref key saved in the
+ // provided SharedPreferences. Return null if the SharedPreferences
+ // is null or if there isn't any value associated with the pref.
+ protected String getBridges(SharedPreferences sharedPrefs, String pref) {
+ if (sharedPrefs == null) {
+ Log.w(LOGTAG, "getBridges: sharedPrefs is null");
+ return null;
+ }
+ return sharedPrefs.getString(pref, null);
+ }
+
+ // Save the bridge type and bridge line preferences.
+ //
+ // Save the bridgesType with the PREFS_BRIDGES_TYPE pref as the key
+ // (for future lookup). If bridgesType is null, then save the
+ // bridgesLines with the PREFS_BRIDGES_PROVIDE pref as the key, and
+ // use tor-android-service's helper method and enable
+ // tor-android-service's bridge pref.
+ protected boolean setBridges(SharedPreferences.Editor editor, String bridgesType, String bridgesLines) {
+ if (editor == null) {
+ Log.w(LOGTAG, "setBridges: editor is null");
+ return false;
+ }
+ Log.i(LOGTAG, "Saving bridge type preference: " + bridgesType);
+ Log.i(LOGTAG, "Saving bridge line preference: " + bridgesLines);
+
+ // If bridgesType is null, then clear the pref and save the bridgesLines
+ // as a provided bridge. If bridgesType is not null, then save the type
+ // but don't save it as a provided bridge.
+ editor.putString(PREFS_BRIDGES_TYPE, bridgesType);
+ if (bridgesType == null) {
+ editor.putString(PREFS_BRIDGES_PROVIDE, bridgesLines);
+ } else {
+ editor.putString(PREFS_BRIDGES_PROVIDE, null);
+ }
+
+ if (!editor.commit()) {
+ return false;
+ }
+
+ // Set tor-android service's preference
+ Prefs.setBridgesList(bridgesLines);
+
+ // If either of these are not null, then we're enabling bridges
+ boolean bridgesAreEnabled = (bridgesType != null) || (bridgesLines != null);
+ // Inform tor-android-service bridges are enabled
+ Prefs.putBridgesEnabled(bridgesAreEnabled);
+ return true;
+ }
+
+ // Disable the bridges.enabled Preference
+ protected void disableBridges(PreferenceFragment frag) {
+ if (frag == null) {
+ Log.w(LOGTAG, "disableBridges: frag is null");
+ return;
+ }
+
+ SwitchPreference bridgesEnabled = (SwitchPreference) frag.findPreference(PREFS_BRIDGES_ENABLED);
+ Preference bridgesType = frag.findPreference(PREFS_BRIDGES_TYPE);
+ Preference bridgesProvide = frag.findPreference(PREFS_BRIDGES_PROVIDE);
+ Preference pref = null;
+
+ if (bridgesEnabled != null) {
+ Log.i(LOGTAG, "disableBridges: bridgesEnabled is not null");
+ pref = bridgesEnabled;
+ } else if (bridgesType != null) {
+ Log.i(LOGTAG, "disableBridges: bridgesType is not null");
+ pref = bridgesType;
+ } else if (bridgesProvide != null) {
+ Log.i(LOGTAG, "disableBridges: bridgesProvide is not null");
+ pref = bridgesProvide;
+ } else {
+ Log.w(LOGTAG, "disableBridges: all of the expected preferences are null?");
+ return;
+ }
+
+ // Clear the saved prefs (it's okay we're using a different
+ // SharedPreference.Editor here, they modify the same backend).
+ // In addition, passing null is equivalent to clearing the
+ // preference.
+ setBridges(pref.getEditor(), null, null);
+
+ if (bridgesEnabled != null) {
+ bridgesEnabled.setChecked(false);
+ }
+ }
+
+ // Set the current title
+ protected void setTitle(int resId) {
+ ActionBar actionBar = mTorPrefAct.getSupportActionBar();
+
+ if (actionBar == null) {
+ Log.w(LOGTAG, "setTitle: actionBar is null");
+ return;
+ }
+
+ actionBar.setTitle(resId);
+ }
+ }
+
+ // Fragment implementing the screen for enabling Bridges
+ public static class TorNetworkBridgesEnabledPreference extends TorNetworkPreferenceFragment {
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ addPreferencesFromResource(R.xml.preferences_tor_network_main);
+ }
+
+ // This class is instantiated within the OnClickListener of the
+ // PreferenceSwitch's Switch widget
+ public class BridgesEnabledSwitchOnClickListener implements View.OnClickListener {
+ @Override
+ public void onClick(View v) {
+ Log.i(LOGTAG, "bridgesEnabledSwitch clicked");
+ if (!(v instanceof Switch)) {
+ Log.w(LOGTAG, "View isn't an instance of Switch?");
+ return;
+ }
+
+ Switch bridgesEnabledSwitch = (Switch) v;
+
+ // The widget was pressed, now find the preference and set it
+ // such that it is synchronized with the widget.
+ final SwitchPreference bridgesEnabled = (SwitchPreference) TorNetworkBridgesEnabledPreference.this.findPreference(PREFS_BRIDGES_ENABLED);
+ if (bridgesEnabled == null) {
+ Log.w(LOGTAG, "onClick: bridgesEnabled is null?");
+ return;
+ }
+
+ bridgesEnabled.setChecked(bridgesEnabledSwitch.isChecked());
+
+ // Only launch the Fragment if we're enabling bridges.
+ if (bridgesEnabledSwitch.isChecked()) {
+ TorNetworkBridgesEnabledPreference.this.mTorPrefAct.startPreferenceFragment(new TorNetworkBridgeSelectPreference(), true);
+ } else {
+ disableBridges(TorNetworkBridgesEnabledPreference.this);
+ }
+ }
+ }
+
+ // This method must be overridden because, when creating Preferences, the
+ // creation of the View hierarchy occurs asynchronously. Usually
+ // onCreateView() gives us the View hierarchy as it is defined in the XML layout.
+ // However, with Preferences the layout is created across multiple threads and it
+ // usually isn't available at the time onCreateView() or onViewCreated() are
+ // called. As a result, we find the ListView (which is almost guaranteed to exist
+ // at this time) and we add an OnHierarchyChangeListener where we wait until the
+ // children are added into the tree.
+ @Override
+ public void onViewCreated(View view, Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+
+ final SwitchPreference bridgesEnabled = (SwitchPreference) findPreference(PREFS_BRIDGES_ENABLED);
+ if (bridgesEnabled == null) {
+ Log.w(LOGTAG, "onViewCreated: bridgesEnabled is null?");
+ return;
+ }
+
+ // If we return from either of the "Select Bridge Type" screen
+ // or "Provide Bridge" screen without selecting or inputing
+ // any value, then we could arrive here without any bridge
+ // saved/enabled but this switch is enabled. Disable it.
+ if (!Prefs.bridgesEnabled()) {
+ bridgesEnabled.setChecked(false);
+ }
+
+ // Decide if the configured bridges were provided by the user or
+ // selected from the list of bridge types
+ if (isBridgeProvided(bridgesEnabled)) {
+ String newSummary = getString(R.string.pref_tor_network_bridges_enabled_change_custom);
+ setBridgesEnabledSummaryAndOnClickListener(bridgesEnabled, newSummary, true);
+ } else if (Prefs.bridgesEnabled()) {
+ // If isBridgeProvided() returned false, but Prefs.bridgesEnabled() returns true.
+ // This means we have bridges, but they weren't provided by the user - therefore
+ // they must be built-in bridges.
+ String newSummary = getString(R.string.pref_tor_network_bridges_enabled_change_builtin);
+ setBridgesEnabledSummaryAndOnClickListener(bridgesEnabled, newSummary, false);
+ }
+
+ ListView lv = getListView(view);
+ if (lv == null) {
+ Log.i(LOGTAG, "onViewCreated: ListView not found");
+ return;
+ }
+
+ lv.setOnHierarchyChangeListener(new ViewGroup.OnHierarchyChangeListener() {
+
+ @Override
+ public void onChildViewAdded(View parent, View child) {
+ Log.i(LOGTAG, "onChildViewAdded: Adding ListView child view");
+
+ setTitle(R.string.pref_tor_network_title);
+
+ // Make sure the Switch widget is synchronized with the preference
+ final Switch bridgesEnabledSwitch =
+ (Switch) parent.findViewById(android.R.id.switch_widget);
+
+ if (bridgesEnabledSwitch != null) {
+ bridgesEnabledSwitch.setChecked(bridgesEnabled.isChecked());
+
+ // When the Switch is pressed by the user, either load the next
+ // fragment (where the user chooses a bridge type), or return to
+ // the main bootstrapping screen.
+ bridgesEnabledSwitch.setOnClickListener(new BridgesEnabledSwitchOnClickListener());
+ }
+
+ final TextView bridgesEnabledSummary =
+ (TextView) parent.findViewById(android.R.id.summary);
+ if (bridgesEnabledSummary == null) {
+ Log.w(LOGTAG, "Bridge Enabled Summary is null, we can't enable the span");
+ return;
+ }
+
+ // Make the ClickableSpan clickable within the TextView.
+ // This is a requirement for using a ClickableSpan in
+ // setBridgesEnabledSummaryAndOnClickListener().
+ bridgesEnabledSummary.setMovementMethod(LinkMovementMethod.getInstance());
+ }
+
+ @Override
+ public void onChildViewRemoved(View parent, View child) {
+ }
+ });
+ }
+
+ // This is a common OnClickListener for when the user clicks on the Change link.
+ // The span won't be clickable until the MovementMethod is set. This happens in
+ // onViewCreated within the OnHierarchyChangeListener we set on the ListView.
+ private void setBridgesEnabledSummaryAndOnClickListener(SwitchPreference bridgesEnabled, final String newSummary, final boolean custom) {
+ Log.i(LOGTAG, "Bridge Summary clicked");
+ if (bridgesEnabled == null) {
+ Log.w(LOGTAG, "Bridge Enabled switch is null");
+ return;
+ }
+
+ // Here we obtain the correct text, based on whether the bridges
+ // were provided (custom) or built-in. Using that text, we create
+ // a spannable string and find the substring "Change" within it.
+ // If it exists, we make that substring clickable.
+ // Note: TODO This breaks with localization.
+ if (newSummary == null) {
+ Log.w(LOGTAG, "R.string.pref_tor_network_bridges_enabled_change_builtin is null");
+ return;
+ }
+ int changeStart = newSummary.indexOf("Change");
+ if (changeStart == -1) {
+ Log.w(LOGTAG, "R.string.pref_tor_network_bridges_enabled_change_builtin doesn't contain 'Change'");
+ return;
+ }
+ SpannableString newSpannableSummary = new SpannableString(newSummary);
+ newSpannableSummary.setSpan(new ClickableSpan() {
+ @Override
+ public void onClick(View v) {
+ // If a custom (provided) bridge is configured, then
+ // open the BridgesProvide preference fragment. Else,
+ // open the built-in/bridge-type fragment.
+ Log.i(LOGTAG, "Span onClick!");
+
+ // Add this Fragment regardless of which Fragment we're showing next. If the Change
+ // link goes to the built-in bridges, then this is what we show the user. If the Change
+ // link goes to the provided bridges, then we consider this a deep-link and we inject the
+ // built-in bridges screen into the backstack so they are shown it when they press Back
+ // from the provided-bridges screen.
+ mTorPrefAct.startPreferenceFragment(new
+ TorNetworkBridgeSelectPreference(), true);
+
+ if (custom) {
+ mTorPrefAct.startPreferenceFragment(new
+ TorNetworkBridgeProvidePreference(), true);
+ }
+ }
+ },
+ // Begin the span
+ changeStart,
+ // End the span
+ newSummary.length(),
+ // Don't include new characters added into the spanned substring
+ Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+
+ bridgesEnabled.setSummaryOn(newSpannableSummary);
+ }
+
+ // We follow this logic:
+ // If the bridgesEnabled switch is off, then false
+ // If tor-android-service doesn't have bridges enabled, then false
+ // If PREFS_BRIDGES_PROVIDE is not null, then true
+ // Else false
+ private boolean isBridgeProvided(SwitchPreference bridgesEnabled) {
+ if (bridgesEnabled == null) {
+ Log.i(LOGTAG, "isBridgeProvided: bridgesEnabled is null");
+ return false;
+ }
+
+ if (!bridgesEnabled.isChecked()) {
+ Log.i(LOGTAG, "isBridgeProvided: bridgesEnabled is not checked");
+ return false;
+ }
+
+ if (!Prefs.bridgesEnabled()) {
+ Log.i(LOGTAG, "isBridgeProvided: bridges are not enabled");
+ return false;
+ }
+ SharedPreferences sharedPrefs = bridgesEnabled.getSharedPreferences();
+ boolean hasBridgeProvide =
+ sharedPrefs.getString(PREFS_BRIDGES_PROVIDE, null) != null;
+
+ Log.i(LOGTAG, "isBridgeProvided: We have provided bridges: " + hasBridgeProvide);
+ return hasBridgeProvide;
+ }
+ }
+
+ // Fragment implementing the screen for selecting a built-in Bridge type
+ public static class TorNetworkBridgeSelectPreference extends TorNetworkPreferenceFragment {
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ addPreferencesFromResource(R.xml.preferences_tor_network_select_bridge_type);
+ }
+
+ // Add OnClickListeners after the View is created
+ @Override
+ public void onViewCreated(View view, Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+
+ ListView lv = getListView(view);
+ if (lv == null) {
+ Log.i(LOGTAG, "onViewCreated: ListView not found");
+ return;
+ }
+
+ // Configure onClick handler for "Provide a Bridge" button
+ lv.setOnHierarchyChangeListener(new ViewGroup.OnHierarchyChangeListener() {
+
+ @Override
+ public void onChildViewAdded(View parent, View child) {
+ setTitle(R.string.pref_tor_select_a_bridge_title);
+
+ // Set the previously chosen RadioButton as checked
+ final RadioGroup group = getBridgeTypeRadioGroup();
+ if (group == null) {
+ Log.w(LOGTAG, "Radio Group is null");
+ return;
+ }
+
+ final View titleAndSummaryView = parent.findViewById(R.id.title_and_summary);
+ if (titleAndSummaryView == null) {
+ Log.w(LOGTAG, "title and summary view is null");
+ group.setVisibility(View.VISIBLE);
+ return;
+ }
+
+ titleAndSummaryView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ group.setVisibility(View.VISIBLE);
+ }
+ });
+
+ final View provideABridge = parent.findViewById(R.id.tor_network_provide_a_bridge);
+ if (provideABridge == null) {
+ return;
+ }
+
+ provideABridge.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Log.i(LOGTAG, "bridgesProvide clicked");
+ saveCurrentCheckedRadioButton();
+
+ mTorPrefAct.startPreferenceFragment(new TorNetworkBridgeProvidePreference(), true);
+ }
+ });
+
+ final TextView provideABridgeSummary = (TextView) parent.findViewById(R.id.tor_network_provide_a_bridge_summary);
+ if (provideABridgeSummary == null) {
+ Log.i(LOGTAG, "provideABridgeSummary is null");
+ return;
+ }
+
+ Preference bridgesTypePref = findPreference(PREFS_BRIDGES_TYPE);
+ if (bridgesTypePref == null) {
+ return;
+ }
+
+ SharedPreferences sharedPrefs = bridgesTypePref.getSharedPreferences();
+ String provideBridges = sharedPrefs.getString(PREFS_BRIDGES_PROVIDE, null);
+ if (provideBridges != null) {
+ if (provideBridges.indexOf("\n") != -1) {
+ provideABridgeSummary.setText(R.string.pref_tor_network_using_multiple_provided_bridges);
+ } else {
+ String summary = getString(R.string.pref_tor_network_using_a_provided_bridge, provideBridges);
+ provideABridgeSummary.setText(summary);
+ }
+ }
+
+ final String configuredBridgeType = getBridges(bridgesTypePref.getSharedPreferences(), PREFS_BRIDGES_TYPE);
+ if (configuredBridgeType == null) {
+ return;
+ }
+
+ int buttonId = -1;
+ // Note: Keep these synchronized with the layout xml file.
+ switch (configuredBridgeType) {
+ case "obfs4":
+ buttonId = R.id.radio_pref_bridges_obfs4;
+ break;
+ case "meek":
+ buttonId = R.id.radio_pref_bridges_meek_azure;
+ break;
+ case "obfs3":
+ buttonId = R.id.radio_pref_bridges_obfs3;
+ break;
+ }
+
+ if (buttonId != -1) {
+ group.check(buttonId);
+ // If a bridge is selected, then make the list visible
+ group.setVisibility(View.VISIBLE);
+ }
+ }
+
+ @Override
+ public void onChildViewRemoved(View parent, View child) {
+ }
+ });
+
+ }
+
+ // Save the checked RadioButton in the SharedPreferences
+ private boolean saveCurrentCheckedRadioButton() {
+ ListView lv = getListView(getView());
+ if (lv == null) {
+ Log.w(LOGTAG, "ListView is null");
+ return false;
+ }
+
+ RadioGroup group = getBridgeTypeRadioGroup();
+ if (group == null) {
+ Log.w(LOGTAG, "RadioGroup is null");
+ return false;
+ }
+
+ int checkedId = group.getCheckedRadioButtonId();
+ RadioButton selectedBridgeType = lv.findViewById(checkedId);
+ if (selectedBridgeType == null) {
+ Log.w(LOGTAG, "RadioButton is null");
+ return false;
+ }
+
+ String bridgesType = selectedBridgeType.getText().toString();
+ if (bridgesType == null) {
+ // We don't know with which bridgesType this Id is associated
+ Log.w(LOGTAG, "RadioButton has null text");
+ return false;
+ }
+
+ // Currently obfs4 is the recommended pluggable transport. As a result,
+ // the text contains " (recommended)". This won't be expected elsewhere,
+ // so replace the string with only the pluggable transport name.
+ // This will need updating when another transport is "recommended".
+ //
+ // Similarly, if meek-azure is chosen, substitute it with "meek"
+ // (tor-android-service only handles these keywords specially if
+ // they are less than 5 characters).
+ if (bridgesType.contains("obfs4")) {
+ bridgesType = "obfs4";
+ } else if (bridgesType.contains("meek-azure")) {
+ bridgesType = "meek";
+ }
+
+ Preference bridgesTypePref = findPreference(PREFS_BRIDGES_TYPE);
+ if (bridgesTypePref == null) {
+ Log.w(LOGTAG, PREFS_BRIDGES_TYPE + " preference not found");
+ disableBridges(this);
+ return false;
+ }
+
+ if (!setBridges(bridgesTypePref.getEditor(), bridgesType, bridgesType)) {
+ Log.w(LOGTAG, "Saving Bridge preference failed.");
+ disableBridges(this);
+ return false;
+ }
+
+ return true;
+ }
+
+ // Handle onSaveState when the user presses Back. Save the selected
+ // built-in bridge type.
+ @Override
+ public void onSaveState() {
+ saveCurrentCheckedRadioButton();
+ }
+
+ // Find the RadioGroup within the View hierarchy now.
+ private RadioGroup getBridgeTypeRadioGroup() {
+ ListView lv = getListView(getView());
+ if (lv == null) {
+ Log.w(LOGTAG, "ListView is null");
+ return null;
+ }
+ ViewParent listViewParent = lv.getParent();
+ // If the parent of this ListView isn't a View, then
+ // the RadioGroup doesn't exist
+ if (!(listViewParent instanceof View)) {
+ Log.w(LOGTAG, "ListView's parent isn't a View. Failing");
+ return null;
+ }
+ View lvParent = (View) listViewParent;
+ // Find the RadioGroup with this View hierarchy.
+ return (RadioGroup) lvParent.findViewById(R.id.pref_radio_group_builtin_bridges_type);
+ }
+ }
+
+ // Fragment implementing the screen for providing a Bridge
+ public static class TorNetworkBridgeProvidePreference extends TorNetworkPreferenceFragment {
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ addPreferencesFromResource(R.xml.preferences_tor_network_provide_bridge);
+ }
+
+ // If there is a provided bridge saved in the preference,
+ // then fill-in the text field with that value.
+ private void setBridgeProvideText(View parent) {
+ final View provideBridge1 = parent.findViewById(R.id.tor_network_provide_bridge1);
+ final View provideBridge2 = parent.findViewById(R.id.tor_network_provide_bridge2);
+ final View provideBridge3 = parent.findViewById(R.id.tor_network_provide_bridge3);
+
+ EditText provideBridge1ET = null;
+ EditText provideBridge2ET = null;
+ EditText provideBridge3ET = null;
+
+ if (provideBridge1 != null) {
+ if (provideBridge1 instanceof EditText) {
+ provideBridge1ET = (EditText) provideBridge1;
+ }
+ }
+
+ if (provideBridge2 != null) {
+ if (provideBridge2 instanceof EditText) {
+ provideBridge2ET = (EditText) provideBridge2;
+ }
+ }
+
+ if (provideBridge3 != null) {
+ if (provideBridge3 instanceof EditText) {
+ provideBridge3ET = (EditText) provideBridge3;
+ }
+ }
+
+ Preference bridgesProvide = findPreference(PREFS_BRIDGES_PROVIDE);
+ if (bridgesProvide != null) {
+ Log.i(LOGTAG, "setBridgeProvideText: bridgesProvide isn't null");
+ String bridgesLines = getBridges(bridgesProvide.getSharedPreferences(), PREFS_BRIDGES_PROVIDE);
+ if (bridgesLines != null) {
+ Log.i(LOGTAG, "setBridgeProvideText: bridgesLines isn't null");
+ if (bridgesLines.contains("\n")) {
+ String[] lines = bridgesLines.split("\n");
+ if (provideBridge1ET != null && lines.length >= 1) {
+ provideBridge1ET.setText(lines[0]);
+ }
+ if (provideBridge2ET != null && lines.length >= 2) {
+ provideBridge2ET.setText(lines[1]);
+ }
+ if (provideBridge3ET != null && lines.length >= 3) {
+ provideBridge3ET.setText(lines[2]);
+ }
+ } else {
+ // Simply set the single line as the text field input if the text field exists.
+ if (provideBridge1ET != null) {
+ provideBridge1ET.setText(bridgesLines);
+ }
+ }
+ }
+ }
+ }
+
+ // See explanation of TorNetworkBridgesEnabledPreference.onViewCreated()
+ @Override
+ public void onViewCreated(View view, Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+ ListView lv = getListView(view);
+ if (lv == null) {
+ Log.i(LOGTAG, "onViewCreated: ListView not found");
+ return;
+ }
+ // The ListView is given "focus" by default when the EditText
+ // field is selected, this prevents typing anything into the field.
+ // We set FOCUS_AFTER_DESCENDANTS so the ListView's children are
+ // given focus (and, therefore, the EditText) before it is
+ // given focus.
+ lv.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
+
+ // The preferences are adding into the ListView hierarchy asynchronously.
+ // We need the onChildViewAdded callback so we can modify the layout after
+ // the child is added.
+ lv.setOnHierarchyChangeListener(new ViewGroup.OnHierarchyChangeListener() {
+ @Override
+ public void onChildViewAdded(View parent, View child) {
+ setTitle(R.string.pref_tor_provide_a_bridge_title);
+
+ // If we have a bridge line saved for this pref,
+ // then show the user
+ setBridgeProvideText(parent);
+ }
+
+ @Override
+ public void onChildViewRemoved(View parent, View child) {
+ }
+ });
+ }
+
+ private String getBridgeLineFromView(View provideBridge) {
+ if (provideBridge != null) {
+ if (provideBridge instanceof EditText) {
+ Log.i(LOGTAG, "onSaveState: Saving bridge");
+ EditText provideBridgeET = (EditText) provideBridge;
+
+ // Get the bridge line (provided text) from the text
+ // field.
+ String bridgesLine = provideBridgeET.getText().toString();
+ if (bridgesLine != null && !bridgesLine.equals("")) {
+ return bridgesLine;
+ }
+ } else {
+ Log.w(LOGTAG, "onSaveState: provideBridge isn't an EditText");
+ }
+ }
+ return null;
+ }
+
+ // Save EditText field value when the Back button or Up button are pressed.
+ @Override
+ public void onSaveState() {
+ ListView lv = getListView(getView());
+ if (lv == null) {
+ Log.i(LOGTAG, "onSaveState: ListView not found");
+ return;
+ }
+
+ final View provideBridge1 = lv.findViewById(R.id.tor_network_provide_bridge1);
+ final View provideBridge2 = lv.findViewById(R.id.tor_network_provide_bridge2);
+ final View provideBridge3 = lv.findViewById(R.id.tor_network_provide_bridge3);
+
+ String bridgesLines = null;
+ String bridgesLine1 = getBridgeLineFromView(provideBridge1);
+ String bridgesLine2 = getBridgeLineFromView(provideBridge2);
+ String bridgesLine3 = getBridgeLineFromView(provideBridge3);
+
+ if (bridgesLine1 != null) {
+ Log.i(LOGTAG, "bridgesLine1 is not null.");
+ bridgesLines = bridgesLine1;
+ }
+
+ if (bridgesLine2 != null) {
+ Log.i(LOGTAG, "bridgesLine2 is not null.");
+ if (bridgesLines != null) {
+ // If bridgesLine1 was not null, then append a newline.
+ bridgesLines += "\n" + bridgesLine2;
+ } else {
+ bridgesLines = bridgesLine2;
+ }
+ }
+
+ if (bridgesLine3 != null) {
+ Log.i(LOGTAG, "bridgesLine3 is not null.");
+ if (bridgesLines != null) {
+ // If bridgesLine1 or bridgesLine2 were not null, then append a newline.
+ bridgesLines += "\n" + bridgesLine3;
+ } else {
+ bridgesLines = bridgesLine3;
+ }
+ }
+
+ Preference bridgesProvide = findPreference(PREFS_BRIDGES_PROVIDE);
+ if (bridgesProvide == null) {
+ Log.w(LOGTAG, PREFS_BRIDGES_PROVIDE + " preference not found");
+ disableBridges(this);
+ return;
+ }
+
+ if (bridgesLines == null) {
+ // If provided bridges are null/empty, then only disable all bridges if
+ // the user did not select a built-in bridge
+ String configuredBuiltinBridges = getBridges(bridgesProvide.getSharedPreferences(), PREFS_BRIDGES_TYPE);
+ if (configuredBuiltinBridges == null) {
+ Log.i(LOGTAG, "Custom bridges are empty. Disabling.");
+ disableBridges(this);
+ }
+ return;
+ }
+
+ // Set the preferences (both our preference and
+ // tor-android-service's preference)
+ Log.w(LOGTAG, "Saving Bridge preference: " + bridgesLines);
+ if (!setBridges(bridgesProvide.getEditor(), null, bridgesLines)) {
+ // TODO inform the user
+ Log.w(LOGTAG, "Saving Bridge preference failed.");
+ disableBridges(this);
+ }
+ }
+ }
+}
1
0

31 Aug '19
commit 8c4c10af480ea9c232b4fc64712141af8e96f3da
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Fri Aug 30 14:20:47 2019 -0400
Bug 31010 - Don't use addTrustedTab on mobile
---
chrome/content/torbutton.js | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/chrome/content/torbutton.js b/chrome/content/torbutton.js
index 756c2c7c..6209b6b8 100644
--- a/chrome/content/torbutton.js
+++ b/chrome/content/torbutton.js
@@ -1861,9 +1861,10 @@ function showSecurityPreferencesPanel(chromeWindow) {
if (settingsTab === null) {
// Open up the settings panel in a new tab.
- tabBrowser.addTrustedTab(SECURITY_PREFERENCES_URI, {
+ tabBrowser.addTab(SECURITY_PREFERENCES_URI, {
"selected": true,
"parentId": tabBrowser.selectedTab.id,
+ triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal(),
});
} else {
// Activate an existing settings panel tab.
1
0

[torbutton/master] Merge remote-tracking branch 'sysrqb/bug31010_00'
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit 0efb110e9bc65e3289c58d093c32a25877f61e0b
Merge: 72aad504 8c4c10af
Author: Georg Koppen <gk(a)torproject.org>
Date: Sat Aug 31 19:37:41 2019 +0000
Merge remote-tracking branch 'sysrqb/bug31010_00'
chrome/content/torbutton.js | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 31563: force reloading search extensions if extensions.enabledScopes has changed
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit dc1c60e81e6d23560d597c390eed48b2331f005c
Author: Alex Catarineu <acat(a)torproject.org>
Date: Sat Aug 31 16:23:20 2019 +0200
Bug 31563: force reloading search extensions if extensions.enabledScopes has changed
---
toolkit/components/search/SearchService.jsm | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/toolkit/components/search/SearchService.jsm b/toolkit/components/search/SearchService.jsm
index 419ab822264e..6d6314c6cd4f 100644
--- a/toolkit/components/search/SearchService.jsm
+++ b/toolkit/components/search/SearchService.jsm
@@ -924,6 +924,7 @@ SearchService.prototype = {
let locale = Services.locale.requestedLocale;
let buildID = Services.appinfo.platformBuildID;
let appVersion = Services.appinfo.version;
+ let enabledScopes = Services.prefs.getIntPref("extensions.enabledScopes", -1);
// Allows us to force a cache refresh should the cache format change.
cache.version = CACHE_VERSION;
@@ -937,6 +938,10 @@ SearchService.prototype = {
cache.appVersion = appVersion;
cache.locale = locale;
+ // Bug 31563: we want to force reloading engines if extensions.enabledScopes
+ // pref changes
+ cache.enabledScopes = enabledScopes;
+
cache.visibleDefaultEngines = this._visibleDefaultEngines;
cache.metaData = this._metaData;
cache.engines = [];
@@ -1025,7 +1030,8 @@ SearchService.prototype = {
cache.buildID != buildID ||
cache.visibleDefaultEngines.length !=
this._visibleDefaultEngines.length ||
- this._visibleDefaultEngines.some(notInCacheVisibleEngines);
+ this._visibleDefaultEngines.some(notInCacheVisibleEngines) ||
+ cache.enabledScopes !== Services.prefs.getIntPref("extensions.enabledScopes", -1);
if (!rebuildCache) {
SearchUtils.log("_loadEngines: loading from cache directories");
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] squash! TB4: Tor Browser's Firefox preference overrides.
by gk@torproject.org 30 Aug '19
by gk@torproject.org 30 Aug '19
30 Aug '19
commit 8aabfb8128a8125a00d0a36d41518379258e0b38
Author: Alex Catarineu <acat(a)torproject.org>
Date: Tue Jun 11 16:29:27 2019 +0200
squash! TB4: Tor Browser's Firefox preference overrides.
Bug 28896: Enable extensions in private browsing by default
---
browser/app/profile/000-tor-browser.js | 2 ++
1 file changed, 2 insertions(+)
diff --git a/browser/app/profile/000-tor-browser.js b/browser/app/profile/000-tor-browser.js
index fd0b691d1831..0d84455051e5 100644
--- a/browser/app/profile/000-tor-browser.js
+++ b/browser/app/profile/000-tor-browser.js
@@ -279,6 +279,8 @@ pref("extensions.legacy.exceptions", "{972ce4c6-7e08-4474-a285-3208198ce6fd},tor
pref("extensions.webextensions.restrictedDomains", "");
// Bug 31396: Disable indexedDB WebExtension storage backend.
pref("extensions.webextensions.ExtensionStorageIDB.enabled", false);
+// Bug 28896: Make sure our bundled WebExtensions are running in Private Browsing Mode
+pref("extensions.allowPrivateBrowsingByDefault", true);
// Toolbar layout
pref("browser.uiCustomization.state", "{\"placements\":{\"widget-overflow-fixed-list\":[],\"PersonalToolbar\":[\"personal-bookmarks\"],\"nav-bar\":[\"back-button\",\"forward-button\",\"stop-reload-button\",\"urlbar-container\",\"torbutton-button\",\"security-level-button\",\"downloads-button\"],\"TabsToolbar\":[\"tabbrowser-tabs\",\"new-tab-button\",\"alltabs-button\"],\"toolbar-menubar\":[\"menubar-items\"],\"PanelUI-contents\":[\"home-button\",\"edit-controls\",\"zoom-controls\",\"new-window-button\",\"save-page-button\",\"print-button\",\"bookmarks-menu-button\",\"history-panelmenu\",\"find-button\",\"preferences-button\",\"add-ons-button\",\"developer-button\"],\"addon-bar\":[\"addonbar-closebutton\",\"status-bar\"]},\"seen\":[\"developer-button\",\"https-everywhere-eff_eff_org-browser-action\",\"_73a6fe31-595d-460b-a920-fcc0f8843232_-browser-action\"],\"dirtyAreaCache\":[\"PersonalToolbar\",\"nav-bar\",\"TabsToolbar\",\"toolbar-menubar\"],\"currentVersion\":14,\"newElementCount
\":1}");
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] fixup! Bug 4234: Use the Firefox Update Process for Tor Browser.
by gk@torproject.org 30 Aug '19
by gk@torproject.org 30 Aug '19
30 Aug '19
commit f607d5bb45e536dc7094999252dc89c6bc84884b
Author: Kathy Brade <brade(a)pearlcrescent.com>
Date: Thu Aug 29 21:12:37 2019 -0400
fixup! Bug 4234: Use the Firefox Update Process for Tor Browser.
---
browser/app/profile/firefox.js | 10 ++--------
toolkit/modules/UpdateUtils.jsm | 16 ++++++++++------
toolkit/mozapps/update/UpdateServiceStub.jsm | 4 ++++
3 files changed, 16 insertions(+), 14 deletions(-)
diff --git a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js
index bb045fce1642..b0c42caa05a4 100644
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -143,14 +143,8 @@ pref("app.update.download.promptMaxAttempts", 2);
pref("app.update.elevation.promptMaxAttempts", 2);
// If set to true, the Update Service will automatically download updates if the
-// user can apply updates. This pref is no longer used on Windows, except as the
-// default value to migrate to the new location that this data is now stored
-// (which is in a file in the update directory). Because of this, this pref
-// should no longer be used directly. Instead, getAppUpdateAutoEnabled and
-// getAppUpdateAutoEnabled from UpdateUtils.jsm should be used.
-#ifndef XP_WIN
+// user can apply updates.
pref("app.update.auto", true);
-#endif
// If set to true, the Update Service will present no UI for any event.
pref("app.update.silent", false);
@@ -178,7 +172,7 @@ pref("app.update.idletime", 60);
pref("app.update.service.enabled", true);
#endif
-#ifdef XP_WIN
+#ifdef MOZ_BITS_DOWNLOAD
// If set to true, the Update Service will attempt to use Windows BITS to
// download updates and will fallback to downloading internally if that fails.
pref("app.update.BITS.enabled", true);
diff --git a/toolkit/modules/UpdateUtils.jsm b/toolkit/modules/UpdateUtils.jsm
index b267ebff48e8..e458dac76228 100644
--- a/toolkit/modules/UpdateUtils.jsm
+++ b/toolkit/modules/UpdateUtils.jsm
@@ -162,15 +162,17 @@ var UpdateUtils = {
* downloads and installs updates. This corresponds to whether or not the user
* has selected "Automatically install updates" in about:preferences.
*
- * On Windows, this setting is shared across all profiles for the installation
+ * On Windows (except in Tor Browser), this setting is shared across all profiles
+ * for the installation
* and is read asynchrnously from the file. On other operating systems, this
* setting is stored in a pref and is thus a per-profile setting.
*
* @return A Promise that resolves with a boolean.
*/
getAppUpdateAutoEnabled() {
- if (AppConstants.platform != "win") {
- // On platforms other than Windows the setting is stored in a preference.
+ if (AppConstants.TOR_BROWSER_UPDATE || (AppConstants.platform != "win")) {
+ // On platforms other than Windows and always in Tor Browser the setting
+ // is stored in a preference.
let prefValue = Services.prefs.getBoolPref(
PREF_APP_UPDATE_AUTO,
DEFAULT_APP_UPDATE_AUTO
@@ -241,7 +243,8 @@ var UpdateUtils = {
* updates" and "Check for updates but let you choose to install them" options
* in about:preferences.
*
- * On Windows, this setting is shared across all profiles for the installation
+ * On Windows (except in Tor Browser), this setting is shared across all profiles
+ * for the installation
* and is written asynchrnously to the file. On other operating systems, this
* setting is stored in a pref and is thus a per-profile setting.
*
@@ -257,8 +260,9 @@ var UpdateUtils = {
* this operation simply sets a pref.
*/
setAppUpdateAutoEnabled(enabledValue) {
- if (AppConstants.platform != "win") {
- // Only in Windows do we store the update config in the update directory
+ if (AppConstants.TOR_BROWSER_UPDATE || (AppConstants.platform != "win")) {
+ // Only in Windows (but never for Tor Browser) do we store the update config
+ // in the update directory
let prefValue = !!enabledValue;
Services.prefs.setBoolPref(PREF_APP_UPDATE_AUTO, prefValue);
maybeUpdateAutoConfigChanged(prefValue);
diff --git a/toolkit/mozapps/update/UpdateServiceStub.jsm b/toolkit/mozapps/update/UpdateServiceStub.jsm
index 0318e52cd6c5..f3fdc12f53e5 100644
--- a/toolkit/mozapps/update/UpdateServiceStub.jsm
+++ b/toolkit/mozapps/update/UpdateServiceStub.jsm
@@ -45,8 +45,12 @@ function UpdateServiceStub() {
// contains the status file's path
// We may need to migrate update data
+ // In Tor Browser we skip this because we do not use an update agent and we
+ // do not want to store any data outside of the browser installation directory.
+ // For more info, see https://bugzilla.mozilla.org/show_bug.cgi?id=1458314
if (
AppConstants.platform == "win" &&
+ !AppConstants.TOR_BROWSER_UPDATE &&
!Services.prefs.getBoolPref(prefUpdateDirMigrated, false)
) {
migrateUpdateDirectory();
1
0
commit 72aad50481c14e094f6fdd810d045c5b5cd38e3c
Author: Georg Koppen <gk(a)torproject.org>
Date: Fri Aug 30 09:54:20 2019 +0000
Translations update
---
chrome/locale/ar/aboutTor.dtd | 3 ---
chrome/locale/bn-BD/aboutTor.dtd | 3 ---
chrome/locale/ca/aboutTor.dtd | 3 ---
chrome/locale/cs/aboutTor.dtd | 3 ---
chrome/locale/da/aboutTor.dtd | 3 ---
chrome/locale/de/aboutTor.dtd | 3 ---
chrome/locale/el/aboutTor.dtd | 3 ---
chrome/locale/es-AR/aboutTor.dtd | 3 ---
chrome/locale/es-ES/aboutTor.dtd | 3 ---
chrome/locale/eu/aboutTor.dtd | 3 ---
chrome/locale/fa/aboutTor.dtd | 3 ---
chrome/locale/fr/aboutTor.dtd | 3 ---
chrome/locale/ga-IE/aboutTor.dtd | 3 ---
chrome/locale/he/aboutTor.dtd | 3 ---
chrome/locale/hu/aboutTor.dtd | 3 ---
chrome/locale/id/aboutTor.dtd | 3 ---
chrome/locale/is/aboutTor.dtd | 3 ---
chrome/locale/it/aboutTor.dtd | 3 ---
chrome/locale/ja/aboutTor.dtd | 3 ---
chrome/locale/ka/aboutTor.dtd | 3 ---
chrome/locale/ko/aboutTor.dtd | 3 ---
chrome/locale/mk/aboutTor.dtd | 3 ---
chrome/locale/nb-NO/aboutTor.dtd | 3 ---
chrome/locale/nl/aboutTor.dtd | 3 ---
chrome/locale/pl/aboutTor.dtd | 3 ---
chrome/locale/pt-BR/aboutTor.dtd | 3 ---
chrome/locale/ro/aboutTor.dtd | 3 ---
chrome/locale/ru/aboutTor.dtd | 3 ---
chrome/locale/sv-SE/aboutTor.dtd | 3 ---
chrome/locale/tr/aboutTor.dtd | 3 ---
chrome/locale/vi/aboutTor.dtd | 3 ---
chrome/locale/zh-CN/aboutTor.dtd | 3 ---
chrome/locale/zh-TW/aboutTor.dtd | 3 ---
33 files changed, 99 deletions(-)
diff --git a/chrome/locale/ar/aboutTor.dtd b/chrome/locale/ar/aboutTor.dtd
index 64e44b7a..610e2f77 100644
--- a/chrome/locale/ar/aboutTor.dtd
+++ b/chrome/locale/ar/aboutTor.dtd
@@ -30,6 +30,3 @@
<!ENTITY aboutTor.newsletter.link_text "اشترك للحصول على أخبار تور.">
<!ENTITY aboutTor.donationBanner.line2e "حافظ على قوة تور.">
<!ENTITY aboutTor.donationBanner.buttonA "تبرع الآن">
-
-<!ENTITY aboutTor.donationBanner3.line1 "تبرعات شهرية أتوماتيكية حافظ على Tor قويا.">
-<!ENTITY aboutTor.donationBanner3.line2 "اصبح مدافعا عن الخصوصية اليوم.">
diff --git a/chrome/locale/bn-BD/aboutTor.dtd b/chrome/locale/bn-BD/aboutTor.dtd
index b5b6b385..76bc83da 100644
--- a/chrome/locale/bn-BD/aboutTor.dtd
+++ b/chrome/locale/bn-BD/aboutTor.dtd
@@ -30,6 +30,3 @@
<!ENTITY aboutTor.newsletter.link_text "টর নিউজ-এর জন্য সাইন আপ করুন ।">
<!ENTITY aboutTor.donationBanner.line2e "টরকে শক্তিশালী রাখুন। ">
<!ENTITY aboutTor.donationBanner.buttonA "এখুনি দান করুন! ">
-
-<!ENTITY aboutTor.donationBanner3.line1 "Automatic monthly donations keep Tor strong.">
-<!ENTITY aboutTor.donationBanner3.line2 "Become a Defender of Privacy today.">
diff --git a/chrome/locale/ca/aboutTor.dtd b/chrome/locale/ca/aboutTor.dtd
index b6f51e39..1c3ac654 100644
--- a/chrome/locale/ca/aboutTor.dtd
+++ b/chrome/locale/ca/aboutTor.dtd
@@ -30,6 +30,3 @@
<!ENTITY aboutTor.newsletter.link_text "Inscriviu-vos a les noticies de Tor.">
<!ENTITY aboutTor.donationBanner.line2e "Feu que Tor segueixi fort.">
<!ENTITY aboutTor.donationBanner.buttonA "Feu una donació">
-
-<!ENTITY aboutTor.donationBanner3.line1 "Els donatius mensuals automàtics fan fort el Tor.">
-<!ENTITY aboutTor.donationBanner3.line2 "Convertiu-vos avui en un defensor de la privadesa.">
diff --git a/chrome/locale/cs/aboutTor.dtd b/chrome/locale/cs/aboutTor.dtd
index 74825986..06e411e5 100644
--- a/chrome/locale/cs/aboutTor.dtd
+++ b/chrome/locale/cs/aboutTor.dtd
@@ -30,6 +30,3 @@
<!ENTITY aboutTor.newsletter.link_text "Přihlaste se k odběru zpravodaje Toru.">
<!ENTITY aboutTor.donationBanner.line2e "Pomozte Toru sílit.">
<!ENTITY aboutTor.donationBanner.buttonA "Přispějte">
-
-<!ENTITY aboutTor.donationBanner3.line1 "Automatické měsíční příspěvky pomáhají Tor rozvíjet.">
-<!ENTITY aboutTor.donationBanner3.line2 "Přispějte na obranu soukromí.">
diff --git a/chrome/locale/da/aboutTor.dtd b/chrome/locale/da/aboutTor.dtd
index 7eb93c52..6fba4caf 100644
--- a/chrome/locale/da/aboutTor.dtd
+++ b/chrome/locale/da/aboutTor.dtd
@@ -30,6 +30,3 @@
<!ENTITY aboutTor.newsletter.link_text "Tilmeld Tor-nyheder.">
<!ENTITY aboutTor.donationBanner.line2e "Hold Tor stærk.">
<!ENTITY aboutTor.donationBanner.buttonA "Donér nu">
-
-<!ENTITY aboutTor.donationBanner3.line1 "Automatiske månedlige donationer holder Tor stærk.">
-<!ENTITY aboutTor.donationBanner3.line2 "Vær med til at beskytte privatliv i dag.">
diff --git a/chrome/locale/de/aboutTor.dtd b/chrome/locale/de/aboutTor.dtd
index 33e9be15..1263d928 100644
--- a/chrome/locale/de/aboutTor.dtd
+++ b/chrome/locale/de/aboutTor.dtd
@@ -30,6 +30,3 @@
<!ENTITY aboutTor.newsletter.link_text "Tor-Nachrichten abonnieren.">
<!ENTITY aboutTor.donationBanner.line2e "Mache Tor stark.">
<!ENTITY aboutTor.donationBanner.buttonA "Spende jetzt">
-
-<!ENTITY aboutTor.donationBanner3.line1 "Automatische monatliche Spenden halten Tor stark.">
-<!ENTITY aboutTor.donationBanner3.line2 "Werde noch heute ein Verteidiger der Privatsphäre.">
diff --git a/chrome/locale/el/aboutTor.dtd b/chrome/locale/el/aboutTor.dtd
index 8556ebc0..1d23b6bb 100644
--- a/chrome/locale/el/aboutTor.dtd
+++ b/chrome/locale/el/aboutTor.dtd
@@ -30,6 +30,3 @@
<!ENTITY aboutTor.newsletter.link_text "Εγγραφτείτε για τα νέα του Tor.">
<!ENTITY aboutTor.donationBanner.line2e "Διατηρήστε το Tor ισχυρό.">
<!ENTITY aboutTor.donationBanner.buttonA "Κάντε μια δωρεά τώρα!">
-
-<!ENTITY aboutTor.donationBanner3.line1 "Οι αυτόματες μηνιαίες δωρεές κρατάνε το Tor δυνατό.">
-<!ENTITY aboutTor.donationBanner3.line2 "Γίνε σήμερα προστάτης της ιδιωτικότητας.">
diff --git a/chrome/locale/es-AR/aboutTor.dtd b/chrome/locale/es-AR/aboutTor.dtd
index 1ada3342..552db139 100644
--- a/chrome/locale/es-AR/aboutTor.dtd
+++ b/chrome/locale/es-AR/aboutTor.dtd
@@ -30,6 +30,3 @@
<!ENTITY aboutTor.newsletter.link_text "Registrate en Tor News.">
<!ENTITY aboutTor.donationBanner.line2e "Mantener fuerte a Tor.">
<!ENTITY aboutTor.donationBanner.buttonA "Doná ahora">
-
-<!ENTITY aboutTor.donationBanner3.line1 "Donaciones automaticas mensuales mantienen Tor fuerte.">
-<!ENTITY aboutTor.donationBanner3.line2 "Convertite en un Defensor de la Privacidad hoy.">
diff --git a/chrome/locale/es-ES/aboutTor.dtd b/chrome/locale/es-ES/aboutTor.dtd
index 26c792d2..aff6157d 100644
--- a/chrome/locale/es-ES/aboutTor.dtd
+++ b/chrome/locale/es-ES/aboutTor.dtd
@@ -30,6 +30,3 @@
<!ENTITY aboutTor.newsletter.link_text "Inscríbete en Tor News.">
<!ENTITY aboutTor.donationBanner.line2e "Mantén fuerte a Tor.">
<!ENTITY aboutTor.donationBanner.buttonA "Dona ahora.">
-
-<!ENTITY aboutTor.donationBanner3.line1 "Las donaciones mensuales automáticas mantienen a Tor.">
-<!ENTITY aboutTor.donationBanner3.line2 "Conviértete en un Defensor de la Privacidad, hoy.">
diff --git a/chrome/locale/eu/aboutTor.dtd b/chrome/locale/eu/aboutTor.dtd
index d2d751ee..227035d0 100644
--- a/chrome/locale/eu/aboutTor.dtd
+++ b/chrome/locale/eu/aboutTor.dtd
@@ -30,6 +30,3 @@
<!ENTITY aboutTor.newsletter.link_text "Harpidetu Tor berrietara">
<!ENTITY aboutTor.donationBanner.line2e "Mantendu Tor indartsu.">
<!ENTITY aboutTor.donationBanner.buttonA "Egin dohaintza orain">
-
-<!ENTITY aboutTor.donationBanner3.line1 "Automatic monthly donations keep Tor strong.">
-<!ENTITY aboutTor.donationBanner3.line2 "Become a Defender of Privacy today.">
diff --git a/chrome/locale/fa/aboutTor.dtd b/chrome/locale/fa/aboutTor.dtd
index 77999b0c..c097eb75 100644
--- a/chrome/locale/fa/aboutTor.dtd
+++ b/chrome/locale/fa/aboutTor.dtd
@@ -30,6 +30,3 @@
<!ENTITY aboutTor.newsletter.link_text "ثبتنام برای اخبار تور.">
<!ENTITY aboutTor.donationBanner.line2e "تور را محکم نگه دارید.">
<!ENTITY aboutTor.donationBanner.buttonA "اکنون اهداء کنید">
-
-<!ENTITY aboutTor.donationBanner3.line1 "کمک های مالی ماهانه خودکار تور را قوی نگه میدارند.">
-<!ENTITY aboutTor.donationBanner3.line2 "امروز تبدیل به یک مدافع حریم خصوصی شوید.">
diff --git a/chrome/locale/fr/aboutTor.dtd b/chrome/locale/fr/aboutTor.dtd
index c0e5dfec..fc6929b5 100644
--- a/chrome/locale/fr/aboutTor.dtd
+++ b/chrome/locale/fr/aboutTor.dtd
@@ -30,6 +30,3 @@
<!ENTITY aboutTor.newsletter.link_text "Inscrivez-vous aux nouvelles de Tor">
<!ENTITY aboutTor.donationBanner.line2e "Assurez la robustesse de Tor.">
<!ENTITY aboutTor.donationBanner.buttonA "Faites un don maintenant">
-
-<!ENTITY aboutTor.donationBanner3.line1 "Les dons mensuels automatiques assurent la robustesse de Tor.">
-<!ENTITY aboutTor.donationBanner3.line2 "Devenez dès aujourd’hui un défenseur de la vie privée et de sa protection.">
diff --git a/chrome/locale/ga-IE/aboutTor.dtd b/chrome/locale/ga-IE/aboutTor.dtd
index 79a3176e..7f2f5d82 100644
--- a/chrome/locale/ga-IE/aboutTor.dtd
+++ b/chrome/locale/ga-IE/aboutTor.dtd
@@ -30,6 +30,3 @@
<!ENTITY aboutTor.newsletter.link_text "Cláraigh le Nuachtlitir Tor.">
<!ENTITY aboutTor.donationBanner.line2e "Cuir taca le Tor.">
<!ENTITY aboutTor.donationBanner.buttonA "Tabhair síntiús airgid anois">
-
-<!ENTITY aboutTor.donationBanner3.line1 "Ba mhór an cúnamh dúinn síntiúis airgid míosúla.">
-<!ENTITY aboutTor.donationBanner3.line2 "Bí i do Chosantóir an Phríobháideachais inniu.">
diff --git a/chrome/locale/he/aboutTor.dtd b/chrome/locale/he/aboutTor.dtd
index dfa2fbae..5f1efea6 100644
--- a/chrome/locale/he/aboutTor.dtd
+++ b/chrome/locale/he/aboutTor.dtd
@@ -30,6 +30,3 @@
<!ENTITY aboutTor.newsletter.link_text "הירשם עבור חדשות Tor.">
<!ENTITY aboutTor.donationBanner.line2e "שמור על Tor חזק.">
<!ENTITY aboutTor.donationBanner.buttonA "תרום עכשיו">
-
-<!ENTITY aboutTor.donationBanner3.line1 "תרומות חודשיות אוטומטיות שומרות על Tor חזק.">
-<!ENTITY aboutTor.donationBanner3.line2 "הפוך אל מגן של פרטיות היום.">
diff --git a/chrome/locale/hu/aboutTor.dtd b/chrome/locale/hu/aboutTor.dtd
index dc759969..5d8e327c 100644
--- a/chrome/locale/hu/aboutTor.dtd
+++ b/chrome/locale/hu/aboutTor.dtd
@@ -30,6 +30,3 @@
<!ENTITY aboutTor.newsletter.link_text "Iratkozzon fel a Tor hírekhez.">
<!ENTITY aboutTor.donationBanner.line2e "Tartsuk meg a Tor-t erősnek.">
<!ENTITY aboutTor.donationBanner.buttonA "Támogasson most">
-
-<!ENTITY aboutTor.donationBanner3.line1 "Az automatikus havi támogatások a tartják a Tort erősen.">
-<!ENTITY aboutTor.donationBanner3.line2 "Legyen az Adatok Védelmezője még ma.">
diff --git a/chrome/locale/id/aboutTor.dtd b/chrome/locale/id/aboutTor.dtd
index eb7581f9..09bac66d 100644
--- a/chrome/locale/id/aboutTor.dtd
+++ b/chrome/locale/id/aboutTor.dtd
@@ -30,6 +30,3 @@
<!ENTITY aboutTor.newsletter.link_text "Daftar untuk mendapatkan Berita Tor.">
<!ENTITY aboutTor.donationBanner.line2e "Bantu Tor tetap kuat.">
<!ENTITY aboutTor.donationBanner.buttonA "Donasi Sekarang">
-
-<!ENTITY aboutTor.donationBanner3.line1 "Donasi bulanan otomatis untuk membantu Tor tetap kuat.">
-<!ENTITY aboutTor.donationBanner3.line2 "Jadilah Pahlawan Privasi hari ini.">
diff --git a/chrome/locale/is/aboutTor.dtd b/chrome/locale/is/aboutTor.dtd
index b6da912b..2ee6f8d7 100644
--- a/chrome/locale/is/aboutTor.dtd
+++ b/chrome/locale/is/aboutTor.dtd
@@ -30,6 +30,3 @@
<!ENTITY aboutTor.newsletter.link_text "Skráðu þig til að fá Tor-fréttir.">
<!ENTITY aboutTor.donationBanner.line2e "Höldum Tor sterku">
<!ENTITY aboutTor.donationBanner.buttonA "Styrkja núna">
-
-<!ENTITY aboutTor.donationBanner3.line1 "Sjálfvirkar mánaðarlegar greiðslur eru mikill styrkur fyrir Tor.">
-<!ENTITY aboutTor.donationBanner3.line2 "Gerstu strax baráttumaður fyrir friðhelgi einkalífsins.">
diff --git a/chrome/locale/it/aboutTor.dtd b/chrome/locale/it/aboutTor.dtd
index 6178c8eb..27cd6ab9 100644
--- a/chrome/locale/it/aboutTor.dtd
+++ b/chrome/locale/it/aboutTor.dtd
@@ -30,6 +30,3 @@
<!ENTITY aboutTor.newsletter.link_text "Registrati alle Tor News.">
<!ENTITY aboutTor.donationBanner.line2e "Mantieni Tor forte.">
<!ENTITY aboutTor.donationBanner.buttonA "Dona Adesso">
-
-<!ENTITY aboutTor.donationBanner3.line1 "Le donazioni mensili automatiche mantengono Tor forte.">
-<!ENTITY aboutTor.donationBanner3.line2 "Diventa un Difensore della Privacy oggi.">
diff --git a/chrome/locale/ja/aboutTor.dtd b/chrome/locale/ja/aboutTor.dtd
index 183b5e2a..339848eb 100644
--- a/chrome/locale/ja/aboutTor.dtd
+++ b/chrome/locale/ja/aboutTor.dtd
@@ -30,6 +30,3 @@
<!ENTITY aboutTor.newsletter.link_text "Torニュースにを申し込む。">
<!ENTITY aboutTor.donationBanner.line2e "Tor を強く保つ。">
<!ENTITY aboutTor.donationBanner.buttonA "今すぐ寄付">
-
-<!ENTITY aboutTor.donationBanner3.line1 "毎月の寄付によりTorを強固に保ちましょう。">
-<!ENTITY aboutTor.donationBanner3.line2 "プライバシーの守護者になりましょう。">
diff --git a/chrome/locale/ka/aboutTor.dtd b/chrome/locale/ka/aboutTor.dtd
index c7b5bbff..144ae7e5 100644
--- a/chrome/locale/ka/aboutTor.dtd
+++ b/chrome/locale/ka/aboutTor.dtd
@@ -30,6 +30,3 @@
<!ENTITY aboutTor.newsletter.link_text "გამოიწერეთ Tor-ის სიახლეები.">
<!ENTITY aboutTor.donationBanner.line2e "შეინარჩუნეთ Tor ძლიერი.">
<!ENTITY aboutTor.donationBanner.buttonA "გაიღეთ თანხა">
-
-<!ENTITY aboutTor.donationBanner3.line1 "ყოველთვიური შემოწირულობები მეტად აძლიერებს Tor-ს.">
-<!ENTITY aboutTor.donationBanner3.line2 "გახდით პირადულობის გუშაგი დღესვე!">
diff --git a/chrome/locale/ko/aboutTor.dtd b/chrome/locale/ko/aboutTor.dtd
index 2469a6af..b6151d13 100644
--- a/chrome/locale/ko/aboutTor.dtd
+++ b/chrome/locale/ko/aboutTor.dtd
@@ -30,6 +30,3 @@
<!ENTITY aboutTor.newsletter.link_text "Tor 뉴스를 구독.">
<!ENTITY aboutTor.donationBanner.line2e "Tor 를 강하게 유지하기.">
<!ENTITY aboutTor.donationBanner.buttonA "기부하기">
-
-<!ENTITY aboutTor.donationBanner3.line1 "매월 자동기부를 통해 Tor를 강하게 유지하기 ">
-<!ENTITY aboutTor.donationBanner3.line2 "바로 오늘 개인정보의 수호자가 되는 겁니다.">
diff --git a/chrome/locale/mk/aboutTor.dtd b/chrome/locale/mk/aboutTor.dtd
index 41f6ac88..551ad217 100644
--- a/chrome/locale/mk/aboutTor.dtd
+++ b/chrome/locale/mk/aboutTor.dtd
@@ -30,6 +30,3 @@
<!ENTITY aboutTor.newsletter.link_text "Пријавете се за Tor Вести.">
<!ENTITY aboutTor.donationBanner.line2e "Чувај го Tor силен.">
<!ENTITY aboutTor.donationBanner.buttonA "Донирај сега">
-
-<!ENTITY aboutTor.donationBanner3.line1 "Автоматските месечни донации го чуваат Tor силен.">
-<!ENTITY aboutTor.donationBanner3.line2 "Станете Бранител на приватноста уште денес.">
diff --git a/chrome/locale/nb-NO/aboutTor.dtd b/chrome/locale/nb-NO/aboutTor.dtd
index 53402eab..7b7e3caf 100644
--- a/chrome/locale/nb-NO/aboutTor.dtd
+++ b/chrome/locale/nb-NO/aboutTor.dtd
@@ -30,6 +30,3 @@
<!ENTITY aboutTor.newsletter.link_text "Registrer deg for Tor Nyheter.">
<!ENTITY aboutTor.donationBanner.line2e "Hold Tor sterk.">
<!ENTITY aboutTor.donationBanner.buttonA "Donér nå">
-
-<!ENTITY aboutTor.donationBanner3.line1 "Automatisk månedlig donasjoner gjør Tor sterk.">
-<!ENTITY aboutTor.donationBanner3.line2 "Bli en Kjemper for Privatliv i dag.">
diff --git a/chrome/locale/nl/aboutTor.dtd b/chrome/locale/nl/aboutTor.dtd
index c4097e97..b4ac52c4 100644
--- a/chrome/locale/nl/aboutTor.dtd
+++ b/chrome/locale/nl/aboutTor.dtd
@@ -30,6 +30,3 @@
<!ENTITY aboutTor.newsletter.link_text "Meld u aan voor Tor News.">
<!ENTITY aboutTor.donationBanner.line2e "Houd Tor sterk.">
<!ENTITY aboutTor.donationBanner.buttonA "Nu doneren">
-
-<!ENTITY aboutTor.donationBanner3.line1 "Automatische maandelijkse donaties houden Tor sterk.">
-<!ENTITY aboutTor.donationBanner3.line2 "Word vandaag nog voorvechter van privacy.">
diff --git a/chrome/locale/pl/aboutTor.dtd b/chrome/locale/pl/aboutTor.dtd
index dff11572..d0239848 100644
--- a/chrome/locale/pl/aboutTor.dtd
+++ b/chrome/locale/pl/aboutTor.dtd
@@ -30,6 +30,3 @@
<!ENTITY aboutTor.newsletter.link_text "Zapisz się na Tor News.">
<!ENTITY aboutTor.donationBanner.line2e "Utrzymuj Tor silnym.">
<!ENTITY aboutTor.donationBanner.buttonA "Wesprzyj teraz">
-
-<!ENTITY aboutTor.donationBanner3.line1 "Automatyczne comiesięczne darowizny trzymają Tora silnym.">
-<!ENTITY aboutTor.donationBanner3.line2 "Zostań już teraz Obrońcą Prywatności.">
diff --git a/chrome/locale/pt-BR/aboutTor.dtd b/chrome/locale/pt-BR/aboutTor.dtd
index a60d789e..ec235f5b 100644
--- a/chrome/locale/pt-BR/aboutTor.dtd
+++ b/chrome/locale/pt-BR/aboutTor.dtd
@@ -31,6 +31,3 @@
<!ENTITY aboutTor.newsletter.link_text "Inscreva-se para receber Notícias do Tor.">
<!ENTITY aboutTor.donationBanner.line2e "Mantenha o Tor forte.">
<!ENTITY aboutTor.donationBanner.buttonA "Doe Agora">
-
-<!ENTITY aboutTor.donationBanner3.line1 "Doações mensais automáticas fortalecem o Tor.">
-<!ENTITY aboutTor.donationBanner3.line2 "Torne-se um(a) Defensor(a) da Privacidade hoje.">
diff --git a/chrome/locale/ro/aboutTor.dtd b/chrome/locale/ro/aboutTor.dtd
index edbb442f..ceaf5b07 100644
--- a/chrome/locale/ro/aboutTor.dtd
+++ b/chrome/locale/ro/aboutTor.dtd
@@ -30,6 +30,3 @@
<!ENTITY aboutTor.newsletter.link_text "Abonează-te la Tor News.">
<!ENTITY aboutTor.donationBanner.line2e "Menține Tor puternic.">
<!ENTITY aboutTor.donationBanner.buttonA "Donează Acum">
-
-<!ENTITY aboutTor.donationBanner3.line1 "Donațiile lunare automate mențin aplicația Tor puternică.">
-<!ENTITY aboutTor.donationBanner3.line2 "Deveniți astăzi un Apărător al Confidențialității.">
diff --git a/chrome/locale/ru/aboutTor.dtd b/chrome/locale/ru/aboutTor.dtd
index 125ac059..fddd66c7 100644
--- a/chrome/locale/ru/aboutTor.dtd
+++ b/chrome/locale/ru/aboutTor.dtd
@@ -30,6 +30,3 @@
<!ENTITY aboutTor.newsletter.link_text "Подпишитесь на новости Tor.">
<!ENTITY aboutTor.donationBanner.line2e "Сохраните Tor сильным.">
<!ENTITY aboutTor.donationBanner.buttonA "Пожертвовать">
-
-<!ENTITY aboutTor.donationBanner3.line1 "Автоматические ежемесячные пожертвования очень помогут Tor">
-<!ENTITY aboutTor.donationBanner3.line2 "Станьте защитником конфиденциальности уже сегодня.">
diff --git a/chrome/locale/sv-SE/aboutTor.dtd b/chrome/locale/sv-SE/aboutTor.dtd
index ee567e6d..d403bb76 100644
--- a/chrome/locale/sv-SE/aboutTor.dtd
+++ b/chrome/locale/sv-SE/aboutTor.dtd
@@ -30,6 +30,3 @@
<!ENTITY aboutTor.newsletter.link_text "Anmäl dig till Tor-nyheter.">
<!ENTITY aboutTor.donationBanner.line2e "Håll Tor stark.">
<!ENTITY aboutTor.donationBanner.buttonA "Donera nu">
-
-<!ENTITY aboutTor.donationBanner3.line1 "Automatiska månatliga donationer håller Tor stark.">
-<!ENTITY aboutTor.donationBanner3.line2 "Bli en försvarare av privatlivet idag.">
diff --git a/chrome/locale/tr/aboutTor.dtd b/chrome/locale/tr/aboutTor.dtd
index dac00818..fe6c9746 100644
--- a/chrome/locale/tr/aboutTor.dtd
+++ b/chrome/locale/tr/aboutTor.dtd
@@ -30,6 +30,3 @@
<!ENTITY aboutTor.newsletter.link_text "Tor Duyurularına Abone Olun">
<!ENTITY aboutTor.donationBanner.line2e "Tor uygulamasının gücünü koruyun.">
<!ENTITY aboutTor.donationBanner.buttonA "Bağış Yapın">
-
-<!ENTITY aboutTor.donationBanner3.line1 "Düzenli aylık bağışlar Tor projesinin gücünü korumasına yardımcı olur.">
-<!ENTITY aboutTor.donationBanner3.line2 "Bugün kişisel gizliliği savunmak için destek olmaya başlayın.">
diff --git a/chrome/locale/vi/aboutTor.dtd b/chrome/locale/vi/aboutTor.dtd
index 44bf6f97..e69430c7 100644
--- a/chrome/locale/vi/aboutTor.dtd
+++ b/chrome/locale/vi/aboutTor.dtd
@@ -30,6 +30,3 @@
<!ENTITY aboutTor.newsletter.link_text "Đăng kí nhận tin tức từ Tor.">
<!ENTITY aboutTor.donationBanner.line2e "Giữ cho Tor trở nên mạnh mẽ.">
<!ENTITY aboutTor.donationBanner.buttonA "Đóng góp Ngay bây giờ">
-
-<!ENTITY aboutTor.donationBanner3.line1 "Tự động donate hàng tháng để giữ cho Tor lớn mạnh.">
-<!ENTITY aboutTor.donationBanner3.line2 "Trở thành một người bảo vệ quyền riêng tư ngày hôm nay.">
diff --git a/chrome/locale/zh-CN/aboutTor.dtd b/chrome/locale/zh-CN/aboutTor.dtd
index 4801db29..2048dc54 100644
--- a/chrome/locale/zh-CN/aboutTor.dtd
+++ b/chrome/locale/zh-CN/aboutTor.dtd
@@ -30,6 +30,3 @@
<!ENTITY aboutTor.newsletter.link_text "订阅 Tor 的最新动态">
<!ENTITY aboutTor.donationBanner.line2e "让 Tor 网络保持健壮。">
<!ENTITY aboutTor.donationBanner.buttonA "立即捐助">
-
-<!ENTITY aboutTor.donationBanner3.line1 "每月自动捐款来使 Tor 保持健壮。">
-<!ENTITY aboutTor.donationBanner3.line2 "即刻就成为隐私的捍卫者。">
diff --git a/chrome/locale/zh-TW/aboutTor.dtd b/chrome/locale/zh-TW/aboutTor.dtd
index a016d044..e937a010 100644
--- a/chrome/locale/zh-TW/aboutTor.dtd
+++ b/chrome/locale/zh-TW/aboutTor.dtd
@@ -30,6 +30,3 @@
<!ENTITY aboutTor.newsletter.link_text "訂閱 Tor 的新資訊。">
<!ENTITY aboutTor.donationBanner.line2e "使 Tor 更加茁壯。">
<!ENTITY aboutTor.donationBanner.buttonA "立刻捐款">
-
-<!ENTITY aboutTor.donationBanner3.line1 "每月自動捐款,使 Tor 更加茁壯。">
-<!ENTITY aboutTor.donationBanner3.line2 "從今天開始,成為隱私守衛員吧!">
1
0

30 Aug '19
commit 27757393545d48637c140507b5af02cbb14b2d9a
Author: Georg Koppen <gk(a)torproject.org>
Date: Fri Aug 30 08:59:34 2019 +0000
Release preparations for 8.5.5
Changelog update and versions bump
---
projects/firefox/config | 4 ++--
.../tor-browser/Bundle-Data/Docs/ChangeLog.txt | 24 ++++++++++++++++++++++
projects/torbutton/config | 2 +-
3 files changed, 27 insertions(+), 3 deletions(-)
diff --git a/projects/firefox/config b/projects/firefox/config
index 195bed3..351c802 100644
--- a/projects/firefox/config
+++ b/projects/firefox/config
@@ -1,14 +1,14 @@
# vim: filetype=yaml sw=2
version: '[% c("abbrev") %]'
filename: 'firefox-[% c("version") %]-[% c("var/osname") %]-[% c("var/build_id") %]'
-git_hash: 'tor-browser-[% c("var/firefox_version") %]-[% c("var/torbrowser_branch") %]-1-build2'
+git_hash: 'tor-browser-[% c("var/firefox_version") %]-[% c("var/torbrowser_branch") %]-1-build1'
tag_gpg_id: 1
git_url: https://git.torproject.org/tor-browser.git
git_submodule: 1
gpg_keyring: torbutton.gpg
var:
- firefox_platform_version: 60.8.0
+ firefox_platform_version: 60.9.0
firefox_version: '[% c("var/firefox_platform_version") %]esr'
torbrowser_branch: 8.5
torbrowser_update_channel: alpha
diff --git a/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt b/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
index 682b309..27d86a9 100644
--- a/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
+++ b/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
@@ -1,3 +1,27 @@
+Tor Browser 8.5.5 -- September 3 2019
+ * All platforms
+ * Update Firefox to 60.9.0esr
+ * Update Torbutton to 2.1.13
+ * Bug 31520: Remove monthly giving banner from Tor Browser
+ * Bug 31140: Do not enable IonMonkey on AARCH64
+ * Translations update
+ * Update NoScript to 11.0.3
+ * Bug 26847: NoScript pops up a full-site window for XSS warning
+ * Bug 31287: NoScript leaks browser locale
+ * Bug 31357: Retire Tom's default obfs4 bridge
+ * Windows + OS X + Linux
+ * Update Tor to 0.4.1.5
+ * Windows
+ * Bug 31547: Back out patch for Mozilla's bug 1574980
+ * Bug 27503: Provide full support for accessibility tools
+ * Bug 30575: Don't allow enterprise policies in Tor Browser
+ * Bug 31141: Fix typo in font.system.whitelist
+ * Android
+ * Bug 28119: Tor Browser for aarch64
+ * Build System
+ * All platforms
+ * Bug 31465: Bump Go to 1.12.9
+
Tor Browser 8.5.4 -- July 9 2019
* All platforms
* Update Firefox to 60.8.0esr
diff --git a/projects/torbutton/config b/projects/torbutton/config
index af17cd5..c8eff57 100644
--- a/projects/torbutton/config
+++ b/projects/torbutton/config
@@ -1,5 +1,5 @@
# vim: filetype=yaml sw=2
-version: 2.1.12
+version: 2.1.13
git_url: https://git.torproject.org/torbutton.git
git_hash: '[% c("version") %]'
gpg_keyring: torbutton.gpg
1
0
commit e3aa8e72c9919de8a16d7d499ab9c2e80a45d586
Author: Georg Koppen <gk(a)torproject.org>
Date: Fri Aug 30 08:20:28 2019 +0000
Translations update
---
chrome/locale/ar/aboutTor.dtd | 6 +++---
chrome/locale/ar/browserOnboarding.properties | 10 +++++-----
chrome/locale/ar/securityLevel.properties | 4 ++--
chrome/locale/ar/torbutton.dtd | 2 +-
chrome/locale/ca/aboutTor.dtd | 12 ++++++------
chrome/locale/cs/aboutTor.dtd | 4 ++--
chrome/locale/cs/browserOnboarding.properties | 2 +-
chrome/locale/cs/securityLevel.properties | 2 +-
chrome/locale/cs/torbutton.dtd | 2 +-
chrome/locale/da/aboutTBUpdate.dtd | 4 ++--
chrome/locale/da/aboutTor.dtd | 4 ++--
chrome/locale/da/torbutton.properties | 2 +-
chrome/locale/el/aboutTor.dtd | 4 ++--
chrome/locale/es-AR/aboutTor.dtd | 4 ++--
chrome/locale/es-AR/securityLevel.properties | 2 +-
chrome/locale/es-AR/torbutton.dtd | 2 +-
chrome/locale/fr/aboutTor.dtd | 2 +-
chrome/locale/ga-IE/aboutTor.dtd | 4 ++--
chrome/locale/hu/aboutTBUpdate.dtd | 4 ++--
chrome/locale/hu/aboutTor.dtd | 6 +++---
chrome/locale/hu/securityLevel.properties | 6 +++---
chrome/locale/hu/torbutton.dtd | 2 +-
chrome/locale/id/aboutTor.dtd | 18 +++++++++---------
chrome/locale/is/aboutTor.dtd | 4 ++--
chrome/locale/it/aboutTor.dtd | 4 ++--
chrome/locale/ja/aboutTor.dtd | 4 ++--
chrome/locale/ja/securityLevel.properties | 2 +-
chrome/locale/ja/torbutton.dtd | 2 +-
chrome/locale/ko/aboutTor.dtd | 10 +++++-----
chrome/locale/mk/aboutTor.dtd | 4 ++--
chrome/locale/mk/browserOnboarding.properties | 6 +++---
chrome/locale/mk/torbutton.properties | 4 ++--
chrome/locale/nb-NO/aboutDialog.dtd | 4 ++--
chrome/locale/nb-NO/aboutTBUpdate.dtd | 4 ++--
chrome/locale/nb-NO/aboutTor.dtd | 8 ++++----
chrome/locale/nb-NO/brand.dtd | 2 +-
chrome/locale/nb-NO/brand.properties | 2 +-
chrome/locale/nb-NO/browserOnboarding.properties | 4 ++--
chrome/locale/nb-NO/torbutton.properties | 12 ++++++------
chrome/locale/nl/aboutTor.dtd | 4 ++--
chrome/locale/nl/brand.properties | 2 +-
chrome/locale/nl/securityLevel.properties | 2 +-
chrome/locale/nl/torbutton.dtd | 18 +++++++++---------
chrome/locale/pl/aboutTor.dtd | 6 +++---
chrome/locale/pt-BR/aboutTor.dtd | 8 ++++----
chrome/locale/ro/aboutTor.dtd | 4 ++--
chrome/locale/ro/securityLevel.properties | 2 +-
chrome/locale/ro/torbutton.dtd | 2 +-
chrome/locale/tr/aboutTor.dtd | 2 +-
chrome/locale/tr/torbutton.properties | 4 ++--
chrome/locale/vi/aboutTor.dtd | 6 +++---
chrome/locale/vi/browserOnboarding.properties | 2 +-
chrome/locale/zh-CN/aboutTor.dtd | 4 ++--
chrome/locale/zh-TW/aboutTor.dtd | 10 +++++-----
54 files changed, 130 insertions(+), 130 deletions(-)
diff --git a/chrome/locale/ar/aboutTor.dtd b/chrome/locale/ar/aboutTor.dtd
index 05486c97..64e44b7a 100644
--- a/chrome/locale/ar/aboutTor.dtd
+++ b/chrome/locale/ar/aboutTor.dtd
@@ -8,7 +8,7 @@
<!ENTITY aboutTor.viewChangelog.label "الإطلاع على سجل التغيرات">
-<!ENTITY aboutTor.ready.label "تصفح بهوية خفية">
+<!ENTITY aboutTor.ready.label "تصفح بكل خصوصية.">
<!ENTITY aboutTor.ready2.label "أنت جاهز الآن لتجربة التصفح الأكثر خصوصية في العالم.">
<!ENTITY aboutTor.failure.label "حدث خطأ ما!">
<!ENTITY aboutTor.failure2.label "تور لا يعمل في هذا المتصفح.">
@@ -31,5 +31,5 @@
<!ENTITY aboutTor.donationBanner.line2e "حافظ على قوة تور.">
<!ENTITY aboutTor.donationBanner.buttonA "تبرع الآن">
-<!ENTITY aboutTor.donationBanner3.line1 "Automatic monthly donations keep Tor strong.">
-<!ENTITY aboutTor.donationBanner3.line2 "Become a Defender of Privacy today.">
+<!ENTITY aboutTor.donationBanner3.line1 "تبرعات شهرية أتوماتيكية حافظ على Tor قويا.">
+<!ENTITY aboutTor.donationBanner3.line2 "اصبح مدافعا عن الخصوصية اليوم.">
diff --git a/chrome/locale/ar/browserOnboarding.properties b/chrome/locale/ar/browserOnboarding.properties
index 996d081c..111de734 100644
--- a/chrome/locale/ar/browserOnboarding.properties
+++ b/chrome/locale/ar/browserOnboarding.properties
@@ -26,9 +26,9 @@ onboarding.tour-tor-circuit-display.next-button=الانتقال إلى الأم
onboarding.tour-tor-security=الأمان
onboarding.tour-tor-security.title=اختر مدى خبرتك
onboarding.tour-tor-security.description=نوفر لك أيضا إعدادات إضافية لرفع مستوى أمان المتصفح. تسمح لك إعدادات الأمان لدينا بحظر العناصر التي يمكن استخدامها لمهاجمة جهاز الكمبيوتر الخاص بك. انقر أدناه لمعرفة ما تفعله الخيارات المختلفة.
-onboarding.tour-tor-security.description-suffix=Note: By default, NoScript and HTTPS Everywhere are not included on the toolbar, but you can customize your toolbar to add them.
+onboarding.tour-tor-security.description-suffix=ملاحظة: NoScript و HTTPS Everywhere ليست متضمنة بشكل افتراضي في شريط الأدوات، لكن بإمكانك تخصيص شريط الأدوات لإضافتهم.
onboarding.tour-tor-security-level.button=تحقق من مستوى الأمن
-onboarding.tour-tor-security-level.next-button=Go to Experience Tips
+onboarding.tour-tor-security-level.next-button=إذهب إلى تلميحات التجربة
onboarding.tour-tor-expect-differences=نصائح التجربة
onboarding.tour-tor-expect-differences.title=توقع بعض التغيرات
@@ -48,11 +48,11 @@ onboarding.tour-tor-update.prefix-updated=تحديث
onboarding.tour-tor-toolbar=شريط الأدوات
onboarding.tour-tor-toolbar-update-8.5.title=نسق شريط الأدوات
-onboarding.tour-tor-toolbar-update-8.5.description=We improved the browser toolbar layout. We moved the Torbutton icon after the URL bar, and we added a security level icon next to it.
+onboarding.tour-tor-toolbar-update-8.5.description=قمنا بتحسين تصميم شريط أدوات المتصفح. نقلنا أيقونة زر Tor الى بعد مربع URL، وأضفنا أيقونة درجة الأمان إلى جانبها.
onboarding.tour-tor-toolbar-update-8.5.next-button=الانتقال إلى الأمان
-onboarding.tour-tor-security-update-8.5.title=Security level experience
-onboarding.tour-tor-security-update-8.5.description=We improved how you see and set your security level. We replaced the security slider with a toolbar icon that makes your current level visible at all times. Click it to view details about your current level or to change your security settings.
+onboarding.tour-tor-security-update-8.5.title=تجربة درجة الأمان
+onboarding.tour-tor-security-update-8.5.description=قمنا بتحسين كيف ترى وتضبط درجة الأمان. استبدلنا شريط تمرير الأمان بأيقونة على شريط الأدوات تجعل من درجة الأمان المفعلة حاليا ظاهرة على الدوام. إضغط عليها لرؤية تفاصيل حول درجة أمانك الحالية أو لتغيير إعدادات الأمان الخاصة بك.
# Circuit Display onboarding.
onboarding.tor-circuit-display.next=التالي
diff --git a/chrome/locale/ar/securityLevel.properties b/chrome/locale/ar/securityLevel.properties
index 3ddca80a..b02c6cc4 100644
--- a/chrome/locale/ar/securityLevel.properties
+++ b/chrome/locale/ar/securityLevel.properties
@@ -1,6 +1,6 @@
securityLevel.securityLevel = مستوى الأمان
securityLevel.customWarning = مخصص
-securityLevel.overview = Disable certain web features that can be used to attack your security and anonymity.
+securityLevel.overview = تعطيل مميزات ويب معينة فد يتم استخدامها لمهاجمة أمنك و مجهولية هويتك.
securityLevel.standard.level = عادي
securityLevel.standard.tooltip = مستوى الأمان: قياسي
securityLevel.standard.summary = كل خصائص متصفح تور ومواقع الوب مفعلة
@@ -9,7 +9,7 @@ securityLevel.safer.tooltip = مستوى الأمان: آمن
securityLevel.safer.summary = يعطل مميزات مواقع الوب التي عادة ما تكون خطيرة. يتسبب في تعطل خصائص بعض المواقع.
securityLevel.safer.description1 = تعطل جافا سكربت على المواقع التي لا تستخدم HTTPS
securityLevel.safer.description2 = تعطّل بعض الخطوط والرموز الرياضية.
-securityLevel.safer.description3 = Audio and video (HTML5 media), and WebGL are click-to-play.
+securityLevel.safer.description3 = الصوت والفيديو (HTML5 media), و WebGL هي انقر للتشغيل
securityLevel.safest.level = الأكثر أمنا
securityLevel.safest.tooltip = مستوى الأمان: الأكثر أمانا
securityLevel.safest.summary = اسمح فقط بالخصائص المطلوبة للمواقع غير الديناميكية والخدمات الأساسية. تؤثر هذه التغييرات على الصور والوسائط والنصوص البرمجية.
diff --git a/chrome/locale/ar/torbutton.dtd b/chrome/locale/ar/torbutton.dtd
index 1b0a01cd..1c114b6d 100644
--- a/chrome/locale/ar/torbutton.dtd
+++ b/chrome/locale/ar/torbutton.dtd
@@ -36,6 +36,6 @@
<!ENTITY torbutton.prefs.sec_js_disabled "تعطل جافا سكربت مبدئيا على جميع المواقع.">
<!ENTITY torbutton.prefs.sec_limit_typography "تعطّل بعض الخطوط والرموز الرياضية.">
<!ENTITY torbutton.prefs.sec_limit_graphics_and_typography "تعطّل بعض الخطوط والأيقونات والرموز الرياضية والصور.">
-<!ENTITY torbutton.prefs.sec_click_to_play_media "Audio and video (HTML5 media), and WebGL are click-to-play.">
+<!ENTITY torbutton.prefs.sec_click_to_play_media "الصوت والفيديو (HTML5 media), و WebGL هي انقر للتشغيل">
<!ENTITY torbutton.circuit_display.title "دائرة تور">
<!ENTITY torbutton.circuit_display.new_circuit "دائرة تور جديدة لهذا الموقع">
diff --git a/chrome/locale/ca/aboutTor.dtd b/chrome/locale/ca/aboutTor.dtd
index 2eca70f2..b6f51e39 100644
--- a/chrome/locale/ca/aboutTor.dtd
+++ b/chrome/locale/ca/aboutTor.dtd
@@ -9,7 +9,7 @@
<!ENTITY aboutTor.viewChangelog.label "Visualitza el registre de canvis">
<!ENTITY aboutTor.ready.label "Exploreu. Privadament.">
-<!ENTITY aboutTor.ready2.label "Estàs preparat per a l'experiència de navegació més privada del món.">
+<!ENTITY aboutTor.ready2.label "Esteu preparat per a l'experiència de navegació més privada del món.">
<!ENTITY aboutTor.failure.label "Hi ha algun error.">
<!ENTITY aboutTor.failure2.label "Tor no funciona en aquest navegador.">
@@ -23,13 +23,13 @@
<!ENTITY aboutTor.torbrowser_user_manual.label "Manual del navegador Tor">
<!ENTITY aboutTor.tor_mission.label "El projecte Tor és una US 501(c)(3) organització sense ànim de lucre que avança els drets i les llibertats dels drets humans mitjançant la creació i implementació d'anonimat de codi obert i lliure i tecnologies de privadesa, que donen suport a la seva disponibilitat i ús sense restriccions i fomenten la seva comprensió científica i popular.">
-<!ENTITY aboutTor.getInvolved.label "Involucrat »">
+<!ENTITY aboutTor.getInvolved.label "Col·laboreu-hi »">
<!ENTITY aboutTor.getInvolved.link "https://www.torproject.org/getinvolved/volunteer.html.en">
<!ENTITY aboutTor.newsletter.tagline "Obteniu les darreres novetats de Tor directament a la safata d'entrada.">
<!ENTITY aboutTor.newsletter.link_text "Inscriviu-vos a les noticies de Tor.">
-<!ENTITY aboutTor.donationBanner.line2e "Fes que Tor segueixi fort.">
-<!ENTITY aboutTor.donationBanner.buttonA "Fes una donació">
+<!ENTITY aboutTor.donationBanner.line2e "Feu que Tor segueixi fort.">
+<!ENTITY aboutTor.donationBanner.buttonA "Feu una donació">
-<!ENTITY aboutTor.donationBanner3.line1 "Automatic monthly donations keep Tor strong.">
-<!ENTITY aboutTor.donationBanner3.line2 "Become a Defender of Privacy today.">
+<!ENTITY aboutTor.donationBanner3.line1 "Els donatius mensuals automàtics fan fort el Tor.">
+<!ENTITY aboutTor.donationBanner3.line2 "Convertiu-vos avui en un defensor de la privadesa.">
diff --git a/chrome/locale/cs/aboutTor.dtd b/chrome/locale/cs/aboutTor.dtd
index 1d62f176..74825986 100644
--- a/chrome/locale/cs/aboutTor.dtd
+++ b/chrome/locale/cs/aboutTor.dtd
@@ -31,5 +31,5 @@
<!ENTITY aboutTor.donationBanner.line2e "Pomozte Toru sílit.">
<!ENTITY aboutTor.donationBanner.buttonA "Přispějte">
-<!ENTITY aboutTor.donationBanner3.line1 "Automatic monthly donations keep Tor strong.">
-<!ENTITY aboutTor.donationBanner3.line2 "Become a Defender of Privacy today.">
+<!ENTITY aboutTor.donationBanner3.line1 "Automatické měsíční příspěvky pomáhají Tor rozvíjet.">
+<!ENTITY aboutTor.donationBanner3.line2 "Přispějte na obranu soukromí.">
diff --git a/chrome/locale/cs/browserOnboarding.properties b/chrome/locale/cs/browserOnboarding.properties
index dc9a0c13..c8b4241a 100644
--- a/chrome/locale/cs/browserOnboarding.properties
+++ b/chrome/locale/cs/browserOnboarding.properties
@@ -26,7 +26,7 @@ onboarding.tour-tor-circuit-display.next-button=Přejít na Zabezpečení
onboarding.tour-tor-security=Zabezpečení
onboarding.tour-tor-security.title=Určujte svůj prožitek.
onboarding.tour-tor-security.description=K dispozici máte rozšířená nastavení pro další zvýšení zabezpečení, např. blokování všech prvků, které mohou být potenciálně použity k útoku na váš počítač. Pro zobrazení různých možností a jejich fungování klepněte níže.
-onboarding.tour-tor-security.description-suffix=Note: By default, NoScript and HTTPS Everywhere are not included on the toolbar, but you can customize your toolbar to add them.
+onboarding.tour-tor-security.description-suffix=Poznámka: Ve výchozím nastavení se NoScript ani HTTPS Everywhere na nástrojové liště nezobrazují, ale můžete si nastavení lišt změnit.
onboarding.tour-tor-security-level.button=Zobrazit nastavenou úroveň zabezpečení
onboarding.tour-tor-security-level.next-button=Přejít na pokročilé tipy
diff --git a/chrome/locale/cs/securityLevel.properties b/chrome/locale/cs/securityLevel.properties
index 357c3b3f..5a0214b5 100644
--- a/chrome/locale/cs/securityLevel.properties
+++ b/chrome/locale/cs/securityLevel.properties
@@ -9,7 +9,7 @@ securityLevel.safer.tooltip = Úroveň zabezpečení: bezpečnější
securityLevel.safer.summary = Některé méně bezpečné funkce jsou vypnuty, ale některé stránky nemusí fungovat.
securityLevel.safer.description1 = JavaScript je na stránkách bez HTTPS vypnut.
securityLevel.safer.description2 = Některá písma a matematické symboly jsou zablokovány.
-securityLevel.safer.description3 = Audio and video (HTML5 media), and WebGL are click-to-play.
+securityLevel.safer.description3 = Audio, video (HTML5 média) a WebGL se přehrávají po kliknutí.
securityLevel.safest.level = Nejbezpečnější
securityLevel.safest.tooltip = Úroveň zabezpečení: nejbezpečnější
securityLevel.safest.summary = Povolí jen funkce pro zobrazení statických webových stránek a fungování základních služeb. Ovlivněno bude zobrazení obrázků, médií a fungování skriptů.
diff --git a/chrome/locale/cs/torbutton.dtd b/chrome/locale/cs/torbutton.dtd
index ae92cd70..75855010 100644
--- a/chrome/locale/cs/torbutton.dtd
+++ b/chrome/locale/cs/torbutton.dtd
@@ -36,6 +36,6 @@
<!ENTITY torbutton.prefs.sec_js_disabled "JavaScript je ve výchozím nastavení vypnut na všech stránkách.">
<!ENTITY torbutton.prefs.sec_limit_typography "Některá písma a matematické symboly jsou zablokovány.">
<!ENTITY torbutton.prefs.sec_limit_graphics_and_typography "Některá písma, matematické symboly a obrázky jsou zablokovány.">
-<!ENTITY torbutton.prefs.sec_click_to_play_media "Audio and video (HTML5 media), and WebGL are click-to-play.">
+<!ENTITY torbutton.prefs.sec_click_to_play_media "Audio, video (HTML5 média) a WebGL se přehrávají po kliknutí.">
<!ENTITY torbutton.circuit_display.title "Tor okruh">
<!ENTITY torbutton.circuit_display.new_circuit "Nový okruh Toru pro tuto stránku">
diff --git a/chrome/locale/da/aboutTBUpdate.dtd b/chrome/locale/da/aboutTBUpdate.dtd
index 0b1afb03..7f580fab 100644
--- a/chrome/locale/da/aboutTBUpdate.dtd
+++ b/chrome/locale/da/aboutTBUpdate.dtd
@@ -1,7 +1,7 @@
<!ENTITY aboutTBUpdate.changelogTitle "Ændringslog for Tor Browser">
<!ENTITY aboutTBUpdate.updated "Tor Browser er blevet opdateret.">
-<!ENTITY aboutTBUpdate.linkPrefix "For den mest aktuelle information om denne udgivelse,">
-<!ENTITY aboutTBUpdate.linkLabel "Besøg vores webside">
+<!ENTITY aboutTBUpdate.linkPrefix "For den seneste information om denne udgivelse, ">
+<!ENTITY aboutTBUpdate.linkLabel "besøg vores websted">
<!ENTITY aboutTBUpdate.linkSuffix ".">
<!ENTITY aboutTBUpdate.version "Version">
<!ENTITY aboutTBUpdate.releaseDate "Udgivelsesdato">
diff --git a/chrome/locale/da/aboutTor.dtd b/chrome/locale/da/aboutTor.dtd
index 50f79ff0..7eb93c52 100644
--- a/chrome/locale/da/aboutTor.dtd
+++ b/chrome/locale/da/aboutTor.dtd
@@ -31,5 +31,5 @@
<!ENTITY aboutTor.donationBanner.line2e "Hold Tor stærk.">
<!ENTITY aboutTor.donationBanner.buttonA "Donér nu">
-<!ENTITY aboutTor.donationBanner3.line1 "Automatic monthly donations keep Tor strong.">
-<!ENTITY aboutTor.donationBanner3.line2 "Become a Defender of Privacy today.">
+<!ENTITY aboutTor.donationBanner3.line1 "Automatiske månedlige donationer holder Tor stærk.">
+<!ENTITY aboutTor.donationBanner3.line2 "Vær med til at beskytte privatliv i dag.">
diff --git a/chrome/locale/da/torbutton.properties b/chrome/locale/da/torbutton.properties
index 5238092e..8554e129 100644
--- a/chrome/locale/da/torbutton.properties
+++ b/chrome/locale/da/torbutton.properties
@@ -29,7 +29,7 @@ torbutton.popup.short_torbrowser = Vigtig Torbutton-information!\n\nTorbutton er
torbutton.popup.confirm_plugins = Udvidelsesmoduler såsom Flash kan skade sikkerheden for dit privatliv og din anonymitet.\n\nDe kan også omgå Tor, så din nuværende placering og IP-adresse afsløres.\n\nEr du sikker på at du vil aktivere udvidelsesmoduler?\n\n
torbutton.popup.never_ask_again = Spørg mig aldrig igen
-torbutton.popup.confirm_newnym = Tor Browser vil lukke alle vinduer og faneblade. Alle webside-sessioner vil gå tabt.\nGenstart Tor Browser nu for at nulstille din identitet?\n
+torbutton.popup.confirm_newnym = Tor Browser vil lukke alle vinduer og faneblade. Alle websted-sessioner vil gå tabt.\nGenstart Tor Browser nu for at nulstille din identitet?\n
torbutton.maximize_warning = Hvis du maksimere Tor Browser kan websteder fastslå din skærmstørrelse, hvilket kan bruges til at spore dig. Vi anbefaler at lade Tor Browser-vinduet være i sin oprindelige standardstørrelse.
diff --git a/chrome/locale/el/aboutTor.dtd b/chrome/locale/el/aboutTor.dtd
index 5ca6e97f..8556ebc0 100644
--- a/chrome/locale/el/aboutTor.dtd
+++ b/chrome/locale/el/aboutTor.dtd
@@ -31,5 +31,5 @@
<!ENTITY aboutTor.donationBanner.line2e "Διατηρήστε το Tor ισχυρό.">
<!ENTITY aboutTor.donationBanner.buttonA "Κάντε μια δωρεά τώρα!">
-<!ENTITY aboutTor.donationBanner3.line1 "Automatic monthly donations keep Tor strong.">
-<!ENTITY aboutTor.donationBanner3.line2 "Become a Defender of Privacy today.">
+<!ENTITY aboutTor.donationBanner3.line1 "Οι αυτόματες μηνιαίες δωρεές κρατάνε το Tor δυνατό.">
+<!ENTITY aboutTor.donationBanner3.line2 "Γίνε σήμερα προστάτης της ιδιωτικότητας.">
diff --git a/chrome/locale/es-AR/aboutTor.dtd b/chrome/locale/es-AR/aboutTor.dtd
index e6345218..1ada3342 100644
--- a/chrome/locale/es-AR/aboutTor.dtd
+++ b/chrome/locale/es-AR/aboutTor.dtd
@@ -31,5 +31,5 @@
<!ENTITY aboutTor.donationBanner.line2e "Mantener fuerte a Tor.">
<!ENTITY aboutTor.donationBanner.buttonA "Doná ahora">
-<!ENTITY aboutTor.donationBanner3.line1 "Automatic monthly donations keep Tor strong.">
-<!ENTITY aboutTor.donationBanner3.line2 "Become a Defender of Privacy today.">
+<!ENTITY aboutTor.donationBanner3.line1 "Donaciones automaticas mensuales mantienen Tor fuerte.">
+<!ENTITY aboutTor.donationBanner3.line2 "Convertite en un Defensor de la Privacidad hoy.">
diff --git a/chrome/locale/es-AR/securityLevel.properties b/chrome/locale/es-AR/securityLevel.properties
index c642566d..0c8564d2 100644
--- a/chrome/locale/es-AR/securityLevel.properties
+++ b/chrome/locale/es-AR/securityLevel.properties
@@ -9,7 +9,7 @@ securityLevel.safer.tooltip = Nivel de Seguridad: Más Seguro
securityLevel.safer.summary = Deshabilita características del sitio web que son a menudo peligrosas, causando que algunos sitios pierdan funcionalidad.
securityLevel.safer.description1 = JavaScript está deshabilitado en sitios no-HTTPS.
securityLevel.safer.description2 = Algunos tipos de letra y símbolos matemáticos están deshabilitados.
-securityLevel.safer.description3 = Audio and video (HTML5 media), and WebGL are click-to-play.
+securityLevel.safer.description3 = Audio y video (medios HTML5) son cliquear-para-reproducir.
securityLevel.safest.level = El más seguro
securityLevel.safest.tooltip = Nivel de Seguridad: El más Seguro
securityLevel.safest.summary = Sólo permite características del sitio web requeridas por sitios estáticos y servicios básicos. Estos cambios afectan imágenes, medios y código ejecutable.
diff --git a/chrome/locale/es-AR/torbutton.dtd b/chrome/locale/es-AR/torbutton.dtd
index b899ae2e..3d2315af 100644
--- a/chrome/locale/es-AR/torbutton.dtd
+++ b/chrome/locale/es-AR/torbutton.dtd
@@ -36,6 +36,6 @@
<!ENTITY torbutton.prefs.sec_js_disabled "JavaScript está deshabilitado por defecto en todos los sitios.">
<!ENTITY torbutton.prefs.sec_limit_typography "Algunos tipos de letra y símbolos matemáticos están deshabilitados.">
<!ENTITY torbutton.prefs.sec_limit_graphics_and_typography "Algunos tipos de letra, iconos, símbolos matemáticos e imágenes están deshabilitados.">
-<!ENTITY torbutton.prefs.sec_click_to_play_media "Audio and video (HTML5 media), and WebGL are click-to-play.">
+<!ENTITY torbutton.prefs.sec_click_to_play_media "Audio y video (medios HTML5) son cliquear-para-reproducir.">
<!ENTITY torbutton.circuit_display.title "Circuito Tor">
<!ENTITY torbutton.circuit_display.new_circuit "Nuevo circuito para este sitio">
diff --git a/chrome/locale/fr/aboutTor.dtd b/chrome/locale/fr/aboutTor.dtd
index e83f750c..c0e5dfec 100644
--- a/chrome/locale/fr/aboutTor.dtd
+++ b/chrome/locale/fr/aboutTor.dtd
@@ -32,4 +32,4 @@
<!ENTITY aboutTor.donationBanner.buttonA "Faites un don maintenant">
<!ENTITY aboutTor.donationBanner3.line1 "Les dons mensuels automatiques assurent la robustesse de Tor.">
-<!ENTITY aboutTor.donationBanner3.line2 "Devenez dès aujourd'hui un défenseur de la vie privée et de sa protection.">
+<!ENTITY aboutTor.donationBanner3.line2 "Devenez dès aujourd’hui un défenseur de la vie privée et de sa protection.">
diff --git a/chrome/locale/ga-IE/aboutTor.dtd b/chrome/locale/ga-IE/aboutTor.dtd
index f649892d..79a3176e 100644
--- a/chrome/locale/ga-IE/aboutTor.dtd
+++ b/chrome/locale/ga-IE/aboutTor.dtd
@@ -31,5 +31,5 @@
<!ENTITY aboutTor.donationBanner.line2e "Cuir taca le Tor.">
<!ENTITY aboutTor.donationBanner.buttonA "Tabhair síntiús airgid anois">
-<!ENTITY aboutTor.donationBanner3.line1 "Automatic monthly donations keep Tor strong.">
-<!ENTITY aboutTor.donationBanner3.line2 "Become a Defender of Privacy today.">
+<!ENTITY aboutTor.donationBanner3.line1 "Ba mhór an cúnamh dúinn síntiúis airgid míosúla.">
+<!ENTITY aboutTor.donationBanner3.line2 "Bí i do Chosantóir an Phríobháideachais inniu.">
diff --git a/chrome/locale/hu/aboutTBUpdate.dtd b/chrome/locale/hu/aboutTBUpdate.dtd
index ad31aa8a..946bb36b 100644
--- a/chrome/locale/hu/aboutTBUpdate.dtd
+++ b/chrome/locale/hu/aboutTBUpdate.dtd
@@ -1,8 +1,8 @@
-<!ENTITY aboutTBUpdate.changelogTitle "Tor Browser Changelog">
+<!ENTITY aboutTBUpdate.changelogTitle "Tor Browser Változási napló">
<!ENTITY aboutTBUpdate.updated "Tor Browser frissítve.">
<!ENTITY aboutTBUpdate.linkPrefix "Az erről a kiadásról szóló legfrissebb információkért">
<!ENTITY aboutTBUpdate.linkLabel "látogassa meg weboldalunkat">
<!ENTITY aboutTBUpdate.linkSuffix ".">
<!ENTITY aboutTBUpdate.version "Verzió">
-<!ENTITY aboutTBUpdate.releaseDate "Release Date">
+<!ENTITY aboutTBUpdate.releaseDate "Kiadási dátum">
<!ENTITY aboutTBUpdate.releaseNotes "Verziókövetési jegyzet">
diff --git a/chrome/locale/hu/aboutTor.dtd b/chrome/locale/hu/aboutTor.dtd
index b83a2815..dc759969 100644
--- a/chrome/locale/hu/aboutTor.dtd
+++ b/chrome/locale/hu/aboutTor.dtd
@@ -28,8 +28,8 @@
<!ENTITY aboutTor.newsletter.tagline "Kapja meg a legfrissebb Tor híreket közvetlenül email fiókjába.">
<!ENTITY aboutTor.newsletter.link_text "Iratkozzon fel a Tor hírekhez.">
-<!ENTITY aboutTor.donationBanner.line2e "Tartsuk a Tor-t erősnek.">
+<!ENTITY aboutTor.donationBanner.line2e "Tartsuk meg a Tor-t erősnek.">
<!ENTITY aboutTor.donationBanner.buttonA "Támogasson most">
-<!ENTITY aboutTor.donationBanner3.line1 "Automatic monthly donations keep Tor strong.">
-<!ENTITY aboutTor.donationBanner3.line2 "Become a Defender of Privacy today.">
+<!ENTITY aboutTor.donationBanner3.line1 "Az automatikus havi támogatások a tartják a Tort erősen.">
+<!ENTITY aboutTor.donationBanner3.line2 "Legyen az Adatok Védelmezője még ma.">
diff --git a/chrome/locale/hu/securityLevel.properties b/chrome/locale/hu/securityLevel.properties
index ea2e700e..ecb5ab1c 100644
--- a/chrome/locale/hu/securityLevel.properties
+++ b/chrome/locale/hu/securityLevel.properties
@@ -1,6 +1,6 @@
securityLevel.securityLevel = Biztonsági szint
securityLevel.customWarning = Egyéni
-securityLevel.overview = Disable certain web features that can be used to attack your security and anonymity.
+securityLevel.overview = Néhány web szolgáltatás kikapcsolása, amit támadhatja biztonságát és anonimitását.
securityLevel.standard.level = Normál
securityLevel.standard.tooltip = Biztonsági szint: Normál
securityLevel.standard.summary = Minden Tor Browser és weboldal szolgáltatás engedélyezve.
@@ -9,7 +9,7 @@ securityLevel.safer.tooltip = Biztonsági szint: Biztonságosabb
securityLevel.safer.summary = Azon weboldal szolgáltatások tiltása, amelyek többnyire veszélyesek, ami néhány oldal működésének problémáit okozhatja.
securityLevel.safer.description1 = A JavaScript tiltott a nem-HTTPS oldalkon.
securityLevel.safer.description2 = Néhány betűtípus és matematikai szimbólum tiltásra került.
-securityLevel.safer.description3 = Audio and video (HTML5 media), and WebGL are click-to-play.
+securityLevel.safer.description3 = Az audió és videó (HTML5 média) és a WebGL kattintásra indul.
securityLevel.safest.level = Legbiztonságosabb
securityLevel.safest.tooltip = Biztonsági szint: Legbiztonságosabb
securityLevel.safest.summary = Csak azon weboldal szolgáltatások engedélyezése, amelyek a statikus, vagy alap szolgáltatásokhoz szükségesek. Ezek a beállítások érintik a képeket, médiákat és scripteket.
@@ -19,4 +19,4 @@ securityLevel.safest.description3 = Audió és videó (HTML5 média) kattintásr
securityLevel.custom.summary = Az Ön által eszközölt egyéni böngészői beállítások eredményeképp biztonsági kockázatok merülhetnek fel. Biztonsági és adatvédelmi szempontokból kérjük válasszon az alapértelmezett biztonsági szintek közül.
securityLevel.learnMore = További információ
securityLevel.restoreDefaults = Alapértelmezések visszaállítása
-securityLevel.advancedSecuritySettings = Advanced Security Settings…
+securityLevel.advancedSecuritySettings = Speciális biztonsági beállítások...
diff --git a/chrome/locale/hu/torbutton.dtd b/chrome/locale/hu/torbutton.dtd
index a00bbdba..0c0b05b5 100644
--- a/chrome/locale/hu/torbutton.dtd
+++ b/chrome/locale/hu/torbutton.dtd
@@ -36,6 +36,6 @@
<!ENTITY torbutton.prefs.sec_js_disabled "A JavaScript alapértelmezetten tiltott minden oldalon.">
<!ENTITY torbutton.prefs.sec_limit_typography "Néhány betűtípus és matematikai szimbólum tiltásra került.">
<!ENTITY torbutton.prefs.sec_limit_graphics_and_typography "Néhány betűtípus, ikon és matematikai szimbólum és a képek tiltásra kerültek.">
-<!ENTITY torbutton.prefs.sec_click_to_play_media "Audio and video (HTML5 media), and WebGL are click-to-play.">
+<!ENTITY torbutton.prefs.sec_click_to_play_media "Az audió és videó (HTML5 média) és a WebGL kattintásra indul.">
<!ENTITY torbutton.circuit_display.title "Tor áramkör">
<!ENTITY torbutton.circuit_display.new_circuit "Új Tor áramkör ehhez az oldalhoz">
diff --git a/chrome/locale/id/aboutTor.dtd b/chrome/locale/id/aboutTor.dtd
index 0d7fa618..eb7581f9 100644
--- a/chrome/locale/id/aboutTor.dtd
+++ b/chrome/locale/id/aboutTor.dtd
@@ -11,25 +11,25 @@
<!ENTITY aboutTor.ready.label "Jelajahi. Secara Privat.">
<!ENTITY aboutTor.ready2.label "Anda siap untuk pengalaman menjelajah yang paling privat di dunia.">
<!ENTITY aboutTor.failure.label "Ada Masalah!">
-<!ENTITY aboutTor.failure2.label "Tor tidak dapat digunakan di peramban ini.">
+<!ENTITY aboutTor.failure2.label "Tor tidak dapat digunakan diperamban ini.">
<!ENTITY aboutTor.search.label "Cari dengan DuckDuckGo">
<!ENTITY aboutTor.searchDDGPost.link "https://duckduckgo.com">
<!ENTITY aboutTor.torbrowser_user_manual_questions.label "Pertanyaan?">
-<!ENTITY aboutTor.torbrowser_user_manual_link.label "Periksa Tor Browser Manual kami »">
+<!ENTITY aboutTor.torbrowser_user_manual_link.label "Periksa Manual Tor Browser kami »">
<!-- The next two entities are used within the browser's Help menu. -->
-<!ENTITY aboutTor.torbrowser_user_manual.accesskey "m">
-<!ENTITY aboutTor.torbrowser_user_manual.label "Tor Browser Manual ">
+<!ENTITY aboutTor.torbrowser_user_manual.accesskey "M">
+<!ENTITY aboutTor.torbrowser_user_manual.label "Manual Tor Browser">
-<!ENTITY aboutTor.tor_mission.label "The Tor Project adalah US 501(c)(3) organisasi nirlaba yang bertujuan memajukan hak asasi manusia dan kebebasan dengan membuat dan menyebarkan teknologi anominitas dan privasi yang bebas dan terbuka dan mendukung keberadaan dan penggunaannya, dan meningkatkan pemahamannya dalam hal ilmiah dan populer.">
+<!ENTITY aboutTor.tor_mission.label "The Tor Project adalah US 501(c)(3) organisasi nirlaba yang bertujuan memajukan hak asasi manusia dan kebebasan dengan membuat dan menyebarkan teknologi anominitas dan privasi yang bebas dan terbuka, mendukung keberadaan dan penggunaannya, dan meningkatkan pemahamannya ilmiah dan populernya.">
<!ENTITY aboutTor.getInvolved.label "Ikut Terlibat »">
<!ENTITY aboutTor.getInvolved.link "https://www.torproject.org/terlibat/relawan.html.id">
-<!ENTITY aboutTor.newsletter.tagline "Dapatkan berita Tor terbaru langsung ke inbox Anda.">
+<!ENTITY aboutTor.newsletter.tagline "Dapatkan berita Tor terbaru langsung dipos-el Anda.">
<!ENTITY aboutTor.newsletter.link_text "Daftar untuk mendapatkan Berita Tor.">
-<!ENTITY aboutTor.donationBanner.line2e "Keep Tor strong.">
+<!ENTITY aboutTor.donationBanner.line2e "Bantu Tor tetap kuat.">
<!ENTITY aboutTor.donationBanner.buttonA "Donasi Sekarang">
-<!ENTITY aboutTor.donationBanner3.line1 "Automatic monthly donations keep Tor strong.">
-<!ENTITY aboutTor.donationBanner3.line2 "Become a Defender of Privacy today.">
+<!ENTITY aboutTor.donationBanner3.line1 "Donasi bulanan otomatis untuk membantu Tor tetap kuat.">
+<!ENTITY aboutTor.donationBanner3.line2 "Jadilah Pahlawan Privasi hari ini.">
diff --git a/chrome/locale/is/aboutTor.dtd b/chrome/locale/is/aboutTor.dtd
index e3bfeff5..b6da912b 100644
--- a/chrome/locale/is/aboutTor.dtd
+++ b/chrome/locale/is/aboutTor.dtd
@@ -31,5 +31,5 @@
<!ENTITY aboutTor.donationBanner.line2e "Höldum Tor sterku">
<!ENTITY aboutTor.donationBanner.buttonA "Styrkja núna">
-<!ENTITY aboutTor.donationBanner3.line1 "Automatic monthly donations keep Tor strong.">
-<!ENTITY aboutTor.donationBanner3.line2 "Become a Defender of Privacy today.">
+<!ENTITY aboutTor.donationBanner3.line1 "Sjálfvirkar mánaðarlegar greiðslur eru mikill styrkur fyrir Tor.">
+<!ENTITY aboutTor.donationBanner3.line2 "Gerstu strax baráttumaður fyrir friðhelgi einkalífsins.">
diff --git a/chrome/locale/it/aboutTor.dtd b/chrome/locale/it/aboutTor.dtd
index a1477463..6178c8eb 100644
--- a/chrome/locale/it/aboutTor.dtd
+++ b/chrome/locale/it/aboutTor.dtd
@@ -29,7 +29,7 @@
<!ENTITY aboutTor.newsletter.tagline "Ottieni le ultime info da Tor direttamente nella tua casella di posta elettronica.">
<!ENTITY aboutTor.newsletter.link_text "Registrati alle Tor News.">
<!ENTITY aboutTor.donationBanner.line2e "Mantieni Tor forte.">
-<!ENTITY aboutTor.donationBanner.buttonA "Dona Ora">
+<!ENTITY aboutTor.donationBanner.buttonA "Dona Adesso">
-<!ENTITY aboutTor.donationBanner3.line1 "Le donazioni mensili automatiche mantengono forte Tor.">
+<!ENTITY aboutTor.donationBanner3.line1 "Le donazioni mensili automatiche mantengono Tor forte.">
<!ENTITY aboutTor.donationBanner3.line2 "Diventa un Difensore della Privacy oggi.">
diff --git a/chrome/locale/ja/aboutTor.dtd b/chrome/locale/ja/aboutTor.dtd
index 5524169a..183b5e2a 100644
--- a/chrome/locale/ja/aboutTor.dtd
+++ b/chrome/locale/ja/aboutTor.dtd
@@ -31,5 +31,5 @@
<!ENTITY aboutTor.donationBanner.line2e "Tor を強く保つ。">
<!ENTITY aboutTor.donationBanner.buttonA "今すぐ寄付">
-<!ENTITY aboutTor.donationBanner3.line1 "Automatic monthly donations keep Tor strong.">
-<!ENTITY aboutTor.donationBanner3.line2 "Become a Defender of Privacy today.">
+<!ENTITY aboutTor.donationBanner3.line1 "毎月の寄付によりTorを強固に保ちましょう。">
+<!ENTITY aboutTor.donationBanner3.line2 "プライバシーの守護者になりましょう。">
diff --git a/chrome/locale/ja/securityLevel.properties b/chrome/locale/ja/securityLevel.properties
index 9fc42437..292dbea8 100644
--- a/chrome/locale/ja/securityLevel.properties
+++ b/chrome/locale/ja/securityLevel.properties
@@ -9,7 +9,7 @@ securityLevel.safer.tooltip = セキュリティレベル:やや安全
securityLevel.safer.summary = ウェブサイトのしばしば危険である機能を無効化します。サイトによっては正常に動作しなくなります。
securityLevel.safer.description1 = HTTPS非対応のサイトで JavaScript が無効化されます。
securityLevel.safer.description2 = いくつかのフォントと数学記号が無効化されます。
-securityLevel.safer.description3 = Audio and video (HTML5 media), and WebGL are click-to-play.
+securityLevel.safer.description3 = オーディオ、ビデオ(HTML5メディア)、WebGLはクリックすると再生されます。
securityLevel.safest.level = 最も安全
securityLevel.safest.tooltip = セキュリティレベル:最も安全
securityLevel.safest.summary = 静的なサイトと基本的なサービスに必要な機能だけを許可します。この変更は画像、メディア、スクリプトに影響します。
diff --git a/chrome/locale/ja/torbutton.dtd b/chrome/locale/ja/torbutton.dtd
index 3137fb04..0c1d43ab 100644
--- a/chrome/locale/ja/torbutton.dtd
+++ b/chrome/locale/ja/torbutton.dtd
@@ -36,6 +36,6 @@
<!ENTITY torbutton.prefs.sec_js_disabled "すべてのサイトで JavaScript が無効化されます。">
<!ENTITY torbutton.prefs.sec_limit_typography "いくつかのフォントと数学記号が無効化されます。">
<!ENTITY torbutton.prefs.sec_limit_graphics_and_typography "いくつかのアイコン、数学記号および画像が無効化されます。">
-<!ENTITY torbutton.prefs.sec_click_to_play_media "Audio and video (HTML5 media), and WebGL are click-to-play.">
+<!ENTITY torbutton.prefs.sec_click_to_play_media "オーディオ、ビデオ(HTML5メディア)、WebGLはクリックすると再生されます。">
<!ENTITY torbutton.circuit_display.title "Tor サーキット">
<!ENTITY torbutton.circuit_display.new_circuit "このサイトに新しいサーキットを使用する">
diff --git a/chrome/locale/ko/aboutTor.dtd b/chrome/locale/ko/aboutTor.dtd
index 753a9b4c..2469a6af 100644
--- a/chrome/locale/ko/aboutTor.dtd
+++ b/chrome/locale/ko/aboutTor.dtd
@@ -9,7 +9,7 @@
<!ENTITY aboutTor.viewChangelog.label "변경이력 보기">
<!ENTITY aboutTor.ready.label "은밀하게 탐색하십시오.">
-<!ENTITY aboutTor.ready2.label "당신은 온세상이 가장 은밀한 탐색의 경험을 준비가 되었습니다.">
+<!ENTITY aboutTor.ready2.label "당신은 온 세상에서 가장 은밀하게 탐색의 경험을 할 준비가 되었습니다.">
<!ENTITY aboutTor.failure.label "뭔가 잘못되었습니다!">
<!ENTITY aboutTor.failure2.label "Tor는 이 브라우저에서 작동하지 않습니다.">
@@ -28,8 +28,8 @@
<!ENTITY aboutTor.newsletter.tagline "최신의 Tor 뉴스를 받은 편지함에 곧장 받으십시오.">
<!ENTITY aboutTor.newsletter.link_text "Tor 뉴스를 구독.">
-<!ENTITY aboutTor.donationBanner.line2e "Keep Tor strong.">
-<!ENTITY aboutTor.donationBanner.buttonA "Donate Now">
+<!ENTITY aboutTor.donationBanner.line2e "Tor 를 강하게 유지하기.">
+<!ENTITY aboutTor.donationBanner.buttonA "기부하기">
-<!ENTITY aboutTor.donationBanner3.line1 "Automatic monthly donations keep Tor strong.">
-<!ENTITY aboutTor.donationBanner3.line2 "Become a Defender of Privacy today.">
+<!ENTITY aboutTor.donationBanner3.line1 "매월 자동기부를 통해 Tor를 강하게 유지하기 ">
+<!ENTITY aboutTor.donationBanner3.line2 "바로 오늘 개인정보의 수호자가 되는 겁니다.">
diff --git a/chrome/locale/mk/aboutTor.dtd b/chrome/locale/mk/aboutTor.dtd
index bb87e67c..41f6ac88 100644
--- a/chrome/locale/mk/aboutTor.dtd
+++ b/chrome/locale/mk/aboutTor.dtd
@@ -31,5 +31,5 @@
<!ENTITY aboutTor.donationBanner.line2e "Чувај го Tor силен.">
<!ENTITY aboutTor.donationBanner.buttonA "Донирај сега">
-<!ENTITY aboutTor.donationBanner3.line1 "Automatic monthly donations keep Tor strong.">
-<!ENTITY aboutTor.donationBanner3.line2 "Become a Defender of Privacy today.">
+<!ENTITY aboutTor.donationBanner3.line1 "Автоматските месечни донации го чуваат Tor силен.">
+<!ENTITY aboutTor.donationBanner3.line2 "Станете Бранител на приватноста уште денес.">
diff --git a/chrome/locale/mk/browserOnboarding.properties b/chrome/locale/mk/browserOnboarding.properties
index f7e732cc..2f39b88a 100644
--- a/chrome/locale/mk/browserOnboarding.properties
+++ b/chrome/locale/mk/browserOnboarding.properties
@@ -10,12 +10,12 @@ onboarding.tour-tor-welcome.next-button=Оди во Приватност
onboarding.tour-tor-privacy=Приватност
onboarding.tour-tor-privacy.title=Прескокнете ги следачите и водачите.
onboarding.tour-tor-privacy.description=Tor Browser ги изолира колачињата и ја брише историјата на вашиот прелистувач после вашата сесија. Овие промени кои ја осигуруваат вашата приватност и безбедност се заштитени во прелистувачот. Кликнете на 'Tor Мрежа' за да научите како да се заштитите на мрежно ниво.
-onboarding.tour-tor-privacy.button=Одете на Tor Мрежа
+onboarding.tour-tor-privacy.button=Оди на Tor Мрежа
onboarding.tour-tor-network=Tor Мрежа
onboarding.tour-tor-network.title=Патувајте низ децентрализираната мрежа.
onboarding.tour-tor-network.description=Tor Browser ве поврзува на Tor мрежата одржувана од илјадници волонтери низ целиот свет. За разлика од VPN, овде нема место за неуспех или централизиран ентитет на кого треба да му верувате со цел да уживате приватност на Интернет.
-onboarding.tour-tor-network.button=Одете на Круг екранот
+onboarding.tour-tor-network.button=Оди на Круг екранот
onboarding.tour-tor-circuit-display=Круг екран
onboarding.tour-tor-circuit-display.title=Видете ја вашата патека.
@@ -25,7 +25,7 @@ onboarding.tour-tor-circuit-display.next-button=Оди во Безбедност
onboarding.tour-tor-security=Безбедност
onboarding.tour-tor-security.title=Изберете го вашето искуство.
-onboarding.tour-tor-security.description=Ние исто така ви овозможуваме дополнителни поставки за зголемување на безбедноста на вашиот прелистувач. Нашите безбедносни поставки ви овозможуваат да блокирате елементи кои можат да бидат користени да го нападнат вашиот компјутер. Кликнете подолу за да ги видите намените на различните опции.
+onboarding.tour-tor-security.description=Исто така ви овозможуваме дополнителни поставки за зголемување на безбедноста на вашиот прелистувач. Tor безбедносните поставки ви овозможуваат да блокирате елементи кои можат да бидат користени да го нападнат вашиот компјутер. Кликнете подолу за да ги видите намените на различните опции.
onboarding.tour-tor-security.description-suffix=Забелешка: Стандардно, NoScript и HTTPS Насекаде не се вклучени во лентата со алатки, но можете да ја прилагодувате вашата лента со алатки за истите да ги додадете.
onboarding.tour-tor-security-level.button=Погледнете го вашето ниво на безбедност
onboarding.tour-tor-security-level.next-button=Оди во Препораки од искуство
diff --git a/chrome/locale/mk/torbutton.properties b/chrome/locale/mk/torbutton.properties
index 898662af..db22bd11 100644
--- a/chrome/locale/mk/torbutton.properties
+++ b/chrome/locale/mk/torbutton.properties
@@ -20,8 +20,8 @@ torbutton.popup.external.note = Некои типови на датотеки м
torbutton.popup.external.suggest = Да би биле безбедни, единствено треба преземените датотеки да ги отворате додека сте исклучени од Интернет, или користејќи Tor бутирачкото ЦД како Tails.\n
torbutton.popup.launch = Преземи датотека
torbutton.popup.cancel = Откажи
-torbutton.popup.dontask = Автоматски преземај датотеки отсега па натаму
-torbutton.popup.no_newnym = Torbutton не може безбедно да ви даде нов идентитет. Нема пристап до Тор контролната порта.\n\nДали го користите Тор прелистувач-киот пакет?
+torbutton.popup.dontask = Автоматски преземај датотеки од сега па натаму
+torbutton.popup.no_newnym = Torbutton не може безбедно да ви даде нов идентитет. Нема пристап до Тor контролната порта.\n\nДали го користите Tor Browser Bundle?
torbutton.security_settings.menu.title = Безбедносни подесувања
torbutton.title.prompt_torbrowser = Важна Torbutton информација
torbutton.popup.prompt_torbrowser = Torbutton работи поинаку сега: не може повеќе да биде исклучен.\n\nЈа направивме оваа промена, заота што не е безбедно да се користи Torbutton во прелистувач кој исто така се користи за не-Tor прелистување. Имаше премногу грешки и проблеми кои не можеа да бидат поправени на поинаков начин.\n\nАко сакате да продолжите да го користите Firefox стандардно, треба да го деинсталирате Torbutton и да го преземете Tor Browser пакетот. Приватните поставки на Tor Browser се помоќни од оние на стандардниот Firefox дури и кога Firefox се користи со Torbutton.\n\nЗа да го отрстранит
е Torbutton, одете во Алатки->Додатоци->Проширувања и кликнете на 'Отстрани' копчето до Torbutton.
diff --git a/chrome/locale/nb-NO/aboutDialog.dtd b/chrome/locale/nb-NO/aboutDialog.dtd
index 78293397..708242f2 100644
--- a/chrome/locale/nb-NO/aboutDialog.dtd
+++ b/chrome/locale/nb-NO/aboutDialog.dtd
@@ -1,9 +1,9 @@
-<!ENTITY project.start "&bransShortName; blir utviklet av">
+<!ENTITY project.start "&brandShortName; blir utviklet av">
<!-- LOCALIZATION NOTE (project.tpoLink): This is a link title that links to https://www.torproject.org -->
<!ENTITY project.tpoLink "&vendorShortName;">
<!ENTITY project.end ", en veldedig organisasjon som jobber for å forsvare ditt personvern og din frihet på nett.">
-<!ENTITY help.start "Vil du bidra?">
+<!ENTITY help.start "Vil du hjelpe?">
<!-- LOCALIZATION NOTE (help.donate): This is a link title that links to https://www.torproject.org/donate/donate.html.en -->
<!ENTITY help.donateLink "Doner">
<!ENTITY help.or "eller">
diff --git a/chrome/locale/nb-NO/aboutTBUpdate.dtd b/chrome/locale/nb-NO/aboutTBUpdate.dtd
index c32d0b2e..e94bc709 100644
--- a/chrome/locale/nb-NO/aboutTBUpdate.dtd
+++ b/chrome/locale/nb-NO/aboutTBUpdate.dtd
@@ -1,5 +1,5 @@
-<!ENTITY aboutTBUpdate.changelogTitle "Tor Browser Endringslogg">
-<!ENTITY aboutTBUpdate.updated "Tor-nettleseren har blitt oppdatert.">
+<!ENTITY aboutTBUpdate.changelogTitle "Tor Nettleser Endringslogg">
+<!ENTITY aboutTBUpdate.updated "Tor Nettleser har blitt oppdatert.">
<!ENTITY aboutTBUpdate.linkPrefix "For den mest oppdaterte informasjonen om denne utgivelsen,">
<!ENTITY aboutTBUpdate.linkLabel "besøk vårt nettsted">
<!ENTITY aboutTBUpdate.linkSuffix ".">
diff --git a/chrome/locale/nb-NO/aboutTor.dtd b/chrome/locale/nb-NO/aboutTor.dtd
index 04cb3a97..53402eab 100644
--- a/chrome/locale/nb-NO/aboutTor.dtd
+++ b/chrome/locale/nb-NO/aboutTor.dtd
@@ -17,10 +17,10 @@
<!ENTITY aboutTor.searchDDGPost.link "https://duckduckgo.com">
<!ENTITY aboutTor.torbrowser_user_manual_questions.label "Spørsmål?">
-<!ENTITY aboutTor.torbrowser_user_manual_link.label "Sjekk vår Tor Browser Manual »">
+<!ENTITY aboutTor.torbrowser_user_manual_link.label "Sjekk vår Tor Nettleser Håndbok »">
<!-- The next two entities are used within the browser's Help menu. -->
<!ENTITY aboutTor.torbrowser_user_manual.accesskey "M">
-<!ENTITY aboutTor.torbrowser_user_manual.label "Tor-nettleseren Håndbok">
+<!ENTITY aboutTor.torbrowser_user_manual.label "Tor Nettleser Håndbok">
<!ENTITY aboutTor.tor_mission.label "The Tor Project er en US 501(c)(3) ideell organisasjon som fremmer menneskerettigheter og friheter ved å skape og distribuere anonymisering og personvernteknologi for fri og åpen kildekode, som støtter deres ubegrensede tilgjengelighet og bruk, og fremmer sin vitenskapelige og populære forståelse.">
<!ENTITY aboutTor.getInvolved.label "Bli involvert »">
@@ -31,5 +31,5 @@
<!ENTITY aboutTor.donationBanner.line2e "Hold Tor sterk.">
<!ENTITY aboutTor.donationBanner.buttonA "Donér nå">
-<!ENTITY aboutTor.donationBanner3.line1 "Automatic monthly donations keep Tor strong.">
-<!ENTITY aboutTor.donationBanner3.line2 "Become a Defender of Privacy today.">
+<!ENTITY aboutTor.donationBanner3.line1 "Automatisk månedlig donasjoner gjør Tor sterk.">
+<!ENTITY aboutTor.donationBanner3.line2 "Bli en Kjemper for Privatliv i dag.">
diff --git a/chrome/locale/nb-NO/brand.dtd b/chrome/locale/nb-NO/brand.dtd
index 7ae614c1..ff45f781 100644
--- a/chrome/locale/nb-NO/brand.dtd
+++ b/chrome/locale/nb-NO/brand.dtd
@@ -5,7 +5,7 @@
<!ENTITY brandShorterName "Tor-nettleseren">
<!ENTITY brandShortName "Tor-nettleseren">
<!ENTITY brandFullName "Tor-nettleseren">
-<!ENTITY vendorShortName "Tor-prosjektet">
+<!ENTITY vendorShortName "Tor Project">
<!ENTITY trademarkInfo.part1 "Firefox og Firefox-logene er varemarker tilhørende Mozilla-stiftelsen.">
<!-- The following strings are for bug #10280's UI. We place them here for our translators -->
diff --git a/chrome/locale/nb-NO/brand.properties b/chrome/locale/nb-NO/brand.properties
index 3101ebc6..2cbf97d7 100644
--- a/chrome/locale/nb-NO/brand.properties
+++ b/chrome/locale/nb-NO/brand.properties
@@ -5,7 +5,7 @@
brandShorterName=Tor-nettleseren
brandShortName=Tor-nettleseren
brandFullName=Tor-nettleseren
-vendorShortName=Tor-prosjektet
+vendorShortName=Tor Project
homePageSingleStartMain=Firefox Start, en rask startside med innebygd søk
homePageImport=Importer startsiden din fra %S
diff --git a/chrome/locale/nb-NO/browserOnboarding.properties b/chrome/locale/nb-NO/browserOnboarding.properties
index 3b0d070c..8ae65912 100644
--- a/chrome/locale/nb-NO/browserOnboarding.properties
+++ b/chrome/locale/nb-NO/browserOnboarding.properties
@@ -9,12 +9,12 @@ onboarding.tour-tor-welcome.next-button=Gå til Personvern
onboarding.tour-tor-privacy=Personvern
onboarding.tour-tor-privacy.title=Avvis snokere og sporing.
-onboarding.tour-tor-privacy.description=Tor Browser isolerer informasjonskapsler og sletter nettleserens historie etter økten. Disse endringene sikrer at personvernet ditt og sikkerheten er beskyttet i nettleseren. Klikk "Tor Nettverk" for å lære hvordan vi beskytter deg på nettverksnivå.
+onboarding.tour-tor-privacy.description=Tor Nettleser isolerer informasjonskapsler og sletter nettleserens historie etter økten. Disse endringene sikrer at personvernet ditt og sikkerheten er beskyttet i nettleseren. Klikk "Tor Nettverk" for å lære hvordan vi beskytter deg på nettverksnivå.
onboarding.tour-tor-privacy.button=Gå til Tor Nettverk
onboarding.tour-tor-network=Tor Nettverk
onboarding.tour-tor-network.title=Reis et decentralisert nettverk.
-onboarding.tour-tor-network.description=Tor Browser forbinder deg med Tor-nettet som drives av tusenvis av frivillige rundt om i verden. I motsetning til en VPN er det ingen feilpunkt eller sentralisert enhet du må stole på for å kunne nyte Internettet privat.
+onboarding.tour-tor-network.description=Tor Nettleser forbinder deg med Tor-nettet som drives av tusenvis av frivillige rundt om i verden. I motsetning til en VPN er det ingen feilpunkt eller sentralisert enhet du må stole på for å kunne nyte Internettet privat.
onboarding.tour-tor-network.button=Gå til Kretsvisning
onboarding.tour-tor-circuit-display=Kretsvisning
diff --git a/chrome/locale/nb-NO/torbutton.properties b/chrome/locale/nb-NO/torbutton.properties
index 83defa32..f4917f95 100644
--- a/chrome/locale/nb-NO/torbutton.properties
+++ b/chrome/locale/nb-NO/torbutton.properties
@@ -8,20 +8,20 @@ torbutton.circuit_display.unknown_country = Ukjent land
torbutton.circuit_display.guard = Vakt
torbutton.circuit_display.guard_note = Din [Vakt] node kan ikke endres.
torbutton.circuit_display.learn_more = Lær mer
-torbutton.content_sizer.margin_tooltip = Tor nettleseren legger til denne marginen for å lage bredden og høyden på ditt vindu mindre unikt, og reduserer slik muligheten for andre til å spore deg på nett.
+torbutton.content_sizer.margin_tooltip = Tor Nettleser legger til denne marginen for å gjøre bredden og høyden på vinduet ditt mindre særegent, og reduserer dermed muligheten for folk til å spore deg på nett.
torbutton.panel.tooltip.disabled = Klikk for å aktivere Tor
torbutton.panel.tooltip.enabled = Klikk for å skru av Tor
torbutton.panel.label.disabled = Tor er avskrudd
torbutton.panel.label.enabled = Tor er aktivert
extensions.torbutton(a)torproject.org.description = Torbutton tilbyr en knapp til å sette opp Tor-innstillinger, samt rask og enkel tilgang til å slette privat nettleserhistorikk.
torbutton.popup.external.title = Last ned en ekstern filtype?
-torbutton.popup.external.app = Tor-nettleseren kan ikke åpne denne filen. Du er nødt til å åpne den med et annet program.\n
+torbutton.popup.external.app = Tor Nettleser kan ikke åpne denne filen. Du er nødt til å åpne den med et annet program.\n\n
torbutton.popup.external.note = Noen filtyper kan forårsake at programmer kobler til internett uten å bruke Tor.\n
torbutton.popup.external.suggest = For å være på den sikre siden, bør du kun åpne nedlastede filer når du frakoblet internett, eller bruke en Tor Live CD som Tails.\n
torbutton.popup.launch = Last ned fil
torbutton.popup.cancel = Avbryt
torbutton.popup.dontask = Last ned filer automatisk fra nå av
-torbutton.popup.no_newnym = Torbutton kan ikke trygt gi deg en ny identitet. Den har ikke tilgang til Tor-kontrollporten.\n\nKjører du Tor-nettleserpakken?
+torbutton.popup.no_newnym = Torbutton kan ikke trygt gi deg en ny identitet. Den har ikke tilgang til Tor-kontrollporten.\n\nKjører du Tor Nettleser pakken?
torbutton.security_settings.menu.title = Sikkerhetsinnstillinger
torbutton.title.prompt_torbrowser = Viktig Torbutton-informasjon
torbutton.popup.prompt_torbrowser = Torbutton fungerer annerledes nå. Du kan ikke skru den av lenger.\n\nVi gjorde denne forandringen fordi det ikke er sikkert å bruke Torbutton i en nettleser som også brukers til annen surfing enn Tor. \nDet var for mange feil der til at vi kunne fikse det på en annen måte.\n\nHvis du ønsker å bruke Firefox normalt, bør du avinstallere Torbutton og laste ned Tor-nettleserforpakningen. Personvernsinnstillingene til Tor-nettleseren er også overlegen forvalget i Firefox, selv når Firefox brukes med Torbutton.\n\nFor å fjerne Torbutton, gå til Verktøy->Tillegg->Utvidelser og klikk på Fjern-knappen ved siden av Torbutton.
@@ -29,12 +29,12 @@ torbutton.popup.short_torbrowser = Viktig Torbutton-informasjon!\n\nTorbutton er
torbutton.popup.confirm_plugins = Nettlesertillegg som f.eks Flash kan skade personvernet og anonymiteten din.\n\nDe kan også omgå Tor og dermed avsløre din nåværende plassering og IP-adresse.\n\nEr du sikker på at du vil aktivere nettlesertillegg?\n\n
torbutton.popup.never_ask_again = Ikke spør meg igjen
-torbutton.popup.confirm_newnym = TOR-nettleseren vil stenge alle vinduer og faner. Alle nettstedeøkter vil gå tapt.\n\n\nRestart TOR-nettleseren nå for å tilbakestille din identitet?\n\n
+torbutton.popup.confirm_newnym = Tor Nettleser vil stenge alle vinduer og faner. Alle nettstedeøkter vil gå tapt.\n\nStart Tor Nettleser på nytt nå for å tilbakestille identiteten din?\n\n
-torbutton.maximize_warning = Å blåse opp vinduet Tor-nettleseren befinner seg i til full størrelse gir nettsteder muligheten til å fastslå din skjermoppløsning, som igjen kan brukes til å spore deg. Vi anbefaler at du lar Tor-nettleservinduet være i orginal størrelse.
+torbutton.maximize_warning = Å maksimere Tor Nettleser kan tillate nettsteder å bestemme skjermstørrelsen din, som kan brukes til å spore deg. Vi anbefaler at du lar Tor Nettleser vinduer ligge i den opprinnelige standardstørrelsen.
# Canvas permission prompt. Strings are kept here for ease of translation.
-canvas.siteprompt=Denne nettsiden (%S) prøvde å pakke ut HTML5-canvas-billeddata, hvilket kan brukes til å tilkjennegi din datamaskin spesifikt i identifiseringsøyemed.\n\nSkal Tor-nettleseren tillate denne nettsiden å pakke ut HTML5-canvas-billeddata?
+canvas.siteprompt=Denne nettsiden (%S) prøvde å pakke ut HTML5-canvas-billeddata, hvilket kan brukes til å tilkjennegi din datamaskin spesifikt i identifiseringsøyemed.\n\nSkal Tor Nettleser tillate denne nettsiden å pakke ut HTML5-canvas-billeddata?
canvas.notNow=Ikke nå
canvas.notNowAccessKey=N
canvas.allow=Tillat i fremtiden
diff --git a/chrome/locale/nl/aboutTor.dtd b/chrome/locale/nl/aboutTor.dtd
index 3e78eb8b..c4097e97 100644
--- a/chrome/locale/nl/aboutTor.dtd
+++ b/chrome/locale/nl/aboutTor.dtd
@@ -6,9 +6,9 @@
<!ENTITY aboutTor.title "Over Tor">
-<!ENTITY aboutTor.viewChangelog.label "Wijzigingslogboek bekijken">
+<!ENTITY aboutTor.viewChangelog.label "Wijzigingslog bekijken">
-<!ENTITY aboutTor.ready.label "Onderzoek. Privé.">
+<!ENTITY aboutTor.ready.label "Verken. Privé.">
<!ENTITY aboutTor.ready2.label "U bent klaar voor de meest private surfervaring ter wereld.">
<!ENTITY aboutTor.failure.label "Er ging iets mis!">
<!ENTITY aboutTor.failure2.label "Tor werkt niet in deze browser.">
diff --git a/chrome/locale/nl/brand.properties b/chrome/locale/nl/brand.properties
index 43f43610..ac15d1c3 100644
--- a/chrome/locale/nl/brand.properties
+++ b/chrome/locale/nl/brand.properties
@@ -11,6 +11,6 @@ homePageSingleStartMain=Firefox Start, een snelle startpagina met ingebouwde zoe
homePageImport=Importeer je startpagina uit %S
homePageMigrationPageTitle=Startpaginakeuze
-homePageMigrationDescription=Selecteer de startpagina die je wil gebruiken:
+homePageMigrationDescription=Selecteer de startpagina die u wilt gebruiken:
syncBrandShortName=Synchronisatie
diff --git a/chrome/locale/nl/securityLevel.properties b/chrome/locale/nl/securityLevel.properties
index 9c98f8e9..25d29f72 100644
--- a/chrome/locale/nl/securityLevel.properties
+++ b/chrome/locale/nl/securityLevel.properties
@@ -9,7 +9,7 @@ securityLevel.safer.tooltip = Beveiligingsniveau: veiliger
securityLevel.safer.summary = Schakelt websitefuncties uit die vaak gevaarlijk zijn, waardoor sommige websites functionaliteit verliezen.
securityLevel.safer.description1 = JavaScript is uitgeschakeld op niet-HTTPS-websites.
securityLevel.safer.description2 = Sommige lettertypen en wiskundige symbolen zijn uitgeschakeld.
-securityLevel.safer.description3 = Audio and video (HTML5 media), and WebGL are click-to-play.
+securityLevel.safer.description3 = Audio en video (HTML5-media) zijn klikken-voor-afspelen.
securityLevel.safest.level = Veiligste
securityLevel.safest.tooltip = Beveiligingsniveau: veiligste
securityLevel.safest.summary = Staat alleen websitefuncties toe die voor statische websites en basisservices zijn vereist. Deze wijzigingen zijn van invloed op afbeeldingen, media en scripts.
diff --git a/chrome/locale/nl/torbutton.dtd b/chrome/locale/nl/torbutton.dtd
index f5819e37..7125d44f 100644
--- a/chrome/locale/nl/torbutton.dtd
+++ b/chrome/locale/nl/torbutton.dtd
@@ -6,21 +6,21 @@
<!ENTITY torbutton.context_menu.networksettings.key "N">
<!ENTITY torbutton.context_menu.downloadUpdate "Controleer op updates voor de Tor-browser...">
<!ENTITY torbutton.context_menu.downloadUpdate.key "U">
-<!ENTITY torbutton.context_menu.cookieProtections "Cookie Beveiligingen">
+<!ENTITY torbutton.context_menu.cookieProtections "Cookiebeschermingen…">
<!ENTITY torbutton.context_menu.cookieProtections.key "C">
<!ENTITY torbutton.button.tooltip "Klik hier om Tor-knop te initialiseren">
<!ENTITY torbutton.prefs.security_settings "Tor-browser Beveiligingsinstellingen">
-<!ENTITY torbutton.cookiedialog.title "Beheer Cookie Beveiligingen">
-<!ENTITY torbutton.cookiedialog.lockCol "Beveiligd">
+<!ENTITY torbutton.cookiedialog.title "Cookiebeschermingen beheren">
+<!ENTITY torbutton.cookiedialog.lockCol "Beschermd">
<!ENTITY torbutton.cookiedialog.domainCol "Host">
<!ENTITY torbutton.cookiedialog.nameCol "Naam">
<!ENTITY torbutton.cookiedialog.pathCol "Pad">
-<!ENTITY torbutton.cookiedialog.protectCookie "Cookie beveiligen">
+<!ENTITY torbutton.cookiedialog.protectCookie "Cookie beschermen">
<!ENTITY torbutton.cookiedialog.removeCookie "Cookie verwijderen">
-<!ENTITY torbutton.cookiedialog.unprotectCookie "Cookie beveiliging opheffen">
-<!ENTITY torbutton.cookiedialog.removeAllBut "Alle cookies, met uitzondering van de beveiligde, verwijderen">
-<!ENTITY torbutton.cookiedialog.saveAllCookies "Beveilig nieuwe cookies">
-<!ENTITY torbutton.cookiedialog.doNotSaveAllCookies "Beveilig nieuwe cookies niet">
+<!ENTITY torbutton.cookiedialog.unprotectCookie "Cookiebescherming opheffen">
+<!ENTITY torbutton.cookiedialog.removeAllBut "Alle behalve beschermde verwijderen">
+<!ENTITY torbutton.cookiedialog.saveAllCookies "Nieuwe cookies beschermen">
+<!ENTITY torbutton.cookiedialog.doNotSaveAllCookies "Nieuwe cookies niet beschermen">
<!ENTITY torbutton.prefs.sec_caption "Beveiligingsniveau">
<!ENTITY torbutton.prefs.sec_caption_tooltip "De beveiligingsschuifbalk laat je toe sommige functies uit te schakelen die je browser mogelijk blootstellen aan beveiligingsrisico's.">
<!ENTITY torbutton.prefs.sec_standard_label "Standaard">
@@ -36,6 +36,6 @@
<!ENTITY torbutton.prefs.sec_js_disabled "Javascript zijn standaard uitgeschakeld op alle sites.">
<!ENTITY torbutton.prefs.sec_limit_typography "Sommige lettertypen en wiskundige symbolen zijn uitgeschakeld.">
<!ENTITY torbutton.prefs.sec_limit_graphics_and_typography "Sommige lettertypen, pictogrammen, wiskundige symbolen en afbeeldingen zijn uitgeschakeld.">
-<!ENTITY torbutton.prefs.sec_click_to_play_media "Audio and video (HTML5 media), and WebGL are click-to-play.">
+<!ENTITY torbutton.prefs.sec_click_to_play_media "Audio en video (HTML5-media) en WebGL zijn klikken-voor-afspelen.">
<!ENTITY torbutton.circuit_display.title "Torcircuit">
<!ENTITY torbutton.circuit_display.new_circuit "Nieuw circuit voor deze website">
diff --git a/chrome/locale/pl/aboutTor.dtd b/chrome/locale/pl/aboutTor.dtd
index 138c73e1..dff11572 100644
--- a/chrome/locale/pl/aboutTor.dtd
+++ b/chrome/locale/pl/aboutTor.dtd
@@ -20,9 +20,9 @@
<!ENTITY aboutTor.torbrowser_user_manual_link.label "Sprawdź naszą instrukcje korzystania z przeglądarki Tor »">
<!-- The next two entities are used within the browser's Help menu. -->
<!ENTITY aboutTor.torbrowser_user_manual.accesskey "M">
-<!ENTITY aboutTor.torbrowser_user_manual.label "Instrukcja korzystania z Tor Browser">
+<!ENTITY aboutTor.torbrowser_user_manual.label "Instrukcja korzystania z Przeglądarki Tor">
-<!ENTITY aboutTor.tor_mission.label "Projekt Tor jest organizacją non-profit US 501(c)(3), poszerzającą prawa człowieka i wolności tworząc darmowe i open-source technologie anonimowości i prywatności, wspierając ich nierestryktowaną dostępność i użycie i promuje ich naukowe i popularne zrozumienie.">
+<!ENTITY aboutTor.tor_mission.label "Projekt Tor jest organizacją non-profit US 501(c)(3), wspierającą prawa człowieka i wolności. W jego ramach tworzone są darmowe i otwarte technologie chroniące anonimowość i prywatność. Tor wspiera ich nieograniczoną dostępność i użycie oraz popularyzuje je w świecie nauki i życiu codziennym. ">
<!ENTITY aboutTor.getInvolved.label "Zaangażuj się »">
<!ENTITY aboutTor.getInvolved.link "https://www.torproject.org/getinvolved/volunteer.html.en">
@@ -32,4 +32,4 @@
<!ENTITY aboutTor.donationBanner.buttonA "Wesprzyj teraz">
<!ENTITY aboutTor.donationBanner3.line1 "Automatyczne comiesięczne darowizny trzymają Tora silnym.">
-<!ENTITY aboutTor.donationBanner3.line2 "Zostań dzisiaj Obrońcą Prywatności.">
+<!ENTITY aboutTor.donationBanner3.line2 "Zostań już teraz Obrońcą Prywatności.">
diff --git a/chrome/locale/pt-BR/aboutTor.dtd b/chrome/locale/pt-BR/aboutTor.dtd
index e5a512fc..a60d789e 100644
--- a/chrome/locale/pt-BR/aboutTor.dtd
+++ b/chrome/locale/pt-BR/aboutTor.dtd
@@ -8,7 +8,7 @@
<!ENTITY aboutTor.viewChangelog.label "Visualizar o registro de mudanças">
-<!ENTITY aboutTor.ready.label "Navegar. Com privacidade.">
+<!ENTITY aboutTor.ready.label "Explore. Com privacidade.">
<!ENTITY aboutTor.ready2.label "Você está pronto para a maior experiência de navegação privada do mundo.">
<!ENTITY aboutTor.failure.label "Alguma coisa deu errado!">
<!ENTITY aboutTor.failure2.label "Tor não está funcionando neste navegador. ">
@@ -29,8 +29,8 @@
<!ENTITY aboutTor.newsletter.tagline "Receba as últimas notícias do Tor diretamente na sua caixa de e-mail.">
<!ENTITY aboutTor.newsletter.link_text "Inscreva-se para receber Notícias do Tor.">
-<!ENTITY aboutTor.donationBanner.line2e "Fortaleça o Tor.">
-<!ENTITY aboutTor.donationBanner.buttonA "Doar Agora">
+<!ENTITY aboutTor.donationBanner.line2e "Mantenha o Tor forte.">
+<!ENTITY aboutTor.donationBanner.buttonA "Doe Agora">
<!ENTITY aboutTor.donationBanner3.line1 "Doações mensais automáticas fortalecem o Tor.">
-<!ENTITY aboutTor.donationBanner3.line2 "Torne-se hoje um Defensor da Privacidade.">
+<!ENTITY aboutTor.donationBanner3.line2 "Torne-se um(a) Defensor(a) da Privacidade hoje.">
diff --git a/chrome/locale/ro/aboutTor.dtd b/chrome/locale/ro/aboutTor.dtd
index 162248d0..edbb442f 100644
--- a/chrome/locale/ro/aboutTor.dtd
+++ b/chrome/locale/ro/aboutTor.dtd
@@ -31,5 +31,5 @@
<!ENTITY aboutTor.donationBanner.line2e "Menține Tor puternic.">
<!ENTITY aboutTor.donationBanner.buttonA "Donează Acum">
-<!ENTITY aboutTor.donationBanner3.line1 "Automatic monthly donations keep Tor strong.">
-<!ENTITY aboutTor.donationBanner3.line2 "Become a Defender of Privacy today.">
+<!ENTITY aboutTor.donationBanner3.line1 "Donațiile lunare automate mențin aplicația Tor puternică.">
+<!ENTITY aboutTor.donationBanner3.line2 "Deveniți astăzi un Apărător al Confidențialității.">
diff --git a/chrome/locale/ro/securityLevel.properties b/chrome/locale/ro/securityLevel.properties
index 9f4a919b..9e036751 100644
--- a/chrome/locale/ro/securityLevel.properties
+++ b/chrome/locale/ro/securityLevel.properties
@@ -9,7 +9,7 @@ securityLevel.safer.tooltip = Nivel Securitate: Sigur
securityLevel.safer.summary = Dezactivează facilități ale site-ului web care sunt deseori periculoase, provocând uneori pierderea funcționalității
securityLevel.safer.description1 = JavaScript e dezactivat în site-uri non-HTTPS
securityLevel.safer.description2 = Unele fonturi și simboluri matematice sunt dezactivate.
-securityLevel.safer.description3 = Audio and video (HTML5 media), and WebGL are click-to-play.
+securityLevel.safer.description3 = Fișierele audio și video (HTML5 media) și WebGL sunt pot fi redate la clic.
securityLevel.safest.level = Cel mai sigur
securityLevel.safest.tooltip = Nivel Securitate: Prudent
securityLevel.safest.summary = Permite doar facilitățile necesare pentru site-uri simple și servicii de bază. Aceste modificări afectează imagini, media și scripturi.
diff --git a/chrome/locale/ro/torbutton.dtd b/chrome/locale/ro/torbutton.dtd
index 6204fe90..d9161984 100644
--- a/chrome/locale/ro/torbutton.dtd
+++ b/chrome/locale/ro/torbutton.dtd
@@ -36,6 +36,6 @@
<!ENTITY torbutton.prefs.sec_js_disabled "JavaScript e dezactivat implicit în toate site-urile.">
<!ENTITY torbutton.prefs.sec_limit_typography "Unele fonturi și simboluri matematice sunt dezactivate.">
<!ENTITY torbutton.prefs.sec_limit_graphics_and_typography "Unele fonturi, pictograme, simboluri matematice și imagini sunt dezactivate.">
-<!ENTITY torbutton.prefs.sec_click_to_play_media "Audio and video (HTML5 media), and WebGL are click-to-play.">
+<!ENTITY torbutton.prefs.sec_click_to_play_media "Fișierele audio și video (HTML5 media) și WebGL sunt pot fi redate la clic.">
<!ENTITY torbutton.circuit_display.title "Circuit Tor">
<!ENTITY torbutton.circuit_display.new_circuit "Circuit nou pentru acest site">
diff --git a/chrome/locale/tr/aboutTor.dtd b/chrome/locale/tr/aboutTor.dtd
index 8ddbea88..dac00818 100644
--- a/chrome/locale/tr/aboutTor.dtd
+++ b/chrome/locale/tr/aboutTor.dtd
@@ -31,5 +31,5 @@
<!ENTITY aboutTor.donationBanner.line2e "Tor uygulamasının gücünü koruyun.">
<!ENTITY aboutTor.donationBanner.buttonA "Bağış Yapın">
-<!ENTITY aboutTor.donationBanner3.line1 "Aylık otomatik bağışlar Tor projesinin gücünü korumasına yardımcı olur.">
+<!ENTITY aboutTor.donationBanner3.line1 "Düzenli aylık bağışlar Tor projesinin gücünü korumasına yardımcı olur.">
<!ENTITY aboutTor.donationBanner3.line2 "Bugün kişisel gizliliği savunmak için destek olmaya başlayın.">
diff --git a/chrome/locale/tr/torbutton.properties b/chrome/locale/tr/torbutton.properties
index 3ab6022a..6105c7b1 100644
--- a/chrome/locale/tr/torbutton.properties
+++ b/chrome/locale/tr/torbutton.properties
@@ -13,7 +13,7 @@ torbutton.panel.tooltip.disabled = Tor uygulamasını etkinleştirmek için tık
torbutton.panel.tooltip.enabled = Tor uygulamasını devre dışı bırakmak için tıklayın
torbutton.panel.label.disabled = Tor Devre Dışı
torbutton.panel.label.enabled = Tor Etkin
-extensions.torbutton(a)torproject.org.description = Torbutton, Tor ayarlarını yapabileceğiniz ve kişisel tarama verilerini hızlı ve kolayca silebileceğiniz bir düğme görüntüler.
+extensions.torbutton(a)torproject.org.description = Torbutton, Tor ayarlarını yapabileceğiniz ve kişisel tarama verilerinizi hızla ve kolayca silebileceğiniz bir düğme görüntüler.
torbutton.popup.external.title = Dış bir dosya türü indirilsin mi?
torbutton.popup.external.app = Tor Browser bu dosyayı görüntüleyemiyor. Başka bir uygulamayla açmanız gerekecek.\n
torbutton.popup.external.note = Bazı dosya türleri uygulamaların Tor kullanmadan İnternet bağlantısı kurmasına neden olabilir.\n
@@ -24,7 +24,7 @@ torbutton.popup.dontask = Bundan sonra dosyalar otomatik indirilsin
torbutton.popup.no_newnym = Torbutton size yeni bir güvenli kimlik sağlayamadı. Tor Denetim Kapısına giriş yapılamıyor.\n\nTor Browser Bundle uygulamasını çalıştırdığınızdan emin olun.
torbutton.security_settings.menu.title = Güvenlik Düzeyi Ayarı
torbutton.title.prompt_torbrowser = Önemli Torbutton Bilgisi
-torbutton.popup.prompt_torbrowser = Torbutton şimdi farklı çalışıyor: artık kapatamıyorsunuz.\n\nBu değişikliği yapmamızın nedeni Tor dışında kullanılan başka bir tarayıcıda Torbutton kullanmanın güvenli olmaması. Başka türlü çözemeyeceğimiz birçok sorun vardı.\n\nFirefox tarayıcısını normal olarak kullanmak istiyorsanız, Torbutton uygulamasını kaldırıp Tor Browser Bundle paketini indirebilirsiniz. Tor Browser gizlilik özellikleri normal Firefox tarayıcısına, hatta Torbutton ile kullanan Firefox ikilisine göre çok daha üstündür.\n\nTorbutton uygulamasını kaldırmak için, Araçlar->Eklentiler->Uzantılar bölümüne gidin ve Torbutton yazılımının yanındaki Kaldır düğmesine tıklayın.
+torbutton.popup.prompt_torbrowser = Torbutton şimdi farklı çalışıyor: artık kapatamıyorsunuz.\n\nBu değişikliği yapmamızın nedeni Tor dışında kullanılan başka bir tarayıcıda Torbutton kullanmanın güvenli olmaması. Başka türlü çözemeyeceğimiz birçok sorun vardı.\n\nFirefox tarayıcısını normal olarak kullanmak istiyorsanız, Torbutton uygulamasını kaldırıp Tor Browser Bundle paketini indirebilirsiniz. Tor Browser kişisel gizliliği koruma özellikleri normal Firefox tarayıcısına, hatta Torbutton ile kullanılan Firefox ikilisine göre çok daha üstündür.\n\nTorbutton uygulamasını kaldırmak için, Araçlar->Eklentiler->Uzantılar bölümüne gidin ve Torbutton yazılımının yanındaki Kaldır düğmesine tıklayın.
torbutton.popup.short_torbrowser = Önemli Torbutton Bilgisi!\n\nTorbutton artık kapatılamayacak şekilde etkinleştirildi.\n\nAyrıntılı bilgi almak için Torbutton üzerine tıklayın.
torbutton.popup.confirm_plugins = Flash gibi eklentiler gizliliğinizi ve anonim kimliğinizi zedeleyebilir.\n\nBu eklentiler Tor uygulamasını atlatarak geçerli konum ve IP adresinizi ortaya çıkarabilir.\n\nBu eklentileri etkinleştirmek istediğinize emin misiniz?\n
diff --git a/chrome/locale/vi/aboutTor.dtd b/chrome/locale/vi/aboutTor.dtd
index ffc191c5..44bf6f97 100644
--- a/chrome/locale/vi/aboutTor.dtd
+++ b/chrome/locale/vi/aboutTor.dtd
@@ -6,7 +6,7 @@
<!ENTITY aboutTor.title "Thông tin về Tor">
-<!ENTITY aboutTor.viewChangelog.label "View Changelog">
+<!ENTITY aboutTor.viewChangelog.label "Xem nhật kí thay dổi">
<!ENTITY aboutTor.ready.label "Truy cập Internet. Một cách riêng tư.">
<!ENTITY aboutTor.ready2.label "Bạn đã sẵn sàng cho trải nghiệm duyệt web riêng tư nhất trên thế giới.">
@@ -31,5 +31,5 @@
<!ENTITY aboutTor.donationBanner.line2e "Giữ cho Tor trở nên mạnh mẽ.">
<!ENTITY aboutTor.donationBanner.buttonA "Đóng góp Ngay bây giờ">
-<!ENTITY aboutTor.donationBanner3.line1 "Automatic monthly donations keep Tor strong.">
-<!ENTITY aboutTor.donationBanner3.line2 "Become a Defender of Privacy today.">
+<!ENTITY aboutTor.donationBanner3.line1 "Tự động donate hàng tháng để giữ cho Tor lớn mạnh.">
+<!ENTITY aboutTor.donationBanner3.line2 "Trở thành một người bảo vệ quyền riêng tư ngày hôm nay.">
diff --git a/chrome/locale/vi/browserOnboarding.properties b/chrome/locale/vi/browserOnboarding.properties
index df4a88ee..616e8694 100644
--- a/chrome/locale/vi/browserOnboarding.properties
+++ b/chrome/locale/vi/browserOnboarding.properties
@@ -9,7 +9,7 @@ onboarding.tour-tor-welcome.next-button=Go to Privacy
onboarding.tour-tor-privacy=Riêng tư
onboarding.tour-tor-privacy.title=Snub trackers and snoopers.
-onboarding.tour-tor-privacy.description=Tor Browser isolates cookies and deletes your browser history after your session. These modifications ensure your privacy and security are protected in the browser. Click ‘Tor Network’ to learn how we protect you on the network level.
+onboarding.tour-tor-privacy.description=Trình duyệt Tor cô lập cookies và xoá lịch sử duyệt web của bạn sau mỗi phiên. Những thay đổi này đảm bảo quyền riêng tư của bạn được bảo vệ trong trình duyệt. Nhân 'Tor Network' để tìm hiểu cách chúng tôi bảo vệ bạn trên cấp độ mạng.
onboarding.tour-tor-privacy.button=Đi đến mạng Tor
onboarding.tour-tor-network=Mạng Tor
diff --git a/chrome/locale/zh-CN/aboutTor.dtd b/chrome/locale/zh-CN/aboutTor.dtd
index c0a8bb61..4801db29 100644
--- a/chrome/locale/zh-CN/aboutTor.dtd
+++ b/chrome/locale/zh-CN/aboutTor.dtd
@@ -31,5 +31,5 @@
<!ENTITY aboutTor.donationBanner.line2e "让 Tor 网络保持健壮。">
<!ENTITY aboutTor.donationBanner.buttonA "立即捐助">
-<!ENTITY aboutTor.donationBanner3.line1 "每个月自动捐款来使Tor保持强大">
-<!ENTITY aboutTor.donationBanner3.line2 "今天就成为隐私的捍卫者">
+<!ENTITY aboutTor.donationBanner3.line1 "每月自动捐款来使 Tor 保持健壮。">
+<!ENTITY aboutTor.donationBanner3.line2 "即刻就成为隐私的捍卫者。">
diff --git a/chrome/locale/zh-TW/aboutTor.dtd b/chrome/locale/zh-TW/aboutTor.dtd
index da568c89..a016d044 100644
--- a/chrome/locale/zh-TW/aboutTor.dtd
+++ b/chrome/locale/zh-TW/aboutTor.dtd
@@ -9,7 +9,7 @@
<!ENTITY aboutTor.viewChangelog.label "檢視變更記錄">
<!ENTITY aboutTor.ready.label "探索。隱密。">
-<!ENTITY aboutTor.ready2.label "您已準備好使用全世界最私密的瀏覽體驗。">
+<!ENTITY aboutTor.ready2.label "您已能夠體驗全世界最私密的網路瀏覽。">
<!ENTITY aboutTor.failure.label "發生錯誤!">
<!ENTITY aboutTor.failure2.label "Tor 無法在此瀏覽器中運作。">
@@ -22,14 +22,14 @@
<!ENTITY aboutTor.torbrowser_user_manual.accesskey "M">
<!ENTITY aboutTor.torbrowser_user_manual.label "洋蔥路由瀏覽器手冊">
-<!ENTITY aboutTor.tor_mission.label "Tor Project 是一個美國 501(c)(3) 非營利組織,致力於透過開發和部署自由與開放原始碼的匿名和隱私技術,為其不受限制的可用性和使用提供支持,促進其在科學領域和大眾的知名度來支持人權和自由。">
+<!ENTITY aboutTor.tor_mission.label "Tor Project 是一個美國 501(c)(3) 非營利組織,致力於透過開發和部署自由與開放原始碼的匿名和隱私技術,支援無限制的可用性和使用,以促進科學領域和大眾對相關技術的理解。">
<!ENTITY aboutTor.getInvolved.label "加入我們 »">
<!ENTITY aboutTor.getInvolved.link "https://www.torproject.org/getinvolved/volunteer.html.en">
<!ENTITY aboutTor.newsletter.tagline "將 Tor 的最新消息直接傳送到您的收件匣。">
<!ENTITY aboutTor.newsletter.link_text "訂閱 Tor 的新資訊。">
-<!ENTITY aboutTor.donationBanner.line2e "讓 Tor 強壯。">
+<!ENTITY aboutTor.donationBanner.line2e "使 Tor 更加茁壯。">
<!ENTITY aboutTor.donationBanner.buttonA "立刻捐款">
-<!ENTITY aboutTor.donationBanner3.line1 "Automatic monthly donations keep Tor strong.">
-<!ENTITY aboutTor.donationBanner3.line2 "Become a Defender of Privacy today.">
+<!ENTITY aboutTor.donationBanner3.line1 "每月自動捐款,使 Tor 更加茁壯。">
+<!ENTITY aboutTor.donationBanner3.line2 "從今天開始,成為隱私守衛員吧!">
1
0
commit 72bcfe96c94c526aab1a1755fbd5cbd3a4f1369c
Author: Georg Koppen <gk(a)torproject.org>
Date: Fri Aug 30 08:24:01 2019 +0000
Translations update
---
src/chrome/locale/ar/aboutTor.dtd | 6 +++---
src/chrome/locale/ar/browserOnboarding.properties | 10 +++++-----
src/chrome/locale/ar/securityLevel.properties | 4 ++--
src/chrome/locale/ar/torbutton.dtd | 2 +-
src/chrome/locale/ca/aboutTor.dtd | 12 ++++++------
src/chrome/locale/cs/aboutTor.dtd | 4 ++--
src/chrome/locale/cs/browserOnboarding.properties | 2 +-
src/chrome/locale/cs/securityLevel.properties | 2 +-
src/chrome/locale/cs/torbutton.dtd | 2 +-
src/chrome/locale/da/aboutTBUpdate.dtd | 4 ++--
src/chrome/locale/da/aboutTor.dtd | 4 ++--
src/chrome/locale/da/torbutton.properties | 2 +-
src/chrome/locale/el/aboutTor.dtd | 4 ++--
src/chrome/locale/es-AR/aboutTor.dtd | 4 ++--
src/chrome/locale/es-AR/securityLevel.properties | 2 +-
src/chrome/locale/es-AR/torbutton.dtd | 2 +-
src/chrome/locale/fr/aboutTor.dtd | 2 +-
src/chrome/locale/ga-IE/aboutTor.dtd | 4 ++--
src/chrome/locale/hu/aboutTBUpdate.dtd | 4 ++--
src/chrome/locale/hu/aboutTor.dtd | 6 +++---
src/chrome/locale/hu/securityLevel.properties | 6 +++---
src/chrome/locale/hu/torbutton.dtd | 2 +-
src/chrome/locale/id/aboutTor.dtd | 18 +++++++++---------
src/chrome/locale/is/aboutTor.dtd | 4 ++--
src/chrome/locale/it/aboutTor.dtd | 4 ++--
src/chrome/locale/ja/aboutTor.dtd | 4 ++--
src/chrome/locale/ja/securityLevel.properties | 2 +-
src/chrome/locale/ja/torbutton.dtd | 2 +-
src/chrome/locale/ka/aboutTor.dtd | 4 ++--
src/chrome/locale/ko/aboutTor.dtd | 10 +++++-----
src/chrome/locale/nb-NO/aboutDialog.dtd | 4 ++--
src/chrome/locale/nb-NO/aboutTBUpdate.dtd | 4 ++--
src/chrome/locale/nb-NO/aboutTor.dtd | 8 ++++----
src/chrome/locale/nb-NO/brand.dtd | 2 +-
src/chrome/locale/nb-NO/brand.properties | 2 +-
src/chrome/locale/nb-NO/browserOnboarding.properties | 4 ++--
src/chrome/locale/nb-NO/torbutton.properties | 12 ++++++------
src/chrome/locale/nl/aboutTor.dtd | 4 ++--
src/chrome/locale/nl/brand.properties | 2 +-
src/chrome/locale/nl/securityLevel.properties | 2 +-
src/chrome/locale/nl/torbutton.dtd | 18 +++++++++---------
src/chrome/locale/pl/aboutTor.dtd | 6 +++---
src/chrome/locale/pt-BR/aboutTor.dtd | 8 ++++----
src/chrome/locale/tr/aboutTor.dtd | 2 +-
src/chrome/locale/tr/torbutton.properties | 4 ++--
src/chrome/locale/vi/aboutTor.dtd | 6 +++---
src/chrome/locale/vi/browserOnboarding.properties | 2 +-
src/chrome/locale/zh-CN/aboutTor.dtd | 4 ++--
src/chrome/locale/zh-TW/aboutTor.dtd | 10 +++++-----
49 files changed, 121 insertions(+), 121 deletions(-)
diff --git a/src/chrome/locale/ar/aboutTor.dtd b/src/chrome/locale/ar/aboutTor.dtd
index 05486c97..64e44b7a 100644
--- a/src/chrome/locale/ar/aboutTor.dtd
+++ b/src/chrome/locale/ar/aboutTor.dtd
@@ -8,7 +8,7 @@
<!ENTITY aboutTor.viewChangelog.label "الإطلاع على سجل التغيرات">
-<!ENTITY aboutTor.ready.label "تصفح بهوية خفية">
+<!ENTITY aboutTor.ready.label "تصفح بكل خصوصية.">
<!ENTITY aboutTor.ready2.label "أنت جاهز الآن لتجربة التصفح الأكثر خصوصية في العالم.">
<!ENTITY aboutTor.failure.label "حدث خطأ ما!">
<!ENTITY aboutTor.failure2.label "تور لا يعمل في هذا المتصفح.">
@@ -31,5 +31,5 @@
<!ENTITY aboutTor.donationBanner.line2e "حافظ على قوة تور.">
<!ENTITY aboutTor.donationBanner.buttonA "تبرع الآن">
-<!ENTITY aboutTor.donationBanner3.line1 "Automatic monthly donations keep Tor strong.">
-<!ENTITY aboutTor.donationBanner3.line2 "Become a Defender of Privacy today.">
+<!ENTITY aboutTor.donationBanner3.line1 "تبرعات شهرية أتوماتيكية حافظ على Tor قويا.">
+<!ENTITY aboutTor.donationBanner3.line2 "اصبح مدافعا عن الخصوصية اليوم.">
diff --git a/src/chrome/locale/ar/browserOnboarding.properties b/src/chrome/locale/ar/browserOnboarding.properties
index 996d081c..111de734 100644
--- a/src/chrome/locale/ar/browserOnboarding.properties
+++ b/src/chrome/locale/ar/browserOnboarding.properties
@@ -26,9 +26,9 @@ onboarding.tour-tor-circuit-display.next-button=الانتقال إلى الأم
onboarding.tour-tor-security=الأمان
onboarding.tour-tor-security.title=اختر مدى خبرتك
onboarding.tour-tor-security.description=نوفر لك أيضا إعدادات إضافية لرفع مستوى أمان المتصفح. تسمح لك إعدادات الأمان لدينا بحظر العناصر التي يمكن استخدامها لمهاجمة جهاز الكمبيوتر الخاص بك. انقر أدناه لمعرفة ما تفعله الخيارات المختلفة.
-onboarding.tour-tor-security.description-suffix=Note: By default, NoScript and HTTPS Everywhere are not included on the toolbar, but you can customize your toolbar to add them.
+onboarding.tour-tor-security.description-suffix=ملاحظة: NoScript و HTTPS Everywhere ليست متضمنة بشكل افتراضي في شريط الأدوات، لكن بإمكانك تخصيص شريط الأدوات لإضافتهم.
onboarding.tour-tor-security-level.button=تحقق من مستوى الأمن
-onboarding.tour-tor-security-level.next-button=Go to Experience Tips
+onboarding.tour-tor-security-level.next-button=إذهب إلى تلميحات التجربة
onboarding.tour-tor-expect-differences=نصائح التجربة
onboarding.tour-tor-expect-differences.title=توقع بعض التغيرات
@@ -48,11 +48,11 @@ onboarding.tour-tor-update.prefix-updated=تحديث
onboarding.tour-tor-toolbar=شريط الأدوات
onboarding.tour-tor-toolbar-update-8.5.title=نسق شريط الأدوات
-onboarding.tour-tor-toolbar-update-8.5.description=We improved the browser toolbar layout. We moved the Torbutton icon after the URL bar, and we added a security level icon next to it.
+onboarding.tour-tor-toolbar-update-8.5.description=قمنا بتحسين تصميم شريط أدوات المتصفح. نقلنا أيقونة زر Tor الى بعد مربع URL، وأضفنا أيقونة درجة الأمان إلى جانبها.
onboarding.tour-tor-toolbar-update-8.5.next-button=الانتقال إلى الأمان
-onboarding.tour-tor-security-update-8.5.title=Security level experience
-onboarding.tour-tor-security-update-8.5.description=We improved how you see and set your security level. We replaced the security slider with a toolbar icon that makes your current level visible at all times. Click it to view details about your current level or to change your security settings.
+onboarding.tour-tor-security-update-8.5.title=تجربة درجة الأمان
+onboarding.tour-tor-security-update-8.5.description=قمنا بتحسين كيف ترى وتضبط درجة الأمان. استبدلنا شريط تمرير الأمان بأيقونة على شريط الأدوات تجعل من درجة الأمان المفعلة حاليا ظاهرة على الدوام. إضغط عليها لرؤية تفاصيل حول درجة أمانك الحالية أو لتغيير إعدادات الأمان الخاصة بك.
# Circuit Display onboarding.
onboarding.tor-circuit-display.next=التالي
diff --git a/src/chrome/locale/ar/securityLevel.properties b/src/chrome/locale/ar/securityLevel.properties
index 3ddca80a..b02c6cc4 100644
--- a/src/chrome/locale/ar/securityLevel.properties
+++ b/src/chrome/locale/ar/securityLevel.properties
@@ -1,6 +1,6 @@
securityLevel.securityLevel = مستوى الأمان
securityLevel.customWarning = مخصص
-securityLevel.overview = Disable certain web features that can be used to attack your security and anonymity.
+securityLevel.overview = تعطيل مميزات ويب معينة فد يتم استخدامها لمهاجمة أمنك و مجهولية هويتك.
securityLevel.standard.level = عادي
securityLevel.standard.tooltip = مستوى الأمان: قياسي
securityLevel.standard.summary = كل خصائص متصفح تور ومواقع الوب مفعلة
@@ -9,7 +9,7 @@ securityLevel.safer.tooltip = مستوى الأمان: آمن
securityLevel.safer.summary = يعطل مميزات مواقع الوب التي عادة ما تكون خطيرة. يتسبب في تعطل خصائص بعض المواقع.
securityLevel.safer.description1 = تعطل جافا سكربت على المواقع التي لا تستخدم HTTPS
securityLevel.safer.description2 = تعطّل بعض الخطوط والرموز الرياضية.
-securityLevel.safer.description3 = Audio and video (HTML5 media), and WebGL are click-to-play.
+securityLevel.safer.description3 = الصوت والفيديو (HTML5 media), و WebGL هي انقر للتشغيل
securityLevel.safest.level = الأكثر أمنا
securityLevel.safest.tooltip = مستوى الأمان: الأكثر أمانا
securityLevel.safest.summary = اسمح فقط بالخصائص المطلوبة للمواقع غير الديناميكية والخدمات الأساسية. تؤثر هذه التغييرات على الصور والوسائط والنصوص البرمجية.
diff --git a/src/chrome/locale/ar/torbutton.dtd b/src/chrome/locale/ar/torbutton.dtd
index 1b0a01cd..1c114b6d 100644
--- a/src/chrome/locale/ar/torbutton.dtd
+++ b/src/chrome/locale/ar/torbutton.dtd
@@ -36,6 +36,6 @@
<!ENTITY torbutton.prefs.sec_js_disabled "تعطل جافا سكربت مبدئيا على جميع المواقع.">
<!ENTITY torbutton.prefs.sec_limit_typography "تعطّل بعض الخطوط والرموز الرياضية.">
<!ENTITY torbutton.prefs.sec_limit_graphics_and_typography "تعطّل بعض الخطوط والأيقونات والرموز الرياضية والصور.">
-<!ENTITY torbutton.prefs.sec_click_to_play_media "Audio and video (HTML5 media), and WebGL are click-to-play.">
+<!ENTITY torbutton.prefs.sec_click_to_play_media "الصوت والفيديو (HTML5 media), و WebGL هي انقر للتشغيل">
<!ENTITY torbutton.circuit_display.title "دائرة تور">
<!ENTITY torbutton.circuit_display.new_circuit "دائرة تور جديدة لهذا الموقع">
diff --git a/src/chrome/locale/ca/aboutTor.dtd b/src/chrome/locale/ca/aboutTor.dtd
index 2eca70f2..b6f51e39 100644
--- a/src/chrome/locale/ca/aboutTor.dtd
+++ b/src/chrome/locale/ca/aboutTor.dtd
@@ -9,7 +9,7 @@
<!ENTITY aboutTor.viewChangelog.label "Visualitza el registre de canvis">
<!ENTITY aboutTor.ready.label "Exploreu. Privadament.">
-<!ENTITY aboutTor.ready2.label "Estàs preparat per a l'experiència de navegació més privada del món.">
+<!ENTITY aboutTor.ready2.label "Esteu preparat per a l'experiència de navegació més privada del món.">
<!ENTITY aboutTor.failure.label "Hi ha algun error.">
<!ENTITY aboutTor.failure2.label "Tor no funciona en aquest navegador.">
@@ -23,13 +23,13 @@
<!ENTITY aboutTor.torbrowser_user_manual.label "Manual del navegador Tor">
<!ENTITY aboutTor.tor_mission.label "El projecte Tor és una US 501(c)(3) organització sense ànim de lucre que avança els drets i les llibertats dels drets humans mitjançant la creació i implementació d'anonimat de codi obert i lliure i tecnologies de privadesa, que donen suport a la seva disponibilitat i ús sense restriccions i fomenten la seva comprensió científica i popular.">
-<!ENTITY aboutTor.getInvolved.label "Involucrat »">
+<!ENTITY aboutTor.getInvolved.label "Col·laboreu-hi »">
<!ENTITY aboutTor.getInvolved.link "https://www.torproject.org/getinvolved/volunteer.html.en">
<!ENTITY aboutTor.newsletter.tagline "Obteniu les darreres novetats de Tor directament a la safata d'entrada.">
<!ENTITY aboutTor.newsletter.link_text "Inscriviu-vos a les noticies de Tor.">
-<!ENTITY aboutTor.donationBanner.line2e "Fes que Tor segueixi fort.">
-<!ENTITY aboutTor.donationBanner.buttonA "Fes una donació">
+<!ENTITY aboutTor.donationBanner.line2e "Feu que Tor segueixi fort.">
+<!ENTITY aboutTor.donationBanner.buttonA "Feu una donació">
-<!ENTITY aboutTor.donationBanner3.line1 "Automatic monthly donations keep Tor strong.">
-<!ENTITY aboutTor.donationBanner3.line2 "Become a Defender of Privacy today.">
+<!ENTITY aboutTor.donationBanner3.line1 "Els donatius mensuals automàtics fan fort el Tor.">
+<!ENTITY aboutTor.donationBanner3.line2 "Convertiu-vos avui en un defensor de la privadesa.">
diff --git a/src/chrome/locale/cs/aboutTor.dtd b/src/chrome/locale/cs/aboutTor.dtd
index 1d62f176..74825986 100644
--- a/src/chrome/locale/cs/aboutTor.dtd
+++ b/src/chrome/locale/cs/aboutTor.dtd
@@ -31,5 +31,5 @@
<!ENTITY aboutTor.donationBanner.line2e "Pomozte Toru sílit.">
<!ENTITY aboutTor.donationBanner.buttonA "Přispějte">
-<!ENTITY aboutTor.donationBanner3.line1 "Automatic monthly donations keep Tor strong.">
-<!ENTITY aboutTor.donationBanner3.line2 "Become a Defender of Privacy today.">
+<!ENTITY aboutTor.donationBanner3.line1 "Automatické měsíční příspěvky pomáhají Tor rozvíjet.">
+<!ENTITY aboutTor.donationBanner3.line2 "Přispějte na obranu soukromí.">
diff --git a/src/chrome/locale/cs/browserOnboarding.properties b/src/chrome/locale/cs/browserOnboarding.properties
index dc9a0c13..c8b4241a 100644
--- a/src/chrome/locale/cs/browserOnboarding.properties
+++ b/src/chrome/locale/cs/browserOnboarding.properties
@@ -26,7 +26,7 @@ onboarding.tour-tor-circuit-display.next-button=Přejít na Zabezpečení
onboarding.tour-tor-security=Zabezpečení
onboarding.tour-tor-security.title=Určujte svůj prožitek.
onboarding.tour-tor-security.description=K dispozici máte rozšířená nastavení pro další zvýšení zabezpečení, např. blokování všech prvků, které mohou být potenciálně použity k útoku na váš počítač. Pro zobrazení různých možností a jejich fungování klepněte níže.
-onboarding.tour-tor-security.description-suffix=Note: By default, NoScript and HTTPS Everywhere are not included on the toolbar, but you can customize your toolbar to add them.
+onboarding.tour-tor-security.description-suffix=Poznámka: Ve výchozím nastavení se NoScript ani HTTPS Everywhere na nástrojové liště nezobrazují, ale můžete si nastavení lišt změnit.
onboarding.tour-tor-security-level.button=Zobrazit nastavenou úroveň zabezpečení
onboarding.tour-tor-security-level.next-button=Přejít na pokročilé tipy
diff --git a/src/chrome/locale/cs/securityLevel.properties b/src/chrome/locale/cs/securityLevel.properties
index 357c3b3f..5a0214b5 100644
--- a/src/chrome/locale/cs/securityLevel.properties
+++ b/src/chrome/locale/cs/securityLevel.properties
@@ -9,7 +9,7 @@ securityLevel.safer.tooltip = Úroveň zabezpečení: bezpečnější
securityLevel.safer.summary = Některé méně bezpečné funkce jsou vypnuty, ale některé stránky nemusí fungovat.
securityLevel.safer.description1 = JavaScript je na stránkách bez HTTPS vypnut.
securityLevel.safer.description2 = Některá písma a matematické symboly jsou zablokovány.
-securityLevel.safer.description3 = Audio and video (HTML5 media), and WebGL are click-to-play.
+securityLevel.safer.description3 = Audio, video (HTML5 média) a WebGL se přehrávají po kliknutí.
securityLevel.safest.level = Nejbezpečnější
securityLevel.safest.tooltip = Úroveň zabezpečení: nejbezpečnější
securityLevel.safest.summary = Povolí jen funkce pro zobrazení statických webových stránek a fungování základních služeb. Ovlivněno bude zobrazení obrázků, médií a fungování skriptů.
diff --git a/src/chrome/locale/cs/torbutton.dtd b/src/chrome/locale/cs/torbutton.dtd
index ae92cd70..75855010 100644
--- a/src/chrome/locale/cs/torbutton.dtd
+++ b/src/chrome/locale/cs/torbutton.dtd
@@ -36,6 +36,6 @@
<!ENTITY torbutton.prefs.sec_js_disabled "JavaScript je ve výchozím nastavení vypnut na všech stránkách.">
<!ENTITY torbutton.prefs.sec_limit_typography "Některá písma a matematické symboly jsou zablokovány.">
<!ENTITY torbutton.prefs.sec_limit_graphics_and_typography "Některá písma, matematické symboly a obrázky jsou zablokovány.">
-<!ENTITY torbutton.prefs.sec_click_to_play_media "Audio and video (HTML5 media), and WebGL are click-to-play.">
+<!ENTITY torbutton.prefs.sec_click_to_play_media "Audio, video (HTML5 média) a WebGL se přehrávají po kliknutí.">
<!ENTITY torbutton.circuit_display.title "Tor okruh">
<!ENTITY torbutton.circuit_display.new_circuit "Nový okruh Toru pro tuto stránku">
diff --git a/src/chrome/locale/da/aboutTBUpdate.dtd b/src/chrome/locale/da/aboutTBUpdate.dtd
index 0b1afb03..7f580fab 100644
--- a/src/chrome/locale/da/aboutTBUpdate.dtd
+++ b/src/chrome/locale/da/aboutTBUpdate.dtd
@@ -1,7 +1,7 @@
<!ENTITY aboutTBUpdate.changelogTitle "Ændringslog for Tor Browser">
<!ENTITY aboutTBUpdate.updated "Tor Browser er blevet opdateret.">
-<!ENTITY aboutTBUpdate.linkPrefix "For den mest aktuelle information om denne udgivelse,">
-<!ENTITY aboutTBUpdate.linkLabel "Besøg vores webside">
+<!ENTITY aboutTBUpdate.linkPrefix "For den seneste information om denne udgivelse, ">
+<!ENTITY aboutTBUpdate.linkLabel "besøg vores websted">
<!ENTITY aboutTBUpdate.linkSuffix ".">
<!ENTITY aboutTBUpdate.version "Version">
<!ENTITY aboutTBUpdate.releaseDate "Udgivelsesdato">
diff --git a/src/chrome/locale/da/aboutTor.dtd b/src/chrome/locale/da/aboutTor.dtd
index 50f79ff0..7eb93c52 100644
--- a/src/chrome/locale/da/aboutTor.dtd
+++ b/src/chrome/locale/da/aboutTor.dtd
@@ -31,5 +31,5 @@
<!ENTITY aboutTor.donationBanner.line2e "Hold Tor stærk.">
<!ENTITY aboutTor.donationBanner.buttonA "Donér nu">
-<!ENTITY aboutTor.donationBanner3.line1 "Automatic monthly donations keep Tor strong.">
-<!ENTITY aboutTor.donationBanner3.line2 "Become a Defender of Privacy today.">
+<!ENTITY aboutTor.donationBanner3.line1 "Automatiske månedlige donationer holder Tor stærk.">
+<!ENTITY aboutTor.donationBanner3.line2 "Vær med til at beskytte privatliv i dag.">
diff --git a/src/chrome/locale/da/torbutton.properties b/src/chrome/locale/da/torbutton.properties
index 5238092e..8554e129 100644
--- a/src/chrome/locale/da/torbutton.properties
+++ b/src/chrome/locale/da/torbutton.properties
@@ -29,7 +29,7 @@ torbutton.popup.short_torbrowser = Vigtig Torbutton-information!\n\nTorbutton er
torbutton.popup.confirm_plugins = Udvidelsesmoduler såsom Flash kan skade sikkerheden for dit privatliv og din anonymitet.\n\nDe kan også omgå Tor, så din nuværende placering og IP-adresse afsløres.\n\nEr du sikker på at du vil aktivere udvidelsesmoduler?\n\n
torbutton.popup.never_ask_again = Spørg mig aldrig igen
-torbutton.popup.confirm_newnym = Tor Browser vil lukke alle vinduer og faneblade. Alle webside-sessioner vil gå tabt.\nGenstart Tor Browser nu for at nulstille din identitet?\n
+torbutton.popup.confirm_newnym = Tor Browser vil lukke alle vinduer og faneblade. Alle websted-sessioner vil gå tabt.\nGenstart Tor Browser nu for at nulstille din identitet?\n
torbutton.maximize_warning = Hvis du maksimere Tor Browser kan websteder fastslå din skærmstørrelse, hvilket kan bruges til at spore dig. Vi anbefaler at lade Tor Browser-vinduet være i sin oprindelige standardstørrelse.
diff --git a/src/chrome/locale/el/aboutTor.dtd b/src/chrome/locale/el/aboutTor.dtd
index 5ca6e97f..8556ebc0 100644
--- a/src/chrome/locale/el/aboutTor.dtd
+++ b/src/chrome/locale/el/aboutTor.dtd
@@ -31,5 +31,5 @@
<!ENTITY aboutTor.donationBanner.line2e "Διατηρήστε το Tor ισχυρό.">
<!ENTITY aboutTor.donationBanner.buttonA "Κάντε μια δωρεά τώρα!">
-<!ENTITY aboutTor.donationBanner3.line1 "Automatic monthly donations keep Tor strong.">
-<!ENTITY aboutTor.donationBanner3.line2 "Become a Defender of Privacy today.">
+<!ENTITY aboutTor.donationBanner3.line1 "Οι αυτόματες μηνιαίες δωρεές κρατάνε το Tor δυνατό.">
+<!ENTITY aboutTor.donationBanner3.line2 "Γίνε σήμερα προστάτης της ιδιωτικότητας.">
diff --git a/src/chrome/locale/es-AR/aboutTor.dtd b/src/chrome/locale/es-AR/aboutTor.dtd
index e6345218..1ada3342 100644
--- a/src/chrome/locale/es-AR/aboutTor.dtd
+++ b/src/chrome/locale/es-AR/aboutTor.dtd
@@ -31,5 +31,5 @@
<!ENTITY aboutTor.donationBanner.line2e "Mantener fuerte a Tor.">
<!ENTITY aboutTor.donationBanner.buttonA "Doná ahora">
-<!ENTITY aboutTor.donationBanner3.line1 "Automatic monthly donations keep Tor strong.">
-<!ENTITY aboutTor.donationBanner3.line2 "Become a Defender of Privacy today.">
+<!ENTITY aboutTor.donationBanner3.line1 "Donaciones automaticas mensuales mantienen Tor fuerte.">
+<!ENTITY aboutTor.donationBanner3.line2 "Convertite en un Defensor de la Privacidad hoy.">
diff --git a/src/chrome/locale/es-AR/securityLevel.properties b/src/chrome/locale/es-AR/securityLevel.properties
index c642566d..0c8564d2 100644
--- a/src/chrome/locale/es-AR/securityLevel.properties
+++ b/src/chrome/locale/es-AR/securityLevel.properties
@@ -9,7 +9,7 @@ securityLevel.safer.tooltip = Nivel de Seguridad: Más Seguro
securityLevel.safer.summary = Deshabilita características del sitio web que son a menudo peligrosas, causando que algunos sitios pierdan funcionalidad.
securityLevel.safer.description1 = JavaScript está deshabilitado en sitios no-HTTPS.
securityLevel.safer.description2 = Algunos tipos de letra y símbolos matemáticos están deshabilitados.
-securityLevel.safer.description3 = Audio and video (HTML5 media), and WebGL are click-to-play.
+securityLevel.safer.description3 = Audio y video (medios HTML5) son cliquear-para-reproducir.
securityLevel.safest.level = El más seguro
securityLevel.safest.tooltip = Nivel de Seguridad: El más Seguro
securityLevel.safest.summary = Sólo permite características del sitio web requeridas por sitios estáticos y servicios básicos. Estos cambios afectan imágenes, medios y código ejecutable.
diff --git a/src/chrome/locale/es-AR/torbutton.dtd b/src/chrome/locale/es-AR/torbutton.dtd
index b899ae2e..3d2315af 100644
--- a/src/chrome/locale/es-AR/torbutton.dtd
+++ b/src/chrome/locale/es-AR/torbutton.dtd
@@ -36,6 +36,6 @@
<!ENTITY torbutton.prefs.sec_js_disabled "JavaScript está deshabilitado por defecto en todos los sitios.">
<!ENTITY torbutton.prefs.sec_limit_typography "Algunos tipos de letra y símbolos matemáticos están deshabilitados.">
<!ENTITY torbutton.prefs.sec_limit_graphics_and_typography "Algunos tipos de letra, iconos, símbolos matemáticos e imágenes están deshabilitados.">
-<!ENTITY torbutton.prefs.sec_click_to_play_media "Audio and video (HTML5 media), and WebGL are click-to-play.">
+<!ENTITY torbutton.prefs.sec_click_to_play_media "Audio y video (medios HTML5) son cliquear-para-reproducir.">
<!ENTITY torbutton.circuit_display.title "Circuito Tor">
<!ENTITY torbutton.circuit_display.new_circuit "Nuevo circuito para este sitio">
diff --git a/src/chrome/locale/fr/aboutTor.dtd b/src/chrome/locale/fr/aboutTor.dtd
index e83f750c..c0e5dfec 100644
--- a/src/chrome/locale/fr/aboutTor.dtd
+++ b/src/chrome/locale/fr/aboutTor.dtd
@@ -32,4 +32,4 @@
<!ENTITY aboutTor.donationBanner.buttonA "Faites un don maintenant">
<!ENTITY aboutTor.donationBanner3.line1 "Les dons mensuels automatiques assurent la robustesse de Tor.">
-<!ENTITY aboutTor.donationBanner3.line2 "Devenez dès aujourd'hui un défenseur de la vie privée et de sa protection.">
+<!ENTITY aboutTor.donationBanner3.line2 "Devenez dès aujourd’hui un défenseur de la vie privée et de sa protection.">
diff --git a/src/chrome/locale/ga-IE/aboutTor.dtd b/src/chrome/locale/ga-IE/aboutTor.dtd
index f649892d..79a3176e 100644
--- a/src/chrome/locale/ga-IE/aboutTor.dtd
+++ b/src/chrome/locale/ga-IE/aboutTor.dtd
@@ -31,5 +31,5 @@
<!ENTITY aboutTor.donationBanner.line2e "Cuir taca le Tor.">
<!ENTITY aboutTor.donationBanner.buttonA "Tabhair síntiús airgid anois">
-<!ENTITY aboutTor.donationBanner3.line1 "Automatic monthly donations keep Tor strong.">
-<!ENTITY aboutTor.donationBanner3.line2 "Become a Defender of Privacy today.">
+<!ENTITY aboutTor.donationBanner3.line1 "Ba mhór an cúnamh dúinn síntiúis airgid míosúla.">
+<!ENTITY aboutTor.donationBanner3.line2 "Bí i do Chosantóir an Phríobháideachais inniu.">
diff --git a/src/chrome/locale/hu/aboutTBUpdate.dtd b/src/chrome/locale/hu/aboutTBUpdate.dtd
index ad31aa8a..946bb36b 100644
--- a/src/chrome/locale/hu/aboutTBUpdate.dtd
+++ b/src/chrome/locale/hu/aboutTBUpdate.dtd
@@ -1,8 +1,8 @@
-<!ENTITY aboutTBUpdate.changelogTitle "Tor Browser Changelog">
+<!ENTITY aboutTBUpdate.changelogTitle "Tor Browser Változási napló">
<!ENTITY aboutTBUpdate.updated "Tor Browser frissítve.">
<!ENTITY aboutTBUpdate.linkPrefix "Az erről a kiadásról szóló legfrissebb információkért">
<!ENTITY aboutTBUpdate.linkLabel "látogassa meg weboldalunkat">
<!ENTITY aboutTBUpdate.linkSuffix ".">
<!ENTITY aboutTBUpdate.version "Verzió">
-<!ENTITY aboutTBUpdate.releaseDate "Release Date">
+<!ENTITY aboutTBUpdate.releaseDate "Kiadási dátum">
<!ENTITY aboutTBUpdate.releaseNotes "Verziókövetési jegyzet">
diff --git a/src/chrome/locale/hu/aboutTor.dtd b/src/chrome/locale/hu/aboutTor.dtd
index b83a2815..dc759969 100644
--- a/src/chrome/locale/hu/aboutTor.dtd
+++ b/src/chrome/locale/hu/aboutTor.dtd
@@ -28,8 +28,8 @@
<!ENTITY aboutTor.newsletter.tagline "Kapja meg a legfrissebb Tor híreket közvetlenül email fiókjába.">
<!ENTITY aboutTor.newsletter.link_text "Iratkozzon fel a Tor hírekhez.">
-<!ENTITY aboutTor.donationBanner.line2e "Tartsuk a Tor-t erősnek.">
+<!ENTITY aboutTor.donationBanner.line2e "Tartsuk meg a Tor-t erősnek.">
<!ENTITY aboutTor.donationBanner.buttonA "Támogasson most">
-<!ENTITY aboutTor.donationBanner3.line1 "Automatic monthly donations keep Tor strong.">
-<!ENTITY aboutTor.donationBanner3.line2 "Become a Defender of Privacy today.">
+<!ENTITY aboutTor.donationBanner3.line1 "Az automatikus havi támogatások a tartják a Tort erősen.">
+<!ENTITY aboutTor.donationBanner3.line2 "Legyen az Adatok Védelmezője még ma.">
diff --git a/src/chrome/locale/hu/securityLevel.properties b/src/chrome/locale/hu/securityLevel.properties
index ea2e700e..ecb5ab1c 100644
--- a/src/chrome/locale/hu/securityLevel.properties
+++ b/src/chrome/locale/hu/securityLevel.properties
@@ -1,6 +1,6 @@
securityLevel.securityLevel = Biztonsági szint
securityLevel.customWarning = Egyéni
-securityLevel.overview = Disable certain web features that can be used to attack your security and anonymity.
+securityLevel.overview = Néhány web szolgáltatás kikapcsolása, amit támadhatja biztonságát és anonimitását.
securityLevel.standard.level = Normál
securityLevel.standard.tooltip = Biztonsági szint: Normál
securityLevel.standard.summary = Minden Tor Browser és weboldal szolgáltatás engedélyezve.
@@ -9,7 +9,7 @@ securityLevel.safer.tooltip = Biztonsági szint: Biztonságosabb
securityLevel.safer.summary = Azon weboldal szolgáltatások tiltása, amelyek többnyire veszélyesek, ami néhány oldal működésének problémáit okozhatja.
securityLevel.safer.description1 = A JavaScript tiltott a nem-HTTPS oldalkon.
securityLevel.safer.description2 = Néhány betűtípus és matematikai szimbólum tiltásra került.
-securityLevel.safer.description3 = Audio and video (HTML5 media), and WebGL are click-to-play.
+securityLevel.safer.description3 = Az audió és videó (HTML5 média) és a WebGL kattintásra indul.
securityLevel.safest.level = Legbiztonságosabb
securityLevel.safest.tooltip = Biztonsági szint: Legbiztonságosabb
securityLevel.safest.summary = Csak azon weboldal szolgáltatások engedélyezése, amelyek a statikus, vagy alap szolgáltatásokhoz szükségesek. Ezek a beállítások érintik a képeket, médiákat és scripteket.
@@ -19,4 +19,4 @@ securityLevel.safest.description3 = Audió és videó (HTML5 média) kattintásr
securityLevel.custom.summary = Az Ön által eszközölt egyéni böngészői beállítások eredményeképp biztonsági kockázatok merülhetnek fel. Biztonsági és adatvédelmi szempontokból kérjük válasszon az alapértelmezett biztonsági szintek közül.
securityLevel.learnMore = További információ
securityLevel.restoreDefaults = Alapértelmezések visszaállítása
-securityLevel.advancedSecuritySettings = Advanced Security Settings…
+securityLevel.advancedSecuritySettings = Speciális biztonsági beállítások...
diff --git a/src/chrome/locale/hu/torbutton.dtd b/src/chrome/locale/hu/torbutton.dtd
index a00bbdba..0c0b05b5 100644
--- a/src/chrome/locale/hu/torbutton.dtd
+++ b/src/chrome/locale/hu/torbutton.dtd
@@ -36,6 +36,6 @@
<!ENTITY torbutton.prefs.sec_js_disabled "A JavaScript alapértelmezetten tiltott minden oldalon.">
<!ENTITY torbutton.prefs.sec_limit_typography "Néhány betűtípus és matematikai szimbólum tiltásra került.">
<!ENTITY torbutton.prefs.sec_limit_graphics_and_typography "Néhány betűtípus, ikon és matematikai szimbólum és a képek tiltásra kerültek.">
-<!ENTITY torbutton.prefs.sec_click_to_play_media "Audio and video (HTML5 media), and WebGL are click-to-play.">
+<!ENTITY torbutton.prefs.sec_click_to_play_media "Az audió és videó (HTML5 média) és a WebGL kattintásra indul.">
<!ENTITY torbutton.circuit_display.title "Tor áramkör">
<!ENTITY torbutton.circuit_display.new_circuit "Új Tor áramkör ehhez az oldalhoz">
diff --git a/src/chrome/locale/id/aboutTor.dtd b/src/chrome/locale/id/aboutTor.dtd
index 0d7fa618..eb7581f9 100644
--- a/src/chrome/locale/id/aboutTor.dtd
+++ b/src/chrome/locale/id/aboutTor.dtd
@@ -11,25 +11,25 @@
<!ENTITY aboutTor.ready.label "Jelajahi. Secara Privat.">
<!ENTITY aboutTor.ready2.label "Anda siap untuk pengalaman menjelajah yang paling privat di dunia.">
<!ENTITY aboutTor.failure.label "Ada Masalah!">
-<!ENTITY aboutTor.failure2.label "Tor tidak dapat digunakan di peramban ini.">
+<!ENTITY aboutTor.failure2.label "Tor tidak dapat digunakan diperamban ini.">
<!ENTITY aboutTor.search.label "Cari dengan DuckDuckGo">
<!ENTITY aboutTor.searchDDGPost.link "https://duckduckgo.com">
<!ENTITY aboutTor.torbrowser_user_manual_questions.label "Pertanyaan?">
-<!ENTITY aboutTor.torbrowser_user_manual_link.label "Periksa Tor Browser Manual kami »">
+<!ENTITY aboutTor.torbrowser_user_manual_link.label "Periksa Manual Tor Browser kami »">
<!-- The next two entities are used within the browser's Help menu. -->
-<!ENTITY aboutTor.torbrowser_user_manual.accesskey "m">
-<!ENTITY aboutTor.torbrowser_user_manual.label "Tor Browser Manual ">
+<!ENTITY aboutTor.torbrowser_user_manual.accesskey "M">
+<!ENTITY aboutTor.torbrowser_user_manual.label "Manual Tor Browser">
-<!ENTITY aboutTor.tor_mission.label "The Tor Project adalah US 501(c)(3) organisasi nirlaba yang bertujuan memajukan hak asasi manusia dan kebebasan dengan membuat dan menyebarkan teknologi anominitas dan privasi yang bebas dan terbuka dan mendukung keberadaan dan penggunaannya, dan meningkatkan pemahamannya dalam hal ilmiah dan populer.">
+<!ENTITY aboutTor.tor_mission.label "The Tor Project adalah US 501(c)(3) organisasi nirlaba yang bertujuan memajukan hak asasi manusia dan kebebasan dengan membuat dan menyebarkan teknologi anominitas dan privasi yang bebas dan terbuka, mendukung keberadaan dan penggunaannya, dan meningkatkan pemahamannya ilmiah dan populernya.">
<!ENTITY aboutTor.getInvolved.label "Ikut Terlibat »">
<!ENTITY aboutTor.getInvolved.link "https://www.torproject.org/terlibat/relawan.html.id">
-<!ENTITY aboutTor.newsletter.tagline "Dapatkan berita Tor terbaru langsung ke inbox Anda.">
+<!ENTITY aboutTor.newsletter.tagline "Dapatkan berita Tor terbaru langsung dipos-el Anda.">
<!ENTITY aboutTor.newsletter.link_text "Daftar untuk mendapatkan Berita Tor.">
-<!ENTITY aboutTor.donationBanner.line2e "Keep Tor strong.">
+<!ENTITY aboutTor.donationBanner.line2e "Bantu Tor tetap kuat.">
<!ENTITY aboutTor.donationBanner.buttonA "Donasi Sekarang">
-<!ENTITY aboutTor.donationBanner3.line1 "Automatic monthly donations keep Tor strong.">
-<!ENTITY aboutTor.donationBanner3.line2 "Become a Defender of Privacy today.">
+<!ENTITY aboutTor.donationBanner3.line1 "Donasi bulanan otomatis untuk membantu Tor tetap kuat.">
+<!ENTITY aboutTor.donationBanner3.line2 "Jadilah Pahlawan Privasi hari ini.">
diff --git a/src/chrome/locale/is/aboutTor.dtd b/src/chrome/locale/is/aboutTor.dtd
index e3bfeff5..b6da912b 100644
--- a/src/chrome/locale/is/aboutTor.dtd
+++ b/src/chrome/locale/is/aboutTor.dtd
@@ -31,5 +31,5 @@
<!ENTITY aboutTor.donationBanner.line2e "Höldum Tor sterku">
<!ENTITY aboutTor.donationBanner.buttonA "Styrkja núna">
-<!ENTITY aboutTor.donationBanner3.line1 "Automatic monthly donations keep Tor strong.">
-<!ENTITY aboutTor.donationBanner3.line2 "Become a Defender of Privacy today.">
+<!ENTITY aboutTor.donationBanner3.line1 "Sjálfvirkar mánaðarlegar greiðslur eru mikill styrkur fyrir Tor.">
+<!ENTITY aboutTor.donationBanner3.line2 "Gerstu strax baráttumaður fyrir friðhelgi einkalífsins.">
diff --git a/src/chrome/locale/it/aboutTor.dtd b/src/chrome/locale/it/aboutTor.dtd
index a1477463..6178c8eb 100644
--- a/src/chrome/locale/it/aboutTor.dtd
+++ b/src/chrome/locale/it/aboutTor.dtd
@@ -29,7 +29,7 @@
<!ENTITY aboutTor.newsletter.tagline "Ottieni le ultime info da Tor direttamente nella tua casella di posta elettronica.">
<!ENTITY aboutTor.newsletter.link_text "Registrati alle Tor News.">
<!ENTITY aboutTor.donationBanner.line2e "Mantieni Tor forte.">
-<!ENTITY aboutTor.donationBanner.buttonA "Dona Ora">
+<!ENTITY aboutTor.donationBanner.buttonA "Dona Adesso">
-<!ENTITY aboutTor.donationBanner3.line1 "Le donazioni mensili automatiche mantengono forte Tor.">
+<!ENTITY aboutTor.donationBanner3.line1 "Le donazioni mensili automatiche mantengono Tor forte.">
<!ENTITY aboutTor.donationBanner3.line2 "Diventa un Difensore della Privacy oggi.">
diff --git a/src/chrome/locale/ja/aboutTor.dtd b/src/chrome/locale/ja/aboutTor.dtd
index 5524169a..183b5e2a 100644
--- a/src/chrome/locale/ja/aboutTor.dtd
+++ b/src/chrome/locale/ja/aboutTor.dtd
@@ -31,5 +31,5 @@
<!ENTITY aboutTor.donationBanner.line2e "Tor を強く保つ。">
<!ENTITY aboutTor.donationBanner.buttonA "今すぐ寄付">
-<!ENTITY aboutTor.donationBanner3.line1 "Automatic monthly donations keep Tor strong.">
-<!ENTITY aboutTor.donationBanner3.line2 "Become a Defender of Privacy today.">
+<!ENTITY aboutTor.donationBanner3.line1 "毎月の寄付によりTorを強固に保ちましょう。">
+<!ENTITY aboutTor.donationBanner3.line2 "プライバシーの守護者になりましょう。">
diff --git a/src/chrome/locale/ja/securityLevel.properties b/src/chrome/locale/ja/securityLevel.properties
index 9fc42437..292dbea8 100644
--- a/src/chrome/locale/ja/securityLevel.properties
+++ b/src/chrome/locale/ja/securityLevel.properties
@@ -9,7 +9,7 @@ securityLevel.safer.tooltip = セキュリティレベル:やや安全
securityLevel.safer.summary = ウェブサイトのしばしば危険である機能を無効化します。サイトによっては正常に動作しなくなります。
securityLevel.safer.description1 = HTTPS非対応のサイトで JavaScript が無効化されます。
securityLevel.safer.description2 = いくつかのフォントと数学記号が無効化されます。
-securityLevel.safer.description3 = Audio and video (HTML5 media), and WebGL are click-to-play.
+securityLevel.safer.description3 = オーディオ、ビデオ(HTML5メディア)、WebGLはクリックすると再生されます。
securityLevel.safest.level = 最も安全
securityLevel.safest.tooltip = セキュリティレベル:最も安全
securityLevel.safest.summary = 静的なサイトと基本的なサービスに必要な機能だけを許可します。この変更は画像、メディア、スクリプトに影響します。
diff --git a/src/chrome/locale/ja/torbutton.dtd b/src/chrome/locale/ja/torbutton.dtd
index 3137fb04..0c1d43ab 100644
--- a/src/chrome/locale/ja/torbutton.dtd
+++ b/src/chrome/locale/ja/torbutton.dtd
@@ -36,6 +36,6 @@
<!ENTITY torbutton.prefs.sec_js_disabled "すべてのサイトで JavaScript が無効化されます。">
<!ENTITY torbutton.prefs.sec_limit_typography "いくつかのフォントと数学記号が無効化されます。">
<!ENTITY torbutton.prefs.sec_limit_graphics_and_typography "いくつかのアイコン、数学記号および画像が無効化されます。">
-<!ENTITY torbutton.prefs.sec_click_to_play_media "Audio and video (HTML5 media), and WebGL are click-to-play.">
+<!ENTITY torbutton.prefs.sec_click_to_play_media "オーディオ、ビデオ(HTML5メディア)、WebGLはクリックすると再生されます。">
<!ENTITY torbutton.circuit_display.title "Tor サーキット">
<!ENTITY torbutton.circuit_display.new_circuit "このサイトに新しいサーキットを使用する">
diff --git a/src/chrome/locale/ka/aboutTor.dtd b/src/chrome/locale/ka/aboutTor.dtd
index 3cdf164e..c7b5bbff 100644
--- a/src/chrome/locale/ka/aboutTor.dtd
+++ b/src/chrome/locale/ka/aboutTor.dtd
@@ -31,5 +31,5 @@
<!ENTITY aboutTor.donationBanner.line2e "შეინარჩუნეთ Tor ძლიერი.">
<!ENTITY aboutTor.donationBanner.buttonA "გაიღეთ თანხა">
-<!ENTITY aboutTor.donationBanner3.line1 "Automatic monthly donations keep Tor strong.">
-<!ENTITY aboutTor.donationBanner3.line2 "Become a Defender of Privacy today.">
+<!ENTITY aboutTor.donationBanner3.line1 "ყოველთვიური შემოწირულობები მეტად აძლიერებს Tor-ს.">
+<!ENTITY aboutTor.donationBanner3.line2 "გახდით პირადულობის გუშაგი დღესვე!">
diff --git a/src/chrome/locale/ko/aboutTor.dtd b/src/chrome/locale/ko/aboutTor.dtd
index 753a9b4c..2469a6af 100644
--- a/src/chrome/locale/ko/aboutTor.dtd
+++ b/src/chrome/locale/ko/aboutTor.dtd
@@ -9,7 +9,7 @@
<!ENTITY aboutTor.viewChangelog.label "변경이력 보기">
<!ENTITY aboutTor.ready.label "은밀하게 탐색하십시오.">
-<!ENTITY aboutTor.ready2.label "당신은 온세상이 가장 은밀한 탐색의 경험을 준비가 되었습니다.">
+<!ENTITY aboutTor.ready2.label "당신은 온 세상에서 가장 은밀하게 탐색의 경험을 할 준비가 되었습니다.">
<!ENTITY aboutTor.failure.label "뭔가 잘못되었습니다!">
<!ENTITY aboutTor.failure2.label "Tor는 이 브라우저에서 작동하지 않습니다.">
@@ -28,8 +28,8 @@
<!ENTITY aboutTor.newsletter.tagline "최신의 Tor 뉴스를 받은 편지함에 곧장 받으십시오.">
<!ENTITY aboutTor.newsletter.link_text "Tor 뉴스를 구독.">
-<!ENTITY aboutTor.donationBanner.line2e "Keep Tor strong.">
-<!ENTITY aboutTor.donationBanner.buttonA "Donate Now">
+<!ENTITY aboutTor.donationBanner.line2e "Tor 를 강하게 유지하기.">
+<!ENTITY aboutTor.donationBanner.buttonA "기부하기">
-<!ENTITY aboutTor.donationBanner3.line1 "Automatic monthly donations keep Tor strong.">
-<!ENTITY aboutTor.donationBanner3.line2 "Become a Defender of Privacy today.">
+<!ENTITY aboutTor.donationBanner3.line1 "매월 자동기부를 통해 Tor를 강하게 유지하기 ">
+<!ENTITY aboutTor.donationBanner3.line2 "바로 오늘 개인정보의 수호자가 되는 겁니다.">
diff --git a/src/chrome/locale/nb-NO/aboutDialog.dtd b/src/chrome/locale/nb-NO/aboutDialog.dtd
index 78293397..708242f2 100644
--- a/src/chrome/locale/nb-NO/aboutDialog.dtd
+++ b/src/chrome/locale/nb-NO/aboutDialog.dtd
@@ -1,9 +1,9 @@
-<!ENTITY project.start "&bransShortName; blir utviklet av">
+<!ENTITY project.start "&brandShortName; blir utviklet av">
<!-- LOCALIZATION NOTE (project.tpoLink): This is a link title that links to https://www.torproject.org -->
<!ENTITY project.tpoLink "&vendorShortName;">
<!ENTITY project.end ", en veldedig organisasjon som jobber for å forsvare ditt personvern og din frihet på nett.">
-<!ENTITY help.start "Vil du bidra?">
+<!ENTITY help.start "Vil du hjelpe?">
<!-- LOCALIZATION NOTE (help.donate): This is a link title that links to https://www.torproject.org/donate/donate.html.en -->
<!ENTITY help.donateLink "Doner">
<!ENTITY help.or "eller">
diff --git a/src/chrome/locale/nb-NO/aboutTBUpdate.dtd b/src/chrome/locale/nb-NO/aboutTBUpdate.dtd
index c32d0b2e..e94bc709 100644
--- a/src/chrome/locale/nb-NO/aboutTBUpdate.dtd
+++ b/src/chrome/locale/nb-NO/aboutTBUpdate.dtd
@@ -1,5 +1,5 @@
-<!ENTITY aboutTBUpdate.changelogTitle "Tor Browser Endringslogg">
-<!ENTITY aboutTBUpdate.updated "Tor-nettleseren har blitt oppdatert.">
+<!ENTITY aboutTBUpdate.changelogTitle "Tor Nettleser Endringslogg">
+<!ENTITY aboutTBUpdate.updated "Tor Nettleser har blitt oppdatert.">
<!ENTITY aboutTBUpdate.linkPrefix "For den mest oppdaterte informasjonen om denne utgivelsen,">
<!ENTITY aboutTBUpdate.linkLabel "besøk vårt nettsted">
<!ENTITY aboutTBUpdate.linkSuffix ".">
diff --git a/src/chrome/locale/nb-NO/aboutTor.dtd b/src/chrome/locale/nb-NO/aboutTor.dtd
index 04cb3a97..53402eab 100644
--- a/src/chrome/locale/nb-NO/aboutTor.dtd
+++ b/src/chrome/locale/nb-NO/aboutTor.dtd
@@ -17,10 +17,10 @@
<!ENTITY aboutTor.searchDDGPost.link "https://duckduckgo.com">
<!ENTITY aboutTor.torbrowser_user_manual_questions.label "Spørsmål?">
-<!ENTITY aboutTor.torbrowser_user_manual_link.label "Sjekk vår Tor Browser Manual »">
+<!ENTITY aboutTor.torbrowser_user_manual_link.label "Sjekk vår Tor Nettleser Håndbok »">
<!-- The next two entities are used within the browser's Help menu. -->
<!ENTITY aboutTor.torbrowser_user_manual.accesskey "M">
-<!ENTITY aboutTor.torbrowser_user_manual.label "Tor-nettleseren Håndbok">
+<!ENTITY aboutTor.torbrowser_user_manual.label "Tor Nettleser Håndbok">
<!ENTITY aboutTor.tor_mission.label "The Tor Project er en US 501(c)(3) ideell organisasjon som fremmer menneskerettigheter og friheter ved å skape og distribuere anonymisering og personvernteknologi for fri og åpen kildekode, som støtter deres ubegrensede tilgjengelighet og bruk, og fremmer sin vitenskapelige og populære forståelse.">
<!ENTITY aboutTor.getInvolved.label "Bli involvert »">
@@ -31,5 +31,5 @@
<!ENTITY aboutTor.donationBanner.line2e "Hold Tor sterk.">
<!ENTITY aboutTor.donationBanner.buttonA "Donér nå">
-<!ENTITY aboutTor.donationBanner3.line1 "Automatic monthly donations keep Tor strong.">
-<!ENTITY aboutTor.donationBanner3.line2 "Become a Defender of Privacy today.">
+<!ENTITY aboutTor.donationBanner3.line1 "Automatisk månedlig donasjoner gjør Tor sterk.">
+<!ENTITY aboutTor.donationBanner3.line2 "Bli en Kjemper for Privatliv i dag.">
diff --git a/src/chrome/locale/nb-NO/brand.dtd b/src/chrome/locale/nb-NO/brand.dtd
index 7ae614c1..ff45f781 100644
--- a/src/chrome/locale/nb-NO/brand.dtd
+++ b/src/chrome/locale/nb-NO/brand.dtd
@@ -5,7 +5,7 @@
<!ENTITY brandShorterName "Tor-nettleseren">
<!ENTITY brandShortName "Tor-nettleseren">
<!ENTITY brandFullName "Tor-nettleseren">
-<!ENTITY vendorShortName "Tor-prosjektet">
+<!ENTITY vendorShortName "Tor Project">
<!ENTITY trademarkInfo.part1 "Firefox og Firefox-logene er varemarker tilhørende Mozilla-stiftelsen.">
<!-- The following strings are for bug #10280's UI. We place them here for our translators -->
diff --git a/src/chrome/locale/nb-NO/brand.properties b/src/chrome/locale/nb-NO/brand.properties
index 3101ebc6..2cbf97d7 100644
--- a/src/chrome/locale/nb-NO/brand.properties
+++ b/src/chrome/locale/nb-NO/brand.properties
@@ -5,7 +5,7 @@
brandShorterName=Tor-nettleseren
brandShortName=Tor-nettleseren
brandFullName=Tor-nettleseren
-vendorShortName=Tor-prosjektet
+vendorShortName=Tor Project
homePageSingleStartMain=Firefox Start, en rask startside med innebygd søk
homePageImport=Importer startsiden din fra %S
diff --git a/src/chrome/locale/nb-NO/browserOnboarding.properties b/src/chrome/locale/nb-NO/browserOnboarding.properties
index 3b0d070c..8ae65912 100644
--- a/src/chrome/locale/nb-NO/browserOnboarding.properties
+++ b/src/chrome/locale/nb-NO/browserOnboarding.properties
@@ -9,12 +9,12 @@ onboarding.tour-tor-welcome.next-button=Gå til Personvern
onboarding.tour-tor-privacy=Personvern
onboarding.tour-tor-privacy.title=Avvis snokere og sporing.
-onboarding.tour-tor-privacy.description=Tor Browser isolerer informasjonskapsler og sletter nettleserens historie etter økten. Disse endringene sikrer at personvernet ditt og sikkerheten er beskyttet i nettleseren. Klikk "Tor Nettverk" for å lære hvordan vi beskytter deg på nettverksnivå.
+onboarding.tour-tor-privacy.description=Tor Nettleser isolerer informasjonskapsler og sletter nettleserens historie etter økten. Disse endringene sikrer at personvernet ditt og sikkerheten er beskyttet i nettleseren. Klikk "Tor Nettverk" for å lære hvordan vi beskytter deg på nettverksnivå.
onboarding.tour-tor-privacy.button=Gå til Tor Nettverk
onboarding.tour-tor-network=Tor Nettverk
onboarding.tour-tor-network.title=Reis et decentralisert nettverk.
-onboarding.tour-tor-network.description=Tor Browser forbinder deg med Tor-nettet som drives av tusenvis av frivillige rundt om i verden. I motsetning til en VPN er det ingen feilpunkt eller sentralisert enhet du må stole på for å kunne nyte Internettet privat.
+onboarding.tour-tor-network.description=Tor Nettleser forbinder deg med Tor-nettet som drives av tusenvis av frivillige rundt om i verden. I motsetning til en VPN er det ingen feilpunkt eller sentralisert enhet du må stole på for å kunne nyte Internettet privat.
onboarding.tour-tor-network.button=Gå til Kretsvisning
onboarding.tour-tor-circuit-display=Kretsvisning
diff --git a/src/chrome/locale/nb-NO/torbutton.properties b/src/chrome/locale/nb-NO/torbutton.properties
index 83defa32..f4917f95 100644
--- a/src/chrome/locale/nb-NO/torbutton.properties
+++ b/src/chrome/locale/nb-NO/torbutton.properties
@@ -8,20 +8,20 @@ torbutton.circuit_display.unknown_country = Ukjent land
torbutton.circuit_display.guard = Vakt
torbutton.circuit_display.guard_note = Din [Vakt] node kan ikke endres.
torbutton.circuit_display.learn_more = Lær mer
-torbutton.content_sizer.margin_tooltip = Tor nettleseren legger til denne marginen for å lage bredden og høyden på ditt vindu mindre unikt, og reduserer slik muligheten for andre til å spore deg på nett.
+torbutton.content_sizer.margin_tooltip = Tor Nettleser legger til denne marginen for å gjøre bredden og høyden på vinduet ditt mindre særegent, og reduserer dermed muligheten for folk til å spore deg på nett.
torbutton.panel.tooltip.disabled = Klikk for å aktivere Tor
torbutton.panel.tooltip.enabled = Klikk for å skru av Tor
torbutton.panel.label.disabled = Tor er avskrudd
torbutton.panel.label.enabled = Tor er aktivert
extensions.torbutton(a)torproject.org.description = Torbutton tilbyr en knapp til å sette opp Tor-innstillinger, samt rask og enkel tilgang til å slette privat nettleserhistorikk.
torbutton.popup.external.title = Last ned en ekstern filtype?
-torbutton.popup.external.app = Tor-nettleseren kan ikke åpne denne filen. Du er nødt til å åpne den med et annet program.\n
+torbutton.popup.external.app = Tor Nettleser kan ikke åpne denne filen. Du er nødt til å åpne den med et annet program.\n\n
torbutton.popup.external.note = Noen filtyper kan forårsake at programmer kobler til internett uten å bruke Tor.\n
torbutton.popup.external.suggest = For å være på den sikre siden, bør du kun åpne nedlastede filer når du frakoblet internett, eller bruke en Tor Live CD som Tails.\n
torbutton.popup.launch = Last ned fil
torbutton.popup.cancel = Avbryt
torbutton.popup.dontask = Last ned filer automatisk fra nå av
-torbutton.popup.no_newnym = Torbutton kan ikke trygt gi deg en ny identitet. Den har ikke tilgang til Tor-kontrollporten.\n\nKjører du Tor-nettleserpakken?
+torbutton.popup.no_newnym = Torbutton kan ikke trygt gi deg en ny identitet. Den har ikke tilgang til Tor-kontrollporten.\n\nKjører du Tor Nettleser pakken?
torbutton.security_settings.menu.title = Sikkerhetsinnstillinger
torbutton.title.prompt_torbrowser = Viktig Torbutton-informasjon
torbutton.popup.prompt_torbrowser = Torbutton fungerer annerledes nå. Du kan ikke skru den av lenger.\n\nVi gjorde denne forandringen fordi det ikke er sikkert å bruke Torbutton i en nettleser som også brukers til annen surfing enn Tor. \nDet var for mange feil der til at vi kunne fikse det på en annen måte.\n\nHvis du ønsker å bruke Firefox normalt, bør du avinstallere Torbutton og laste ned Tor-nettleserforpakningen. Personvernsinnstillingene til Tor-nettleseren er også overlegen forvalget i Firefox, selv når Firefox brukes med Torbutton.\n\nFor å fjerne Torbutton, gå til Verktøy->Tillegg->Utvidelser og klikk på Fjern-knappen ved siden av Torbutton.
@@ -29,12 +29,12 @@ torbutton.popup.short_torbrowser = Viktig Torbutton-informasjon!\n\nTorbutton er
torbutton.popup.confirm_plugins = Nettlesertillegg som f.eks Flash kan skade personvernet og anonymiteten din.\n\nDe kan også omgå Tor og dermed avsløre din nåværende plassering og IP-adresse.\n\nEr du sikker på at du vil aktivere nettlesertillegg?\n\n
torbutton.popup.never_ask_again = Ikke spør meg igjen
-torbutton.popup.confirm_newnym = TOR-nettleseren vil stenge alle vinduer og faner. Alle nettstedeøkter vil gå tapt.\n\n\nRestart TOR-nettleseren nå for å tilbakestille din identitet?\n\n
+torbutton.popup.confirm_newnym = Tor Nettleser vil stenge alle vinduer og faner. Alle nettstedeøkter vil gå tapt.\n\nStart Tor Nettleser på nytt nå for å tilbakestille identiteten din?\n\n
-torbutton.maximize_warning = Å blåse opp vinduet Tor-nettleseren befinner seg i til full størrelse gir nettsteder muligheten til å fastslå din skjermoppløsning, som igjen kan brukes til å spore deg. Vi anbefaler at du lar Tor-nettleservinduet være i orginal størrelse.
+torbutton.maximize_warning = Å maksimere Tor Nettleser kan tillate nettsteder å bestemme skjermstørrelsen din, som kan brukes til å spore deg. Vi anbefaler at du lar Tor Nettleser vinduer ligge i den opprinnelige standardstørrelsen.
# Canvas permission prompt. Strings are kept here for ease of translation.
-canvas.siteprompt=Denne nettsiden (%S) prøvde å pakke ut HTML5-canvas-billeddata, hvilket kan brukes til å tilkjennegi din datamaskin spesifikt i identifiseringsøyemed.\n\nSkal Tor-nettleseren tillate denne nettsiden å pakke ut HTML5-canvas-billeddata?
+canvas.siteprompt=Denne nettsiden (%S) prøvde å pakke ut HTML5-canvas-billeddata, hvilket kan brukes til å tilkjennegi din datamaskin spesifikt i identifiseringsøyemed.\n\nSkal Tor Nettleser tillate denne nettsiden å pakke ut HTML5-canvas-billeddata?
canvas.notNow=Ikke nå
canvas.notNowAccessKey=N
canvas.allow=Tillat i fremtiden
diff --git a/src/chrome/locale/nl/aboutTor.dtd b/src/chrome/locale/nl/aboutTor.dtd
index 3e78eb8b..c4097e97 100644
--- a/src/chrome/locale/nl/aboutTor.dtd
+++ b/src/chrome/locale/nl/aboutTor.dtd
@@ -6,9 +6,9 @@
<!ENTITY aboutTor.title "Over Tor">
-<!ENTITY aboutTor.viewChangelog.label "Wijzigingslogboek bekijken">
+<!ENTITY aboutTor.viewChangelog.label "Wijzigingslog bekijken">
-<!ENTITY aboutTor.ready.label "Onderzoek. Privé.">
+<!ENTITY aboutTor.ready.label "Verken. Privé.">
<!ENTITY aboutTor.ready2.label "U bent klaar voor de meest private surfervaring ter wereld.">
<!ENTITY aboutTor.failure.label "Er ging iets mis!">
<!ENTITY aboutTor.failure2.label "Tor werkt niet in deze browser.">
diff --git a/src/chrome/locale/nl/brand.properties b/src/chrome/locale/nl/brand.properties
index 43f43610..ac15d1c3 100644
--- a/src/chrome/locale/nl/brand.properties
+++ b/src/chrome/locale/nl/brand.properties
@@ -11,6 +11,6 @@ homePageSingleStartMain=Firefox Start, een snelle startpagina met ingebouwde zoe
homePageImport=Importeer je startpagina uit %S
homePageMigrationPageTitle=Startpaginakeuze
-homePageMigrationDescription=Selecteer de startpagina die je wil gebruiken:
+homePageMigrationDescription=Selecteer de startpagina die u wilt gebruiken:
syncBrandShortName=Synchronisatie
diff --git a/src/chrome/locale/nl/securityLevel.properties b/src/chrome/locale/nl/securityLevel.properties
index 9c98f8e9..25d29f72 100644
--- a/src/chrome/locale/nl/securityLevel.properties
+++ b/src/chrome/locale/nl/securityLevel.properties
@@ -9,7 +9,7 @@ securityLevel.safer.tooltip = Beveiligingsniveau: veiliger
securityLevel.safer.summary = Schakelt websitefuncties uit die vaak gevaarlijk zijn, waardoor sommige websites functionaliteit verliezen.
securityLevel.safer.description1 = JavaScript is uitgeschakeld op niet-HTTPS-websites.
securityLevel.safer.description2 = Sommige lettertypen en wiskundige symbolen zijn uitgeschakeld.
-securityLevel.safer.description3 = Audio and video (HTML5 media), and WebGL are click-to-play.
+securityLevel.safer.description3 = Audio en video (HTML5-media) zijn klikken-voor-afspelen.
securityLevel.safest.level = Veiligste
securityLevel.safest.tooltip = Beveiligingsniveau: veiligste
securityLevel.safest.summary = Staat alleen websitefuncties toe die voor statische websites en basisservices zijn vereist. Deze wijzigingen zijn van invloed op afbeeldingen, media en scripts.
diff --git a/src/chrome/locale/nl/torbutton.dtd b/src/chrome/locale/nl/torbutton.dtd
index f5819e37..7125d44f 100644
--- a/src/chrome/locale/nl/torbutton.dtd
+++ b/src/chrome/locale/nl/torbutton.dtd
@@ -6,21 +6,21 @@
<!ENTITY torbutton.context_menu.networksettings.key "N">
<!ENTITY torbutton.context_menu.downloadUpdate "Controleer op updates voor de Tor-browser...">
<!ENTITY torbutton.context_menu.downloadUpdate.key "U">
-<!ENTITY torbutton.context_menu.cookieProtections "Cookie Beveiligingen">
+<!ENTITY torbutton.context_menu.cookieProtections "Cookiebeschermingen…">
<!ENTITY torbutton.context_menu.cookieProtections.key "C">
<!ENTITY torbutton.button.tooltip "Klik hier om Tor-knop te initialiseren">
<!ENTITY torbutton.prefs.security_settings "Tor-browser Beveiligingsinstellingen">
-<!ENTITY torbutton.cookiedialog.title "Beheer Cookie Beveiligingen">
-<!ENTITY torbutton.cookiedialog.lockCol "Beveiligd">
+<!ENTITY torbutton.cookiedialog.title "Cookiebeschermingen beheren">
+<!ENTITY torbutton.cookiedialog.lockCol "Beschermd">
<!ENTITY torbutton.cookiedialog.domainCol "Host">
<!ENTITY torbutton.cookiedialog.nameCol "Naam">
<!ENTITY torbutton.cookiedialog.pathCol "Pad">
-<!ENTITY torbutton.cookiedialog.protectCookie "Cookie beveiligen">
+<!ENTITY torbutton.cookiedialog.protectCookie "Cookie beschermen">
<!ENTITY torbutton.cookiedialog.removeCookie "Cookie verwijderen">
-<!ENTITY torbutton.cookiedialog.unprotectCookie "Cookie beveiliging opheffen">
-<!ENTITY torbutton.cookiedialog.removeAllBut "Alle cookies, met uitzondering van de beveiligde, verwijderen">
-<!ENTITY torbutton.cookiedialog.saveAllCookies "Beveilig nieuwe cookies">
-<!ENTITY torbutton.cookiedialog.doNotSaveAllCookies "Beveilig nieuwe cookies niet">
+<!ENTITY torbutton.cookiedialog.unprotectCookie "Cookiebescherming opheffen">
+<!ENTITY torbutton.cookiedialog.removeAllBut "Alle behalve beschermde verwijderen">
+<!ENTITY torbutton.cookiedialog.saveAllCookies "Nieuwe cookies beschermen">
+<!ENTITY torbutton.cookiedialog.doNotSaveAllCookies "Nieuwe cookies niet beschermen">
<!ENTITY torbutton.prefs.sec_caption "Beveiligingsniveau">
<!ENTITY torbutton.prefs.sec_caption_tooltip "De beveiligingsschuifbalk laat je toe sommige functies uit te schakelen die je browser mogelijk blootstellen aan beveiligingsrisico's.">
<!ENTITY torbutton.prefs.sec_standard_label "Standaard">
@@ -36,6 +36,6 @@
<!ENTITY torbutton.prefs.sec_js_disabled "Javascript zijn standaard uitgeschakeld op alle sites.">
<!ENTITY torbutton.prefs.sec_limit_typography "Sommige lettertypen en wiskundige symbolen zijn uitgeschakeld.">
<!ENTITY torbutton.prefs.sec_limit_graphics_and_typography "Sommige lettertypen, pictogrammen, wiskundige symbolen en afbeeldingen zijn uitgeschakeld.">
-<!ENTITY torbutton.prefs.sec_click_to_play_media "Audio and video (HTML5 media), and WebGL are click-to-play.">
+<!ENTITY torbutton.prefs.sec_click_to_play_media "Audio en video (HTML5-media) en WebGL zijn klikken-voor-afspelen.">
<!ENTITY torbutton.circuit_display.title "Torcircuit">
<!ENTITY torbutton.circuit_display.new_circuit "Nieuw circuit voor deze website">
diff --git a/src/chrome/locale/pl/aboutTor.dtd b/src/chrome/locale/pl/aboutTor.dtd
index 138c73e1..dff11572 100644
--- a/src/chrome/locale/pl/aboutTor.dtd
+++ b/src/chrome/locale/pl/aboutTor.dtd
@@ -20,9 +20,9 @@
<!ENTITY aboutTor.torbrowser_user_manual_link.label "Sprawdź naszą instrukcje korzystania z przeglądarki Tor »">
<!-- The next two entities are used within the browser's Help menu. -->
<!ENTITY aboutTor.torbrowser_user_manual.accesskey "M">
-<!ENTITY aboutTor.torbrowser_user_manual.label "Instrukcja korzystania z Tor Browser">
+<!ENTITY aboutTor.torbrowser_user_manual.label "Instrukcja korzystania z Przeglądarki Tor">
-<!ENTITY aboutTor.tor_mission.label "Projekt Tor jest organizacją non-profit US 501(c)(3), poszerzającą prawa człowieka i wolności tworząc darmowe i open-source technologie anonimowości i prywatności, wspierając ich nierestryktowaną dostępność i użycie i promuje ich naukowe i popularne zrozumienie.">
+<!ENTITY aboutTor.tor_mission.label "Projekt Tor jest organizacją non-profit US 501(c)(3), wspierającą prawa człowieka i wolności. W jego ramach tworzone są darmowe i otwarte technologie chroniące anonimowość i prywatność. Tor wspiera ich nieograniczoną dostępność i użycie oraz popularyzuje je w świecie nauki i życiu codziennym. ">
<!ENTITY aboutTor.getInvolved.label "Zaangażuj się »">
<!ENTITY aboutTor.getInvolved.link "https://www.torproject.org/getinvolved/volunteer.html.en">
@@ -32,4 +32,4 @@
<!ENTITY aboutTor.donationBanner.buttonA "Wesprzyj teraz">
<!ENTITY aboutTor.donationBanner3.line1 "Automatyczne comiesięczne darowizny trzymają Tora silnym.">
-<!ENTITY aboutTor.donationBanner3.line2 "Zostań dzisiaj Obrońcą Prywatności.">
+<!ENTITY aboutTor.donationBanner3.line2 "Zostań już teraz Obrońcą Prywatności.">
diff --git a/src/chrome/locale/pt-BR/aboutTor.dtd b/src/chrome/locale/pt-BR/aboutTor.dtd
index e5a512fc..a60d789e 100644
--- a/src/chrome/locale/pt-BR/aboutTor.dtd
+++ b/src/chrome/locale/pt-BR/aboutTor.dtd
@@ -8,7 +8,7 @@
<!ENTITY aboutTor.viewChangelog.label "Visualizar o registro de mudanças">
-<!ENTITY aboutTor.ready.label "Navegar. Com privacidade.">
+<!ENTITY aboutTor.ready.label "Explore. Com privacidade.">
<!ENTITY aboutTor.ready2.label "Você está pronto para a maior experiência de navegação privada do mundo.">
<!ENTITY aboutTor.failure.label "Alguma coisa deu errado!">
<!ENTITY aboutTor.failure2.label "Tor não está funcionando neste navegador. ">
@@ -29,8 +29,8 @@
<!ENTITY aboutTor.newsletter.tagline "Receba as últimas notícias do Tor diretamente na sua caixa de e-mail.">
<!ENTITY aboutTor.newsletter.link_text "Inscreva-se para receber Notícias do Tor.">
-<!ENTITY aboutTor.donationBanner.line2e "Fortaleça o Tor.">
-<!ENTITY aboutTor.donationBanner.buttonA "Doar Agora">
+<!ENTITY aboutTor.donationBanner.line2e "Mantenha o Tor forte.">
+<!ENTITY aboutTor.donationBanner.buttonA "Doe Agora">
<!ENTITY aboutTor.donationBanner3.line1 "Doações mensais automáticas fortalecem o Tor.">
-<!ENTITY aboutTor.donationBanner3.line2 "Torne-se hoje um Defensor da Privacidade.">
+<!ENTITY aboutTor.donationBanner3.line2 "Torne-se um(a) Defensor(a) da Privacidade hoje.">
diff --git a/src/chrome/locale/tr/aboutTor.dtd b/src/chrome/locale/tr/aboutTor.dtd
index 8ddbea88..dac00818 100644
--- a/src/chrome/locale/tr/aboutTor.dtd
+++ b/src/chrome/locale/tr/aboutTor.dtd
@@ -31,5 +31,5 @@
<!ENTITY aboutTor.donationBanner.line2e "Tor uygulamasının gücünü koruyun.">
<!ENTITY aboutTor.donationBanner.buttonA "Bağış Yapın">
-<!ENTITY aboutTor.donationBanner3.line1 "Aylık otomatik bağışlar Tor projesinin gücünü korumasına yardımcı olur.">
+<!ENTITY aboutTor.donationBanner3.line1 "Düzenli aylık bağışlar Tor projesinin gücünü korumasına yardımcı olur.">
<!ENTITY aboutTor.donationBanner3.line2 "Bugün kişisel gizliliği savunmak için destek olmaya başlayın.">
diff --git a/src/chrome/locale/tr/torbutton.properties b/src/chrome/locale/tr/torbutton.properties
index 3ab6022a..6105c7b1 100644
--- a/src/chrome/locale/tr/torbutton.properties
+++ b/src/chrome/locale/tr/torbutton.properties
@@ -13,7 +13,7 @@ torbutton.panel.tooltip.disabled = Tor uygulamasını etkinleştirmek için tık
torbutton.panel.tooltip.enabled = Tor uygulamasını devre dışı bırakmak için tıklayın
torbutton.panel.label.disabled = Tor Devre Dışı
torbutton.panel.label.enabled = Tor Etkin
-extensions.torbutton(a)torproject.org.description = Torbutton, Tor ayarlarını yapabileceğiniz ve kişisel tarama verilerini hızlı ve kolayca silebileceğiniz bir düğme görüntüler.
+extensions.torbutton(a)torproject.org.description = Torbutton, Tor ayarlarını yapabileceğiniz ve kişisel tarama verilerinizi hızla ve kolayca silebileceğiniz bir düğme görüntüler.
torbutton.popup.external.title = Dış bir dosya türü indirilsin mi?
torbutton.popup.external.app = Tor Browser bu dosyayı görüntüleyemiyor. Başka bir uygulamayla açmanız gerekecek.\n
torbutton.popup.external.note = Bazı dosya türleri uygulamaların Tor kullanmadan İnternet bağlantısı kurmasına neden olabilir.\n
@@ -24,7 +24,7 @@ torbutton.popup.dontask = Bundan sonra dosyalar otomatik indirilsin
torbutton.popup.no_newnym = Torbutton size yeni bir güvenli kimlik sağlayamadı. Tor Denetim Kapısına giriş yapılamıyor.\n\nTor Browser Bundle uygulamasını çalıştırdığınızdan emin olun.
torbutton.security_settings.menu.title = Güvenlik Düzeyi Ayarı
torbutton.title.prompt_torbrowser = Önemli Torbutton Bilgisi
-torbutton.popup.prompt_torbrowser = Torbutton şimdi farklı çalışıyor: artık kapatamıyorsunuz.\n\nBu değişikliği yapmamızın nedeni Tor dışında kullanılan başka bir tarayıcıda Torbutton kullanmanın güvenli olmaması. Başka türlü çözemeyeceğimiz birçok sorun vardı.\n\nFirefox tarayıcısını normal olarak kullanmak istiyorsanız, Torbutton uygulamasını kaldırıp Tor Browser Bundle paketini indirebilirsiniz. Tor Browser gizlilik özellikleri normal Firefox tarayıcısına, hatta Torbutton ile kullanan Firefox ikilisine göre çok daha üstündür.\n\nTorbutton uygulamasını kaldırmak için, Araçlar->Eklentiler->Uzantılar bölümüne gidin ve Torbutton yazılımının yanındaki Kaldır düğmesine tıklayın.
+torbutton.popup.prompt_torbrowser = Torbutton şimdi farklı çalışıyor: artık kapatamıyorsunuz.\n\nBu değişikliği yapmamızın nedeni Tor dışında kullanılan başka bir tarayıcıda Torbutton kullanmanın güvenli olmaması. Başka türlü çözemeyeceğimiz birçok sorun vardı.\n\nFirefox tarayıcısını normal olarak kullanmak istiyorsanız, Torbutton uygulamasını kaldırıp Tor Browser Bundle paketini indirebilirsiniz. Tor Browser kişisel gizliliği koruma özellikleri normal Firefox tarayıcısına, hatta Torbutton ile kullanılan Firefox ikilisine göre çok daha üstündür.\n\nTorbutton uygulamasını kaldırmak için, Araçlar->Eklentiler->Uzantılar bölümüne gidin ve Torbutton yazılımının yanındaki Kaldır düğmesine tıklayın.
torbutton.popup.short_torbrowser = Önemli Torbutton Bilgisi!\n\nTorbutton artık kapatılamayacak şekilde etkinleştirildi.\n\nAyrıntılı bilgi almak için Torbutton üzerine tıklayın.
torbutton.popup.confirm_plugins = Flash gibi eklentiler gizliliğinizi ve anonim kimliğinizi zedeleyebilir.\n\nBu eklentiler Tor uygulamasını atlatarak geçerli konum ve IP adresinizi ortaya çıkarabilir.\n\nBu eklentileri etkinleştirmek istediğinize emin misiniz?\n
diff --git a/src/chrome/locale/vi/aboutTor.dtd b/src/chrome/locale/vi/aboutTor.dtd
index ffc191c5..44bf6f97 100644
--- a/src/chrome/locale/vi/aboutTor.dtd
+++ b/src/chrome/locale/vi/aboutTor.dtd
@@ -6,7 +6,7 @@
<!ENTITY aboutTor.title "Thông tin về Tor">
-<!ENTITY aboutTor.viewChangelog.label "View Changelog">
+<!ENTITY aboutTor.viewChangelog.label "Xem nhật kí thay dổi">
<!ENTITY aboutTor.ready.label "Truy cập Internet. Một cách riêng tư.">
<!ENTITY aboutTor.ready2.label "Bạn đã sẵn sàng cho trải nghiệm duyệt web riêng tư nhất trên thế giới.">
@@ -31,5 +31,5 @@
<!ENTITY aboutTor.donationBanner.line2e "Giữ cho Tor trở nên mạnh mẽ.">
<!ENTITY aboutTor.donationBanner.buttonA "Đóng góp Ngay bây giờ">
-<!ENTITY aboutTor.donationBanner3.line1 "Automatic monthly donations keep Tor strong.">
-<!ENTITY aboutTor.donationBanner3.line2 "Become a Defender of Privacy today.">
+<!ENTITY aboutTor.donationBanner3.line1 "Tự động donate hàng tháng để giữ cho Tor lớn mạnh.">
+<!ENTITY aboutTor.donationBanner3.line2 "Trở thành một người bảo vệ quyền riêng tư ngày hôm nay.">
diff --git a/src/chrome/locale/vi/browserOnboarding.properties b/src/chrome/locale/vi/browserOnboarding.properties
index df4a88ee..616e8694 100644
--- a/src/chrome/locale/vi/browserOnboarding.properties
+++ b/src/chrome/locale/vi/browserOnboarding.properties
@@ -9,7 +9,7 @@ onboarding.tour-tor-welcome.next-button=Go to Privacy
onboarding.tour-tor-privacy=Riêng tư
onboarding.tour-tor-privacy.title=Snub trackers and snoopers.
-onboarding.tour-tor-privacy.description=Tor Browser isolates cookies and deletes your browser history after your session. These modifications ensure your privacy and security are protected in the browser. Click ‘Tor Network’ to learn how we protect you on the network level.
+onboarding.tour-tor-privacy.description=Trình duyệt Tor cô lập cookies và xoá lịch sử duyệt web của bạn sau mỗi phiên. Những thay đổi này đảm bảo quyền riêng tư của bạn được bảo vệ trong trình duyệt. Nhân 'Tor Network' để tìm hiểu cách chúng tôi bảo vệ bạn trên cấp độ mạng.
onboarding.tour-tor-privacy.button=Đi đến mạng Tor
onboarding.tour-tor-network=Mạng Tor
diff --git a/src/chrome/locale/zh-CN/aboutTor.dtd b/src/chrome/locale/zh-CN/aboutTor.dtd
index c0a8bb61..4801db29 100644
--- a/src/chrome/locale/zh-CN/aboutTor.dtd
+++ b/src/chrome/locale/zh-CN/aboutTor.dtd
@@ -31,5 +31,5 @@
<!ENTITY aboutTor.donationBanner.line2e "让 Tor 网络保持健壮。">
<!ENTITY aboutTor.donationBanner.buttonA "立即捐助">
-<!ENTITY aboutTor.donationBanner3.line1 "每个月自动捐款来使Tor保持强大">
-<!ENTITY aboutTor.donationBanner3.line2 "今天就成为隐私的捍卫者">
+<!ENTITY aboutTor.donationBanner3.line1 "每月自动捐款来使 Tor 保持健壮。">
+<!ENTITY aboutTor.donationBanner3.line2 "即刻就成为隐私的捍卫者。">
diff --git a/src/chrome/locale/zh-TW/aboutTor.dtd b/src/chrome/locale/zh-TW/aboutTor.dtd
index da568c89..a016d044 100644
--- a/src/chrome/locale/zh-TW/aboutTor.dtd
+++ b/src/chrome/locale/zh-TW/aboutTor.dtd
@@ -9,7 +9,7 @@
<!ENTITY aboutTor.viewChangelog.label "檢視變更記錄">
<!ENTITY aboutTor.ready.label "探索。隱密。">
-<!ENTITY aboutTor.ready2.label "您已準備好使用全世界最私密的瀏覽體驗。">
+<!ENTITY aboutTor.ready2.label "您已能夠體驗全世界最私密的網路瀏覽。">
<!ENTITY aboutTor.failure.label "發生錯誤!">
<!ENTITY aboutTor.failure2.label "Tor 無法在此瀏覽器中運作。">
@@ -22,14 +22,14 @@
<!ENTITY aboutTor.torbrowser_user_manual.accesskey "M">
<!ENTITY aboutTor.torbrowser_user_manual.label "洋蔥路由瀏覽器手冊">
-<!ENTITY aboutTor.tor_mission.label "Tor Project 是一個美國 501(c)(3) 非營利組織,致力於透過開發和部署自由與開放原始碼的匿名和隱私技術,為其不受限制的可用性和使用提供支持,促進其在科學領域和大眾的知名度來支持人權和自由。">
+<!ENTITY aboutTor.tor_mission.label "Tor Project 是一個美國 501(c)(3) 非營利組織,致力於透過開發和部署自由與開放原始碼的匿名和隱私技術,支援無限制的可用性和使用,以促進科學領域和大眾對相關技術的理解。">
<!ENTITY aboutTor.getInvolved.label "加入我們 »">
<!ENTITY aboutTor.getInvolved.link "https://www.torproject.org/getinvolved/volunteer.html.en">
<!ENTITY aboutTor.newsletter.tagline "將 Tor 的最新消息直接傳送到您的收件匣。">
<!ENTITY aboutTor.newsletter.link_text "訂閱 Tor 的新資訊。">
-<!ENTITY aboutTor.donationBanner.line2e "讓 Tor 強壯。">
+<!ENTITY aboutTor.donationBanner.line2e "使 Tor 更加茁壯。">
<!ENTITY aboutTor.donationBanner.buttonA "立刻捐款">
-<!ENTITY aboutTor.donationBanner3.line1 "Automatic monthly donations keep Tor strong.">
-<!ENTITY aboutTor.donationBanner3.line2 "Become a Defender of Privacy today.">
+<!ENTITY aboutTor.donationBanner3.line1 "每月自動捐款,使 Tor 更加茁壯。">
+<!ENTITY aboutTor.donationBanner3.line2 "從今天開始,成為隱私守衛員吧!">
1
0
commit 850024dd1bef30256f0ef443d4761aa43a3b84f6
Author: Georg Koppen <gk(a)torproject.org>
Date: Fri Aug 30 08:31:53 2019 +0000
Release prep for 2.1.13
CHANGELOG update and version bump
---
src/CHANGELOG | 5 +++++
src/install.rdf | 2 +-
2 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/src/CHANGELOG b/src/CHANGELOG
index e3cfa026..9435d991 100644
--- a/src/CHANGELOG
+++ b/src/CHANGELOG
@@ -1,3 +1,8 @@
+2.1.13
+ * Bug 31520: Remove monthly giving banner from Tor Browser
+ * Bug 31140: Do not enable IonMonkey on AARCH64
+ * Translations update
+
2.1.12
* Bug 30577: Add Fundraising Banner
* Bug 31041: Stop syncing network.cookie.lifetimePolicy
diff --git a/src/install.rdf b/src/install.rdf
index 267b1c6c..df859c72 100644
--- a/src/install.rdf
+++ b/src/install.rdf
@@ -6,7 +6,7 @@
<em:name>Torbutton</em:name>
<em:creator>Mike Perry</em:creator>
<em:id>torbutton(a)torproject.org</em:id>
- <em:version>2.1.12</em:version>
+ <em:version>2.1.13</em:version>
<em:multiprocessCompatible>true</em:multiprocessCompatible>
<em:homepageURL>https://www.torproject.org/projects/torbrowser.html.en</em:homepageURL>
<em:iconURL>chrome://torbutton/skin/tor.png</em:iconURL>
1
0

[tor-browser-build/master] Bug 31388: Update Rust Project for Android
by gk@torproject.org 30 Aug '19
by gk@torproject.org 30 Aug '19
30 Aug '19
commit 9e3cc2f51b69fdcf6ff1366bec5eac8525ad14d4
Author: sisbell <shane.isbell(a)gmail.com>
Date: Sat Aug 10 21:18:15 2019 -0700
Bug 31388: Update Rust Project for Android
---
...e-dl_iterate_phdr-is-undefined-on-Android.patch | 34 -----------------
projects/rust/build | 8 ----
projects/rust/config | 6 +--
projects/rust/replace_pagesize_in_mmap.patch | 44 ----------------------
4 files changed, 1 insertion(+), 91 deletions(-)
diff --git a/projects/rust/0001-Make-sure-dl_iterate_phdr-is-undefined-on-Android.patch b/projects/rust/0001-Make-sure-dl_iterate_phdr-is-undefined-on-Android.patch
deleted file mode 100644
index 75cd657..0000000
--- a/projects/rust/0001-Make-sure-dl_iterate_phdr-is-undefined-on-Android.patch
+++ /dev/null
@@ -1,34 +0,0 @@
-From 4fa67c8a014ac10558be71edec9048851ca7a02d Mon Sep 17 00:00:00 2001
-From: Georg Koppen <gk(a)torproject.org>
-Date: Thu, 15 Nov 2018 19:04:46 +0000
-Subject: [PATCH] Make sure `dl_iterate_phdr` is undefined on Android
-
-If we build with API < 21 we'll run into undefined reference errors.
-We follow the Rust people who ran into similar issues when
-upgrading libbacktrace for 1.28.0 in making sure `dl_iterate_phdr` is
-not defined for Android.
-
-diff --git a/src/libbacktrace/configure b/src/libbacktrace/configure
-index 8bdb29d256..8941fcd2b0 100755
---- a/src/libbacktrace/configure
-+++ b/src/libbacktrace/configure
-@@ -12397,7 +12397,15 @@ rm -f conftest*
- have_dl_iterate_phdr=no ;;
- esac
- else
-- ac_fn_c_check_func "$LINENO" "dl_iterate_phdr" "ac_cv_func_dl_iterate_phdr"
-+ case "${host}" in
-+ *-*-androideabi*)
-+ # Avoid dl_iterate_phdr on older Android API (which we use),
-+ # as defining it causes undefined reference errors when
-+ # compiling Firefox later on.
-+ have_dl_iterate_phdr=no ;;
-+ *) ac_fn_c_check_func "$LINENO" "dl_iterate_phdr" "ac_cv_func_dl_iterate_phdr" ;;
-+ esac
-+
- if test "x$ac_cv_func_dl_iterate_phdr" = x""yes; then :
- have_dl_iterate_phdr=yes
- else
---
-2.19.1
-
diff --git a/projects/rust/build b/projects/rust/build
index 5cf8c02..ce039ea 100644
--- a/projects/rust/build
+++ b/projects/rust/build
@@ -62,14 +62,6 @@ cd /var/tmp/build/rustc-[% c('version') %]-src
patch -p1 < $rootdir/unwind.patch
[% END %]
-[% IF c("var/android") %]
- patch -p1 < $rootdir/replace_pagesize_in_mmap.patch
- # The additional Rust patch is not necessary for x86.
- [% IF c("var/android-armv7") %]
- patch -p1 < $rootdir/0001-Make-sure-dl_iterate_phdr-is-undefined-on-Android.patch
- [% END %]
-[% END %]
-
mkdir build
cd build
../configure --prefix=$distdir [% c("var/configure_opt") %]
diff --git a/projects/rust/config b/projects/rust/config
index 011920b..106c709 100644
--- a/projects/rust/config
+++ b/projects/rust/config
@@ -18,7 +18,7 @@ targets:
- zlib1g-dev
android-armv7:
var:
- configure_opt: --enable-local-rust --enable-vendor --enable-extended --release-channel=stable --sysconfdir=etc --target=armv7-linux-androideabi --set=target.armv7-linux-androideabi.cc=$ANDROID_NDK_HOME/arm/bin/arm-linux-androideabi-gcc
+ configure_opt: --enable-local-rust --enable-vendor --enable-extended --release-channel=stable --sysconfdir=etc --target=thumbv7neon-linux-androideabi --set=target.thumbv7neon-linux-androideabi.cc=$ANDROID_NDK_HOME/arm/bin/arm-linux-androideabi-gcc
android-x86:
var:
@@ -105,7 +105,3 @@ input_files:
gpg_keyring: rust.gpg
- filename: unwind.patch
enable: '[% c("var/windows-i686") %]'
- - filename: replace_pagesize_in_mmap.patch
- enable: '[% c("var/android") %]'
- - filename: 0001-Make-sure-dl_iterate_phdr-is-undefined-on-Android.patch
- enable: '[% c("var/android-armv7") %]'
diff --git a/projects/rust/replace_pagesize_in_mmap.patch b/projects/rust/replace_pagesize_in_mmap.patch
deleted file mode 100644
index 598f190..0000000
--- a/projects/rust/replace_pagesize_in_mmap.patch
+++ /dev/null
@@ -1,44 +0,0 @@
-diff --git a/src/libbacktrace/mmap.c b/src/libbacktrace/mmap.c
-index 138ef70711..e3c4cd2643 100644
---- a/src/libbacktrace/mmap.c
-+++ b/src/libbacktrace/mmap.c
-@@ -140,7 +140,7 @@ backtrace_alloc (struct backtrace_state *state,
- {
- /* Allocate a new page. */
-
-- pagesize = getpagesize ();
-+ pagesize = sysconf(_SC_PAGESIZE);
- asksize = (size + pagesize - 1) & ~ (pagesize - 1);
- page = mmap (NULL, asksize, PROT_READ | PROT_WRITE,
- MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
-@@ -181,7 +181,7 @@ backtrace_free (struct backtrace_state *state, void *addr, size_t size,
- {
- size_t pagesize;
-
-- pagesize = getpagesize ();
-+ pagesize = sysconf(_SC_PAGESIZE);
- if (((uintptr_t) addr & (pagesize - 1)) == 0
- && (size & (pagesize - 1)) == 0)
- {
-@@ -226,7 +226,7 @@ backtrace_vector_grow (struct backtrace_state *state,size_t size,
- size_t alc;
- void *base;
-
-- pagesize = getpagesize ();
-+ pagesize = sysconf(_SC_PAGESIZE);
- alc = vec->size + size;
- if (vec->size == 0)
- alc = 16 * size;
-diff --git a/src/libbacktrace/mmapio.c b/src/libbacktrace/mmapio.c
-index dfdaf6fa52..5b23003090 100644
---- a/src/libbacktrace/mmapio.c
-+++ b/src/libbacktrace/mmapio.c
-@@ -60,7 +60,7 @@ backtrace_get_view (struct backtrace_state *state ATTRIBUTE_UNUSED,
- off_t pageoff;
- void *map;
-
-- pagesize = getpagesize ();
-+ pagesize = sysconf(_SC_PAGESIZE);
- inpage = offset % pagesize;
- pageoff = offset - inpage;
-
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] squash! TB4: Tor Browser's Firefox preference overrides.
by gk@torproject.org 29 Aug '19
by gk@torproject.org 29 Aug '19
29 Aug '19
commit 3b423362d6729d76b0c79274f52972346900c4fc
Author: Alex Catarineu <acat(a)torproject.org>
Date: Wed Aug 28 18:52:09 2019 +0200
squash! TB4: Tor Browser's Firefox preference overrides.
Bug 30845: Make sure default themes and other internal extensions are enabled
---
browser/app/profile/000-tor-browser.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/browser/app/profile/000-tor-browser.js b/browser/app/profile/000-tor-browser.js
index f9114b7a892e..fd0b691d1831 100644
--- a/browser/app/profile/000-tor-browser.js
+++ b/browser/app/profile/000-tor-browser.js
@@ -264,7 +264,7 @@ pref("extensions.checkCompatibility.4.*", false);
pref("extensions.databaseSchema", 3);
pref("extensions.enabledAddons", "https-everywhere%40eff.org:3.1.4,%7B73a6fe31-595d-460b-a920-fcc0f8843232%7D:2.6.6.1,torbutton%40torproject.org:1.5.2,ubufox%40ubuntu.com:2.6,%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D:17.0.5");
pref("extensions.enabledItems", "langpack-en-US@firefox.mozilla.org:,{73a6fe31-595d-460b-a920-fcc0f8843232}:1.9.9.57,{e0204bd5-9d31-402b-a99d-a6aa8ffebdca}:1.2.4,{972ce4c6-7e08-4474-a285-3208198ce6fd}:3.5.8");
-pref("extensions.enabledScopes", 1);
+pref("extensions.enabledScopes", 5); // AddonManager.SCOPE_PROFILE=1 | AddonManager.SCOPE_APPLICATION=4
pref("extensions.pendingOperations", false);
pref("xpinstall.whitelist.add", "");
pref("xpinstall.whitelist.add.36", "");
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Revert "Bug 24056: Use en-US strings in HTML forms"
by gk@torproject.org 29 Aug '19
by gk@torproject.org 29 Aug '19
29 Aug '19
commit 69bf59ac52f26317e93e2325a8e8c1d797f56c0c
Author: Alex Catarineu <acat(a)torproject.org>
Date: Mon Aug 19 13:13:36 2019 +0200
Revert "Bug 24056: Use en-US strings in HTML forms"
This reverts commit 243a68926e148a2590707ee9b3cb2364e2f42083.
---
dom/base/nsContentUtils.cpp | 32 +++++++-------------------------
dom/base/nsContentUtils.h | 3 ---
2 files changed, 7 insertions(+), 28 deletions(-)
diff --git a/dom/base/nsContentUtils.cpp b/dom/base/nsContentUtils.cpp
index a7ff89977a95..ca8ad1d26b26 100644
--- a/dom/base/nsContentUtils.cpp
+++ b/dom/base/nsContentUtils.cpp
@@ -317,8 +317,6 @@ bool nsContentUtils::sBypassCSSOMOriginCheck = false;
nsCString* nsContentUtils::sJSBytecodeMimeType = nullptr;
-int32_t nsContentUtils::sSpoofEnglish = 0;
-
nsContentUtils::UserInteractionObserver*
nsContentUtils::sUserInteractionObserver = nullptr;
@@ -607,8 +605,6 @@ nsresult nsContentUtils::Init() {
Preferences::AddBoolVarCache(&sAllowXULXBL_for_file,
"dom.allow_XUL_XBL_for_file");
- Preferences::AddIntVarCache(&sSpoofEnglish, "privacy.spoof_english", 0);
-
#ifndef RELEASE_OR_BETA
sBypassCSSOMOriginCheck = getenv("MOZ_BYPASS_CSSOM_ORIGIN_CHECK");
#endif
@@ -3511,7 +3507,7 @@ void nsContentUtils::GetEventArgNames(int32_t aNameSpaceID, nsAtom* aEventName,
// Note: The list of content bundles in nsStringBundle.cpp should be updated
// whenever entries are added or removed from this list.
-static const char* gPropertiesFiles[nsContentUtils::PropertiesFile_COUNT] = {
+static const char gPropertiesFiles[nsContentUtils::PropertiesFile_COUNT][56] = {
// Must line up with the enum values in |PropertiesFile| enum.
"chrome://global/locale/css.properties",
"chrome://global/locale/xbl.properties",
@@ -3526,9 +3522,7 @@ static const char* gPropertiesFiles[nsContentUtils::PropertiesFile_COUNT] = {
"chrome://global/locale/commonDialogs.properties",
"chrome://global/locale/mathml/mathml.properties",
"chrome://global/locale/security/security.properties",
- "chrome://necko/locale/necko.properties",
- "resource://gre/chrome/en-US/locale/en-US/global/layout/"
- "HtmlForm.properties"};
+ "chrome://necko/locale/necko.properties"};
/* static */
nsresult nsContentUtils::EnsureStringBundle(PropertiesFile aFile) {
@@ -3581,11 +3575,6 @@ void nsContentUtils::AsyncPrecreateStringBundles() {
nsresult nsContentUtils::GetLocalizedString(PropertiesFile aFile,
const char* aKey,
nsAString& aResult) {
- // When we spoof English, use en-US default strings in HTML forms.
- if (aFile == eFORMS_PROPERTIES && sSpoofEnglish == 2) {
- aFile = eFORMS_PROPERTIES_en_US;
- }
-
nsresult rv = EnsureStringBundle(aFile);
NS_ENSURE_SUCCESS(rv, rv);
nsIStringBundle* bundle = sStringBundles[aFile];
@@ -3598,11 +3587,6 @@ nsresult nsContentUtils::FormatLocalizedString(PropertiesFile aFile,
const char16_t** aParams,
uint32_t aParamsLength,
nsAString& aResult) {
- // When we spoof English, use en-US default strings in HTML forms.
- if (aFile == eFORMS_PROPERTIES && sSpoofEnglish == 2) {
- aFile = eFORMS_PROPERTIES_en_US;
- }
-
nsresult rv = EnsureStringBundle(aFile);
NS_ENSURE_SUCCESS(rv, rv);
nsIStringBundle* bundle = sStringBundles[aFile];
@@ -5136,13 +5120,11 @@ nsIWidget* nsContentUtils::GetTopLevelWidget(nsIWidget* aWidget) {
const nsDependentString nsContentUtils::GetLocalizedEllipsis() {
static char16_t sBuf[4] = {0, 0, 0, 0};
if (!sBuf[0]) {
- if (sSpoofEnglish != 2) {
- nsAutoString tmp;
- Preferences::GetLocalizedString("intl.ellipsis", tmp);
- uint32_t len =
- std::min(uint32_t(tmp.Length()), uint32_t(ArrayLength(sBuf) - 1));
- CopyUnicodeTo(tmp, 0, sBuf, len);
- }
+ nsAutoString tmp;
+ Preferences::GetLocalizedString("intl.ellipsis", tmp);
+ uint32_t len =
+ std::min(uint32_t(tmp.Length()), uint32_t(ArrayLength(sBuf) - 1));
+ CopyUnicodeTo(tmp, 0, sBuf, len);
if (!sBuf[0]) sBuf[0] = char16_t(0x2026);
}
return nsDependentString(sBuf);
diff --git a/dom/base/nsContentUtils.h b/dom/base/nsContentUtils.h
index 4ea35a42f029..de450090e9db 100644
--- a/dom/base/nsContentUtils.h
+++ b/dom/base/nsContentUtils.h
@@ -1117,7 +1117,6 @@ class nsContentUtils {
eMATHML_PROPERTIES,
eSECURITY_PROPERTIES,
eNECKO_PROPERTIES,
- eFORMS_PROPERTIES_en_US,
PropertiesFile_COUNT
};
static nsresult ReportToConsole(
@@ -3421,8 +3420,6 @@ class nsContentUtils {
static int32_t sInnerOrOuterWindowCount;
static uint32_t sInnerOrOuterWindowSerialCounter;
-
- static int32_t sSpoofEnglish;
};
/* static */ inline nsContentPolicyType
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 1561322 - Allow spoofing strings in HTML forms r=baku, Pike
by gk@torproject.org 29 Aug '19
by gk@torproject.org 29 Aug '19
29 Aug '19
commit 1ad6ff94d72b99a72ac66459230755502acccd8d
Author: Alex Catarineu <acat(a)torproject.org>
Date: Wed Jul 24 13:22:22 2019 +0000
Bug 1561322 - Allow spoofing strings in HTML forms r=baku,Pike
When privacy.spoof_english = 2, we should hide the user's
locale in content. So we use en-US default strings for HTML
form elements, such as a Submit button.
We also force GetLocalizedEllipsis() to always return the
ellipsis used by en-US.
Differential Revision: https://phabricator.services.mozilla.com/D35815
--HG--
extra : moz-landing-system : lando
---
browser/installer/package-manifest.in | 1 +
dom/base/nsContentUtils.cpp | 35 ++++++++++++++++++++------
dom/base/nsContentUtils.h | 2 ++
dom/html/HTMLInputElement.cpp | 37 +++++++++++++++-------------
dom/locales/moz.build | 4 +++
layout/base/nsCSSFrameConstructor.cpp | 8 +++---
layout/forms/nsFileControlFrame.cpp | 4 +--
layout/forms/nsGfxButtonControlFrame.cpp | 4 +--
layout/generic/DetailsFrame.cpp | 5 ++--
mobile/android/installer/package-manifest.in | 1 +
10 files changed, 67 insertions(+), 34 deletions(-)
diff --git a/browser/installer/package-manifest.in b/browser/installer/package-manifest.in
index a160f316a56d..1a2a24f9b5b9 100644
--- a/browser/installer/package-manifest.in
+++ b/browser/installer/package-manifest.in
@@ -344,6 +344,7 @@
@RESPATH@/res/fonts/*
@RESPATH@/res/dtd/*
@RESPATH@/res/language.properties
+@RESPATH@/res/locale/layout/HtmlForm.properties
#ifdef XP_MACOSX
@RESPATH@/res/MainMenu.nib/
#endif
diff --git a/dom/base/nsContentUtils.cpp b/dom/base/nsContentUtils.cpp
index ca8ad1d26b26..d7ab544f7274 100644
--- a/dom/base/nsContentUtils.cpp
+++ b/dom/base/nsContentUtils.cpp
@@ -3507,7 +3507,7 @@ void nsContentUtils::GetEventArgNames(int32_t aNameSpaceID, nsAtom* aEventName,
// Note: The list of content bundles in nsStringBundle.cpp should be updated
// whenever entries are added or removed from this list.
-static const char gPropertiesFiles[nsContentUtils::PropertiesFile_COUNT][56] = {
+static const char* gPropertiesFiles[nsContentUtils::PropertiesFile_COUNT] = {
// Must line up with the enum values in |PropertiesFile| enum.
"chrome://global/locale/css.properties",
"chrome://global/locale/xbl.properties",
@@ -3522,7 +3522,9 @@ static const char gPropertiesFiles[nsContentUtils::PropertiesFile_COUNT][56] = {
"chrome://global/locale/commonDialogs.properties",
"chrome://global/locale/mathml/mathml.properties",
"chrome://global/locale/security/security.properties",
- "chrome://necko/locale/necko.properties"};
+ "chrome://necko/locale/necko.properties",
+ "chrome://global/locale/layout/HtmlForm.properties",
+ "resource://gre/res/locale/layout/HtmlForm.properties"};
/* static */
nsresult nsContentUtils::EnsureStringBundle(PropertiesFile aFile) {
@@ -3571,10 +3573,22 @@ void nsContentUtils::AsyncPrecreateStringBundles() {
}
}
+static bool SpoofLocaleEnglish() {
+ // 0 - will prompt
+ // 1 - don't spoof
+ // 2 - spoof
+ return StaticPrefs::privacy_spoof_english() == 2;
+}
+
/* static */
nsresult nsContentUtils::GetLocalizedString(PropertiesFile aFile,
const char* aKey,
nsAString& aResult) {
+ // When we spoof English, use en-US default strings in HTML forms.
+ if (aFile == eFORMS_PROPERTIES_MAYBESPOOF && SpoofLocaleEnglish()) {
+ aFile = eFORMS_PROPERTIES_en_US;
+ }
+
nsresult rv = EnsureStringBundle(aFile);
NS_ENSURE_SUCCESS(rv, rv);
nsIStringBundle* bundle = sStringBundles[aFile];
@@ -3587,6 +3601,11 @@ nsresult nsContentUtils::FormatLocalizedString(PropertiesFile aFile,
const char16_t** aParams,
uint32_t aParamsLength,
nsAString& aResult) {
+ // When we spoof English, use en-US default strings in HTML forms.
+ if (aFile == eFORMS_PROPERTIES_MAYBESPOOF && SpoofLocaleEnglish()) {
+ aFile = eFORMS_PROPERTIES_en_US;
+ }
+
nsresult rv = EnsureStringBundle(aFile);
NS_ENSURE_SUCCESS(rv, rv);
nsIStringBundle* bundle = sStringBundles[aFile];
@@ -5120,11 +5139,13 @@ nsIWidget* nsContentUtils::GetTopLevelWidget(nsIWidget* aWidget) {
const nsDependentString nsContentUtils::GetLocalizedEllipsis() {
static char16_t sBuf[4] = {0, 0, 0, 0};
if (!sBuf[0]) {
- nsAutoString tmp;
- Preferences::GetLocalizedString("intl.ellipsis", tmp);
- uint32_t len =
- std::min(uint32_t(tmp.Length()), uint32_t(ArrayLength(sBuf) - 1));
- CopyUnicodeTo(tmp, 0, sBuf, len);
+ if (!SpoofLocaleEnglish()) {
+ nsAutoString tmp;
+ Preferences::GetLocalizedString("intl.ellipsis", tmp);
+ uint32_t len =
+ std::min(uint32_t(tmp.Length()), uint32_t(ArrayLength(sBuf) - 1));
+ CopyUnicodeTo(tmp, 0, sBuf, len);
+ }
if (!sBuf[0]) sBuf[0] = char16_t(0x2026);
}
return nsDependentString(sBuf);
diff --git a/dom/base/nsContentUtils.h b/dom/base/nsContentUtils.h
index de450090e9db..67febf189c34 100644
--- a/dom/base/nsContentUtils.h
+++ b/dom/base/nsContentUtils.h
@@ -1117,6 +1117,8 @@ class nsContentUtils {
eMATHML_PROPERTIES,
eSECURITY_PROPERTIES,
eNECKO_PROPERTIES,
+ eFORMS_PROPERTIES_MAYBESPOOF,
+ eFORMS_PROPERTIES_en_US,
PropertiesFile_COUNT
};
static nsresult ReportToConsole(
diff --git a/dom/html/HTMLInputElement.cpp b/dom/html/HTMLInputElement.cpp
index b7360a9ff3e7..dd0365a7646c 100644
--- a/dom/html/HTMLInputElement.cpp
+++ b/dom/html/HTMLInputElement.cpp
@@ -725,15 +725,15 @@ nsresult HTMLInputElement::InitFilePicker(FilePickerType aType) {
nsAutoString title;
nsAutoString okButtonLabel;
if (aType == FILE_PICKER_DIRECTORY) {
- nsContentUtils::GetLocalizedString(nsContentUtils::eFORMS_PROPERTIES,
- "DirectoryUpload", title);
+ nsContentUtils::GetLocalizedString(
+ nsContentUtils::eFORMS_PROPERTIES_MAYBESPOOF, "DirectoryUpload", title);
- nsContentUtils::GetLocalizedString(nsContentUtils::eFORMS_PROPERTIES,
- "DirectoryPickerOkButtonLabel",
- okButtonLabel);
+ nsContentUtils::GetLocalizedString(
+ nsContentUtils::eFORMS_PROPERTIES_MAYBESPOOF,
+ "DirectoryPickerOkButtonLabel", okButtonLabel);
} else {
- nsContentUtils::GetLocalizedString(nsContentUtils::eFORMS_PROPERTIES,
- "FileUpload", title);
+ nsContentUtils::GetLocalizedString(
+ nsContentUtils::eFORMS_PROPERTIES_MAYBESPOOF, "FileUpload", title);
}
nsCOMPtr<nsIFilePicker> filePicker =
@@ -2339,22 +2339,25 @@ void HTMLInputElement::GetDisplayFileName(nsAString& aValue) const {
if ((IsDirPickerEnabled() && Allowdirs()) ||
(StaticPrefs::dom_webkitBlink_dirPicker_enabled() &&
HasAttr(kNameSpaceID_None, nsGkAtoms::webkitdirectory))) {
- nsContentUtils::GetLocalizedString(nsContentUtils::eFORMS_PROPERTIES,
- "NoDirSelected", value);
+ nsContentUtils::GetLocalizedString(
+ nsContentUtils::eFORMS_PROPERTIES_MAYBESPOOF, "NoDirSelected", value);
} else if (HasAttr(kNameSpaceID_None, nsGkAtoms::multiple)) {
- nsContentUtils::GetLocalizedString(nsContentUtils::eFORMS_PROPERTIES,
- "NoFilesSelected", value);
+ nsContentUtils::GetLocalizedString(
+ nsContentUtils::eFORMS_PROPERTIES_MAYBESPOOF, "NoFilesSelected",
+ value);
} else {
- nsContentUtils::GetLocalizedString(nsContentUtils::eFORMS_PROPERTIES,
- "NoFileSelected", value);
+ nsContentUtils::GetLocalizedString(
+ nsContentUtils::eFORMS_PROPERTIES_MAYBESPOOF, "NoFileSelected",
+ value);
}
} else {
nsString count;
count.AppendInt(int(mFileData->mFilesOrDirectories.Length()));
const char16_t* params[] = {count.get()};
- nsContentUtils::FormatLocalizedString(nsContentUtils::eFORMS_PROPERTIES,
- "XFilesSelected", params, value);
+ nsContentUtils::FormatLocalizedString(
+ nsContentUtils::eFORMS_PROPERTIES_MAYBESPOOF, "XFilesSelected", params,
+ value);
}
aValue = value;
@@ -5825,8 +5828,8 @@ HTMLInputElement::SubmitNamesValues(HTMLFormSubmission* aFormSubmission) {
!HasAttr(kNameSpaceID_None, nsGkAtoms::value)) {
// Get our default value, which is the same as our default label
nsAutoString defaultValue;
- nsContentUtils::GetLocalizedString(nsContentUtils::eFORMS_PROPERTIES,
- "Submit", defaultValue);
+ nsContentUtils::GetLocalizedString(
+ nsContentUtils::eFORMS_PROPERTIES_MAYBESPOOF, "Submit", defaultValue);
value = defaultValue;
}
diff --git a/dom/locales/moz.build b/dom/locales/moz.build
index 1734739c5426..b2bcd271de7c 100644
--- a/dom/locales/moz.build
+++ b/dom/locales/moz.build
@@ -59,3 +59,7 @@ with Files("en-US/chrome/plugins.properties"):
BUG_COMPONENT = ("Core", "Plug-ins")
JAR_MANIFESTS += ['jar.mn']
+
+RESOURCE_FILES.locale.layout += [
+ 'en-US/chrome/layout/HtmlForm.properties',
+]
diff --git a/layout/base/nsCSSFrameConstructor.cpp b/layout/base/nsCSSFrameConstructor.cpp
index 4941b7f9780a..7a5a96d1769a 100644
--- a/layout/base/nsCSSFrameConstructor.cpp
+++ b/layout/base/nsCSSFrameConstructor.cpp
@@ -1654,8 +1654,8 @@ already_AddRefed<nsIContent> nsCSSFrameConstructor::CreateGeneratedContent(
}
nsAutoString temp;
- nsContentUtils::GetLocalizedString(nsContentUtils::eFORMS_PROPERTIES,
- "Submit", temp);
+ nsContentUtils::GetLocalizedString(
+ nsContentUtils::eFORMS_PROPERTIES_MAYBESPOOF, "Submit", temp);
return CreateGenConTextNode(aState, temp, nullptr, nullptr);
}
@@ -7899,8 +7899,8 @@ void nsCSSFrameConstructor::GetAlternateTextFor(Element* aElement, nsAtom* aTag,
// If there's no "value" attribute either, then use the localized string for
// "Submit" as the alternate text.
- nsContentUtils::GetLocalizedString(nsContentUtils::eFORMS_PROPERTIES,
- "Submit", aAltText);
+ nsContentUtils::GetLocalizedString(
+ nsContentUtils::eFORMS_PROPERTIES_MAYBESPOOF, "Submit", aAltText);
}
}
diff --git a/layout/forms/nsFileControlFrame.cpp b/layout/forms/nsFileControlFrame.cpp
index 5774f9f9275f..9be30011aa8e 100644
--- a/layout/forms/nsFileControlFrame.cpp
+++ b/layout/forms/nsFileControlFrame.cpp
@@ -215,8 +215,8 @@ static already_AddRefed<Element> MakeAnonButton(Document* aDoc,
// Set the file picking button text depending on the current locale.
nsAutoString buttonTxt;
- nsContentUtils::GetLocalizedString(nsContentUtils::eFORMS_PROPERTIES,
- labelKey, buttonTxt);
+ nsContentUtils::GetLocalizedString(
+ nsContentUtils::eFORMS_PROPERTIES_MAYBESPOOF, labelKey, buttonTxt);
// Set the browse button text. It's a bit of a pain to do because we want to
// make sure we are not notifying.
diff --git a/layout/forms/nsGfxButtonControlFrame.cpp b/layout/forms/nsGfxButtonControlFrame.cpp
index a35765a2cb5e..03186ef7bf54 100644
--- a/layout/forms/nsGfxButtonControlFrame.cpp
+++ b/layout/forms/nsGfxButtonControlFrame.cpp
@@ -88,8 +88,8 @@ nsresult nsGfxButtonControlFrame::GetDefaultLabel(nsAString& aString) const {
return NS_OK;
}
- return nsContentUtils::GetLocalizedString(nsContentUtils::eFORMS_PROPERTIES,
- prop, aString);
+ return nsContentUtils::GetLocalizedString(
+ nsContentUtils::eFORMS_PROPERTIES_MAYBESPOOF, prop, aString);
}
nsresult nsGfxButtonControlFrame::GetLabel(nsString& aLabel) {
diff --git a/layout/generic/DetailsFrame.cpp b/layout/generic/DetailsFrame.cpp
index 9f4e909f3952..e1a9f0c70b2b 100644
--- a/layout/generic/DetailsFrame.cpp
+++ b/layout/generic/DetailsFrame.cpp
@@ -98,8 +98,9 @@ nsresult DetailsFrame::CreateAnonymousContent(
mDefaultSummary = new HTMLSummaryElement(nodeInfo.forget());
nsAutoString defaultSummaryText;
- nsContentUtils::GetLocalizedString(nsContentUtils::eFORMS_PROPERTIES,
- "DefaultSummary", defaultSummaryText);
+ nsContentUtils::GetLocalizedString(
+ nsContentUtils::eFORMS_PROPERTIES_MAYBESPOOF, "DefaultSummary",
+ defaultSummaryText);
RefPtr<nsTextNode> description = new nsTextNode(nodeInfoManager);
description->SetText(defaultSummaryText, false);
mDefaultSummary->AppendChildTo(description, false);
diff --git a/mobile/android/installer/package-manifest.in b/mobile/android/installer/package-manifest.in
index 816589393562..3d014cbc6e67 100644
--- a/mobile/android/installer/package-manifest.in
+++ b/mobile/android/installer/package-manifest.in
@@ -201,6 +201,7 @@
@BINPATH@/res/grabber.gif
@BINPATH@/res/dtd/*
@BINPATH@/res/language.properties
+@BINPATH@/res/locale/layout/HtmlForm.properties
#ifndef MOZ_ANDROID_EXCLUDE_FONTS
@BINPATH@/res/fonts/*
1
0

[tor-browser-build/master] Bug 31173: Update android-toolchain project to match firefox
by gk@torproject.org 29 Aug '19
by gk@torproject.org 29 Aug '19
29 Aug '19
commit 576c12b5e461df957731a7d4583d84a8e716ddaf
Author: sisbell <shane.isbell(a)gmail.com>
Date: Wed Jul 17 01:48:43 2019 -0700
Bug 31173: Update android-toolchain project to match firefox
---
projects/android-toolchain/build | 21 +++++++++++----------
projects/android-toolchain/config | 28 ++++++++++++++--------------
2 files changed, 25 insertions(+), 24 deletions(-)
diff --git a/projects/android-toolchain/build b/projects/android-toolchain/build
index e0f59a9..42e961c 100644
--- a/projects/android-toolchain/build
+++ b/projects/android-toolchain/build
@@ -15,28 +15,29 @@ unzip -qq [% c("input_files_by_name/gradle_bin") %] -d $GRADLE_HOME
# NDK Archive
cd $NDK_HOME
-mv android-ndk-r15c/* .
-rm -fR android-ndk-r15c
+mv android-ndk-r17b/* .
+rm -fR android-ndk-r17b
+# The architectures we support
./build/tools/make_standalone_toolchain.py --api [% c("var/android_min_api_armv7") %] --arch arm --install-dir=./arm
./build/tools/make_standalone_toolchain.py --api [% c("var/android_min_api_x86") %] --arch x86 --install-dir=./x86
./build/tools/make_standalone_toolchain.py --api [% c("var/android_min_api_aarch64") %] --arch arm64 --install-dir=./arm64
# Tool Archives
cd $SDK_HOME
-unzip -qq $HOME/[% c("input_files_by_name/build_tools_26") %] -d $SDK_HOME
-mkdir -p build-tools/26.0.2
-mv android-8.1.0/* build-tools/26.0.2
+unzip -qq $HOME/[% c("input_files_by_name/build_tools") %] -d $SDK_HOME
+mkdir -p build-tools/27.0.3
+mv android-8.1.0/* build-tools/27.0.3
-unzip -qq $HOME/[% c("input_files_by_name/platform_26") %] -d $SDK_HOME
-mkdir -p platforms/android-26
-mv android-8.0.0/* platforms/android-26
+unzip -qq $HOME/[% c("input_files_by_name/platform") %] -d $SDK_HOME
+mkdir -p platforms/android-28
+mv android-9/* platforms/android-28
-unzip -qq $HOME/[% c("input_files_by_name/platform_tools_26") %] -d $SDK_HOME
+unzip -qq $HOME/[% c("input_files_by_name/platform_tools") %] -d $SDK_HOME
# Cleanup
rm -fR android-8.1.0
-rm -fR android-8.0.0
+rm -fR android-9
# Archive dist directory
cd /var/tmp/dist
diff --git a/projects/android-toolchain/config b/projects/android-toolchain/config
index 8a4c413..8c9c822 100644
--- a/projects/android-toolchain/config
+++ b/projects/android-toolchain/config
@@ -1,6 +1,6 @@
# vim: filetype=yaml sw=2
filename: '[% project %]-[% c("version") %]-[% c("var/build_id") %].tar.gz'
-version: 26.0.2
+version: 27.0.3
var:
container:
use_container: 1
@@ -18,21 +18,21 @@ var:
google_repo: https://dl.google.com/android/repository
input_files:
- project: container-image
- - URL: '[% c("var/google_repo") %]/build-tools_r26.0.2-linux.zip'
- name: build_tools_26
- sha256sum: a752849fac85c4a7f9ea165ec8f367b0ebe8bbf6a1f33fc8605342be004231ce
- - URL: '[% c("var/google_repo") %]/platform-26_r02.zip'
- name: platform_26
- sha256sum: 2aafa7d19c5e9c4b643ee6ade3d85ef89dc2f79e8383efdb9baf7fddad74b52a
- - URL: '[% c("var/google_repo") %]/platform-tools_r26.0.2-linux.zip'
- name: platform_tools_26
- sha256sum: 63b15a38c2b64e6ec8b54febe9f69fce5fe6c898c554c73b826b49daf7b52519
+ - URL: '[% c("var/google_repo") %]/build-tools_r27.0.3-linux.zip'
+ name: build_tools
+ sha256sum: 5e1f4fc5203f13de120c56f9cc103bb2e57d940959547506196ab10ddc9e6b97
+ - URL: '[% c("var/google_repo") %]/platform-28_r04.zip'
+ name: platform
+ sha256sum: 967f8ca99b71d337aa9c7781f9d65dd8110bf5c4746f44304047bf71b20d0ded
+ - URL: '[% c("var/google_repo") %]/platform-tools_r28.0.3-linux.zip'
+ name: platform_tools
+ sha256sum: 38fccfe8d2646dd12bdd7cad22fedba0493425b98ebd6d620e4c670b9af4c53f
- URL: '[% c("var/google_repo") %]/sdk-tools-linux-4333796.zip'
name: android_sdk_tools
sha256sum: 92ffee5a1d98d856634e8b71132e8a95d96c83a63fde1099be3d86df3106def9
- - URL: '[% c("var/google_repo") %]/android-ndk-r15c-linux-x86_64.zip'
+ - URL: '[% c("var/google_repo") %]/android-ndk-r17b-linux-x86_64.zip'
name: android_ndk_compiler
- sha256sum: f01788946733bf6294a36727b99366a18369904eb068a599dde8cca2c1d2ba3c
- - URL: https://services.gradle.org/distributions/gradle-4.1-bin.zip
+ sha256sum: 5dfbbdc2d3ba859fed90d0e978af87c71a91a5be1f6e1c40ba697503d48ccecd
+ - URL: https://services.gradle.org/distributions/gradle-4.10.2-bin.zip
name: gradle_bin
- sha256sum: d55dfa9cfb5a3da86a1c9e75bb0b9507f9a8c8c100793ccec7beb6e259f9ed43
+ sha256sum: b49c6da1b2cb67a0caf6c7480630b51c70a11ca2016ff2f555eaeda863143a29
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] fixup! TB4: Tor Browser's Firefox preference overrides.
by gk@torproject.org 29 Aug '19
by gk@torproject.org 29 Aug '19
29 Aug '19
commit bd3c6c4beaf4c0ee004c841d8474e26b32925692
Author: Georg Koppen <gk(a)torproject.org>
Date: Mon Aug 19 07:38:56 2019 +0000
fixup! TB4: Tor Browser's Firefox preference overrides.
Fixes bug 31141.
---
browser/app/profile/000-tor-browser.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/browser/app/profile/000-tor-browser.js b/browser/app/profile/000-tor-browser.js
index 08fe0e8d301e..f9114b7a892e 100644
--- a/browser/app/profile/000-tor-browser.js
+++ b/browser/app/profile/000-tor-browser.js
@@ -371,7 +371,7 @@ pref("font.name.sans-serif.ar", "Arial");
#endif
#ifdef XP_WIN
-pref("font.system.whitelist", "Arial, Batang, 바탕, Cambria Math, Courier New, Euphemia, Gautami, Georgia, Gulim, 굴림, GulimChe, 굴림체, Iskoola Pota, Kalinga, Kartika, Latha, Lucida Console, MS Gothic, MS ゴシック, MS Mincho, MS 明朝, MS PGothic, MS Pゴシック, MS PMincho, MS P明朝, MV Boli, Malgun Gothic, Mangal, Meiryo, Meiryo UI, Microsoft Himalaya, Microsoft JhengHei, Microsoft JengHei UI, Microsoft YaHei, 微软雅黑, Microsoft YaHei UI, MingLiU, 細明體, Noto Sans Buginese, Noto Sans Khmer, Noto Sans Lao, Noto Sans Myanmar, Noto Sans Yi, Nyala, PMingLiU, 新細明體, Plantagenet Cherokee, Raavi, Segoe UI, Shruti, SimSun, 宋体, Sylfaen, Tahoma, Times New Roman, Tunga, Verdana, Vrinda, Yu Gothic UI");
+pref("font.system.whitelist", "Arial, Batang, 바탕, Cambria Math, Courier New, Euphemia, Gautami, Georgia, Gulim, 굴림, GulimChe, 굴림체, Iskoola Pota, Kalinga, Kartika, Latha, Lucida Console, MS Gothic, MS ゴシック, MS Mincho, MS 明朝, MS PGothic, MS Pゴシック, MS PMincho, MS P明朝, MV Boli, Malgun Gothic, Mangal, Meiryo, Meiryo UI, Microsoft Himalaya, Microsoft JhengHei, Microsoft JhengHei UI, Microsoft YaHei, 微软雅黑, Microsoft YaHei UI, MingLiU, 細明體, Noto Sans Buginese, Noto Sans Khmer, Noto Sans Lao, Noto Sans Myanmar, Noto Sans Yi, Nyala, PMingLiU, 新細明體, Plantagenet Cherokee, Raavi, Segoe UI, Shruti, SimSun, 宋体, Sylfaen, Tahoma, Times New Roman, Tunga, Verdana, Vrinda, Yu Gothic UI");
#endif
#ifdef XP_LINUX
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] squash! TB4: Tor Browser's Firefox preference overrides.
by gk@torproject.org 29 Aug '19
by gk@torproject.org 29 Aug '19
29 Aug '19
commit 1d8ad2218d07aa58e1887cb238499d08b70c190d
Author: Alex Catarineu <acat(a)torproject.org>
Date: Wed Aug 28 18:51:12 2019 +0200
squash! TB4: Tor Browser's Firefox preference overrides.
Bug 31396: Disable indexedDB WebExtension storage backend.
---
browser/app/profile/000-tor-browser.js | 2 ++
1 file changed, 2 insertions(+)
diff --git a/browser/app/profile/000-tor-browser.js b/browser/app/profile/000-tor-browser.js
index 8a83eac60400..08fe0e8d301e 100644
--- a/browser/app/profile/000-tor-browser.js
+++ b/browser/app/profile/000-tor-browser.js
@@ -277,6 +277,8 @@ pref("extensions.getAddons.showPane", false);
pref("extensions.legacy.exceptions", "{972ce4c6-7e08-4474-a285-3208198ce6fd},torbutton(a)torproject.org");
// Bug 26114: Allow NoScript to access addons.mozilla.org etc.
pref("extensions.webextensions.restrictedDomains", "");
+// Bug 31396: Disable indexedDB WebExtension storage backend.
+pref("extensions.webextensions.ExtensionStorageIDB.enabled", false);
// Toolbar layout
pref("browser.uiCustomization.state", "{\"placements\":{\"widget-overflow-fixed-list\":[],\"PersonalToolbar\":[\"personal-bookmarks\"],\"nav-bar\":[\"back-button\",\"forward-button\",\"stop-reload-button\",\"urlbar-container\",\"torbutton-button\",\"security-level-button\",\"downloads-button\"],\"TabsToolbar\":[\"tabbrowser-tabs\",\"new-tab-button\",\"alltabs-button\"],\"toolbar-menubar\":[\"menubar-items\"],\"PanelUI-contents\":[\"home-button\",\"edit-controls\",\"zoom-controls\",\"new-window-button\",\"save-page-button\",\"print-button\",\"bookmarks-menu-button\",\"history-panelmenu\",\"find-button\",\"preferences-button\",\"add-ons-button\",\"developer-button\"],\"addon-bar\":[\"addonbar-closebutton\",\"status-bar\"]},\"seen\":[\"developer-button\",\"https-everywhere-eff_eff_org-browser-action\",\"_73a6fe31-595d-460b-a920-fcc0f8843232_-browser-action\"],\"dirtyAreaCache\":[\"PersonalToolbar\",\"nav-bar\",\"TabsToolbar\",\"toolbar-menubar\"],\"currentVersion\":14,\"newElementCount
\":1}");
1
0

[tor-browser-build/master] Picking up first 68.1.0esr branch for nightly builds
by gk@torproject.org 28 Aug '19
by gk@torproject.org 28 Aug '19
28 Aug '19
commit d2c194dd5f82de9bbd9ec7c7e7e34e3c7a5a4684
Author: Georg Koppen <gk(a)torproject.org>
Date: Wed Aug 28 21:37:32 2019 +0000
Picking up first 68.1.0esr branch for nightly builds
---
projects/firefox-langpacks/config | 2 +-
projects/firefox/config | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/projects/firefox-langpacks/config b/projects/firefox-langpacks/config
index 17a707a..34d6fad 100644
--- a/projects/firefox-langpacks/config
+++ b/projects/firefox-langpacks/config
@@ -4,7 +4,7 @@ filename: '[% project %]-[% c("version") %]-[% c("var/osname") %]-[% c("var/buil
var:
ff_version: '[% pc("firefox", "var/firefox_version") %]'
- ff_build: build2
+ ff_build: build1
input_filename: 'dl-langpack-[% c("var/ff_arch") %]-[% c("version") %]'
targets:
diff --git a/projects/firefox/config b/projects/firefox/config
index 799861e..06f7c60 100644
--- a/projects/firefox/config
+++ b/projects/firefox/config
@@ -8,7 +8,7 @@ git_submodule: 1
gpg_keyring: torbutton.gpg
var:
- firefox_platform_version: 68.0
+ firefox_platform_version: 68.1.0
firefox_version: '[% c("var/firefox_platform_version") %]esr'
torbrowser_branch: 9.0
torbrowser_update_channel: alpha
@@ -51,7 +51,7 @@ targets:
branding_directory: '[% IF c("var/android") %]mobile/android[% ELSE %]browser[% END %]/branding/official'
nightly:
- git_hash: 'tor-browser-[% c("var/firefox_version") %]-[% c("var/torbrowser_branch") %]-3'
+ git_hash: 'tor-browser-[% c("var/firefox_version") %]-[% c("var/torbrowser_branch") %]-1'
tag_gpg_id: 0
var:
torbrowser_update_channel: default
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 1572844 - Consistently check for MOZ_BITS_DOWNLOAD
by gk@torproject.org 28 Aug '19
by gk@torproject.org 28 Aug '19
28 Aug '19
commit adb1614b652a5be21e7f025d15a8ea48401eeb02
Author: Adam Gashlin <agashlin(a)mozilla.com>
Date: Mon Aug 19 15:44:42 2019 -0700
Bug 1572844 - Consistently check for MOZ_BITS_DOWNLOAD
---
toolkit/components/bitsdownload/components.conf | 2 +-
toolkit/components/bitsdownload/moz.build | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/toolkit/components/bitsdownload/components.conf b/toolkit/components/bitsdownload/components.conf
index d8a7b5721e00..fe7090d366be 100644
--- a/toolkit/components/bitsdownload/components.conf
+++ b/toolkit/components/bitsdownload/components.conf
@@ -5,7 +5,7 @@
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
Classes = []
-if buildconfig.substs['OS_ARCH'] == 'WINNT' and defined('MOZ_BITS_DOWNLOAD'):
+if defined('MOZ_BITS_DOWNLOAD'):
Classes += [
{
'cid': '{495d6f3d-9748-4d30-8ce5-0290c0001edf}',
diff --git a/toolkit/components/bitsdownload/moz.build b/toolkit/components/bitsdownload/moz.build
index 1d3f45937bdb..5f1dc96e9490 100644
--- a/toolkit/components/bitsdownload/moz.build
+++ b/toolkit/components/bitsdownload/moz.build
@@ -14,7 +14,7 @@ XPCOM_MANIFESTS += [
'components.conf',
]
-if CONFIG['OS_ARCH'] == 'WINNT':
+if CONFIG['MOZ_BITS_DOWNLOAD']:
EXPORTS += [
'Bits.h'
]
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Pick up Torbutton esr68 changes
by gk@torproject.org 28 Aug '19
by gk@torproject.org 28 Aug '19
28 Aug '19
commit 489a4f07172f64ee5c9bd86a4426b5de64a9448a
Author: Georg Koppen <gk(a)torproject.org>
Date: Wed Aug 28 21:35:04 2019 +0000
Pick up Torbutton esr68 changes
---
toolkit/torproject/torbutton | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/toolkit/torproject/torbutton b/toolkit/torproject/torbutton
index ac8d92514940..605decfd4ddc 160000
--- a/toolkit/torproject/torbutton
+++ b/toolkit/torproject/torbutton
@@ -1 +1 @@
-Subproject commit ac8d9251494056e761bb2cf5c2a4795a888f38bd
+Subproject commit 605decfd4ddc81eb37da17172f48f92fd7f7e451
1
0

[tor-browser-build/master] Bug 28716: Optionally omit timestamp in PE header
by boklm@torproject.org 28 Aug '19
by boklm@torproject.org 28 Aug '19
28 Aug '19
commit 6ca067d2d716283c47c6b2fb822305e61b16e168
Author: Georg Koppen <gk(a)torproject.org>
Date: Sun Aug 25 21:52:32 2019 +0000
Bug 28716: Optionally omit timestamp in PE header
Since r332613 lld has the option of setting the timestamp in PE headers
to `0` which essentially is the behavior of ld's `--no-insert-timestamp`
flag. However, we need a patch for lld's MingW target to pass this
option on in our cross-compilation case, as it would not be available
otherwise.
---
projects/clang/build | 1 +
projects/clang/config | 2 ++
projects/clang/timestamp.patch | 54 ++++++++++++++++++++++++++++++++++++++++++
3 files changed, 57 insertions(+)
diff --git a/projects/clang/build b/projects/clang/build
index 50576b4..c1afa6d 100644
--- a/projects/clang/build
+++ b/projects/clang/build
@@ -30,6 +30,7 @@ mv compiler-rt-* llvm/projects/compiler-rt
for i in {1..12}
do git apply $rootdir/win-patches/llvm-objcopy-$i.patch
done
+ patch -p1 -d llvm/tools/lld < $rootdir/timestamp.patch
[% END %]
cd llvm
export LLVM_HOME=$(pwd)
diff --git a/projects/clang/config b/projects/clang/config
index f439cf7..08231be 100644
--- a/projects/clang/config
+++ b/projects/clang/config
@@ -43,3 +43,5 @@ input_files:
file_gpg_id: 1
- filename: win-patches
enable: '[% c("var/windows") %]'
+ - filename: timestamp.patch
+ enable: '[% c("var/windows") %]'
diff --git a/projects/clang/timestamp.patch b/projects/clang/timestamp.patch
new file mode 100644
index 0000000..bea48a2
--- /dev/null
+++ b/projects/clang/timestamp.patch
@@ -0,0 +1,54 @@
+From f4743f40894d1dcd4ba131af3ad86a34c6d54598 Mon Sep 17 00:00:00 2001
+From: Martin Storsjo <martin(a)martin.st>
+Date: Tue, 5 Feb 2019 08:16:06 +0000
+Subject: [PATCH] Hook up the --no-insert-timestamp option
+
+This fixes PR40582.
+
+Patch by Georg Koppen!
+
+Differential Revision: https://reviews.llvm.org/D57679
+
+git-svn-id: https://llvm.org/svn/llvm-project/lld/trunk@353145 91177308-0d34-0410-b5e6-96231b3b80d8
+
+diff --git a/MinGW/Driver.cpp b/MinGW/Driver.cpp
+index 27a5550ec..d79ebe82e 100644
+--- a/MinGW/Driver.cpp
++++ b/MinGW/Driver.cpp
+@@ -170,6 +170,9 @@ bool mingw::link(ArrayRef<const char *> ArgsArr, raw_ostream &Diag) {
+ Args.getLastArgValue(OPT_m) != "arm64pe" && !Args.hasArg(OPT_dynamicbase))
+ Add("-dynamicbase:no");
+
++ if (Args.hasArg(OPT_no_insert_timestamp))
++ Add("-timestamp:0");
++
+ if (Args.hasFlag(OPT_gc_sections, OPT_no_gc_sections, false))
+ Add("-opt:ref");
+ else
+diff --git a/MinGW/Options.td b/MinGW/Options.td
+index ad699f711..5cc339a4a 100644
+--- a/MinGW/Options.td
++++ b/MinGW/Options.td
+@@ -20,6 +20,8 @@ def l: JoinedOrSeparate<["-"], "l">, MetaVarName<"<libName>">,
+ def m: JoinedOrSeparate<["-"], "m">, HelpText<"Set target emulation">;
+ def map: S<"Map">, HelpText<"Output a linker map">;
+ def map_eq: J<"Map=">, Alias<map>;
++def no_insert_timestamp: F<"no-insert-timestamp">,
++ HelpText<"Don't include PE header timestamp">;
+ def no_whole_archive: F<"no-whole-archive">,
+ HelpText<"No longer include all object files for following archives">;
+ def large_address_aware: Flag<["--"], "large-address-aware">,
+diff --git a/test/MinGW/driver.test b/test/MinGW/driver.test
+index 3222bb111..b853527a0 100644
+--- a/test/MinGW/driver.test
++++ b/test/MinGW/driver.test
+@@ -151,3 +151,6 @@ REQUIRE-DEFINED: -include:_foo -include:_bar -include:_baz -include:_foo2
+
+ RUN: ld.lld -### -m i386pep foo.o -Llibpath | FileCheck -check-prefix LIBPATH %s
+ LIBPATH: -libpath:libpath
++
++RUN: ld.lld -### -m i386pep foo.o --no-insert-timestamp | FileCheck -check-prefix NOTIMESTAMP %s
++NOTIMESTAMP: -timestamp:0
+--
+2.23.0.rc1
+
1
0

[tor-browser-build/master] Bug 30490: Adapt cbindgen for Windows 32bit usage
by boklm@torproject.org 28 Aug '19
by boklm@torproject.org 28 Aug '19
28 Aug '19
commit 84d95d6d2a51d93f62e9927cfa2e63e674066c7d
Author: Georg Koppen <gk(a)torproject.org>
Date: Mon Aug 26 21:21:20 2019 +0000
Bug 30490: Adapt cbindgen for Windows 32bit usage
---
projects/cbindgen/build | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/projects/cbindgen/build b/projects/cbindgen/build
index 429f567..402a216 100644
--- a/projects/cbindgen/build
+++ b/projects/cbindgen/build
@@ -22,8 +22,13 @@ replace-with = "vendored-sources"
directory = "/var/tmp/build/cbindgen/vendor"
EOF
-cargo build --release --frozen --target x86_64-unknown-linux-gnu
-mv target/x86_64-unknown-linux-gnu/release/cbindgen $distdir/[% project %]
+[% IF ! c("var/windows-i686") -%]
+ target=x86_64
+[% ELSE -%]
+ target=i686
+[% END -%]
+cargo build --release --frozen --target $target-unknown-linux-gnu
+mv target/$target-unknown-linux-gnu/release/cbindgen $distdir/[% project %]
cd $distdir
[% c('tar', {
1
0

[tor-browser-build/master] Bug 28238: Use mingw-w64-clang for fxc2
by boklm@torproject.org 28 Aug '19
by boklm@torproject.org 28 Aug '19
28 Aug '19
commit 9b4b31f5bacfffb2b35e914fe5535999c7db45e1
Author: Georg Koppen <gk(a)torproject.org>
Date: Mon Aug 26 12:24:36 2019 +0000
Bug 28238: Use mingw-w64-clang for fxc2
---
projects/firefox/build | 1 -
projects/fxc2/config | 3 ++-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/projects/firefox/build b/projects/firefox/build
index 31b812a..1fb4b58 100644
--- a/projects/firefox/build
+++ b/projects/firefox/build
@@ -40,7 +40,6 @@ EOF
mkdir -p /var/tmp/dist
tar -C /var/tmp/dist -xf [% c('input_files_by_name/fxc2') %]
fxcdir=/var/tmp/dist/fxc2/bin
- cp $mingwdir/[% c("arch") %]-w64-mingw32/bin/libwinpthread-1.dll $fxcdir
export PATH="$fxcdir:$PATH"
# fxc2 requires Wine.
[% IF c("var/windows-x86_64") %]
diff --git a/projects/fxc2/config b/projects/fxc2/config
index 5cdf03a..4b9f151 100644
--- a/projects/fxc2/config
+++ b/projects/fxc2/config
@@ -1,12 +1,13 @@
# vim: filetype=yaml sw=2
version: '[% c("abbrev") %]'
git_url: https://github.com/mozilla/fxc2.git
-git_hash: 0b800f3e41ed087df6f51f120165f3ccc71cc27c
+git_hash: 5ace4c25b63cb5a83b58a3eae3d36256a6022cde
filename: '[% project %]-[% c("version") %]-[% c("var/osname") %]-[% c("var/build_id") %].tar.gz'
var:
container:
use_container: 1
+ compiler: mingw-w64-clang
input_files:
- project: container-image
1
0

[tor-browser-build/master] Bug 28238: Adapt firefox project for Windows builds
by boklm@torproject.org 28 Aug '19
by boklm@torproject.org 28 Aug '19
28 Aug '19
commit 023ce30eb3c6082af3353fe6876c202d849cfea8
Author: Georg Koppen <gk(a)torproject.org>
Date: Mon Aug 26 21:30:50 2019 +0000
Bug 28238: Adapt firefox project for Windows builds
---
projects/firefox/build | 77 ++++---------------------------
projects/firefox/config | 16 +++----
projects/firefox/mozconfig-windows-i686 | 24 ++++++++--
projects/firefox/mozconfig-windows-x86_64 | 21 +++++++--
4 files changed, 56 insertions(+), 82 deletions(-)
diff --git a/projects/firefox/build b/projects/firefox/build
index 1fb4b58..a4b10b6 100644
--- a/projects/firefox/build
+++ b/projects/firefox/build
@@ -1,46 +1,15 @@
#!/bin/bash
[% c("var/setarch") -%]
[% c("var/set_default_env") -%]
-[% IF c("var/windows") -%]
- [% pc('gcc', 'var/setup', { compiler_tarfile => c('input_files_by_name/gcc') }) %]
- # We need a link to our GCC, otherwise the system cc gets used which points to
- # /usr/bin/gcc.
- ln -s gcc /var/tmp/dist/gcc/bin/cc
-[% END -%]
[% pc(c('var/compiler'), 'var/setup', { compiler_tarfile => c('input_files_by_name/' _ c('var/compiler')) }) %]
distdir=/var/tmp/dist/[% project %]
mkdir -p /var/tmp/build
mkdir -p [% dest_dir _ '/' _ c('filename') %]
-[% IF c("var/windows") -%]
- mingwdir=/var/tmp/dist/mingw-w64
- mkdir -p $mingwdir/helpers
-
- cat > $mingwdir/helpers/[% c("arch") %]-w64-mingw32-g++ << 'EOF'
-#!/bin/sh
-/var/tmp/dist/mingw-w64/bin/[% c("arch") %]-w64-mingw32-g++ [% c("var/LDFLAGS") %] [% c("var/CFLAGS") %] "$@"
-EOF
-
- cat > $mingwdir/helpers/[% c("arch") %]-w64-mingw32-gcc << 'EOF'
-#!/bin/sh
-/var/tmp/dist/mingw-w64/bin/[% c("arch") %]-w64-mingw32-gcc [% c("var/LDFLAGS") %] [% c("var/CFLAGS") %] "$@"
-EOF
-
- cat > $mingwdir/helpers/[% c("arch") %]-w64-mingw32-ld << 'EOF'
-#!/bin/sh
-/var/tmp/dist/mingw-w64/bin/[% c("arch") %]-w64-mingw32-ld [% c("var/LDFLAGS") %] "$@"
-EOF
-
- chmod +x $mingwdir/helpers/*
- export PATH="$mingwdir/helpers:$PATH"
-[% END -%]
-
[% IF c("var/windows") %]
- # Unpack fxc2.
- mkdir -p /var/tmp/dist
+ # Setting up fxc2
tar -C /var/tmp/dist -xf [% c('input_files_by_name/fxc2') %]
- fxcdir=/var/tmp/dist/fxc2/bin
- export PATH="$fxcdir:$PATH"
+ export PATH="/var/tmp/dist/fxc2/bin:$PATH"
# fxc2 requires Wine.
[% IF c("var/windows-x86_64") %]
export WINEARCH=win64
@@ -51,7 +20,6 @@ EOF
wine wineboot -i
[% END -%]
-mkdir -p /var/tmp/dist
tar -C /var/tmp/dist -xf [% c('input_files_by_name/rust') %]
tar -C /var/tmp/dist -xf [% c('input_files_by_name/cbindgen') %]
tar -C /var/tmp/dist -xf [% c('input_files_by_name/nasm') %]
@@ -113,30 +81,11 @@ then
fi
[% IF c("var/windows") %]
- # FIXME
- # Ideally, using LDFLAGS (and e.g. DLLFLAGS for NSS) would be enough to get
- # all Firefox libraries linked against msvcr100. Alas, this does not hold for
- # NSPR. Without patching it we get a "missing entry points for _strcmpi in
- # msvcr100.dll". Now, this should be fixed in rev>=6179 as the def file there
- # contains a proper patch according to the mingw-w64 developers.
- # However, even with this patch the _strcmpi issue is still popping up,
- # probably due to a bug in our current linking setup. The small patch below
- # is therefore just a workaround which should get fixed but is at least
- # justified as the signature of _strcmpi and _stricmp is the same, see:
- # http://msdn.microsoft.com/en-us/library/k59z8dwe.aspx.
- sed 's/strcmpi/stricmp/' -i nsprpub/pr/src/linking/prlink.c
- export HOST_LDFLAGS=" "
- export LDFLAGS="-specs=/var/tmp/dist/mingw-w64/msvcr100.spec"
- # Our flags don't get passed to NSS. We need to do that manually using an
- # obscure one.
- export DLLFLAGS="-specs=/var/tmp/dist/mingw-w64/msvcr100.spec"
-
# Make sure widl is not inserting random timestamps, see #21837.
export WIDL_TIME_OVERRIDE="0"
-[% END %]
-
-[% IF c("var/windows") %]
patch -p1 < $rootdir/nsis-uninstall.patch
+ # Make sure we link without inserting timestamps in general.
+ export LDFLAGS="-Wl,--no-insert-timestamp"
[% END -%]
# Backporting a sec-high bugfix to ESR 60, but making sure it is only applied to
@@ -203,14 +152,9 @@ rm -f js/src/configure
chmod 755 $distdir/Browser/firefox
[% END %]
-[% IF c("var/windows-x86_64") -%]
- mv $rootdir/msvcr100-x86_64.dll $rootdir/msvcr100.dll
-[% END -%]
[% IF c("var/windows") %]
cp -a obj-*/dist/firefox/* $distdir/Browser/
- cp -a $rootdir/msvcr100.dll $distdir/Browser
- cp -a $gcclibs/libssp-0.dll $distdir/Browser
- cp -a $fxcdir/d3dcompiler_47.dll $distdir/Browser
+ cp -a /var/tmp/dist/fxc2/bin/d3dcompiler_47.dll $distdir/Browser
[% END %]
# Make MAR-based update tools available for use during the bundle phase.
@@ -243,16 +187,15 @@ cp -p obj-*/dist/host/bin/mbsdiff $MARTOOLS/
done
[% END %]
[% IF c("var/windows") %]
- cp -p obj-*/modules/libmar/tool/signmar.exe $MARTOOLS/
- cp -p obj-*/security/nss/cmd/certutil/certutil_certutil/certutil.exe $MARTOOLS/
- cp -p obj-*/security/nss/cmd/modutil/modutil_modutil/modutil.exe $MARTOOLS/
- cp -p obj-*/security/nss/cmd/pk12util/pk12util_pk12util/pk12util.exe $MARTOOLS/
- cp -p obj-*/security/nss/cmd/shlibsign/shlibsign_shlibsign/shlibsign.exe $MARTOOLS/
+ cp -p obj-*/dist/bin/signmar.exe $MARTOOLS/
+ cp -p obj-*/dist/bin/certutil.exe $MARTOOLS/
+ cp -p obj-*/dist/bin/modutil.exe $MARTOOLS/
+ cp -p obj-*/dist/bin/pk12util.exe $MARTOOLS/
+ cp -p obj-*/dist/bin/shlibsign.exe $MARTOOLS/
NSS_LIBS="freebl3.dll mozglue.dll nss3.dll nssckbi.dll nssdbm3.dll softokn3.dll"
for LIB in $NSS_LIBS; do
cp -p obj-*/dist/bin/$LIB $MARTOOLS/
done
- cp -a $rootdir/msvcr100.dll $MARTOOLS/
[% END %]
cd $distdir
diff --git a/projects/firefox/config b/projects/firefox/config
index 2622da6..799861e 100644
--- a/projects/firefox/config
+++ b/projects/firefox/config
@@ -110,6 +110,13 @@ targets:
var:
arch_deps:
- wine
+ pre_pkginst: |
+ echo 'deb http://ftp.debian.org/debian stretch-backports main' >> /etc/apt/sources.list
+ post_pkginst: |
+ # We need to have at least 3.0.3 which Mozilla is using in the
+ # mingw-w64/clang build process
+ apt-get -y -t stretch-backports install wine
+ compiler: mingw-w64-clang
windows-i686:
var:
@@ -131,15 +138,6 @@ input_files:
enable: '[% c("var/linux") %]'
- filename: fix-info-plist.py
enable: '[% c("var/osx") %]'
- - URL: https://people.torproject.org/~gk/mirrors/sources/msvcr100.dll
- sha256sum: 8793353461826fbd48f25ea8b835be204b758ce7510db2af631b28850355bd18
- enable: '[% c("var/windows-i686") %]'
- - URL: https://people.torproject.org/~boklm/mirrors/sources/msvcr100-x86_64.dll
- sha256sum: ae3cb6c6afba9a4aa5c85f66023c35338ca579b30326dd02918f9d55259503d5
- enable: '[% c("var/windows-x86_64") %]'
- - project: gcc
- name: gcc
- enable: '[% c("var/windows") %]'
- filename: nsis-uninstall.patch
enable: '[% c("var/windows") %]'
- project: rust
diff --git a/projects/firefox/mozconfig-windows-i686 b/projects/firefox/mozconfig-windows-i686
index 3314719..5538bc1 100644
--- a/projects/firefox/mozconfig-windows-i686
+++ b/projects/firefox/mozconfig-windows-i686
@@ -1,5 +1,18 @@
CROSS_COMPILE=1
+HOST_CC="clang"
+HOST_CXX="clang++"
+CC="i686-w64-mingw32-clang"
+CXX="i686-w64-mingw32-clang++"
+CXXFLAGS="-fms-extensions"
+AR=llvm-ar
+RANLIB=llvm-ranlib
+
+clang_path=/var/tmp/dist/mingw-w64-clang
+
+# For Stylo
+BINDGEN_CFLAGS="-I$clang_path/i686-w64-mingw32/include/c++/v1 -I$clang_path/i686-w64-mingw32/include"
+
ac_add_options --enable-application=browser
ac_add_options --target=i686-w64-mingw32
ac_add_options --with-toolchain-prefix=i686-w64-mingw32-
@@ -11,6 +24,9 @@ export MOZILLA_OFFICIAL=1
mk_add_options BUILD_OFFICIAL=1
ac_add_options --disable-debug
+# Until we build on a 64bit host we need to hack around linker errors due to
+# memory constraints
+ac_add_options --disable-debug-symbols
ac_add_options --enable-optimize
ac_add_options --enable-strip
ac_add_options --enable-official-branding
@@ -18,12 +34,14 @@ ac_add_options --enable-official-branding
ac_add_options --enable-tor-browser-update
ac_add_options --enable-signmar
ac_add_options --enable-verify-mar
+ac_add_options --disable-bits-download
# Let's make sure no preference is enabling either Adobe's or Google's CDM.
ac_add_options --disable-eme
ac_add_options --disable-crashreporter
ac_add_options --disable-maintenance-service
-ac_add_options --disable-webrtc
+ac_add_options --enable-proxy-bypass-protection
+ac_add_options --disable-webrtc # Bug 1393901
ac_add_options --disable-tests
-ac_add_options --disable-stylo # Bugzilla 1390583
-ac_add_options --disable-jemalloc # Bugzilla 1466192
+ac_add_options --disable-jemalloc # Bug 154751
+ac_add_options --disable-geckodriver # Bug 1489320
diff --git a/projects/firefox/mozconfig-windows-x86_64 b/projects/firefox/mozconfig-windows-x86_64
index 62e32c5..c95525b 100644
--- a/projects/firefox/mozconfig-windows-x86_64
+++ b/projects/firefox/mozconfig-windows-x86_64
@@ -1,5 +1,18 @@
CROSS_COMPILE=1
+HOST_CC="clang"
+HOST_CXX="clang++"
+CC="x86_64-w64-mingw32-clang"
+CXX="x86_64-w64-mingw32-clang++"
+CXXFLAGS="-fms-extensions"
+AR=llvm-ar
+RANLIB=llvm-ranlib
+
+clang_path=/var/tmp/dist/mingw-w64-clang
+
+# For Stylo
+BINDGEN_CFLAGS="-I$clang_path/x86_64-w64-mingw32/include/c++/v1 -I$clang_path/x86_64-w64-mingw32/include"
+
ac_add_options --enable-application=browser
ac_add_options --target=x86_64-w64-mingw32
ac_add_options --with-toolchain-prefix=x86_64-w64-mingw32-
@@ -18,12 +31,14 @@ ac_add_options --enable-official-branding
ac_add_options --enable-tor-browser-update
ac_add_options --enable-signmar
ac_add_options --enable-verify-mar
+ac_add_options --disable-bits-download
# Let's make sure no preference is enabling either Adobe's or Google's CDM.
ac_add_options --disable-eme
ac_add_options --disable-crashreporter
ac_add_options --disable-maintenance-service
-ac_add_options --disable-webrtc
+ac_add_options --enable-proxy-bypass-protection
+ac_add_options --disable-webrtc # Bug 1393901
ac_add_options --disable-tests
-ac_add_options --disable-stylo # Bugzilla 1390583
-ac_add_options --disable-jemalloc # Bugzilla 1466192
+ac_add_options --disable-jemalloc # Bug 1547519
+ac_add_options --disable-geckodriver # Bug 1489320
1
0

[tor-browser-build/master] Bug 28716: Create mingw-w64-clang toolchain
by boklm@torproject.org 28 Aug '19
by boklm@torproject.org 28 Aug '19
28 Aug '19
commit 8aeb04965f9993b7572c7fe98d9ad3e0b2fe4453
Author: Georg Koppen <gk(a)torproject.org>
Date: Fri Aug 23 10:10:50 2019 +0000
Bug 28716: Create mingw-w64-clang toolchain
This commit adds a mingw-w64/clang toolchain that is needed for getting
Stylo compiled. The build script follows mostly
https://hg.mozilla.org/releases/mozilla-esr68/file/2f459603370d1d35a56ca4e9…
Exceptions are:
1) We don't build clang in 3 stages but just one like we do for our
macOS cross-compilation toolchain.
2) We are omitting the `DEBUG_FLAGS` (-g -gcodeview) as we plan to
actually ship the resulting build to users, which seems okay (see
bug 1500102).
3) We use a slightly newer libunwind (8.0.0) to better fit to our
clang 8 we deploy.
4) We poke clang harder to compile `i686-w64-mingw32-windres` by
specifying the target explicitly. Using our `var/setarch` trick does not
work anymore for an unknown reason.
Thanks to Martin Storsjö, Jacek Caban, Tom Ritter, and many others for
their help in setting this Windows cross-compilation toolchain up.
---
projects/llvm-mingw/build | 8 +
projects/llvm-mingw/config | 5 +
projects/mingw-w64-clang/build | 233 ++
projects/mingw-w64-clang/config | 38 +
projects/mingw-w64-clang/mingw-winrt.patch | 5525 ++++++++++++++++++++++++++++
5 files changed, 5809 insertions(+)
diff --git a/projects/llvm-mingw/build b/projects/llvm-mingw/build
new file mode 100644
index 0000000..ac0f21b
--- /dev/null
+++ b/projects/llvm-mingw/build
@@ -0,0 +1,8 @@
+#!/bin/bash
+[% c("var/set_default_env") -%]
+tar xf [% project %]-[% c("version") %].tar.gz
+mv [% project %]-[% c("version") %] [% project %]
+[% c('tar', {
+ tar_src => [ project ],
+ tar_args => '-czf ' _ dest_dir _ '/' _ c('filename'),
+ }) %]
diff --git a/projects/llvm-mingw/config b/projects/llvm-mingw/config
new file mode 100644
index 0000000..b1ebf42
--- /dev/null
+++ b/projects/llvm-mingw/config
@@ -0,0 +1,5 @@
+# vim: filetype=yaml sw=2
+version: '[% c("abbrev") %]'
+git_hash: c3a16814bd26aa6702e1e5b482a3d9044bb0f725
+git_url: https://github.com/mstorsjo/llvm-mingw.git
+filename: '[% project %]-[% c("version") %]-[% c("var/build_id") %].tar.gz'
diff --git a/projects/mingw-w64-clang/build b/projects/mingw-w64-clang/build
new file mode 100644
index 0000000..4226212
--- /dev/null
+++ b/projects/mingw-w64-clang/build
@@ -0,0 +1,233 @@
+#!/bin/bash
+[% c("var/set_default_env") -%]
+builddir=/var/tmp/build
+distdir=/var/tmp/dist/mingw-w64-clang
+mkdir -p $distdir
+cd /var/tmp/dist
+tar -xf $rootdir/[% c('input_files_by_name/clang') %]
+mv clang/* mingw-w64-clang/
+tar -xf $rootdir/[% c('input_files_by_name/cmake') %]
+mkdir -p $builddir
+cd $builddir
+tar -xf $rootdir/mingw-w64-clang-[% c('version') %].tar.gz
+mv mingw-w64-clang-[% c('version') %] mingw-w64-clang
+tar -xf $rootdir/[% c('input_files_by_name/libcxx') %]
+mv libcxx-* libcxx
+tar -xf $rootdir/[% c('input_files_by_name/libcxxabi') %]
+mv libcxxabi-* libcxxabi
+tar -xf $rootdir/[% c('input_files_by_name/libunwind') %]
+mv libunwind-* libunwind
+tar -xf $rootdir/[% c('input_files_by_name/compiler-rt') %]
+mv compiler-rt-* compiler-rt
+tar -xf $rootdir/[% c('input_files_by_name/llvm-mingw') %]
+
+# Adding the wrappers and symlinks we need
+cd $distdir/bin
+exception_flags=""
+target=""
+[% IF c("var/windows-i686") %]
+ target="--target=i686-linux-gnu"
+ exception_flags="-fsjlj-exceptions"
+[% END -%]
+compiler_flags="--sysroot \$DIR/../[% c("arch") %]-w64-mingw32 -rtlib=compiler-rt -stdlib=libc++ -fuse-ld=lld $exception_flags -fuse-cxa-atexit -Qunused-arguments"
+
+cat <<EOF >[% c("arch") %]-w64-mingw32-clang
+#!/bin/sh
+DIR="\$(cd "\$(dirname "\$0")" && pwd)"
+\$DIR/clang -target [% c("arch") %]-w64-mingw32 $compiler_flags "\$@"
+EOF
+chmod +x [% c("arch") %]-w64-mingw32-clang
+
+cat <<EOF >[% c("arch") %]-w64-mingw32-clang++
+#!/bin/sh
+DIR="\$(cd "\$(dirname "\$0")" && pwd)"
+\$DIR/clang -target [% c("arch") %]-w64-mingw32 --driver-mode=g++ $compiler_flags "\$@"
+EOF
+chmod +x [% c("arch") %]-w64-mingw32-clang++
+
+ln -s llvm-nm [% c("arch") %]-w64-mingw32-nm
+ln -s llvm-strip [% c("arch") %]-w64-mingw32-strip
+ln -s llvm-readobj [% c("arch") %]-w64-mingw32-readobj
+ln -s llvm-objcopy [% c("arch") %]-w64-mingw32-objcopy
+./clang $builddir/llvm-mingw/wrappers/windres-wrapper.c $target -O2 -Wl,-s -o [% c("arch") %]-w64-mingw32-windres
+
+# Building mingw-w64
+export PATH="$distdir/bin:/var/tmp/dist/cmake/bin:$PATH"
+CC="[% c("arch") %]-w64-mingw32-clang"
+CXX="[% c("arch") %]-w64-mingw32-clang++"
+# This is the default value of _WIN32_WINNT. Gecko configure script explicitly
+# sets this, so this is not used to build Gecko itself. We default to 0x601,
+# which is Windows 7.
+default_win32_winnt=0x601
+[% IF c("var/windows-i686") %]
+ crt_flags="--enable-lib32 --disable-lib64"
+ compiler_rt_machine="i386"
+[% ELSE -%]
+ crt_flags="--disable-lib32 --enable-lib64"
+ compiler_rt_machine="x86_64"
+[% END -%]
+
+cd $builddir/mingw-w64-clang
+patch -p1 < $rootdir/mingw-winrt.patch
+cd mingw-w64-headers
+mkdir build && cd build
+../configure --host=[% c("arch") %]-w64-mingw32 \
+ --enable-sdk=all \
+ --enable-secure-api \
+ --enable-idl \
+ --with-default-msvcrt=ucrt \
+ --with-default-win32-winnt=$default_win32_winnt \
+ --prefix=$distdir/[% c("arch") %]-w64-mingw32
+make -j[% c("buildconf/num_procs") %] install
+
+cd $builddir/mingw-w64-clang/mingw-w64-crt
+mkdir build && cd build
+../configure --host=[% c("arch") %]-w64-mingw32 \
+ $crt_flags \
+ --with-default-msvcrt=ucrt \
+ CC="$CC" \
+ AR=llvm-ar \
+ RANLIB=llvm-ranlib \
+ DLLTOOL=llvm-dlltool \
+ --prefix=$distdir/[% c("arch") %]-w64-mingw32
+make -j[% c("buildconf/num_procs") %]
+make -j[% c("buildconf/num_procs") %] install
+
+cd $builddir/mingw-w64-clang/mingw-w64-tools/widl
+mkdir build && cd build
+../configure --target=[% c("arch") %]-w64-mingw32 --prefix=$distdir
+make -j[% c("buildconf/num_procs") %]
+make -j[% c("buildconf/num_procs") %] install
+
+# compiler-rt
+cd $builddir/compiler-rt
+mkdir build && cd build
+CLANG_VERSION=$(basename $(dirname $(dirname $(dirname $($CC --print-libgcc-file-name -rtlib=compiler-rt)))))
+cmake -DCMAKE_BUILD_TYPE=Release \
+ -DCMAKE_C_COMPILER=$CC \
+ -DCMAKE_SYSTEM_NAME=Windows \
+ -DCMAKE_AR=$distdir/bin/llvm-ar \
+ -DCMAKE_RANLIB=$distdir/bin/llvm-ranlib \
+ -DCMAKE_C_COMPILER_WORKS=1 \
+ -DCMAKE_C_COMPILER_TARGET=$compiler_rt_machine-windows-gnu \
+ -DCOMPILER_RT_DEFAULT_TARGET_ONLY=TRUE \
+ $builddir/compiler-rt/lib/builtins
+ make -j[% c("buildconf/num_procs") %]
+ mkdir -p $distdir/lib/clang/$CLANG_VERSION/lib/windows
+ cp lib/windows/libclang_rt.builtins-$compiler_rt_machine.a $distdir/lib/clang/$CLANG_VERSION/lib/windows/
+
+# libunwind
+cd $builddir/libunwind
+mkdir build && cd build
+cmake -DCMAKE_BUILD_TYPE=Release \
+ -DCMAKE_INSTALL_PREFIX=$distdir/[% c("arch") %]-w64-mingw32 \
+ -DCMAKE_C_COMPILER=$CC \
+ -DCMAKE_CXX_COMPILER=$CXX \
+ -DCMAKE_CROSSCOMPILING=TRUE \
+ -DCMAKE_SYSROOT=$distdir/[% c("arch") %]-w64-mingw32 \
+ -DCMAKE_SYSTEM_NAME=Windows \
+ -DCMAKE_C_COMPILER_WORKS=TRUE \
+ -DCMAKE_CXX_COMPILER_WORKS=TRUE \
+ -DLLVM_COMPILER_CHECKED=True \
+ -DCMAKE_AR=$distdir/bin/llvm-ar \
+ -DCMAKE_RANLIB=$distdir/bin/llvm-ranlib \
+ -DLLVM_NO_OLD_LIBSTDCXX=TRUE \
+ -DCXX_SUPPORTS_CXX11=TRUE \
+ -DCXX_SUPPORTS_CXX_STD=True \
+ -DLIBUNWIND_USE_COMPILER_RT=TRUE \
+ -DLIBUNWIND_ENABLE_THREADS=TRUE \
+ -DLIBUNWIND_ENABLE_SHARED=FALSE \
+ -DLIBUNWIND_ENABLE_CROSS_UNWINDING=FALSE \
+ -DCMAKE_CXX_FLAGS="-Wno-dll-attribute-on-redeclaration -nostdinc++ -I$builddir/libcxx/include -DPSAPI_VERSION=2" \
+ -DCMAKE_C_FLAGS="-Wno-dll-attribute-on-redeclaration" \
+ $builddir/libunwind
+make -j[% c("buildconf/num_procs") %]
+make -j[% c("buildconf/num_procs") %] install
+
+# libcxxabi
+cd $builddir/libcxxabi
+mkdir build && cd build
+cmake -DCMAKE_BUILD_TYPE=Release \
+ -DCMAKE_INSTALL_PREFIX=$distdir/[% c("arch") %]-w64-mingw32 \
+ -DCMAKE_C_COMPILER=$CC \
+ -DCMAKE_CXX_COMPILER=$CXX \
+ -DCMAKE_CROSSCOMPILING=TRUE \
+ -DCMAKE_SYSTEM_NAME=Windows \
+ -DCMAKE_C_COMPILER_WORKS=TRUE \
+ -DCMAKE_CXX_COMPILER_WORKS=TRUE \
+ -DCMAKE_SYSROOT=$distdir/[% c("arch") %]-w64-mingw32 \
+ -DLLVM_COMPILER_CHECKED=True \
+ -DCMAKE_AR=$distdir/bin/llvm-ar \
+ -DCMAKE_RANLIB=$distdir/bin/llvm-ranlib \
+ -DLIBCXXABI_USE_COMPILER_RT=ON \
+ -DLIBCXXABI_ENABLE_EXCEPTIONS=ON \
+ -DLIBCXXABI_ENABLE_THREADS=ON \
+ -DLIBCXXABI_TARGET_TRIPLE=[% c("arch") %]-w64-mingw32 \
+ -DLIBCXXABI_ENABLE_SHARED=OFF \
+ -DLIBCXXABI_LIBCXX_INCLUDES=$builddir/libcxx/include \
+ -DLLVM_NO_OLD_LIBSTDCXX=TRUE \
+ -DCXX_SUPPORTS_CXX11=TRUE \
+ -DCXX_SUPPORTS_CXX_STD=True \
+ -DCMAKE_CXX_FLAGS="-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS -D_LIBCPP_HAS_THREAD_API_WIN32" \
+ $builddir/libcxxabi
+make -j[% c("buildconf/num_procs") %] VERBOSE=1
+
+# libcxx
+cd $builddir/libcxx
+mkdir build && cd build
+cmake -DCMAKE_BUILD_TYPE=Release \
+ -DCMAKE_INSTALL_PREFIX=$distdir/[% c("arch") %]-w64-mingw32 \
+ -DCMAKE_C_COMPILER=$CC \
+ -DCMAKE_CXX_COMPILER=$CXX \
+ -DCMAKE_CROSSCOMPILING=TRUE \
+ -DCMAKE_SYSTEM_NAME=Windows \
+ -DCMAKE_C_COMPILER_WORKS=TRUE \
+ -DCMAKE_CXX_COMPILER_WORKS=TRUE \
+ -DLLVM_COMPILER_CHECKED=True \
+ -DCMAKE_AR=$distdir/bin/llvm-ar \
+ -DCMAKE_RANLIB=$distdir/bin/llvm-ranlib \
+ -DLIBCXX_USE_COMPILER_RT=ON \
+ -DLIBCXX_INSTALL_HEADERS=ON \
+ -DLIBCXX_ENABLE_EXCEPTIONS=ON \
+ -DLIBCXX_ENABLE_THREADS=ON \
+ -DLIBCXX_HAS_WIN32_THREAD_API=ON \
+ -DLIBCXX_ENABLE_MONOTONIC_CLOCK=ON \
+ -DLIBCXX_ENABLE_SHARED=OFF \
+ -DLIBCXX_SUPPORTS_STD_EQ_CXX11_FLAG=TRUE \
+ -DLIBCXX_HAVE_CXX_ATOMICS_WITHOUT_LIB=TRUE \
+ -DLIBCXX_ENABLE_EXPERIMENTAL_LIBRARY=OFF \
+ -DLIBCXX_ENABLE_FILESYSTEM=OFF \
+ -DLIBCXX_ENABLE_STATIC_ABI_LIBRARY=TRUE \
+ -DLIBCXX_CXX_ABI=libcxxabi \
+ -DLIBCXX_CXX_ABI_INCLUDE_PATHS=$builddir/libcxxabi/include \
+ -DLIBCXX_CXX_ABI_LIBRARY_PATH=$builddir/libcxxabi/build/lib \
+ -DCMAKE_CXX_FLAGS="-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS" \
+ $builddir/libcxx
+make -j[% c("buildconf/num_procs") %] VERBOSE=1
+make -j[% c("buildconf/num_procs") %] install
+
+# libc++.a depends on libunwind.a. While the linker will automatically link to
+# libc++.a in C++ mode, it won't pick libunwind.a, requiring the caller to
+# explicitly pass -lunwind. To work around that, we merge libunwind.a into
+# libc++.a.
+merge_libs() {
+ cat <<EOF |llvm-ar -M
+CREATE tmp.a
+ADDLIB $1
+ADDLIB $2
+SAVE
+END
+EOF
+ llvm-ranlib tmp.a
+ mv tmp.a $1
+}
+
+merge_libs $distdir/[% c("arch") %]-w64-mingw32/lib/libc++.a $distdir/[% c("arch") %]-w64-mingw32/lib/libunwind.a
+
+# Packaging up everything
+cd $distdir
+cd ..
+[% c('tar', {
+ tar_src => [ project ],
+ tar_args => '-czf ' _ dest_dir _ '/' _ c('filename'),
+ }) %]
diff --git a/projects/mingw-w64-clang/config b/projects/mingw-w64-clang/config
new file mode 100644
index 0000000..203e12e
--- /dev/null
+++ b/projects/mingw-w64-clang/config
@@ -0,0 +1,38 @@
+# vim: filetype=yaml sw=2
+filename: '[% project %]-[% c("version") %]-[% c("var/build_id") %].tar.gz'
+git_url: https://git.code.sf.net/p/mingw-w64/mingw-w64
+git_hash: 2d52c4b3433e55b1c454f9567c0ae9adc4b83b41
+version: '[% c("abbrev") %]'
+llvm_version: 8.0.0
+gpg_keyring: clang.gpg
+sig_ext: sig
+
+var:
+ container:
+ use_container: 1
+ setup: |
+ mkdir -p /var/tmp/dist
+ tar -C /var/tmp/dist -xf $rootdir/[% c("compiler_tarfile") %]
+ export PATH="/var/tmp/dist/mingw-w64-clang/bin:$PATH"
+
+input_files:
+ - project: container-image
+ - project: clang
+ name: clang
+ - project: cmake
+ name: cmake
+ - URL: 'https://releases.llvm.org/[% c("llvm_version") %]/libcxx-[% c("llvm_version") %].src.tar.xz'
+ name: libcxx
+ file_gpg_id: 1
+ - URL: 'https://releases.llvm.org/[% c("llvm_version") %]/libcxxabi-[% c("llvm_version") %].src.tar.xz'
+ name: libcxxabi
+ file_gpg_id: 1
+ - URL: 'https://releases.llvm.org/[% c("llvm_version") %]/libunwind-[% c("llvm_version") %].src.tar.xz'
+ name: libunwind
+ file_gpg_id: 1
+ - URL: 'https://releases.llvm.org/[% c("llvm_version") %]/compiler-rt-[% c("llvm_version") %].src.tar.xz'
+ name: compiler-rt
+ file_gpg_id: 1
+ - project: llvm-mingw
+ name: llvm-mingw
+ - filename: mingw-winrt.patch
diff --git a/projects/mingw-w64-clang/mingw-winrt.patch b/projects/mingw-w64-clang/mingw-winrt.patch
new file mode 100644
index 0000000..e7124e1
--- /dev/null
+++ b/projects/mingw-w64-clang/mingw-winrt.patch
@@ -0,0 +1,5525 @@
+commit 07fff0900d668fbd75e0ac0a6382a86d486cee88
+Author: Jacek Caban <jacek(a)codeweavers.com>
+Date: Sun Mar 24 21:20:55 2019 +0100
+
+ winrt headers
+
+diff --git a/mingw-w64-headers/include/intsafe.h b/mingw-w64-headers/include/intsafe.h
+index 701d4cef..daaedb83 100644
+--- a/mingw-w64-headers/include/intsafe.h
++++ b/mingw-w64-headers/include/intsafe.h
+@@ -411,5 +411,8 @@ __MINGW_INTSAFE_API __MINGW_INTSAFE_MATH(ULongLongMult, ULONGLONG, mul)
+ __MINGW_INTSAFE_API __MINGW_INTSAFE_MATH(LongLongMult, LONGLONG, mul)
+
+ #endif /* __GNUC__ >= 5 */
++
++#define SizeTToUInt32 UIntPtrToUInt
++
+ #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) */
+ #endif /* _INTSAFE_H_INCLUDED_ */
+diff --git a/mingw-w64-headers/include/windows.foundation.h b/mingw-w64-headers/include/windows.foundation.h
+index 6c4d3ec8..59797984 100644
+--- a/mingw-w64-headers/include/windows.foundation.h
++++ b/mingw-w64-headers/include/windows.foundation.h
+@@ -1,11 +1,12 @@
+-/*** Autogenerated by WIDL 1.5.31 from include/windows.foundation.idl - Do not edit ***/
++/*** Autogenerated by WIDL 4.4 from windows.foundation.idl - Do not edit ***/
+
++#ifdef _WIN32
+ #ifndef __REQUIRED_RPCNDR_H_VERSION__
+ #define __REQUIRED_RPCNDR_H_VERSION__ 475
+ #endif
+-
+ #include <rpc.h>
+ #include <rpcndr.h>
++#endif
+
+ #ifndef COM_NO_WINDOWS_H
+ #include <windows.h>
+@@ -17,24 +18,18 @@
+
+ /* Forward declarations */
+
+-#ifndef __IAsyncInfo_FWD_DEFINED__
+-#define __IAsyncInfo_FWD_DEFINED__
+-typedef interface IAsyncInfo IAsyncInfo;
+-#endif
+-
+-#ifndef __IASyncAction_FWD_DEFINED__
+-#define __IASyncAction_FWD_DEFINED__
+-typedef interface IASyncAction IASyncAction;
+-#endif
+-
+-#ifndef __AsyncActionCompletedHandler_FWD_DEFINED__
+-#define __AsyncActionCompletedHandler_FWD_DEFINED__
+-typedef interface AsyncActionCompletedHandler AsyncActionCompletedHandler;
+-#endif
+-
+-#ifndef __IAsyncOperation_FWD_DEFINED__
+-#define __IAsyncOperation_FWD_DEFINED__
+-typedef interface IAsyncOperation IAsyncOperation;
++#ifndef ____x_ABI_CWindows_CFoundation_CIStringable_FWD_DEFINED__
++#define ____x_ABI_CWindows_CFoundation_CIStringable_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CFoundation_CIStringable __x_ABI_CWindows_CFoundation_CIStringable;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace Foundation {
++ interface IStringable;
++ }
++ }
++}
++#endif /* __cplusplus */
+ #endif
+
+ /* Headers for imported files */
+@@ -45,667 +40,331 @@ typedef interface IAsyncOperation IAsyncOperation;
+ extern "C" {
+ #endif
+
+-#ifndef __IAsyncInfo_FWD_DEFINED__
+-#define __IAsyncInfo_FWD_DEFINED__
+-typedef interface IAsyncInfo IAsyncInfo;
+-#endif
+-
+-#ifndef __IAsyncAction_FWD_DEFINED__
+-#define __IAsyncAction_FWD_DEFINED__
+-typedef interface IAsyncAction IAsyncAction;
+-#endif
+-
+-#ifndef __IAsyncOperation_FWD_DEFINED__
+-#define __IAsyncOperation_FWD_DEFINED__
+-typedef interface IAsyncOperation IAsyncOperation;
+-#endif
+-
+-#ifndef __AsyncActionCompletedHandler_FWD_DEFINED__
+-#define __AsyncActionCompletedHandler_FWD_DEFINED__
+-typedef interface AsyncActionCompletedHandler AsyncActionCompletedHandler;
+-#endif
+-
+-#ifndef __TypedEventHandler_FWD_DEFINED__
+-#define __TypedEventHandler_FWD_DEFINED__
+-typedef interface TypedEventHandler TypedEventHandler;
+-#endif
+-
+-struct DateTime;
+-
+-struct EventRegistrationToken;
+-
+-#ifndef __IVectorView_FWD_DEFINED__
+-#define __IVectorView_FWD_DEFINED__
+-typedef interface IVectorView IVectorView;
+-#endif
+-
+-#ifndef __IPropertySet_FWD_DEFINED__
+-#define __IPropertySet_FWD_DEFINED__
+-typedef interface IPropertySet IPropertySet;
+-#endif
+-
+-typedef enum AsyncStatus {
+- Started = 0,
+- Completed = 1,
+- Canceled = 2,
+- Error = 3
+-} AsyncStatus;
+-typedef struct DateTime {
+- UINT64 UniversalTime;
+-} DateTime;
+-typedef struct EventRegistrationToken {
+- UINT64 Value;
+-} EventRegistrationToken;
+-/*****************************************************************************
+- * IAsyncInfo interface
+- */
+-#ifndef __IAsyncInfo_INTERFACE_DEFINED__
+-#define __IAsyncInfo_INTERFACE_DEFINED__
+-
+-DEFINE_GUID(IID_IAsyncInfo, 0x00000036, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
+-#if defined(__cplusplus) && !defined(CINTERFACE)
+-MIDL_INTERFACE("00000036-0000-0000-c000-000000000046")
+-IAsyncInfo : public IInspectable
+-{
+- virtual HRESULT STDMETHODCALLTYPE get_Id(
+- unsigned int *id) = 0;
+-
+- virtual HRESULT STDMETHODCALLTYPE get_Status(
+- AsyncStatus *status) = 0;
+-
+- virtual HRESULT STDMETHODCALLTYPE get_ErrorCode(
+- HRESULT *errorCode) = 0;
+-
+- virtual HRESULT STDMETHODCALLTYPE Cancel(
+- ) = 0;
+-
+- virtual HRESULT STDMETHODCALLTYPE Close(
+- ) = 0;
+-
+-};
+-#ifdef __CRT_UUID_DECL
+-__CRT_UUID_DECL(IAsyncInfo, 0x00000036, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46)
+-#endif
++#ifdef __cplusplus
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace Foundation {
++ enum PropertyType {
++ PropertyType_Empty = 0,
++ PropertyType_UInt8 = 1,
++ PropertyType_Int16 = 2,
++ PropertyType_UInt16 = 3,
++ PropertyType_Int32 = 4,
++ PropertyType_UInt32 = 5,
++ PropertyType_Int64 = 6,
++ PropertyType_UInt64 = 7,
++ PropertyType_Single = 8,
++ PropertyType_Double = 9,
++ PropertyType_Char16 = 10,
++ PropertyType_Boolean = 11,
++ PropertyType_String = 12,
++ PropertyType_Inspectable = 13,
++ PropertyType_DateTime = 14,
++ PropertyType_TimeSpan = 15,
++ PropertyType_Guid = 16,
++ PropertyType_Point = 17,
++ PropertyType_Size = 18,
++ PropertyType_Rect = 19,
++ PropertyType_OtherType = 20,
++ PropertyType_UInt8Array = 1025,
++ PropertyType_Int16Array = 1026,
++ PropertyType_UInt16Array = 1027,
++ PropertyType_Int32Array = 1028,
++ PropertyType_UInt32Array = 1029,
++ PropertyType_Int64Array = 1030,
++ PropertyType_UInt64Array = 1031,
++ PropertyType_SingleArray = 1032,
++ PropertyType_DoubleArray = 1033,
++ PropertyType_Char16Array = 1034,
++ PropertyType_BooleanArray = 1035,
++ PropertyType_StringArray = 1036,
++ PropertyType_InspectableArray = 1037,
++ PropertyType_DateTimeArray = 1038,
++ PropertyType_TimeSpanArray = 1039,
++ PropertyType_GuidArray = 1040,
++ PropertyType_PointArray = 1041,
++ PropertyType_SizeArray = 1042,
++ PropertyType_RectArray = 1043,
++ PropertyType_OtherTypeArray = 1044
++ };
++ }
++ }
++}
++extern "C" {
+ #else
+-typedef struct IAsyncInfoVtbl {
+- BEGIN_INTERFACE
+-
+- /*** IUnknown methods ***/
+- HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+- IAsyncInfo* This,
+- REFIID riid,
+- void **ppvObject);
+-
+- ULONG (STDMETHODCALLTYPE *AddRef)(
+- IAsyncInfo* This);
+-
+- ULONG (STDMETHODCALLTYPE *Release)(
+- IAsyncInfo* This);
+-
+- /*** IInspectable methods ***/
+- HRESULT (STDMETHODCALLTYPE *GetIids)(
+- IAsyncInfo* This,
+- ULONG *iidCount,
+- IID **iids);
+-
+- HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+- IAsyncInfo* This,
+- HSTRING *className);
+-
+- HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+- IAsyncInfo* This,
+- TrustLevel *trustLevel);
+-
+- /*** IAsyncInfo methods ***/
+- HRESULT (STDMETHODCALLTYPE *get_Id)(
+- IAsyncInfo* This,
+- unsigned int *id);
+-
+- HRESULT (STDMETHODCALLTYPE *get_Status)(
+- IAsyncInfo* This,
+- AsyncStatus *status);
+-
+- HRESULT (STDMETHODCALLTYPE *get_ErrorCode)(
+- IAsyncInfo* This,
+- HRESULT *errorCode);
+-
+- HRESULT (STDMETHODCALLTYPE *Cancel)(
+- IAsyncInfo* This);
+-
+- HRESULT (STDMETHODCALLTYPE *Close)(
+- IAsyncInfo* This);
+-
+- END_INTERFACE
+-} IAsyncInfoVtbl;
+-interface IAsyncInfo {
+- CONST_VTBL IAsyncInfoVtbl* lpVtbl;
++enum __x_ABI_CWindows_CFoundation_CPropertyType {
++ PropertyType_Empty = 0,
++ PropertyType_UInt8 = 1,
++ PropertyType_Int16 = 2,
++ PropertyType_UInt16 = 3,
++ PropertyType_Int32 = 4,
++ PropertyType_UInt32 = 5,
++ PropertyType_Int64 = 6,
++ PropertyType_UInt64 = 7,
++ PropertyType_Single = 8,
++ PropertyType_Double = 9,
++ PropertyType_Char16 = 10,
++ PropertyType_Boolean = 11,
++ PropertyType_String = 12,
++ PropertyType_Inspectable = 13,
++ PropertyType_DateTime = 14,
++ PropertyType_TimeSpan = 15,
++ PropertyType_Guid = 16,
++ PropertyType_Point = 17,
++ PropertyType_Size = 18,
++ PropertyType_Rect = 19,
++ PropertyType_OtherType = 20,
++ PropertyType_UInt8Array = 1025,
++ PropertyType_Int16Array = 1026,
++ PropertyType_UInt16Array = 1027,
++ PropertyType_Int32Array = 1028,
++ PropertyType_UInt32Array = 1029,
++ PropertyType_Int64Array = 1030,
++ PropertyType_UInt64Array = 1031,
++ PropertyType_SingleArray = 1032,
++ PropertyType_DoubleArray = 1033,
++ PropertyType_Char16Array = 1034,
++ PropertyType_BooleanArray = 1035,
++ PropertyType_StringArray = 1036,
++ PropertyType_InspectableArray = 1037,
++ PropertyType_DateTimeArray = 1038,
++ PropertyType_TimeSpanArray = 1039,
++ PropertyType_GuidArray = 1040,
++ PropertyType_PointArray = 1041,
++ PropertyType_SizeArray = 1042,
++ PropertyType_RectArray = 1043,
++ PropertyType_OtherTypeArray = 1044
+ };
+-
+-#ifdef COBJMACROS
+-#ifndef WIDL_C_INLINE_WRAPPERS
+-/*** IUnknown methods ***/
+-#define IAsyncInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+-#define IAsyncInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
+-#define IAsyncInfo_Release(This) (This)->lpVtbl->Release(This)
+-/*** IInspectable methods ***/
+-#define IAsyncInfo_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+-#define IAsyncInfo_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+-#define IAsyncInfo_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+-/*** IAsyncInfo methods ***/
+-#define IAsyncInfo_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
+-#define IAsyncInfo_get_Status(This,status) (This)->lpVtbl->get_Status(This,status)
+-#define IAsyncInfo_get_ErrorCode(This,errorCode) (This)->lpVtbl->get_ErrorCode(This,errorCode)
+-#define IAsyncInfo_Cancel(This) (This)->lpVtbl->Cancel(This)
+-#define IAsyncInfo_Close(This) (This)->lpVtbl->Close(This)
+-#else
+-/*** IUnknown methods ***/
+-static FORCEINLINE HRESULT IAsyncInfo_QueryInterface(IAsyncInfo* This,REFIID riid,void **ppvObject) {
+- return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+-}
+-static FORCEINLINE ULONG IAsyncInfo_AddRef(IAsyncInfo* This) {
+- return This->lpVtbl->AddRef(This);
+-}
+-static FORCEINLINE ULONG IAsyncInfo_Release(IAsyncInfo* This) {
+- return This->lpVtbl->Release(This);
+-}
+-/*** IInspectable methods ***/
+-static FORCEINLINE HRESULT IAsyncInfo_GetIids(IAsyncInfo* This,ULONG *iidCount,IID **iids) {
+- return This->lpVtbl->GetIids(This,iidCount,iids);
+-}
+-static FORCEINLINE HRESULT IAsyncInfo_GetRuntimeClassName(IAsyncInfo* This,HSTRING *className) {
+- return This->lpVtbl->GetRuntimeClassName(This,className);
+-}
+-static FORCEINLINE HRESULT IAsyncInfo_GetTrustLevel(IAsyncInfo* This,TrustLevel *trustLevel) {
+- return This->lpVtbl->GetTrustLevel(This,trustLevel);
+-}
+-/*** IAsyncInfo methods ***/
+-static FORCEINLINE HRESULT IAsyncInfo_get_Id(IAsyncInfo* This,unsigned int *id) {
+- return This->lpVtbl->get_Id(This,id);
+-}
+-static FORCEINLINE HRESULT IAsyncInfo_get_Status(IAsyncInfo* This,AsyncStatus *status) {
+- return This->lpVtbl->get_Status(This,status);
+-}
+-static FORCEINLINE HRESULT IAsyncInfo_get_ErrorCode(IAsyncInfo* This,HRESULT *errorCode) {
+- return This->lpVtbl->get_ErrorCode(This,errorCode);
+-}
+-static FORCEINLINE HRESULT IAsyncInfo_Cancel(IAsyncInfo* This) {
+- return This->lpVtbl->Cancel(This);
+-}
+-static FORCEINLINE HRESULT IAsyncInfo_Close(IAsyncInfo* This) {
+- return This->lpVtbl->Close(This);
+-}
+ #endif
+-#endif
+-
+-#endif
+-
+-HRESULT STDMETHODCALLTYPE IAsyncInfo_get_Id_Proxy(
+- IAsyncInfo* This,
+- unsigned int *id);
+-void __RPC_STUB IAsyncInfo_get_Id_Stub(
+- IRpcStubBuffer* This,
+- IRpcChannelBuffer* pRpcChannelBuffer,
+- PRPC_MESSAGE pRpcMessage,
+- DWORD* pdwStubPhase);
+-HRESULT STDMETHODCALLTYPE IAsyncInfo_get_Status_Proxy(
+- IAsyncInfo* This,
+- AsyncStatus *status);
+-void __RPC_STUB IAsyncInfo_get_Status_Stub(
+- IRpcStubBuffer* This,
+- IRpcChannelBuffer* pRpcChannelBuffer,
+- PRPC_MESSAGE pRpcMessage,
+- DWORD* pdwStubPhase);
+-HRESULT STDMETHODCALLTYPE IAsyncInfo_get_ErrorCode_Proxy(
+- IAsyncInfo* This,
+- HRESULT *errorCode);
+-void __RPC_STUB IAsyncInfo_get_ErrorCode_Stub(
+- IRpcStubBuffer* This,
+- IRpcChannelBuffer* pRpcChannelBuffer,
+- PRPC_MESSAGE pRpcMessage,
+- DWORD* pdwStubPhase);
+-HRESULT STDMETHODCALLTYPE IAsyncInfo_Cancel_Proxy(
+- IAsyncInfo* This);
+-void __RPC_STUB IAsyncInfo_Cancel_Stub(
+- IRpcStubBuffer* This,
+- IRpcChannelBuffer* pRpcChannelBuffer,
+- PRPC_MESSAGE pRpcMessage,
+- DWORD* pdwStubPhase);
+-HRESULT STDMETHODCALLTYPE IAsyncInfo_Close_Proxy(
+- IAsyncInfo* This);
+-void __RPC_STUB IAsyncInfo_Close_Stub(
+- IRpcStubBuffer* This,
+- IRpcChannelBuffer* pRpcChannelBuffer,
+- PRPC_MESSAGE pRpcMessage,
+- DWORD* pdwStubPhase);
+-
+-#endif /* __IAsyncInfo_INTERFACE_DEFINED__ */
+-
+-/*****************************************************************************
+- * IASyncAction interface
+- */
+-#ifndef __IASyncAction_INTERFACE_DEFINED__
+-#define __IASyncAction_INTERFACE_DEFINED__
+-
+-DEFINE_GUID(IID_IASyncAction, 0x5a648006, 0x843a, 0x4da9, 0x86,0x5b, 0x9d,0x26,0xe5,0xdf,0xad,0x7b);
+-#if defined(__cplusplus) && !defined(CINTERFACE)
+-MIDL_INTERFACE("5a648006-843a-4da9-865b-9d26e5dfad7b")
+-IASyncAction : public IInspectable
+-{
+- virtual HRESULT STDMETHODCALLTYPE put_Completed(
+- AsyncActionCompletedHandler *handler) = 0;
+-
+- virtual HRESULT STDMETHODCALLTYPE get_Completed(
+- AsyncActionCompletedHandler **handler) = 0;
+-
+- virtual HRESULT STDMETHODCALLTYPE GetResults(
+- ) = 0;
+
+-};
+-#ifdef __CRT_UUID_DECL
+-__CRT_UUID_DECL(IASyncAction, 0x5a648006, 0x843a, 0x4da9, 0x86,0x5b, 0x9d,0x26,0xe5,0xdf,0xad,0x7b)
+-#endif
++#ifdef __cplusplus
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace Foundation {
++ struct Point {
++ FLOAT X;
++ FLOAT Y;
++ };
++ }
++ }
++}
++extern "C" {
+ #else
+-typedef struct IASyncActionVtbl {
+- BEGIN_INTERFACE
+-
+- /*** IUnknown methods ***/
+- HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+- IASyncAction* This,
+- REFIID riid,
+- void **ppvObject);
+-
+- ULONG (STDMETHODCALLTYPE *AddRef)(
+- IASyncAction* This);
+-
+- ULONG (STDMETHODCALLTYPE *Release)(
+- IASyncAction* This);
+-
+- /*** IInspectable methods ***/
+- HRESULT (STDMETHODCALLTYPE *GetIids)(
+- IASyncAction* This,
+- ULONG *iidCount,
+- IID **iids);
+-
+- HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+- IASyncAction* This,
+- HSTRING *className);
+-
+- HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+- IASyncAction* This,
+- TrustLevel *trustLevel);
+-
+- /*** IASyncAction methods ***/
+- HRESULT (STDMETHODCALLTYPE *put_Completed)(
+- IASyncAction* This,
+- AsyncActionCompletedHandler *handler);
+-
+- HRESULT (STDMETHODCALLTYPE *get_Completed)(
+- IASyncAction* This,
+- AsyncActionCompletedHandler **handler);
+-
+- HRESULT (STDMETHODCALLTYPE *GetResults)(
+- IASyncAction* This);
+-
+- END_INTERFACE
+-} IASyncActionVtbl;
+-interface IASyncAction {
+- CONST_VTBL IASyncActionVtbl* lpVtbl;
++struct __x_ABI_CWindows_CFoundation_CPoint {
++ FLOAT X;
++ FLOAT Y;
+ };
+-
+-#ifdef COBJMACROS
+-#ifndef WIDL_C_INLINE_WRAPPERS
+-/*** IUnknown methods ***/
+-#define IASyncAction_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+-#define IASyncAction_AddRef(This) (This)->lpVtbl->AddRef(This)
+-#define IASyncAction_Release(This) (This)->lpVtbl->Release(This)
+-/*** IInspectable methods ***/
+-#define IASyncAction_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+-#define IASyncAction_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+-#define IASyncAction_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+-/*** IASyncAction methods ***/
+-#define IASyncAction_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
+-#define IASyncAction_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
+-#define IASyncAction_GetResults(This) (This)->lpVtbl->GetResults(This)
+-#else
+-/*** IUnknown methods ***/
+-static FORCEINLINE HRESULT IASyncAction_QueryInterface(IASyncAction* This,REFIID riid,void **ppvObject) {
+- return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+-}
+-static FORCEINLINE ULONG IASyncAction_AddRef(IASyncAction* This) {
+- return This->lpVtbl->AddRef(This);
+-}
+-static FORCEINLINE ULONG IASyncAction_Release(IASyncAction* This) {
+- return This->lpVtbl->Release(This);
+-}
+-/*** IInspectable methods ***/
+-static FORCEINLINE HRESULT IASyncAction_GetIids(IASyncAction* This,ULONG *iidCount,IID **iids) {
+- return This->lpVtbl->GetIids(This,iidCount,iids);
+-}
+-static FORCEINLINE HRESULT IASyncAction_GetRuntimeClassName(IASyncAction* This,HSTRING *className) {
+- return This->lpVtbl->GetRuntimeClassName(This,className);
+-}
+-static FORCEINLINE HRESULT IASyncAction_GetTrustLevel(IASyncAction* This,TrustLevel *trustLevel) {
+- return This->lpVtbl->GetTrustLevel(This,trustLevel);
+-}
+-/*** IASyncAction methods ***/
+-static FORCEINLINE HRESULT IASyncAction_put_Completed(IASyncAction* This,AsyncActionCompletedHandler *handler) {
+- return This->lpVtbl->put_Completed(This,handler);
+-}
+-static FORCEINLINE HRESULT IASyncAction_get_Completed(IASyncAction* This,AsyncActionCompletedHandler **handler) {
+- return This->lpVtbl->get_Completed(This,handler);
+-}
+-static FORCEINLINE HRESULT IASyncAction_GetResults(IASyncAction* This) {
+- return This->lpVtbl->GetResults(This);
+-}
+-#endif
+ #endif
+
+-#endif
+-
+-HRESULT STDMETHODCALLTYPE IASyncAction_put_Completed_Proxy(
+- IASyncAction* This,
+- AsyncActionCompletedHandler *handler);
+-void __RPC_STUB IASyncAction_put_Completed_Stub(
+- IRpcStubBuffer* This,
+- IRpcChannelBuffer* pRpcChannelBuffer,
+- PRPC_MESSAGE pRpcMessage,
+- DWORD* pdwStubPhase);
+-HRESULT STDMETHODCALLTYPE IASyncAction_get_Completed_Proxy(
+- IASyncAction* This,
+- AsyncActionCompletedHandler **handler);
+-void __RPC_STUB IASyncAction_get_Completed_Stub(
+- IRpcStubBuffer* This,
+- IRpcChannelBuffer* pRpcChannelBuffer,
+- PRPC_MESSAGE pRpcMessage,
+- DWORD* pdwStubPhase);
+-HRESULT STDMETHODCALLTYPE IASyncAction_GetResults_Proxy(
+- IASyncAction* This);
+-void __RPC_STUB IASyncAction_GetResults_Stub(
+- IRpcStubBuffer* This,
+- IRpcChannelBuffer* pRpcChannelBuffer,
+- PRPC_MESSAGE pRpcMessage,
+- DWORD* pdwStubPhase);
+-
+-#endif /* __IASyncAction_INTERFACE_DEFINED__ */
+-
+-/*****************************************************************************
+- * AsyncActionCompletedHandler interface
+- */
+-#ifndef __AsyncActionCompletedHandler_INTERFACE_DEFINED__
+-#define __AsyncActionCompletedHandler_INTERFACE_DEFINED__
+-
+-DEFINE_GUID(IID_AsyncActionCompletedHandler, 0xa4ed5c81, 0x76c9, 0x40bd, 0x8b,0xe6, 0xb1,0xd9,0x0f,0xb2,0x0a,0xe7);
+-#if defined(__cplusplus) && !defined(CINTERFACE)
+-MIDL_INTERFACE("a4ed5c81-76c9-40bd-8be6-b1d90fb20ae7")
+-AsyncActionCompletedHandler : public IUnknown
+-{
+- virtual HRESULT STDMETHODCALLTYPE Invoke(
+- IInspectable *asyncAction,
+- AsyncStatus status) = 0;
+-
++#ifdef __cplusplus
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace Foundation {
++ struct Size {
++ FLOAT Width;
++ FLOAT Height;
++ };
++ }
++ }
++}
++extern "C" {
++#else
++struct __x_ABI_CWindows_CFoundation_CSize {
++ FLOAT Width;
++ FLOAT Height;
+ };
+-#ifdef __CRT_UUID_DECL
+-__CRT_UUID_DECL(AsyncActionCompletedHandler, 0xa4ed5c81, 0x76c9, 0x40bd, 0x8b,0xe6, 0xb1,0xd9,0x0f,0xb2,0x0a,0xe7)
+ #endif
+-#else
+-typedef struct AsyncActionCompletedHandlerVtbl {
+- BEGIN_INTERFACE
+-
+- /*** IUnknown methods ***/
+- HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+- AsyncActionCompletedHandler* This,
+- REFIID riid,
+- void **ppvObject);
+-
+- ULONG (STDMETHODCALLTYPE *AddRef)(
+- AsyncActionCompletedHandler* This);
+-
+- ULONG (STDMETHODCALLTYPE *Release)(
+- AsyncActionCompletedHandler* This);
+-
+- /*** AsyncActionCompletedHandler methods ***/
+- HRESULT (STDMETHODCALLTYPE *Invoke)(
+- AsyncActionCompletedHandler* This,
+- IInspectable *asyncAction,
+- AsyncStatus status);
+
+- END_INTERFACE
+-} AsyncActionCompletedHandlerVtbl;
+-interface AsyncActionCompletedHandler {
+- CONST_VTBL AsyncActionCompletedHandlerVtbl* lpVtbl;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace Foundation {
++typedef struct Size Size;
++ }
++ }
++}
++#endif /* __cplusplus */
++#ifdef __cplusplus
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace Foundation {
++ struct Rect {
++ FLOAT X;
++ FLOAT Y;
++ FLOAT Width;
++ FLOAT Height;
++ };
++ }
++ }
++}
++extern "C" {
++#else
++struct __x_ABI_CWindows_CFoundation_CRect {
++ FLOAT X;
++ FLOAT Y;
++ FLOAT Width;
++ FLOAT Height;
+ };
++#endif
+
+-#ifdef COBJMACROS
+-#ifndef WIDL_C_INLINE_WRAPPERS
+-/*** IUnknown methods ***/
+-#define AsyncActionCompletedHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+-#define AsyncActionCompletedHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
+-#define AsyncActionCompletedHandler_Release(This) (This)->lpVtbl->Release(This)
+-/*** AsyncActionCompletedHandler methods ***/
+-#define AsyncActionCompletedHandler_Invoke(This,asyncAction,status) (This)->lpVtbl->Invoke(This,asyncAction,status)
+-#else
+-/*** IUnknown methods ***/
+-static FORCEINLINE HRESULT AsyncActionCompletedHandler_QueryInterface(AsyncActionCompletedHandler* This,REFIID riid,void **ppvObject) {
+- return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+-}
+-static FORCEINLINE ULONG AsyncActionCompletedHandler_AddRef(AsyncActionCompletedHandler* This) {
+- return This->lpVtbl->AddRef(This);
+-}
+-static FORCEINLINE ULONG AsyncActionCompletedHandler_Release(AsyncActionCompletedHandler* This) {
+- return This->lpVtbl->Release(This);
+-}
+-/*** AsyncActionCompletedHandler methods ***/
+-static FORCEINLINE HRESULT AsyncActionCompletedHandler_Invoke(AsyncActionCompletedHandler* This,IInspectable *asyncAction,AsyncStatus status) {
+- return This->lpVtbl->Invoke(This,asyncAction,status);
++#ifdef __cplusplus
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace Foundation {
++ struct DateTime {
++ INT64 UniversalTime;
++ };
++ }
++ }
+ }
+-#endif
++extern "C" {
++#else
++struct __x_ABI_CWindows_CFoundation_CDateTime {
++ INT64 UniversalTime;
++};
+ #endif
+
++#ifdef __cplusplus
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace Foundation {
++ struct TimeSpan {
++ INT64 Duration;
++ };
++ }
++ }
++}
++extern "C" {
++#else
++struct __x_ABI_CWindows_CFoundation_CTimeSpan {
++ INT64 Duration;
++};
+ #endif
+
+-HRESULT STDMETHODCALLTYPE AsyncActionCompletedHandler_Invoke_Proxy(
+- AsyncActionCompletedHandler* This,
+- IInspectable *asyncAction,
+- AsyncStatus status);
+-void __RPC_STUB AsyncActionCompletedHandler_Invoke_Stub(
+- IRpcStubBuffer* This,
+- IRpcChannelBuffer* pRpcChannelBuffer,
+- PRPC_MESSAGE pRpcMessage,
+- DWORD* pdwStubPhase);
+-
+-#endif /* __AsyncActionCompletedHandler_INTERFACE_DEFINED__ */
+-
+ /*****************************************************************************
+- * IAsyncOperation interface
++ * IStringable interface
+ */
+-#ifndef __IAsyncOperation_INTERFACE_DEFINED__
+-#define __IAsyncOperation_INTERFACE_DEFINED__
++#ifndef ____x_ABI_CWindows_CFoundation_CIStringable_INTERFACE_DEFINED__
++#define ____x_ABI_CWindows_CFoundation_CIStringable_INTERFACE_DEFINED__
+
+-DEFINE_GUID(IID_IAsyncOperation, 0x9fc2b0bb, 0xe446, 0x44e2, 0xaa,0x61, 0x9c,0xab,0x8f,0x63,0x6a,0xf2);
++DEFINE_GUID(IID___x_ABI_CWindows_CFoundation_CIStringable, 0x96369f54, 0x8eb6, 0x48f0, 0xab,0xce, 0xc1,0xb2,0x11,0xe6,0x27,0xc3);
+ #if defined(__cplusplus) && !defined(CINTERFACE)
+-MIDL_INTERFACE("9fc2b0bb-e446-44e2-aa61-9cab8f636af2")
+-IAsyncOperation : public IAsyncInfo
+-{
+- virtual HRESULT STDMETHODCALLTYPE put_Completed(
+- AsyncActionCompletedHandler *handler) = 0;
+-
+- virtual HRESULT STDMETHODCALLTYPE get_Completed(
+- AsyncActionCompletedHandler **handler) = 0;
+-
+- virtual IInspectable * STDMETHODCALLTYPE GetResults(
+- ) = 0;
+-
+-};
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace Foundation {
++ MIDL_INTERFACE("96369f54-8eb6-48f0-abce-c1b211e627c3")
++ IStringable : public IInspectable
++ {
++ virtual HRESULT STDMETHODCALLTYPE ToString(
++ HSTRING *value) = 0;
++
++ };
++ }
++ }
++}
++extern "C" {
+ #ifdef __CRT_UUID_DECL
+-__CRT_UUID_DECL(IAsyncOperation, 0x9fc2b0bb, 0xe446, 0x44e2, 0xaa,0x61, 0x9c,0xab,0x8f,0x63,0x6a,0xf2)
++__CRT_UUID_DECL(ABI::Windows::Foundation::IStringable, 0x96369f54, 0x8eb6, 0x48f0, 0xab,0xce, 0xc1,0xb2,0x11,0xe6,0x27,0xc3)
+ #endif
+ #else
+-typedef struct IAsyncOperationVtbl {
++typedef struct __x_ABI_CWindows_CFoundation_CIStringableVtbl {
+ BEGIN_INTERFACE
+
+ /*** IUnknown methods ***/
+ HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+- IAsyncOperation* This,
++ __x_ABI_CWindows_CFoundation_CIStringable *This,
+ REFIID riid,
+ void **ppvObject);
+
+ ULONG (STDMETHODCALLTYPE *AddRef)(
+- IAsyncOperation* This);
++ __x_ABI_CWindows_CFoundation_CIStringable *This);
+
+ ULONG (STDMETHODCALLTYPE *Release)(
+- IAsyncOperation* This);
++ __x_ABI_CWindows_CFoundation_CIStringable *This);
+
+ /*** IInspectable methods ***/
+ HRESULT (STDMETHODCALLTYPE *GetIids)(
+- IAsyncOperation* This,
++ __x_ABI_CWindows_CFoundation_CIStringable *This,
+ ULONG *iidCount,
+ IID **iids);
+
+ HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+- IAsyncOperation* This,
++ __x_ABI_CWindows_CFoundation_CIStringable *This,
+ HSTRING *className);
+
+ HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+- IAsyncOperation* This,
++ __x_ABI_CWindows_CFoundation_CIStringable *This,
+ TrustLevel *trustLevel);
+
+- /*** IAsyncInfo methods ***/
+- HRESULT (STDMETHODCALLTYPE *get_Id)(
+- IAsyncOperation* This,
+- unsigned int *id);
+-
+- HRESULT (STDMETHODCALLTYPE *get_Status)(
+- IAsyncOperation* This,
+- AsyncStatus *status);
+-
+- HRESULT (STDMETHODCALLTYPE *get_ErrorCode)(
+- IAsyncOperation* This,
+- HRESULT *errorCode);
+-
+- HRESULT (STDMETHODCALLTYPE *Cancel)(
+- IAsyncOperation* This);
+-
+- HRESULT (STDMETHODCALLTYPE *Close)(
+- IAsyncOperation* This);
+-
+- /*** IAsyncOperation methods ***/
+- HRESULT (STDMETHODCALLTYPE *put_Completed)(
+- IAsyncOperation* This,
+- AsyncActionCompletedHandler *handler);
+-
+- HRESULT (STDMETHODCALLTYPE *get_Completed)(
+- IAsyncOperation* This,
+- AsyncActionCompletedHandler **handler);
+-
+- IInspectable * (STDMETHODCALLTYPE *GetResults)(
+- IAsyncOperation* This);
++ /*** IStringable methods ***/
++ HRESULT (STDMETHODCALLTYPE *ToString)(
++ __x_ABI_CWindows_CFoundation_CIStringable *This,
++ HSTRING *value);
+
+ END_INTERFACE
+-} IAsyncOperationVtbl;
+-interface IAsyncOperation {
+- CONST_VTBL IAsyncOperationVtbl* lpVtbl;
++} __x_ABI_CWindows_CFoundation_CIStringableVtbl;
++
++interface __x_ABI_CWindows_CFoundation_CIStringable {
++ CONST_VTBL __x_ABI_CWindows_CFoundation_CIStringableVtbl* lpVtbl;
+ };
+
+ #ifdef COBJMACROS
+ #ifndef WIDL_C_INLINE_WRAPPERS
+ /*** IUnknown methods ***/
+-#define IAsyncOperation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+-#define IAsyncOperation_AddRef(This) (This)->lpVtbl->AddRef(This)
+-#define IAsyncOperation_Release(This) (This)->lpVtbl->Release(This)
++#define __x_ABI_CWindows_CFoundation_CIStringable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
++#define __x_ABI_CWindows_CFoundation_CIStringable_AddRef(This) (This)->lpVtbl->AddRef(This)
++#define __x_ABI_CWindows_CFoundation_CIStringable_Release(This) (This)->lpVtbl->Release(This)
+ /*** IInspectable methods ***/
+-#define IAsyncOperation_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+-#define IAsyncOperation_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+-#define IAsyncOperation_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+-/*** IAsyncInfo methods ***/
+-#define IAsyncOperation_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
+-#define IAsyncOperation_get_Status(This,status) (This)->lpVtbl->get_Status(This,status)
+-#define IAsyncOperation_get_ErrorCode(This,errorCode) (This)->lpVtbl->get_ErrorCode(This,errorCode)
+-#define IAsyncOperation_Cancel(This) (This)->lpVtbl->Cancel(This)
+-#define IAsyncOperation_Close(This) (This)->lpVtbl->Close(This)
+-/*** IAsyncOperation methods ***/
+-#define IAsyncOperation_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
+-#define IAsyncOperation_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
+-#define IAsyncOperation_GetResults(This) (This)->lpVtbl->GetResults(This)
++#define __x_ABI_CWindows_CFoundation_CIStringable_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
++#define __x_ABI_CWindows_CFoundation_CIStringable_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
++#define __x_ABI_CWindows_CFoundation_CIStringable_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
++/*** IStringable methods ***/
++#define __x_ABI_CWindows_CFoundation_CIStringable_ToString(This,value) (This)->lpVtbl->ToString(This,value)
+ #else
+ /*** IUnknown methods ***/
+-static FORCEINLINE HRESULT IAsyncOperation_QueryInterface(IAsyncOperation* This,REFIID riid,void **ppvObject) {
++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CIStringable_QueryInterface(__x_ABI_CWindows_CFoundation_CIStringable* This,REFIID riid,void **ppvObject) {
+ return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+ }
+-static FORCEINLINE ULONG IAsyncOperation_AddRef(IAsyncOperation* This) {
++static FORCEINLINE ULONG __x_ABI_CWindows_CFoundation_CIStringable_AddRef(__x_ABI_CWindows_CFoundation_CIStringable* This) {
+ return This->lpVtbl->AddRef(This);
+ }
+-static FORCEINLINE ULONG IAsyncOperation_Release(IAsyncOperation* This) {
++static FORCEINLINE ULONG __x_ABI_CWindows_CFoundation_CIStringable_Release(__x_ABI_CWindows_CFoundation_CIStringable* This) {
+ return This->lpVtbl->Release(This);
+ }
+ /*** IInspectable methods ***/
+-static FORCEINLINE HRESULT IAsyncOperation_GetIids(IAsyncOperation* This,ULONG *iidCount,IID **iids) {
++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CIStringable_GetIids(__x_ABI_CWindows_CFoundation_CIStringable* This,ULONG *iidCount,IID **iids) {
+ return This->lpVtbl->GetIids(This,iidCount,iids);
+ }
+-static FORCEINLINE HRESULT IAsyncOperation_GetRuntimeClassName(IAsyncOperation* This,HSTRING *className) {
++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CIStringable_GetRuntimeClassName(__x_ABI_CWindows_CFoundation_CIStringable* This,HSTRING *className) {
+ return This->lpVtbl->GetRuntimeClassName(This,className);
+ }
+-static FORCEINLINE HRESULT IAsyncOperation_GetTrustLevel(IAsyncOperation* This,TrustLevel *trustLevel) {
++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CIStringable_GetTrustLevel(__x_ABI_CWindows_CFoundation_CIStringable* This,TrustLevel *trustLevel) {
+ return This->lpVtbl->GetTrustLevel(This,trustLevel);
+ }
+-/*** IAsyncInfo methods ***/
+-static FORCEINLINE HRESULT IAsyncOperation_get_Id(IAsyncOperation* This,unsigned int *id) {
+- return This->lpVtbl->get_Id(This,id);
+-}
+-static FORCEINLINE HRESULT IAsyncOperation_get_Status(IAsyncOperation* This,AsyncStatus *status) {
+- return This->lpVtbl->get_Status(This,status);
+-}
+-static FORCEINLINE HRESULT IAsyncOperation_get_ErrorCode(IAsyncOperation* This,HRESULT *errorCode) {
+- return This->lpVtbl->get_ErrorCode(This,errorCode);
+-}
+-static FORCEINLINE HRESULT IAsyncOperation_Cancel(IAsyncOperation* This) {
+- return This->lpVtbl->Cancel(This);
+-}
+-static FORCEINLINE HRESULT IAsyncOperation_Close(IAsyncOperation* This) {
+- return This->lpVtbl->Close(This);
+-}
+-/*** IAsyncOperation methods ***/
+-static FORCEINLINE HRESULT IAsyncOperation_put_Completed(IAsyncOperation* This,AsyncActionCompletedHandler *handler) {
+- return This->lpVtbl->put_Completed(This,handler);
+-}
+-static FORCEINLINE HRESULT IAsyncOperation_get_Completed(IAsyncOperation* This,AsyncActionCompletedHandler **handler) {
+- return This->lpVtbl->get_Completed(This,handler);
+-}
+-static FORCEINLINE IInspectable * IAsyncOperation_GetResults(IAsyncOperation* This) {
+- return This->lpVtbl->GetResults(This);
++/*** IStringable methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CIStringable_ToString(__x_ABI_CWindows_CFoundation_CIStringable* This,HSTRING *value) {
++ return This->lpVtbl->ToString(This,value);
+ }
+ #endif
+ #endif
+
+ #endif
+
+-HRESULT STDMETHODCALLTYPE IAsyncOperation_put_Completed_Proxy(
+- IAsyncOperation* This,
+- AsyncActionCompletedHandler *handler);
+-void __RPC_STUB IAsyncOperation_put_Completed_Stub(
+- IRpcStubBuffer* This,
+- IRpcChannelBuffer* pRpcChannelBuffer,
+- PRPC_MESSAGE pRpcMessage,
+- DWORD* pdwStubPhase);
+-HRESULT STDMETHODCALLTYPE IAsyncOperation_get_Completed_Proxy(
+- IAsyncOperation* This,
+- AsyncActionCompletedHandler **handler);
+-void __RPC_STUB IAsyncOperation_get_Completed_Stub(
+- IRpcStubBuffer* This,
+- IRpcChannelBuffer* pRpcChannelBuffer,
+- PRPC_MESSAGE pRpcMessage,
+- DWORD* pdwStubPhase);
+-IInspectable * STDMETHODCALLTYPE IAsyncOperation_GetResults_Proxy(
+- IAsyncOperation* This);
+-void __RPC_STUB IAsyncOperation_GetResults_Stub(
+- IRpcStubBuffer* This,
+- IRpcChannelBuffer* pRpcChannelBuffer,
+- PRPC_MESSAGE pRpcMessage,
+- DWORD* pdwStubPhase);
+-
+-#endif /* __IAsyncOperation_INTERFACE_DEFINED__ */
++#endif /* ____x_ABI_CWindows_CFoundation_CIStringable_INTERFACE_DEFINED__ */
+
+ /* Begin additional prototypes for all interfaces */
+
++ULONG __RPC_USER HSTRING_UserSize (ULONG *, ULONG, HSTRING *);
++unsigned char * __RPC_USER HSTRING_UserMarshal (ULONG *, unsigned char *, HSTRING *);
++unsigned char * __RPC_USER HSTRING_UserUnmarshal(ULONG *, unsigned char *, HSTRING *);
++void __RPC_USER HSTRING_UserFree (ULONG *, HSTRING *);
+
+ /* End additional prototypes */
+
+diff --git a/mingw-w64-headers/include/windows.foundation.metadata.h b/mingw-w64-headers/include/windows.foundation.metadata.h
+new file mode 100644
+index 00000000..13262699
+--- /dev/null
++++ b/mingw-w64-headers/include/windows.foundation.metadata.h
+@@ -0,0 +1,315 @@
++/*** Autogenerated by WIDL 4.4 from windows.foundation.metadata.idl - Do not edit ***/
++
++#ifdef _WIN32
++#ifndef __REQUIRED_RPCNDR_H_VERSION__
++#define __REQUIRED_RPCNDR_H_VERSION__ 475
++#endif
++#include <rpc.h>
++#include <rpcndr.h>
++#endif
++
++#ifndef COM_NO_WINDOWS_H
++#include <windows.h>
++#include <ole2.h>
++#endif
++
++#ifndef __windows_foundation_metadata_h__
++#define __windows_foundation_metadata_h__
++
++/* Forward declarations */
++
++#ifndef ____x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_FWD_DEFINED__
++#define ____x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace Foundation {
++ namespace Metadata {
++ interface IApiInformationStatics;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++/* Headers for imported files */
++
++#include <inspectable.h>
++#include <windows.foundation.h>
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/*****************************************************************************
++ * IApiInformationStatics interface
++ */
++#ifndef ____x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_INTERFACE_DEFINED__
++#define ____x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_INTERFACE_DEFINED__
++
++DEFINE_GUID(IID___x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics, 0x997439fe, 0xf681, 0x4a11, 0xb4,0x16, 0xc1,0x3a,0x47,0xe8,0xba,0x36);
++#if defined(__cplusplus) && !defined(CINTERFACE)
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace Foundation {
++ namespace Metadata {
++ MIDL_INTERFACE("997439fe-f681-4a11-b416-c13a47e8ba36")
++ IApiInformationStatics : public IInspectable
++ {
++ virtual HRESULT STDMETHODCALLTYPE IsTypePresent(
++ HSTRING typeName,
++ boolean *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE IsMethodPresent(
++ HSTRING typeName,
++ HSTRING methodName,
++ boolean *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE IsMethodPresentWithArity(
++ HSTRING typeName,
++ HSTRING methodName,
++ UINT32 inputParameterCount,
++ boolean *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE IsEventPresent(
++ HSTRING typeName,
++ HSTRING eventName,
++ boolean *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE IsPropertyPresent(
++ HSTRING typeName,
++ HSTRING propertyName,
++ boolean *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE IsReadOnlyPropertyPresent(
++ HSTRING typeName,
++ HSTRING propertyName,
++ boolean *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE IsWriteablePropertyPresent(
++ HSTRING typeName,
++ HSTRING propertyName,
++ boolean *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE IsEnumNamedValuePresent(
++ HSTRING enumTypeName,
++ HSTRING valueName,
++ boolean *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE IsApiContractPresentByMajor(
++ HSTRING contractName,
++ UINT16 majorVersion,
++ boolean *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE IsApiContractPresentByMajorAndMinor(
++ HSTRING contractName,
++ UINT16 majorVersion,
++ UINT16 minorVersion,
++ boolean *value) = 0;
++
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#ifdef __CRT_UUID_DECL
++__CRT_UUID_DECL(ABI::Windows::Foundation::Metadata::IApiInformationStatics, 0x997439fe, 0xf681, 0x4a11, 0xb4,0x16, 0xc1,0x3a,0x47,0xe8,0xba,0x36)
++#endif
++#else
++typedef struct __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStaticsVtbl {
++ BEGIN_INTERFACE
++
++ /*** IUnknown methods ***/
++ HRESULT (STDMETHODCALLTYPE *QueryInterface)(
++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This,
++ REFIID riid,
++ void **ppvObject);
++
++ ULONG (STDMETHODCALLTYPE *AddRef)(
++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This);
++
++ ULONG (STDMETHODCALLTYPE *Release)(
++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This);
++
++ /*** IInspectable methods ***/
++ HRESULT (STDMETHODCALLTYPE *GetIids)(
++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This,
++ ULONG *iidCount,
++ IID **iids);
++
++ HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This,
++ HSTRING *className);
++
++ HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This,
++ TrustLevel *trustLevel);
++
++ /*** IApiInformationStatics methods ***/
++ HRESULT (STDMETHODCALLTYPE *IsTypePresent)(
++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This,
++ HSTRING typeName,
++ boolean *value);
++
++ HRESULT (STDMETHODCALLTYPE *IsMethodPresent)(
++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This,
++ HSTRING typeName,
++ HSTRING methodName,
++ boolean *value);
++
++ HRESULT (STDMETHODCALLTYPE *IsMethodPresentWithArity)(
++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This,
++ HSTRING typeName,
++ HSTRING methodName,
++ UINT32 inputParameterCount,
++ boolean *value);
++
++ HRESULT (STDMETHODCALLTYPE *IsEventPresent)(
++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This,
++ HSTRING typeName,
++ HSTRING eventName,
++ boolean *value);
++
++ HRESULT (STDMETHODCALLTYPE *IsPropertyPresent)(
++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This,
++ HSTRING typeName,
++ HSTRING propertyName,
++ boolean *value);
++
++ HRESULT (STDMETHODCALLTYPE *IsReadOnlyPropertyPresent)(
++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This,
++ HSTRING typeName,
++ HSTRING propertyName,
++ boolean *value);
++
++ HRESULT (STDMETHODCALLTYPE *IsWriteablePropertyPresent)(
++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This,
++ HSTRING typeName,
++ HSTRING propertyName,
++ boolean *value);
++
++ HRESULT (STDMETHODCALLTYPE *IsEnumNamedValuePresent)(
++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This,
++ HSTRING enumTypeName,
++ HSTRING valueName,
++ boolean *value);
++
++ HRESULT (STDMETHODCALLTYPE *IsApiContractPresentByMajor)(
++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This,
++ HSTRING contractName,
++ UINT16 majorVersion,
++ boolean *value);
++
++ HRESULT (STDMETHODCALLTYPE *IsApiContractPresentByMajorAndMinor)(
++ __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics *This,
++ HSTRING contractName,
++ UINT16 majorVersion,
++ UINT16 minorVersion,
++ boolean *value);
++
++ END_INTERFACE
++} __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStaticsVtbl;
++
++interface __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics {
++ CONST_VTBL __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStaticsVtbl* lpVtbl;
++};
++
++#ifdef COBJMACROS
++#ifndef WIDL_C_INLINE_WRAPPERS
++/*** IUnknown methods ***/
++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_Release(This) (This)->lpVtbl->Release(This)
++/*** IInspectable methods ***/
++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
++/*** IApiInformationStatics methods ***/
++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsTypePresent(This,typeName,value) (This)->lpVtbl->IsTypePresent(This,typeName,value)
++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsMethodPresent(This,typeName,methodName,value) (This)->lpVtbl->IsMethodPresent(This,typeName,methodName,value)
++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsMethodPresentWithArity(This,typeName,methodName,inputParameterCount,value) (This)->lpVtbl->IsMethodPresentWithArity(This,typeName,methodName,inputParameterCount,value)
++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsEventPresent(This,typeName,eventName,value) (This)->lpVtbl->IsEventPresent(This,typeName,eventName,value)
++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsPropertyPresent(This,typeName,propertyName,value) (This)->lpVtbl->IsPropertyPresent(This,typeName,propertyName,value)
++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsReadOnlyPropertyPresent(This,typeName,propertyName,value) (This)->lpVtbl->IsReadOnlyPropertyPresent(This,typeName,propertyName,value)
++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsWriteablePropertyPresent(This,typeName,propertyName,value) (This)->lpVtbl->IsWriteablePropertyPresent(This,typeName,propertyName,value)
++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsEnumNamedValuePresent(This,enumTypeName,valueName,value) (This)->lpVtbl->IsEnumNamedValuePresent(This,enumTypeName,valueName,value)
++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsApiContractPresentByMajor(This,contractName,majorVersion,value) (This)->lpVtbl->IsApiContractPresentByMajor(This,contractName,majorVersion,value)
++#define __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsApiContractPresentByMajorAndMinor(This,contractName,majorVersion,minorVersion,value) (This)->lpVtbl->IsApiContractPresentByMajorAndMinor(This,contractName,majorVersion,minorVersion,value)
++#else
++/*** IUnknown methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_QueryInterface(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This,REFIID riid,void **ppvObject) {
++ return This->lpVtbl->QueryInterface(This,riid,ppvObject);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_AddRef(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This) {
++ return This->lpVtbl->AddRef(This);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_Release(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This) {
++ return This->lpVtbl->Release(This);
++}
++/*** IInspectable methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_GetIids(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This,ULONG *iidCount,IID **iids) {
++ return This->lpVtbl->GetIids(This,iidCount,iids);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_GetRuntimeClassName(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This,HSTRING *className) {
++ return This->lpVtbl->GetRuntimeClassName(This,className);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_GetTrustLevel(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This,TrustLevel *trustLevel) {
++ return This->lpVtbl->GetTrustLevel(This,trustLevel);
++}
++/*** IApiInformationStatics methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsTypePresent(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This,HSTRING typeName,boolean *value) {
++ return This->lpVtbl->IsTypePresent(This,typeName,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsMethodPresent(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This,HSTRING typeName,HSTRING methodName,boolean *value) {
++ return This->lpVtbl->IsMethodPresent(This,typeName,methodName,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsMethodPresentWithArity(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This,HSTRING typeName,HSTRING methodName,UINT32 inputParameterCount,boolean *value) {
++ return This->lpVtbl->IsMethodPresentWithArity(This,typeName,methodName,inputParameterCount,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsEventPresent(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This,HSTRING typeName,HSTRING eventName,boolean *value) {
++ return This->lpVtbl->IsEventPresent(This,typeName,eventName,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsPropertyPresent(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This,HSTRING typeName,HSTRING propertyName,boolean *value) {
++ return This->lpVtbl->IsPropertyPresent(This,typeName,propertyName,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsReadOnlyPropertyPresent(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This,HSTRING typeName,HSTRING propertyName,boolean *value) {
++ return This->lpVtbl->IsReadOnlyPropertyPresent(This,typeName,propertyName,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsWriteablePropertyPresent(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This,HSTRING typeName,HSTRING propertyName,boolean *value) {
++ return This->lpVtbl->IsWriteablePropertyPresent(This,typeName,propertyName,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsEnumNamedValuePresent(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This,HSTRING enumTypeName,HSTRING valueName,boolean *value) {
++ return This->lpVtbl->IsEnumNamedValuePresent(This,enumTypeName,valueName,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsApiContractPresentByMajor(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This,HSTRING contractName,UINT16 majorVersion,boolean *value) {
++ return This->lpVtbl->IsApiContractPresentByMajor(This,contractName,majorVersion,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_IsApiContractPresentByMajorAndMinor(__x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics* This,HSTRING contractName,UINT16 majorVersion,UINT16 minorVersion,boolean *value) {
++ return This->lpVtbl->IsApiContractPresentByMajorAndMinor(This,contractName,majorVersion,minorVersion,value);
++}
++#endif
++#endif
++
++#endif
++
++#endif /* ____x_ABI_CWindows_CFoundation_CMetadata_CIApiInformationStatics_INTERFACE_DEFINED__ */
++
++extern const __declspec(selectany) WCHAR RuntimeClass_Windows_Foundation_Metadata_ApiInformation[] = L"Windows.Foundation.Metadata.ApiInformation";
++/* Begin additional prototypes for all interfaces */
++
++ULONG __RPC_USER HSTRING_UserSize (ULONG *, ULONG, HSTRING *);
++unsigned char * __RPC_USER HSTRING_UserMarshal (ULONG *, unsigned char *, HSTRING *);
++unsigned char * __RPC_USER HSTRING_UserUnmarshal(ULONG *, unsigned char *, HSTRING *);
++void __RPC_USER HSTRING_UserFree (ULONG *, HSTRING *);
++
++/* End additional prototypes */
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* __windows_foundation_metadata_h__ */
+diff --git a/mingw-w64-headers/include/windows.foundation.numerics.h b/mingw-w64-headers/include/windows.foundation.numerics.h
+new file mode 100644
+index 00000000..e20017ce
+--- /dev/null
++++ b/mingw-w64-headers/include/windows.foundation.numerics.h
+@@ -0,0 +1,204 @@
++/*** Autogenerated by WIDL 4.4 from windows.foundation.numerics.idl - Do not edit ***/
++
++#ifdef _WIN32
++#ifndef __REQUIRED_RPCNDR_H_VERSION__
++#define __REQUIRED_RPCNDR_H_VERSION__ 475
++#endif
++#include <rpc.h>
++#include <rpcndr.h>
++#endif
++
++#ifndef COM_NO_WINDOWS_H
++#include <windows.h>
++#include <ole2.h>
++#endif
++
++#ifndef __windows_foundation_numerics_h__
++#define __windows_foundation_numerics_h__
++
++/* Forward declarations */
++
++/* Headers for imported files */
++
++#include <inspectable.h>
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace Foundation {
++ namespace Numerics {
++typedef struct Vector2 Vector2;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace Foundation {
++ namespace Numerics {
++typedef struct Vector3 Vector3;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace Foundation {
++ namespace Numerics {
++typedef struct Matrix4x4 Matrix4x4;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace Foundation {
++ namespace Numerics {
++typedef struct Quaternion Quaternion;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#ifdef __cplusplus
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace Foundation {
++ namespace Numerics {
++ struct Vector2 {
++ FLOAT X;
++ FLOAT Y;
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#else
++struct __x_ABI_CWindows_CFoundation_CNumerics_CVector2 {
++ FLOAT X;
++ FLOAT Y;
++};
++#endif
++
++#ifdef __cplusplus
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace Foundation {
++ namespace Numerics {
++ struct Vector3 {
++ FLOAT X;
++ FLOAT Y;
++ FLOAT Z;
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#else
++struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 {
++ FLOAT X;
++ FLOAT Y;
++ FLOAT Z;
++};
++#endif
++
++#ifdef __cplusplus
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace Foundation {
++ namespace Numerics {
++ struct Matrix4x4 {
++ FLOAT M11;
++ FLOAT M12;
++ FLOAT M13;
++ FLOAT M14;
++ FLOAT M21;
++ FLOAT M22;
++ FLOAT M23;
++ FLOAT M24;
++ FLOAT M31;
++ FLOAT M32;
++ FLOAT M33;
++ FLOAT M34;
++ FLOAT M41;
++ FLOAT M42;
++ FLOAT M43;
++ FLOAT M44;
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#else
++struct __x_ABI_CWindows_CFoundation_CNumerics_CMatrix4x4 {
++ FLOAT M11;
++ FLOAT M12;
++ FLOAT M13;
++ FLOAT M14;
++ FLOAT M21;
++ FLOAT M22;
++ FLOAT M23;
++ FLOAT M24;
++ FLOAT M31;
++ FLOAT M32;
++ FLOAT M33;
++ FLOAT M34;
++ FLOAT M41;
++ FLOAT M42;
++ FLOAT M43;
++ FLOAT M44;
++};
++#endif
++
++#ifdef __cplusplus
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace Foundation {
++ namespace Numerics {
++ struct Quaternion {
++ FLOAT X;
++ FLOAT Y;
++ FLOAT Z;
++ FLOAT W;
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#else
++struct __x_ABI_CWindows_CFoundation_CNumerics_CQuaternion {
++ FLOAT X;
++ FLOAT Y;
++ FLOAT Z;
++ FLOAT W;
++};
++#endif
++
++/* Begin additional prototypes for all interfaces */
++
++
++/* End additional prototypes */
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* __windows_foundation_numerics_h__ */
+diff --git a/mingw-w64-headers/include/windows.graphics.directx.h b/mingw-w64-headers/include/windows.graphics.directx.h
+new file mode 100644
+index 00000000..4bc4cb44
+--- /dev/null
++++ b/mingw-w64-headers/include/windows.graphics.directx.h
+@@ -0,0 +1,343 @@
++/*** Autogenerated by WIDL 4.4 from windows.graphics.directx.idl - Do not edit ***/
++
++#ifdef _WIN32
++#ifndef __REQUIRED_RPCNDR_H_VERSION__
++#define __REQUIRED_RPCNDR_H_VERSION__ 475
++#endif
++#include <rpc.h>
++#include <rpcndr.h>
++#endif
++
++#ifndef COM_NO_WINDOWS_H
++#include <windows.h>
++#include <ole2.h>
++#endif
++
++#ifndef __windows_graphics_directx_h__
++#define __windows_graphics_directx_h__
++
++/* Forward declarations */
++
++/* Headers for imported files */
++
++#include <inspectable.h>
++#include <windows.foundation.h>
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#ifdef __cplusplus
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace Graphics {
++ namespace DirectX {
++ enum DirectXAlphaMode {
++ DirectXAlphaMode_Unspecified = 0,
++ DirectXAlphaMode_Premultiplied = 1,
++ DirectXAlphaMode_Straight = 2,
++ DirectXAlphaMode_Ignore = 3
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#else
++enum __x_ABI_CWindows_CGraphics_CDirectX_CDirectXAlphaMode {
++ DirectXAlphaMode_Unspecified = 0,
++ DirectXAlphaMode_Premultiplied = 1,
++ DirectXAlphaMode_Straight = 2,
++ DirectXAlphaMode_Ignore = 3
++};
++#endif
++
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace Graphics {
++ namespace DirectX {
++typedef enum DirectXAlphaMode DirectXAlphaMode;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#ifdef __cplusplus
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace Graphics {
++ namespace DirectX {
++ enum DirectXPixelFormat {
++ DirectXPixelFormat_Unknown = 0,
++ DirectXPixelFormat_R32G32B32A32Typeless = 1,
++ DirectXPixelFormat_R32G32B32A32Float = 2,
++ DirectXPixelFormat_R32G32B32A32UInt = 3,
++ DirectXPixelFormat_R32G32B32A32Int = 4,
++ DirectXPixelFormat_R32G32B32Typeless = 5,
++ DirectXPixelFormat_R32G32B32Float = 6,
++ DirectXPixelFormat_R32G32B32UInt = 7,
++ DirectXPixelFormat_R32G32B32Int = 8,
++ DirectXPixelFormat_R16G16B16A16Typeless = 9,
++ DirectXPixelFormat_R16G16B16A16Float = 10,
++ DirectXPixelFormat_R16G16B16A16UIntNormalized = 11,
++ DirectXPixelFormat_R16G16B16A16UInt = 12,
++ DirectXPixelFormat_R16G16B16A16IntNormalized = 13,
++ DirectXPixelFormat_R16G16B16A16Int = 14,
++ DirectXPixelFormat_R32G32Typeless = 15,
++ DirectXPixelFormat_R32G32Float = 16,
++ DirectXPixelFormat_R32G32UInt = 17,
++ DirectXPixelFormat_R32G32Int = 18,
++ DirectXPixelFormat_R32G8X24Typeless = 19,
++ DirectXPixelFormat_D32FloatS8X24UInt = 20,
++ DirectXPixelFormat_R32FloatX8X24Typeless = 21,
++ DirectXPixelFormat_X32TypelessG8X24UInt = 22,
++ DirectXPixelFormat_R10G10B10A2Typeless = 23,
++ DirectXPixelFormat_R10G10B10A2UIntNormalized = 24,
++ DirectXPixelFormat_R10G10B10A2UInt = 25,
++ DirectXPixelFormat_R11G11B10Float = 26,
++ DirectXPixelFormat_R8G8B8A8Typeless = 27,
++ DirectXPixelFormat_R8G8B8A8UIntNormalized = 28,
++ DirectXPixelFormat_R8G8B8A8UIntNormalizedSrgb = 29,
++ DirectXPixelFormat_R8G8B8A8UInt = 30,
++ DirectXPixelFormat_R8G8B8A8IntNormalized = 31,
++ DirectXPixelFormat_R8G8B8A8Int = 32,
++ DirectXPixelFormat_R16G16Typeless = 33,
++ DirectXPixelFormat_R16G16Float = 34,
++ DirectXPixelFormat_R16G16UIntNormalized = 35,
++ DirectXPixelFormat_R16G16UInt = 36,
++ DirectXPixelFormat_R16G16IntNormalized = 37,
++ DirectXPixelFormat_R16G16Int = 38,
++ DirectXPixelFormat_R32Typeless = 39,
++ DirectXPixelFormat_D32Float = 40,
++ DirectXPixelFormat_R32Float = 41,
++ DirectXPixelFormat_R32UInt = 42,
++ DirectXPixelFormat_R32Int = 43,
++ DirectXPixelFormat_R24G8Typeless = 44,
++ DirectXPixelFormat_D24UIntNormalizedS8UInt = 45,
++ DirectXPixelFormat_R24UIntNormalizedX8Typeless = 46,
++ DirectXPixelFormat_X24TypelessG8UInt = 47,
++ DirectXPixelFormat_R8G8Typeless = 48,
++ DirectXPixelFormat_R8G8UIntNormalized = 49,
++ DirectXPixelFormat_R8G8UInt = 50,
++ DirectXPixelFormat_R8G8IntNormalized = 51,
++ DirectXPixelFormat_R8G8Int = 52,
++ DirectXPixelFormat_R16Typeless = 53,
++ DirectXPixelFormat_R16Float = 54,
++ DirectXPixelFormat_D16UIntNormalized = 55,
++ DirectXPixelFormat_R16UIntNormalized = 56,
++ DirectXPixelFormat_R16UInt = 57,
++ DirectXPixelFormat_R16IntNormalized = 58,
++ DirectXPixelFormat_R16Int = 59,
++ DirectXPixelFormat_R8Typeless = 60,
++ DirectXPixelFormat_R8UIntNormalized = 61,
++ DirectXPixelFormat_R8UInt = 62,
++ DirectXPixelFormat_R8IntNormalized = 63,
++ DirectXPixelFormat_R8Int = 64,
++ DirectXPixelFormat_A8UIntNormalized = 65,
++ DirectXPixelFormat_R1UIntNormalized = 66,
++ DirectXPixelFormat_R9G9B9E5SharedExponent = 67,
++ DirectXPixelFormat_R8G8B8G8UIntNormalized = 68,
++ DirectXPixelFormat_G8R8G8B8UIntNormalized = 69,
++ DirectXPixelFormat_BC1Typeless = 70,
++ DirectXPixelFormat_BC1UIntNormalized = 71,
++ DirectXPixelFormat_BC1UIntNormalizedSrgb = 72,
++ DirectXPixelFormat_BC2Typeless = 73,
++ DirectXPixelFormat_BC2UIntNormalized = 74,
++ DirectXPixelFormat_BC2UIntNormalizedSrgb = 75,
++ DirectXPixelFormat_BC3Typeless = 76,
++ DirectXPixelFormat_BC3UIntNormalized = 77,
++ DirectXPixelFormat_BC3UIntNormalizedSrgb = 78,
++ DirectXPixelFormat_BC4Typeless = 79,
++ DirectXPixelFormat_BC4UIntNormalized = 80,
++ DirectXPixelFormat_BC4IntNormalized = 81,
++ DirectXPixelFormat_BC5Typeless = 82,
++ DirectXPixelFormat_BC5UIntNormalized = 83,
++ DirectXPixelFormat_BC5IntNormalized = 84,
++ DirectXPixelFormat_B5G6R5UIntNormalized = 85,
++ DirectXPixelFormat_B5G5R5A1UIntNormalized = 86,
++ DirectXPixelFormat_B8G8R8A8UIntNormalized = 87,
++ DirectXPixelFormat_B8G8R8X8UIntNormalized = 88,
++ DirectXPixelFormat_R10G10B10XRBiasA2UIntNormalized = 89,
++ DirectXPixelFormat_B8G8R8A8Typeless = 90,
++ DirectXPixelFormat_B8G8R8A8UIntNormalizedSrgb = 91,
++ DirectXPixelFormat_B8G8R8X8Typeless = 92,
++ DirectXPixelFormat_B8G8R8X8UIntNormalizedSrgb = 93,
++ DirectXPixelFormat_BC6HTypeless = 94,
++ DirectXPixelFormat_BC6H16UnsignedFloat = 95,
++ DirectXPixelFormat_BC6H16Float = 96,
++ DirectXPixelFormat_BC7Typeless = 97,
++ DirectXPixelFormat_BC7UIntNormalized = 98,
++ DirectXPixelFormat_BC7UIntNormalizedSrgb = 99,
++ DirectXPixelFormat_Ayuv = 100,
++ DirectXPixelFormat_Y410 = 101,
++ DirectXPixelFormat_Y416 = 102,
++ DirectXPixelFormat_NV12 = 103,
++ DirectXPixelFormat_P010 = 104,
++ DirectXPixelFormat_P016 = 105,
++ DirectXPixelFormat_Opaque420 = 106,
++ DirectXPixelFormat_Yuy2 = 107,
++ DirectXPixelFormat_Y210 = 108,
++ DirectXPixelFormat_Y216 = 109,
++ DirectXPixelFormat_NV11 = 110,
++ DirectXPixelFormat_AI44 = 111,
++ DirectXPixelFormat_IA44 = 112,
++ DirectXPixelFormat_P8 = 113,
++ DirectXPixelFormat_A8P8 = 114,
++ DirectXPixelFormat_B4G4R4A4UIntNormalized = 115,
++ DirectXPixelFormat_P208 = 130,
++ DirectXPixelFormat_V208 = 131,
++ DirectXPixelFormat_V408 = 132
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#else
++enum __x_ABI_CWindows_CGraphics_CDirectX_CDirectXPixelFormat {
++ DirectXPixelFormat_Unknown = 0,
++ DirectXPixelFormat_R32G32B32A32Typeless = 1,
++ DirectXPixelFormat_R32G32B32A32Float = 2,
++ DirectXPixelFormat_R32G32B32A32UInt = 3,
++ DirectXPixelFormat_R32G32B32A32Int = 4,
++ DirectXPixelFormat_R32G32B32Typeless = 5,
++ DirectXPixelFormat_R32G32B32Float = 6,
++ DirectXPixelFormat_R32G32B32UInt = 7,
++ DirectXPixelFormat_R32G32B32Int = 8,
++ DirectXPixelFormat_R16G16B16A16Typeless = 9,
++ DirectXPixelFormat_R16G16B16A16Float = 10,
++ DirectXPixelFormat_R16G16B16A16UIntNormalized = 11,
++ DirectXPixelFormat_R16G16B16A16UInt = 12,
++ DirectXPixelFormat_R16G16B16A16IntNormalized = 13,
++ DirectXPixelFormat_R16G16B16A16Int = 14,
++ DirectXPixelFormat_R32G32Typeless = 15,
++ DirectXPixelFormat_R32G32Float = 16,
++ DirectXPixelFormat_R32G32UInt = 17,
++ DirectXPixelFormat_R32G32Int = 18,
++ DirectXPixelFormat_R32G8X24Typeless = 19,
++ DirectXPixelFormat_D32FloatS8X24UInt = 20,
++ DirectXPixelFormat_R32FloatX8X24Typeless = 21,
++ DirectXPixelFormat_X32TypelessG8X24UInt = 22,
++ DirectXPixelFormat_R10G10B10A2Typeless = 23,
++ DirectXPixelFormat_R10G10B10A2UIntNormalized = 24,
++ DirectXPixelFormat_R10G10B10A2UInt = 25,
++ DirectXPixelFormat_R11G11B10Float = 26,
++ DirectXPixelFormat_R8G8B8A8Typeless = 27,
++ DirectXPixelFormat_R8G8B8A8UIntNormalized = 28,
++ DirectXPixelFormat_R8G8B8A8UIntNormalizedSrgb = 29,
++ DirectXPixelFormat_R8G8B8A8UInt = 30,
++ DirectXPixelFormat_R8G8B8A8IntNormalized = 31,
++ DirectXPixelFormat_R8G8B8A8Int = 32,
++ DirectXPixelFormat_R16G16Typeless = 33,
++ DirectXPixelFormat_R16G16Float = 34,
++ DirectXPixelFormat_R16G16UIntNormalized = 35,
++ DirectXPixelFormat_R16G16UInt = 36,
++ DirectXPixelFormat_R16G16IntNormalized = 37,
++ DirectXPixelFormat_R16G16Int = 38,
++ DirectXPixelFormat_R32Typeless = 39,
++ DirectXPixelFormat_D32Float = 40,
++ DirectXPixelFormat_R32Float = 41,
++ DirectXPixelFormat_R32UInt = 42,
++ DirectXPixelFormat_R32Int = 43,
++ DirectXPixelFormat_R24G8Typeless = 44,
++ DirectXPixelFormat_D24UIntNormalizedS8UInt = 45,
++ DirectXPixelFormat_R24UIntNormalizedX8Typeless = 46,
++ DirectXPixelFormat_X24TypelessG8UInt = 47,
++ DirectXPixelFormat_R8G8Typeless = 48,
++ DirectXPixelFormat_R8G8UIntNormalized = 49,
++ DirectXPixelFormat_R8G8UInt = 50,
++ DirectXPixelFormat_R8G8IntNormalized = 51,
++ DirectXPixelFormat_R8G8Int = 52,
++ DirectXPixelFormat_R16Typeless = 53,
++ DirectXPixelFormat_R16Float = 54,
++ DirectXPixelFormat_D16UIntNormalized = 55,
++ DirectXPixelFormat_R16UIntNormalized = 56,
++ DirectXPixelFormat_R16UInt = 57,
++ DirectXPixelFormat_R16IntNormalized = 58,
++ DirectXPixelFormat_R16Int = 59,
++ DirectXPixelFormat_R8Typeless = 60,
++ DirectXPixelFormat_R8UIntNormalized = 61,
++ DirectXPixelFormat_R8UInt = 62,
++ DirectXPixelFormat_R8IntNormalized = 63,
++ DirectXPixelFormat_R8Int = 64,
++ DirectXPixelFormat_A8UIntNormalized = 65,
++ DirectXPixelFormat_R1UIntNormalized = 66,
++ DirectXPixelFormat_R9G9B9E5SharedExponent = 67,
++ DirectXPixelFormat_R8G8B8G8UIntNormalized = 68,
++ DirectXPixelFormat_G8R8G8B8UIntNormalized = 69,
++ DirectXPixelFormat_BC1Typeless = 70,
++ DirectXPixelFormat_BC1UIntNormalized = 71,
++ DirectXPixelFormat_BC1UIntNormalizedSrgb = 72,
++ DirectXPixelFormat_BC2Typeless = 73,
++ DirectXPixelFormat_BC2UIntNormalized = 74,
++ DirectXPixelFormat_BC2UIntNormalizedSrgb = 75,
++ DirectXPixelFormat_BC3Typeless = 76,
++ DirectXPixelFormat_BC3UIntNormalized = 77,
++ DirectXPixelFormat_BC3UIntNormalizedSrgb = 78,
++ DirectXPixelFormat_BC4Typeless = 79,
++ DirectXPixelFormat_BC4UIntNormalized = 80,
++ DirectXPixelFormat_BC4IntNormalized = 81,
++ DirectXPixelFormat_BC5Typeless = 82,
++ DirectXPixelFormat_BC5UIntNormalized = 83,
++ DirectXPixelFormat_BC5IntNormalized = 84,
++ DirectXPixelFormat_B5G6R5UIntNormalized = 85,
++ DirectXPixelFormat_B5G5R5A1UIntNormalized = 86,
++ DirectXPixelFormat_B8G8R8A8UIntNormalized = 87,
++ DirectXPixelFormat_B8G8R8X8UIntNormalized = 88,
++ DirectXPixelFormat_R10G10B10XRBiasA2UIntNormalized = 89,
++ DirectXPixelFormat_B8G8R8A8Typeless = 90,
++ DirectXPixelFormat_B8G8R8A8UIntNormalizedSrgb = 91,
++ DirectXPixelFormat_B8G8R8X8Typeless = 92,
++ DirectXPixelFormat_B8G8R8X8UIntNormalizedSrgb = 93,
++ DirectXPixelFormat_BC6HTypeless = 94,
++ DirectXPixelFormat_BC6H16UnsignedFloat = 95,
++ DirectXPixelFormat_BC6H16Float = 96,
++ DirectXPixelFormat_BC7Typeless = 97,
++ DirectXPixelFormat_BC7UIntNormalized = 98,
++ DirectXPixelFormat_BC7UIntNormalizedSrgb = 99,
++ DirectXPixelFormat_Ayuv = 100,
++ DirectXPixelFormat_Y410 = 101,
++ DirectXPixelFormat_Y416 = 102,
++ DirectXPixelFormat_NV12 = 103,
++ DirectXPixelFormat_P010 = 104,
++ DirectXPixelFormat_P016 = 105,
++ DirectXPixelFormat_Opaque420 = 106,
++ DirectXPixelFormat_Yuy2 = 107,
++ DirectXPixelFormat_Y210 = 108,
++ DirectXPixelFormat_Y216 = 109,
++ DirectXPixelFormat_NV11 = 110,
++ DirectXPixelFormat_AI44 = 111,
++ DirectXPixelFormat_IA44 = 112,
++ DirectXPixelFormat_P8 = 113,
++ DirectXPixelFormat_A8P8 = 114,
++ DirectXPixelFormat_B4G4R4A4UIntNormalized = 115,
++ DirectXPixelFormat_P208 = 130,
++ DirectXPixelFormat_V208 = 131,
++ DirectXPixelFormat_V408 = 132
++};
++#endif
++
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace Graphics {
++ namespace DirectX {
++typedef enum DirectXPixelFormat DirectXPixelFormat;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++/* Begin additional prototypes for all interfaces */
++
++
++/* End additional prototypes */
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* __windows_graphics_directx_h__ */
+diff --git a/mingw-w64-headers/include/windows.graphics.effects.h b/mingw-w64-headers/include/windows.graphics.effects.h
+new file mode 100644
+index 00000000..7c6e62a5
+--- /dev/null
++++ b/mingw-w64-headers/include/windows.graphics.effects.h
+@@ -0,0 +1,184 @@
++/*** Autogenerated by WIDL 4.4 from windows.graphics.effects.idl - Do not edit ***/
++
++#ifdef _WIN32
++#ifndef __REQUIRED_RPCNDR_H_VERSION__
++#define __REQUIRED_RPCNDR_H_VERSION__ 475
++#endif
++#include <rpc.h>
++#include <rpcndr.h>
++#endif
++
++#ifndef COM_NO_WINDOWS_H
++#include <windows.h>
++#include <ole2.h>
++#endif
++
++#ifndef __windows_graphics_effects_h__
++#define __windows_graphics_effects_h__
++
++/* Forward declarations */
++
++#ifndef ____x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_FWD_DEFINED__
++#define ____x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace Graphics {
++ namespace Effects {
++ interface IGraphicsEffect;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++/* Headers for imported files */
++
++#include <inspectable.h>
++#include <windows.foundation.h>
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/*****************************************************************************
++ * IGraphicsEffect interface
++ */
++#ifndef ____x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_INTERFACE_DEFINED__
++#define ____x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_INTERFACE_DEFINED__
++
++DEFINE_GUID(IID___x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect, 0xcb51c0ce, 0x8fe6, 0x4636, 0xb2,0x02, 0x86,0x1f,0xaa,0x07,0xd8,0xf3);
++#if defined(__cplusplus) && !defined(CINTERFACE)
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace Graphics {
++ namespace Effects {
++ MIDL_INTERFACE("cb51c0ce-8fe6-4636-b202-861faa07d8f3")
++ IGraphicsEffect : public IInspectable
++ {
++ virtual HRESULT STDMETHODCALLTYPE get_Name(
++ HSTRING *name) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE put_Name(
++ HSTRING name) = 0;
++
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#ifdef __CRT_UUID_DECL
++__CRT_UUID_DECL(ABI::Windows::Graphics::Effects::IGraphicsEffect, 0xcb51c0ce, 0x8fe6, 0x4636, 0xb2,0x02, 0x86,0x1f,0xaa,0x07,0xd8,0xf3)
++#endif
++#else
++typedef struct __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffectVtbl {
++ BEGIN_INTERFACE
++
++ /*** IUnknown methods ***/
++ HRESULT (STDMETHODCALLTYPE *QueryInterface)(
++ __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect *This,
++ REFIID riid,
++ void **ppvObject);
++
++ ULONG (STDMETHODCALLTYPE *AddRef)(
++ __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect *This);
++
++ ULONG (STDMETHODCALLTYPE *Release)(
++ __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect *This);
++
++ /*** IInspectable methods ***/
++ HRESULT (STDMETHODCALLTYPE *GetIids)(
++ __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect *This,
++ ULONG *iidCount,
++ IID **iids);
++
++ HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
++ __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect *This,
++ HSTRING *className);
++
++ HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
++ __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect *This,
++ TrustLevel *trustLevel);
++
++ /*** IGraphicsEffect methods ***/
++ HRESULT (STDMETHODCALLTYPE *get_Name)(
++ __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect *This,
++ HSTRING *name);
++
++ HRESULT (STDMETHODCALLTYPE *put_Name)(
++ __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect *This,
++ HSTRING name);
++
++ END_INTERFACE
++} __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffectVtbl;
++
++interface __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect {
++ CONST_VTBL __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffectVtbl* lpVtbl;
++};
++
++#ifdef COBJMACROS
++#ifndef WIDL_C_INLINE_WRAPPERS
++/*** IUnknown methods ***/
++#define __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
++#define __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_AddRef(This) (This)->lpVtbl->AddRef(This)
++#define __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_Release(This) (This)->lpVtbl->Release(This)
++/*** IInspectable methods ***/
++#define __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
++#define __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
++#define __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
++/*** IGraphicsEffect methods ***/
++#define __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_get_Name(This,name) (This)->lpVtbl->get_Name(This,name)
++#define __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_put_Name(This,name) (This)->lpVtbl->put_Name(This,name)
++#else
++/*** IUnknown methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_QueryInterface(__x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect* This,REFIID riid,void **ppvObject) {
++ return This->lpVtbl->QueryInterface(This,riid,ppvObject);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_AddRef(__x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect* This) {
++ return This->lpVtbl->AddRef(This);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_Release(__x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect* This) {
++ return This->lpVtbl->Release(This);
++}
++/*** IInspectable methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_GetIids(__x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect* This,ULONG *iidCount,IID **iids) {
++ return This->lpVtbl->GetIids(This,iidCount,iids);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_GetRuntimeClassName(__x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect* This,HSTRING *className) {
++ return This->lpVtbl->GetRuntimeClassName(This,className);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_GetTrustLevel(__x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect* This,TrustLevel *trustLevel) {
++ return This->lpVtbl->GetTrustLevel(This,trustLevel);
++}
++/*** IGraphicsEffect methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_get_Name(__x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect* This,HSTRING *name) {
++ return This->lpVtbl->get_Name(This,name);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_put_Name(__x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect* This,HSTRING name) {
++ return This->lpVtbl->put_Name(This,name);
++}
++#endif
++#endif
++
++#endif
++
++#endif /* ____x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect_INTERFACE_DEFINED__ */
++
++/* Begin additional prototypes for all interfaces */
++
++ULONG __RPC_USER HSTRING_UserSize (ULONG *, ULONG, HSTRING *);
++unsigned char * __RPC_USER HSTRING_UserMarshal (ULONG *, unsigned char *, HSTRING *);
++unsigned char * __RPC_USER HSTRING_UserUnmarshal(ULONG *, unsigned char *, HSTRING *);
++void __RPC_USER HSTRING_UserFree (ULONG *, HSTRING *);
++
++/* End additional prototypes */
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* __windows_graphics_effects_h__ */
+diff --git a/mingw-w64-headers/include/windows.ui.composition.h b/mingw-w64-headers/include/windows.ui.composition.h
+new file mode 100644
+index 00000000..9410a3ce
+--- /dev/null
++++ b/mingw-w64-headers/include/windows.ui.composition.h
+@@ -0,0 +1,3212 @@
++/*** Autogenerated by WIDL 4.4 from windows.ui.composition.idl - Do not edit ***/
++
++#ifdef _WIN32
++#ifndef __REQUIRED_RPCNDR_H_VERSION__
++#define __REQUIRED_RPCNDR_H_VERSION__ 475
++#endif
++#include <rpc.h>
++#include <rpcndr.h>
++#endif
++
++#ifndef COM_NO_WINDOWS_H
++#include <windows.h>
++#include <ole2.h>
++#endif
++
++#ifndef __windows_ui_composition_h__
++#define __windows_ui_composition_h__
++
++/* Forward declarations */
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionBrush_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CICompositionBrush_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionBrush __x_ABI_CWindows_CUI_CComposition_CICompositionBrush;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface ICompositionBrush;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionSurface_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CICompositionSurface_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionSurface __x_ABI_CWindows_CUI_CComposition_CICompositionSurface;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface ICompositionSurface;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface ICompositionSurfaceBrush;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionBrush_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionBrush_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CCompositionBrush __x_ABI_CWindows_CUI_CComposition_CCompositionBrush;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface CompositionBrush;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CISpriteVisual_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CISpriteVisual_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CISpriteVisual __x_ABI_CWindows_CUI_CComposition_CISpriteVisual;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface ISpriteVisual;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CSpriteVisual_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CSpriteVisual_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CSpriteVisual __x_ABI_CWindows_CUI_CComposition_CSpriteVisual;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface SpriteVisual;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionClip_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionClip_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CCompositionClip __x_ABI_CWindows_CUI_CComposition_CCompositionClip;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface CompositionClip;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CContainerVisual_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CContainerVisual_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CContainerVisual __x_ABI_CWindows_CUI_CComposition_CContainerVisual;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface ContainerVisual;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CIVisual_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CIVisual_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CIVisual __x_ABI_CWindows_CUI_CComposition_CIVisual;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface IVisual;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositor_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CCompositor_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CCompositor __x_ABI_CWindows_CUI_CComposition_CCompositor;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface Compositor;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface CompositionPropertySet;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionAnimation_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionAnimation_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CCompositionAnimation __x_ABI_CWindows_CUI_CComposition_CCompositionAnimation;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface CompositionAnimation;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionObject_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CICompositionObject_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionObject __x_ABI_CWindows_CUI_CComposition_CICompositionObject;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface ICompositionObject;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface ColorKeyFrameAnimation;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface CompositionColorBrush;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface CubicBezierEasingFunction;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositor_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CICompositor_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositor __x_ABI_CWindows_CUI_CComposition_CICompositor;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface ICompositor;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface ICompositionGraphicsDevice;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++/* Headers for imported files */
++
++#include <inspectable.h>
++#include <windows.foundation.h>
++#include <windows.foundation.numerics.h>
++#include <windows.graphics.directx.h>
++#include <windows.graphics.effects.h>
++#include <windows.ui.h>
++#include <windows.ui.core.h>
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#ifdef __cplusplus
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ enum CompositionBitmapInterpolationMode {
++ CompositionBitmapInterpolationMode_NearestNeighbor = 0,
++ CompositionBitmapInterpolationMode_Linear = 1
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#else
++enum __x_ABI_CWindows_CUI_CComposition_CCompositionBitmapInterpolationMode {
++ CompositionBitmapInterpolationMode_NearestNeighbor = 0,
++ CompositionBitmapInterpolationMode_Linear = 1
++};
++#endif
++
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++typedef enum CompositionBitmapInterpolationMode CompositionBitmapInterpolationMode;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#ifdef __cplusplus
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ enum CompositionStretch {
++ CompositionStretch_None = 0,
++ CompositionStretch_Fill = 1,
++ CompositionStretch_Uniform = 2,
++ CompositionStretch_UniformToFill = 3
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#else
++enum __x_ABI_CWindows_CUI_CComposition_CCompositionStretch {
++ CompositionStretch_None = 0,
++ CompositionStretch_Fill = 1,
++ CompositionStretch_Uniform = 2,
++ CompositionStretch_UniformToFill = 3
++};
++#endif
++
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++typedef enum CompositionStretch CompositionStretch;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#ifdef __cplusplus
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ enum CompositionBackfaceVisibility {
++ CompositionBackfaceVisibility_Inherit = 0,
++ CompositionBackfaceVisibility_Visible = 1,
++ CompositionBackfaceVisibility_Hidden = 2
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#else
++enum __x_ABI_CWindows_CUI_CComposition_CCompositionBackfaceVisibility {
++ CompositionBackfaceVisibility_Inherit = 0,
++ CompositionBackfaceVisibility_Visible = 1,
++ CompositionBackfaceVisibility_Hidden = 2
++};
++#endif
++
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++typedef enum CompositionBackfaceVisibility CompositionBackfaceVisibility;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#ifdef __cplusplus
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ enum CompositionBorderMode {
++ CompositionBorderMode_Inherit = 0,
++ CompositionBorderMode_Soft = 1,
++ CompositionBorderMode_Hard = 2
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#else
++enum __x_ABI_CWindows_CUI_CComposition_CCompositionBorderMode {
++ CompositionBorderMode_Inherit = 0,
++ CompositionBorderMode_Soft = 1,
++ CompositionBorderMode_Hard = 2
++};
++#endif
++
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++typedef enum CompositionBorderMode CompositionBorderMode;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#ifdef __cplusplus
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ enum CompositionCompositeMode {
++ CompositionCompositeMode_Inherit = 0,
++ CompositionCompositeMode_SourceOver = 1,
++ CompositionCompositeMode_DestinationInvert = 2,
++ CompositionCompositeMode_MinBlend = 3
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#else
++enum __x_ABI_CWindows_CUI_CComposition_CCompositionCompositeMode {
++ CompositionCompositeMode_Inherit = 0,
++ CompositionCompositeMode_SourceOver = 1,
++ CompositionCompositeMode_DestinationInvert = 2,
++ CompositionCompositeMode_MinBlend = 3
++};
++#endif
++
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++typedef enum CompositionCompositeMode CompositionCompositeMode;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#ifdef __cplusplus
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ enum CompositionBatchTypes {
++ CompositionBatchTypes_None = 0x0,
++ CompositionBatchTypes_Animation = 0x1,
++ CompositionBatchTypes_Effect = 0x2
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#else
++enum __x_ABI_CWindows_CUI_CComposition_CCompositionBatchTypes {
++ CompositionBatchTypes_None = 0x0,
++ CompositionBatchTypes_Animation = 0x1,
++ CompositionBatchTypes_Effect = 0x2
++};
++#endif
++
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++typedef enum CompositionBatchTypes CompositionBatchTypes;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++/*****************************************************************************
++ * ICompositionBrush interface
++ */
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionBrush_INTERFACE_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CICompositionBrush_INTERFACE_DEFINED__
++
++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CICompositionBrush, 0xab0d7608, 0x30c0, 0x40e9, 0xb5,0x68, 0xb6,0x0a,0x6b,0xd1,0xfb,0x46);
++#if defined(__cplusplus) && !defined(CINTERFACE)
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ MIDL_INTERFACE("ab0d7608-30c0-40e9-b568-b60a6bd1fb46")
++ ICompositionBrush : public IInspectable
++ {
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#ifdef __CRT_UUID_DECL
++__CRT_UUID_DECL(ABI::Windows::UI::Composition::ICompositionBrush, 0xab0d7608, 0x30c0, 0x40e9, 0xb5,0x68, 0xb6,0x0a,0x6b,0xd1,0xfb,0x46)
++#endif
++#else
++typedef struct __x_ABI_CWindows_CUI_CComposition_CICompositionBrushVtbl {
++ BEGIN_INTERFACE
++
++ /*** IUnknown methods ***/
++ HRESULT (STDMETHODCALLTYPE *QueryInterface)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionBrush *This,
++ REFIID riid,
++ void **ppvObject);
++
++ ULONG (STDMETHODCALLTYPE *AddRef)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionBrush *This);
++
++ ULONG (STDMETHODCALLTYPE *Release)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionBrush *This);
++
++ /*** IInspectable methods ***/
++ HRESULT (STDMETHODCALLTYPE *GetIids)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionBrush *This,
++ ULONG *iidCount,
++ IID **iids);
++
++ HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionBrush *This,
++ HSTRING *className);
++
++ HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionBrush *This,
++ TrustLevel *trustLevel);
++
++ END_INTERFACE
++} __x_ABI_CWindows_CUI_CComposition_CICompositionBrushVtbl;
++
++interface __x_ABI_CWindows_CUI_CComposition_CICompositionBrush {
++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CICompositionBrushVtbl* lpVtbl;
++};
++
++#ifdef COBJMACROS
++#ifndef WIDL_C_INLINE_WRAPPERS
++/*** IUnknown methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_AddRef(This) (This)->lpVtbl->AddRef(This)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_Release(This) (This)->lpVtbl->Release(This)
++/*** IInspectable methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
++#else
++/*** IUnknown methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CICompositionBrush* This,REFIID riid,void **ppvObject) {
++ return This->lpVtbl->QueryInterface(This,riid,ppvObject);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionBrush* This) {
++ return This->lpVtbl->AddRef(This);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionBrush* This) {
++ return This->lpVtbl->Release(This);
++}
++/*** IInspectable methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_GetIids(__x_ABI_CWindows_CUI_CComposition_CICompositionBrush* This,ULONG *iidCount,IID **iids) {
++ return This->lpVtbl->GetIids(This,iidCount,iids);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CICompositionBrush* This,HSTRING *className) {
++ return This->lpVtbl->GetRuntimeClassName(This,className);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CICompositionBrush* This,TrustLevel *trustLevel) {
++ return This->lpVtbl->GetTrustLevel(This,trustLevel);
++}
++#endif
++#endif
++
++#endif
++
++#endif /* ____x_ABI_CWindows_CUI_CComposition_CICompositionBrush_INTERFACE_DEFINED__ */
++
++/*****************************************************************************
++ * ICompositionSurface interface
++ */
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionSurface_INTERFACE_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CICompositionSurface_INTERFACE_DEFINED__
++
++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CICompositionSurface, 0x1527540d, 0x42c7, 0x47a6, 0xa4,0x08, 0x66,0x8f,0x79,0xa9,0x0d,0xfb);
++#if defined(__cplusplus) && !defined(CINTERFACE)
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ MIDL_INTERFACE("1527540d-42c7-47a6-a408-668f79a90dfb")
++ ICompositionSurface : public IInspectable
++ {
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#ifdef __CRT_UUID_DECL
++__CRT_UUID_DECL(ABI::Windows::UI::Composition::ICompositionSurface, 0x1527540d, 0x42c7, 0x47a6, 0xa4,0x08, 0x66,0x8f,0x79,0xa9,0x0d,0xfb)
++#endif
++#else
++typedef struct __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceVtbl {
++ BEGIN_INTERFACE
++
++ /*** IUnknown methods ***/
++ HRESULT (STDMETHODCALLTYPE *QueryInterface)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurface *This,
++ REFIID riid,
++ void **ppvObject);
++
++ ULONG (STDMETHODCALLTYPE *AddRef)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurface *This);
++
++ ULONG (STDMETHODCALLTYPE *Release)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurface *This);
++
++ /*** IInspectable methods ***/
++ HRESULT (STDMETHODCALLTYPE *GetIids)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurface *This,
++ ULONG *iidCount,
++ IID **iids);
++
++ HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurface *This,
++ HSTRING *className);
++
++ HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurface *This,
++ TrustLevel *trustLevel);
++
++ END_INTERFACE
++} __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceVtbl;
++
++interface __x_ABI_CWindows_CUI_CComposition_CICompositionSurface {
++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceVtbl* lpVtbl;
++};
++
++#ifdef COBJMACROS
++#ifndef WIDL_C_INLINE_WRAPPERS
++/*** IUnknown methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_AddRef(This) (This)->lpVtbl->AddRef(This)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_Release(This) (This)->lpVtbl->Release(This)
++/*** IInspectable methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
++#else
++/*** IUnknown methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CICompositionSurface* This,REFIID riid,void **ppvObject) {
++ return This->lpVtbl->QueryInterface(This,riid,ppvObject);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionSurface* This) {
++ return This->lpVtbl->AddRef(This);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionSurface* This) {
++ return This->lpVtbl->Release(This);
++}
++/*** IInspectable methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_GetIids(__x_ABI_CWindows_CUI_CComposition_CICompositionSurface* This,ULONG *iidCount,IID **iids) {
++ return This->lpVtbl->GetIids(This,iidCount,iids);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CICompositionSurface* This,HSTRING *className) {
++ return This->lpVtbl->GetRuntimeClassName(This,className);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CICompositionSurface* This,TrustLevel *trustLevel) {
++ return This->lpVtbl->GetTrustLevel(This,trustLevel);
++}
++#endif
++#endif
++
++#endif
++
++#endif /* ____x_ABI_CWindows_CUI_CComposition_CICompositionSurface_INTERFACE_DEFINED__ */
++
++/*****************************************************************************
++ * ICompositionSurfaceBrush interface
++ */
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_INTERFACE_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_INTERFACE_DEFINED__
++
++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush, 0xad016d79, 0x1e4c, 0x4c0d, 0x9c,0x29, 0x83,0x33,0x8c,0x87,0xc1,0x62);
++#if defined(__cplusplus) && !defined(CINTERFACE)
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ MIDL_INTERFACE("ad016d79-1e4c-4c0d-9c29-83338c87c162")
++ ICompositionSurfaceBrush : public IInspectable
++ {
++ virtual HRESULT STDMETHODCALLTYPE get_BitmapInterpolationMode(
++ ABI::Windows::UI::Composition::CompositionBitmapInterpolationMode *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE put_BitmapInterpolationMode(
++ ABI::Windows::UI::Composition::CompositionBitmapInterpolationMode value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE get_HorizontalAlignmentRatio(
++ FLOAT *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE put_HorizontalAlignmentRatio(
++ FLOAT value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE get_Stretch(
++ ABI::Windows::UI::Composition::CompositionStretch *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE put_Stretch(
++ ABI::Windows::UI::Composition::CompositionStretch value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE get_Surface(
++ ABI::Windows::UI::Composition::ICompositionSurface **value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE put_Surface(
++ ABI::Windows::UI::Composition::ICompositionSurface *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE get_VerticalAlignmentRatio(
++ FLOAT *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE put_VerticalAlignmentRatio(
++ FLOAT value) = 0;
++
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#ifdef __CRT_UUID_DECL
++__CRT_UUID_DECL(ABI::Windows::UI::Composition::ICompositionSurfaceBrush, 0xad016d79, 0x1e4c, 0x4c0d, 0x9c,0x29, 0x83,0x33,0x8c,0x87,0xc1,0x62)
++#endif
++#else
++typedef struct __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrushVtbl {
++ BEGIN_INTERFACE
++
++ /*** IUnknown methods ***/
++ HRESULT (STDMETHODCALLTYPE *QueryInterface)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This,
++ REFIID riid,
++ void **ppvObject);
++
++ ULONG (STDMETHODCALLTYPE *AddRef)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This);
++
++ ULONG (STDMETHODCALLTYPE *Release)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This);
++
++ /*** IInspectable methods ***/
++ HRESULT (STDMETHODCALLTYPE *GetIids)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This,
++ ULONG *iidCount,
++ IID **iids);
++
++ HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This,
++ HSTRING *className);
++
++ HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This,
++ TrustLevel *trustLevel);
++
++ /*** ICompositionSurfaceBrush methods ***/
++ HRESULT (STDMETHODCALLTYPE *get_BitmapInterpolationMode)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionBitmapInterpolationMode *value);
++
++ HRESULT (STDMETHODCALLTYPE *put_BitmapInterpolationMode)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionBitmapInterpolationMode value);
++
++ HRESULT (STDMETHODCALLTYPE *get_HorizontalAlignmentRatio)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This,
++ FLOAT *value);
++
++ HRESULT (STDMETHODCALLTYPE *put_HorizontalAlignmentRatio)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This,
++ FLOAT value);
++
++ HRESULT (STDMETHODCALLTYPE *get_Stretch)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionStretch *value);
++
++ HRESULT (STDMETHODCALLTYPE *put_Stretch)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionStretch value);
++
++ HRESULT (STDMETHODCALLTYPE *get_Surface)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This,
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurface **value);
++
++ HRESULT (STDMETHODCALLTYPE *put_Surface)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This,
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurface *value);
++
++ HRESULT (STDMETHODCALLTYPE *get_VerticalAlignmentRatio)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This,
++ FLOAT *value);
++
++ HRESULT (STDMETHODCALLTYPE *put_VerticalAlignmentRatio)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This,
++ FLOAT value);
++
++ END_INTERFACE
++} __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrushVtbl;
++
++interface __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush {
++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrushVtbl* lpVtbl;
++};
++
++#ifdef COBJMACROS
++#ifndef WIDL_C_INLINE_WRAPPERS
++/*** IUnknown methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_AddRef(This) (This)->lpVtbl->AddRef(This)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_Release(This) (This)->lpVtbl->Release(This)
++/*** IInspectable methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
++/*** ICompositionSurfaceBrush methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_BitmapInterpolationMode(This,value) (This)->lpVtbl->get_BitmapInterpolationMode(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_BitmapInterpolationMode(This,value) (This)->lpVtbl->put_BitmapInterpolationMode(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_HorizontalAlignmentRatio(This,value) (This)->lpVtbl->get_HorizontalAlignmentRatio(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_HorizontalAlignmentRatio(This,value) (This)->lpVtbl->put_HorizontalAlignmentRatio(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_Stretch(This,value) (This)->lpVtbl->get_Stretch(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_Stretch(This,value) (This)->lpVtbl->put_Stretch(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_Surface(This,value) (This)->lpVtbl->get_Surface(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_Surface(This,value) (This)->lpVtbl->put_Surface(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_VerticalAlignmentRatio(This,value) (This)->lpVtbl->get_VerticalAlignmentRatio(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_VerticalAlignmentRatio(This,value) (This)->lpVtbl->put_VerticalAlignmentRatio(This,value)
++#else
++/*** IUnknown methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,REFIID riid,void **ppvObject) {
++ return This->lpVtbl->QueryInterface(This,riid,ppvObject);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This) {
++ return This->lpVtbl->AddRef(This);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This) {
++ return This->lpVtbl->Release(This);
++}
++/*** IInspectable methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_GetIids(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,ULONG *iidCount,IID **iids) {
++ return This->lpVtbl->GetIids(This,iidCount,iids);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,HSTRING *className) {
++ return This->lpVtbl->GetRuntimeClassName(This,className);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,TrustLevel *trustLevel) {
++ return This->lpVtbl->GetTrustLevel(This,trustLevel);
++}
++/*** ICompositionSurfaceBrush methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_BitmapInterpolationMode(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,__x_ABI_CWindows_CUI_CComposition_CCompositionBitmapInterpolationMode *value) {
++ return This->lpVtbl->get_BitmapInterpolationMode(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_BitmapInterpolationMode(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,__x_ABI_CWindows_CUI_CComposition_CCompositionBitmapInterpolationMode value) {
++ return This->lpVtbl->put_BitmapInterpolationMode(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_HorizontalAlignmentRatio(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,FLOAT *value) {
++ return This->lpVtbl->get_HorizontalAlignmentRatio(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_HorizontalAlignmentRatio(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,FLOAT value) {
++ return This->lpVtbl->put_HorizontalAlignmentRatio(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_Stretch(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,__x_ABI_CWindows_CUI_CComposition_CCompositionStretch *value) {
++ return This->lpVtbl->get_Stretch(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_Stretch(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,__x_ABI_CWindows_CUI_CComposition_CCompositionStretch value) {
++ return This->lpVtbl->put_Stretch(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_Surface(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,__x_ABI_CWindows_CUI_CComposition_CICompositionSurface **value) {
++ return This->lpVtbl->get_Surface(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_Surface(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,__x_ABI_CWindows_CUI_CComposition_CICompositionSurface *value) {
++ return This->lpVtbl->put_Surface(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_VerticalAlignmentRatio(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,FLOAT *value) {
++ return This->lpVtbl->get_VerticalAlignmentRatio(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_VerticalAlignmentRatio(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,FLOAT value) {
++ return This->lpVtbl->put_VerticalAlignmentRatio(This,value);
++}
++#endif
++#endif
++
++#endif
++
++#endif /* ____x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_INTERFACE_DEFINED__ */
++
++/*****************************************************************************
++ * CompositionBrush interface
++ */
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionBrush_INTERFACE_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionBrush_INTERFACE_DEFINED__
++
++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CCompositionBrush, 0x08e05581, 0x1ad1, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3c);
++#if defined(__cplusplus) && !defined(CINTERFACE)
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ MIDL_INTERFACE("08e05581-1ad1-4f97-9666-402d76e4233c")
++ CompositionBrush : public IUnknown
++ {
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#ifdef __CRT_UUID_DECL
++__CRT_UUID_DECL(ABI::Windows::UI::Composition::CompositionBrush, 0x08e05581, 0x1ad1, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3c)
++#endif
++#else
++typedef struct __x_ABI_CWindows_CUI_CComposition_CCompositionBrushVtbl {
++ BEGIN_INTERFACE
++
++ /*** IUnknown methods ***/
++ HRESULT (STDMETHODCALLTYPE *QueryInterface)(
++ __x_ABI_CWindows_CUI_CComposition_CCompositionBrush *This,
++ REFIID riid,
++ void **ppvObject);
++
++ ULONG (STDMETHODCALLTYPE *AddRef)(
++ __x_ABI_CWindows_CUI_CComposition_CCompositionBrush *This);
++
++ ULONG (STDMETHODCALLTYPE *Release)(
++ __x_ABI_CWindows_CUI_CComposition_CCompositionBrush *This);
++
++ END_INTERFACE
++} __x_ABI_CWindows_CUI_CComposition_CCompositionBrushVtbl;
++
++interface __x_ABI_CWindows_CUI_CComposition_CCompositionBrush {
++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CCompositionBrushVtbl* lpVtbl;
++};
++
++#ifdef COBJMACROS
++#ifndef WIDL_C_INLINE_WRAPPERS
++/*** IUnknown methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CCompositionBrush_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
++#define __x_ABI_CWindows_CUI_CComposition_CCompositionBrush_AddRef(This) (This)->lpVtbl->AddRef(This)
++#define __x_ABI_CWindows_CUI_CComposition_CCompositionBrush_Release(This) (This)->lpVtbl->Release(This)
++#else
++/*** IUnknown methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CCompositionBrush_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CCompositionBrush* This,REFIID riid,void **ppvObject) {
++ return This->lpVtbl->QueryInterface(This,riid,ppvObject);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CCompositionBrush_AddRef(__x_ABI_CWindows_CUI_CComposition_CCompositionBrush* This) {
++ return This->lpVtbl->AddRef(This);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CCompositionBrush_Release(__x_ABI_CWindows_CUI_CComposition_CCompositionBrush* This) {
++ return This->lpVtbl->Release(This);
++}
++#endif
++#endif
++
++#endif
++
++#endif /* ____x_ABI_CWindows_CUI_CComposition_CCompositionBrush_INTERFACE_DEFINED__ */
++
++/*****************************************************************************
++ * ISpriteVisual interface
++ */
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CISpriteVisual_INTERFACE_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CISpriteVisual_INTERFACE_DEFINED__
++
++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CISpriteVisual, 0x08e05581, 0x1ad1, 0x4f97, 0x97,0x57, 0x40,0x2d,0x76,0xe4,0x23,0x3b);
++#if defined(__cplusplus) && !defined(CINTERFACE)
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ MIDL_INTERFACE("08e05581-1ad1-4f97-9757-402d76e4233b")
++ ISpriteVisual : public IInspectable
++ {
++ virtual HRESULT STDMETHODCALLTYPE get_Brush(
++ ABI::Windows::UI::Composition::CompositionBrush **value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE put_Brush(
++ ABI::Windows::UI::Composition::ICompositionBrush *value) = 0;
++
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#ifdef __CRT_UUID_DECL
++__CRT_UUID_DECL(ABI::Windows::UI::Composition::ISpriteVisual, 0x08e05581, 0x1ad1, 0x4f97, 0x97,0x57, 0x40,0x2d,0x76,0xe4,0x23,0x3b)
++#endif
++#else
++typedef struct __x_ABI_CWindows_CUI_CComposition_CISpriteVisualVtbl {
++ BEGIN_INTERFACE
++
++ /*** IUnknown methods ***/
++ HRESULT (STDMETHODCALLTYPE *QueryInterface)(
++ __x_ABI_CWindows_CUI_CComposition_CISpriteVisual *This,
++ REFIID riid,
++ void **ppvObject);
++
++ ULONG (STDMETHODCALLTYPE *AddRef)(
++ __x_ABI_CWindows_CUI_CComposition_CISpriteVisual *This);
++
++ ULONG (STDMETHODCALLTYPE *Release)(
++ __x_ABI_CWindows_CUI_CComposition_CISpriteVisual *This);
++
++ /*** IInspectable methods ***/
++ HRESULT (STDMETHODCALLTYPE *GetIids)(
++ __x_ABI_CWindows_CUI_CComposition_CISpriteVisual *This,
++ ULONG *iidCount,
++ IID **iids);
++
++ HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
++ __x_ABI_CWindows_CUI_CComposition_CISpriteVisual *This,
++ HSTRING *className);
++
++ HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
++ __x_ABI_CWindows_CUI_CComposition_CISpriteVisual *This,
++ TrustLevel *trustLevel);
++
++ /*** ISpriteVisual methods ***/
++ HRESULT (STDMETHODCALLTYPE *get_Brush)(
++ __x_ABI_CWindows_CUI_CComposition_CISpriteVisual *This,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionBrush **value);
++
++ HRESULT (STDMETHODCALLTYPE *put_Brush)(
++ __x_ABI_CWindows_CUI_CComposition_CISpriteVisual *This,
++ __x_ABI_CWindows_CUI_CComposition_CICompositionBrush *value);
++
++ END_INTERFACE
++} __x_ABI_CWindows_CUI_CComposition_CISpriteVisualVtbl;
++
++interface __x_ABI_CWindows_CUI_CComposition_CISpriteVisual {
++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CISpriteVisualVtbl* lpVtbl;
++};
++
++#ifdef COBJMACROS
++#ifndef WIDL_C_INLINE_WRAPPERS
++/*** IUnknown methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
++#define __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_AddRef(This) (This)->lpVtbl->AddRef(This)
++#define __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_Release(This) (This)->lpVtbl->Release(This)
++/*** IInspectable methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
++#define __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
++#define __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
++/*** ISpriteVisual methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_get_Brush(This,value) (This)->lpVtbl->get_Brush(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_put_Brush(This,value) (This)->lpVtbl->put_Brush(This,value)
++#else
++/*** IUnknown methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CISpriteVisual* This,REFIID riid,void **ppvObject) {
++ return This->lpVtbl->QueryInterface(This,riid,ppvObject);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_AddRef(__x_ABI_CWindows_CUI_CComposition_CISpriteVisual* This) {
++ return This->lpVtbl->AddRef(This);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_Release(__x_ABI_CWindows_CUI_CComposition_CISpriteVisual* This) {
++ return This->lpVtbl->Release(This);
++}
++/*** IInspectable methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_GetIids(__x_ABI_CWindows_CUI_CComposition_CISpriteVisual* This,ULONG *iidCount,IID **iids) {
++ return This->lpVtbl->GetIids(This,iidCount,iids);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CISpriteVisual* This,HSTRING *className) {
++ return This->lpVtbl->GetRuntimeClassName(This,className);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CISpriteVisual* This,TrustLevel *trustLevel) {
++ return This->lpVtbl->GetTrustLevel(This,trustLevel);
++}
++/*** ISpriteVisual methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_get_Brush(__x_ABI_CWindows_CUI_CComposition_CISpriteVisual* This,__x_ABI_CWindows_CUI_CComposition_CCompositionBrush **value) {
++ return This->lpVtbl->get_Brush(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_put_Brush(__x_ABI_CWindows_CUI_CComposition_CISpriteVisual* This,__x_ABI_CWindows_CUI_CComposition_CICompositionBrush *value) {
++ return This->lpVtbl->put_Brush(This,value);
++}
++#endif
++#endif
++
++#endif
++
++#endif /* ____x_ABI_CWindows_CUI_CComposition_CISpriteVisual_INTERFACE_DEFINED__ */
++
++/*****************************************************************************
++ * SpriteVisual interface
++ */
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CSpriteVisual_INTERFACE_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CSpriteVisual_INTERFACE_DEFINED__
++
++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CSpriteVisual, 0x08e05581, 0x1ad1, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b);
++#if defined(__cplusplus) && !defined(CINTERFACE)
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ MIDL_INTERFACE("08e05581-1ad1-4f97-9666-402d76e4233b")
++ SpriteVisual : public IUnknown
++ {
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#ifdef __CRT_UUID_DECL
++__CRT_UUID_DECL(ABI::Windows::UI::Composition::SpriteVisual, 0x08e05581, 0x1ad1, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b)
++#endif
++#else
++typedef struct __x_ABI_CWindows_CUI_CComposition_CSpriteVisualVtbl {
++ BEGIN_INTERFACE
++
++ /*** IUnknown methods ***/
++ HRESULT (STDMETHODCALLTYPE *QueryInterface)(
++ __x_ABI_CWindows_CUI_CComposition_CSpriteVisual *This,
++ REFIID riid,
++ void **ppvObject);
++
++ ULONG (STDMETHODCALLTYPE *AddRef)(
++ __x_ABI_CWindows_CUI_CComposition_CSpriteVisual *This);
++
++ ULONG (STDMETHODCALLTYPE *Release)(
++ __x_ABI_CWindows_CUI_CComposition_CSpriteVisual *This);
++
++ END_INTERFACE
++} __x_ABI_CWindows_CUI_CComposition_CSpriteVisualVtbl;
++
++interface __x_ABI_CWindows_CUI_CComposition_CSpriteVisual {
++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CSpriteVisualVtbl* lpVtbl;
++};
++
++#ifdef COBJMACROS
++#ifndef WIDL_C_INLINE_WRAPPERS
++/*** IUnknown methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CSpriteVisual_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
++#define __x_ABI_CWindows_CUI_CComposition_CSpriteVisual_AddRef(This) (This)->lpVtbl->AddRef(This)
++#define __x_ABI_CWindows_CUI_CComposition_CSpriteVisual_Release(This) (This)->lpVtbl->Release(This)
++#else
++/*** IUnknown methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CSpriteVisual_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CSpriteVisual* This,REFIID riid,void **ppvObject) {
++ return This->lpVtbl->QueryInterface(This,riid,ppvObject);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CSpriteVisual_AddRef(__x_ABI_CWindows_CUI_CComposition_CSpriteVisual* This) {
++ return This->lpVtbl->AddRef(This);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CSpriteVisual_Release(__x_ABI_CWindows_CUI_CComposition_CSpriteVisual* This) {
++ return This->lpVtbl->Release(This);
++}
++#endif
++#endif
++
++#endif
++
++#endif /* ____x_ABI_CWindows_CUI_CComposition_CSpriteVisual_INTERFACE_DEFINED__ */
++
++/*****************************************************************************
++ * CompositionClip interface
++ */
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionClip_INTERFACE_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionClip_INTERFACE_DEFINED__
++
++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CCompositionClip, 0x18e05581, 0x1ad1, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b);
++#if defined(__cplusplus) && !defined(CINTERFACE)
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ MIDL_INTERFACE("18e05581-1ad1-4f97-9666-402d76e4233b")
++ CompositionClip : public IUnknown
++ {
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#ifdef __CRT_UUID_DECL
++__CRT_UUID_DECL(ABI::Windows::UI::Composition::CompositionClip, 0x18e05581, 0x1ad1, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b)
++#endif
++#else
++typedef struct __x_ABI_CWindows_CUI_CComposition_CCompositionClipVtbl {
++ BEGIN_INTERFACE
++
++ /*** IUnknown methods ***/
++ HRESULT (STDMETHODCALLTYPE *QueryInterface)(
++ __x_ABI_CWindows_CUI_CComposition_CCompositionClip *This,
++ REFIID riid,
++ void **ppvObject);
++
++ ULONG (STDMETHODCALLTYPE *AddRef)(
++ __x_ABI_CWindows_CUI_CComposition_CCompositionClip *This);
++
++ ULONG (STDMETHODCALLTYPE *Release)(
++ __x_ABI_CWindows_CUI_CComposition_CCompositionClip *This);
++
++ END_INTERFACE
++} __x_ABI_CWindows_CUI_CComposition_CCompositionClipVtbl;
++
++interface __x_ABI_CWindows_CUI_CComposition_CCompositionClip {
++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CCompositionClipVtbl* lpVtbl;
++};
++
++#ifdef COBJMACROS
++#ifndef WIDL_C_INLINE_WRAPPERS
++/*** IUnknown methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CCompositionClip_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
++#define __x_ABI_CWindows_CUI_CComposition_CCompositionClip_AddRef(This) (This)->lpVtbl->AddRef(This)
++#define __x_ABI_CWindows_CUI_CComposition_CCompositionClip_Release(This) (This)->lpVtbl->Release(This)
++#else
++/*** IUnknown methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CCompositionClip_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CCompositionClip* This,REFIID riid,void **ppvObject) {
++ return This->lpVtbl->QueryInterface(This,riid,ppvObject);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CCompositionClip_AddRef(__x_ABI_CWindows_CUI_CComposition_CCompositionClip* This) {
++ return This->lpVtbl->AddRef(This);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CCompositionClip_Release(__x_ABI_CWindows_CUI_CComposition_CCompositionClip* This) {
++ return This->lpVtbl->Release(This);
++}
++#endif
++#endif
++
++#endif
++
++#endif /* ____x_ABI_CWindows_CUI_CComposition_CCompositionClip_INTERFACE_DEFINED__ */
++
++/*****************************************************************************
++ * ContainerVisual interface
++ */
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CContainerVisual_INTERFACE_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CContainerVisual_INTERFACE_DEFINED__
++
++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CContainerVisual, 0x28e05581, 0x1ad1, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b);
++#if defined(__cplusplus) && !defined(CINTERFACE)
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ MIDL_INTERFACE("28e05581-1ad1-4f97-9666-402d76e4233b")
++ ContainerVisual : public IUnknown
++ {
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#ifdef __CRT_UUID_DECL
++__CRT_UUID_DECL(ABI::Windows::UI::Composition::ContainerVisual, 0x28e05581, 0x1ad1, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b)
++#endif
++#else
++typedef struct __x_ABI_CWindows_CUI_CComposition_CContainerVisualVtbl {
++ BEGIN_INTERFACE
++
++ /*** IUnknown methods ***/
++ HRESULT (STDMETHODCALLTYPE *QueryInterface)(
++ __x_ABI_CWindows_CUI_CComposition_CContainerVisual *This,
++ REFIID riid,
++ void **ppvObject);
++
++ ULONG (STDMETHODCALLTYPE *AddRef)(
++ __x_ABI_CWindows_CUI_CComposition_CContainerVisual *This);
++
++ ULONG (STDMETHODCALLTYPE *Release)(
++ __x_ABI_CWindows_CUI_CComposition_CContainerVisual *This);
++
++ END_INTERFACE
++} __x_ABI_CWindows_CUI_CComposition_CContainerVisualVtbl;
++
++interface __x_ABI_CWindows_CUI_CComposition_CContainerVisual {
++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CContainerVisualVtbl* lpVtbl;
++};
++
++#ifdef COBJMACROS
++#ifndef WIDL_C_INLINE_WRAPPERS
++/*** IUnknown methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CContainerVisual_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
++#define __x_ABI_CWindows_CUI_CComposition_CContainerVisual_AddRef(This) (This)->lpVtbl->AddRef(This)
++#define __x_ABI_CWindows_CUI_CComposition_CContainerVisual_Release(This) (This)->lpVtbl->Release(This)
++#else
++/*** IUnknown methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CContainerVisual_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CContainerVisual* This,REFIID riid,void **ppvObject) {
++ return This->lpVtbl->QueryInterface(This,riid,ppvObject);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CContainerVisual_AddRef(__x_ABI_CWindows_CUI_CComposition_CContainerVisual* This) {
++ return This->lpVtbl->AddRef(This);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CContainerVisual_Release(__x_ABI_CWindows_CUI_CComposition_CContainerVisual* This) {
++ return This->lpVtbl->Release(This);
++}
++#endif
++#endif
++
++#endif
++
++#endif /* ____x_ABI_CWindows_CUI_CComposition_CContainerVisual_INTERFACE_DEFINED__ */
++
++/*****************************************************************************
++ * IVisual interface
++ */
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CIVisual_INTERFACE_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CIVisual_INTERFACE_DEFINED__
++
++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CIVisual, 0x117e202d, 0xa859, 0x4c89, 0x87,0x3b, 0xc2,0xaa,0x56,0x67,0x88,0xe3);
++#if defined(__cplusplus) && !defined(CINTERFACE)
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ MIDL_INTERFACE("117e202d-a859-4c89-873b-c2aa566788e3")
++ IVisual : public IInspectable
++ {
++ virtual HRESULT STDMETHODCALLTYPE get_AnchorPoint(
++ ABI::Windows::Foundation::Numerics::Vector2 *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE put_AnchorPoint(
++ ABI::Windows::Foundation::Numerics::Vector2 value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE get_BackfaceVisibility(
++ ABI::Windows::UI::Composition::CompositionBackfaceVisibility *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE put_BackfaceVisibility(
++ ABI::Windows::UI::Composition::CompositionBackfaceVisibility value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE get_BorderMode(
++ ABI::Windows::UI::Composition::CompositionBorderMode *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE put_BorderMode(
++ ABI::Windows::UI::Composition::CompositionBorderMode value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE get_CenterPoint(
++ ABI::Windows::Foundation::Numerics::Vector3 *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE put_CenterPoint(
++ ABI::Windows::Foundation::Numerics::Vector3 value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE get_Clip(
++ ABI::Windows::UI::Composition::CompositionClip **value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE put_Clip(
++ ABI::Windows::UI::Composition::CompositionClip *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE get_CompositeMode(
++ ABI::Windows::UI::Composition::CompositionCompositeMode *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE put_CompositeMode(
++ ABI::Windows::UI::Composition::CompositionCompositeMode value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE get_IsVisible(
++ boolean *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE put_IsVisible(
++ boolean value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE get_Offset(
++ ABI::Windows::Foundation::Numerics::Vector3 *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE put_Offset(
++ ABI::Windows::Foundation::Numerics::Vector3 value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE get_Opacity(
++ FLOAT *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE put_Opacity(
++ FLOAT value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE get_Orientation(
++ ABI::Windows::Foundation::Numerics::Quaternion *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE put_Orientation(
++ ABI::Windows::Foundation::Numerics::Quaternion value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE get_Parent(
++ ABI::Windows::UI::Composition::ContainerVisual **value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE get_RotationAngle(
++ FLOAT *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE put_RotationAngle(
++ FLOAT value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE get_RotationAngleInDegrees(
++ FLOAT *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE put_RotationAngleInDegrees(
++ FLOAT value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE get_RotationAxis(
++ ABI::Windows::Foundation::Numerics::Vector3 *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE put_RotationAxis(
++ ABI::Windows::Foundation::Numerics::Vector3 value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE get_Scale(
++ ABI::Windows::Foundation::Numerics::Vector3 *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE put_Scale(
++ ABI::Windows::Foundation::Numerics::Vector3 value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE get_Size(
++ ABI::Windows::Foundation::Numerics::Vector2 *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE put_Size(
++ ABI::Windows::Foundation::Numerics::Vector2 value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE get_TransformMatrix(
++ ABI::Windows::Foundation::Numerics::Matrix4x4 *value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE put_TransformMatrix(
++ ABI::Windows::Foundation::Numerics::Matrix4x4 value) = 0;
++
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#ifdef __CRT_UUID_DECL
++__CRT_UUID_DECL(ABI::Windows::UI::Composition::IVisual, 0x117e202d, 0xa859, 0x4c89, 0x87,0x3b, 0xc2,0xaa,0x56,0x67,0x88,0xe3)
++#endif
++#else
++typedef struct __x_ABI_CWindows_CUI_CComposition_CIVisualVtbl {
++ BEGIN_INTERFACE
++
++ /*** IUnknown methods ***/
++ HRESULT (STDMETHODCALLTYPE *QueryInterface)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ REFIID riid,
++ void **ppvObject);
++
++ ULONG (STDMETHODCALLTYPE *AddRef)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This);
++
++ ULONG (STDMETHODCALLTYPE *Release)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This);
++
++ /*** IInspectable methods ***/
++ HRESULT (STDMETHODCALLTYPE *GetIids)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ ULONG *iidCount,
++ IID **iids);
++
++ HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ HSTRING *className);
++
++ HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ TrustLevel *trustLevel);
++
++ /*** IVisual methods ***/
++ HRESULT (STDMETHODCALLTYPE *get_AnchorPoint)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CFoundation_CNumerics_CVector2 *value);
++
++ HRESULT (STDMETHODCALLTYPE *put_AnchorPoint)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CFoundation_CNumerics_CVector2 value);
++
++ HRESULT (STDMETHODCALLTYPE *get_BackfaceVisibility)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionBackfaceVisibility *value);
++
++ HRESULT (STDMETHODCALLTYPE *put_BackfaceVisibility)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionBackfaceVisibility value);
++
++ HRESULT (STDMETHODCALLTYPE *get_BorderMode)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionBorderMode *value);
++
++ HRESULT (STDMETHODCALLTYPE *put_BorderMode)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionBorderMode value);
++
++ HRESULT (STDMETHODCALLTYPE *get_CenterPoint)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CFoundation_CNumerics_CVector3 *value);
++
++ HRESULT (STDMETHODCALLTYPE *put_CenterPoint)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CFoundation_CNumerics_CVector3 value);
++
++ HRESULT (STDMETHODCALLTYPE *get_Clip)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionClip **value);
++
++ HRESULT (STDMETHODCALLTYPE *put_Clip)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionClip *value);
++
++ HRESULT (STDMETHODCALLTYPE *get_CompositeMode)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionCompositeMode *value);
++
++ HRESULT (STDMETHODCALLTYPE *put_CompositeMode)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionCompositeMode value);
++
++ HRESULT (STDMETHODCALLTYPE *get_IsVisible)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ boolean *value);
++
++ HRESULT (STDMETHODCALLTYPE *put_IsVisible)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ boolean value);
++
++ HRESULT (STDMETHODCALLTYPE *get_Offset)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CFoundation_CNumerics_CVector3 *value);
++
++ HRESULT (STDMETHODCALLTYPE *put_Offset)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CFoundation_CNumerics_CVector3 value);
++
++ HRESULT (STDMETHODCALLTYPE *get_Opacity)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ FLOAT *value);
++
++ HRESULT (STDMETHODCALLTYPE *put_Opacity)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ FLOAT value);
++
++ HRESULT (STDMETHODCALLTYPE *get_Orientation)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CFoundation_CNumerics_CQuaternion *value);
++
++ HRESULT (STDMETHODCALLTYPE *put_Orientation)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CFoundation_CNumerics_CQuaternion value);
++
++ HRESULT (STDMETHODCALLTYPE *get_Parent)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CUI_CComposition_CContainerVisual **value);
++
++ HRESULT (STDMETHODCALLTYPE *get_RotationAngle)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ FLOAT *value);
++
++ HRESULT (STDMETHODCALLTYPE *put_RotationAngle)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ FLOAT value);
++
++ HRESULT (STDMETHODCALLTYPE *get_RotationAngleInDegrees)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ FLOAT *value);
++
++ HRESULT (STDMETHODCALLTYPE *put_RotationAngleInDegrees)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ FLOAT value);
++
++ HRESULT (STDMETHODCALLTYPE *get_RotationAxis)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CFoundation_CNumerics_CVector3 *value);
++
++ HRESULT (STDMETHODCALLTYPE *put_RotationAxis)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CFoundation_CNumerics_CVector3 value);
++
++ HRESULT (STDMETHODCALLTYPE *get_Scale)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CFoundation_CNumerics_CVector3 *value);
++
++ HRESULT (STDMETHODCALLTYPE *put_Scale)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CFoundation_CNumerics_CVector3 value);
++
++ HRESULT (STDMETHODCALLTYPE *get_Size)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CFoundation_CNumerics_CVector2 *value);
++
++ HRESULT (STDMETHODCALLTYPE *put_Size)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CFoundation_CNumerics_CVector2 value);
++
++ HRESULT (STDMETHODCALLTYPE *get_TransformMatrix)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CFoundation_CNumerics_CMatrix4x4 *value);
++
++ HRESULT (STDMETHODCALLTYPE *put_TransformMatrix)(
++ __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
++ __x_ABI_CWindows_CFoundation_CNumerics_CMatrix4x4 value);
++
++ END_INTERFACE
++} __x_ABI_CWindows_CUI_CComposition_CIVisualVtbl;
++
++interface __x_ABI_CWindows_CUI_CComposition_CIVisual {
++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CIVisualVtbl* lpVtbl;
++};
++
++#ifdef COBJMACROS
++#ifndef WIDL_C_INLINE_WRAPPERS
++/*** IUnknown methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_AddRef(This) (This)->lpVtbl->AddRef(This)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_Release(This) (This)->lpVtbl->Release(This)
++/*** IInspectable methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
++/*** IVisual methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_AnchorPoint(This,value) (This)->lpVtbl->get_AnchorPoint(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_AnchorPoint(This,value) (This)->lpVtbl->put_AnchorPoint(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_BackfaceVisibility(This,value) (This)->lpVtbl->get_BackfaceVisibility(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_BackfaceVisibility(This,value) (This)->lpVtbl->put_BackfaceVisibility(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_BorderMode(This,value) (This)->lpVtbl->get_BorderMode(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_BorderMode(This,value) (This)->lpVtbl->put_BorderMode(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_CenterPoint(This,value) (This)->lpVtbl->get_CenterPoint(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_CenterPoint(This,value) (This)->lpVtbl->put_CenterPoint(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Clip(This,value) (This)->lpVtbl->get_Clip(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Clip(This,value) (This)->lpVtbl->put_Clip(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_CompositeMode(This,value) (This)->lpVtbl->get_CompositeMode(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_CompositeMode(This,value) (This)->lpVtbl->put_CompositeMode(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_IsVisible(This,value) (This)->lpVtbl->get_IsVisible(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_IsVisible(This,value) (This)->lpVtbl->put_IsVisible(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Offset(This,value) (This)->lpVtbl->get_Offset(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Offset(This,value) (This)->lpVtbl->put_Offset(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Opacity(This,value) (This)->lpVtbl->get_Opacity(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Opacity(This,value) (This)->lpVtbl->put_Opacity(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Orientation(This,value) (This)->lpVtbl->get_Orientation(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Orientation(This,value) (This)->lpVtbl->put_Orientation(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Parent(This,value) (This)->lpVtbl->get_Parent(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_RotationAngle(This,value) (This)->lpVtbl->get_RotationAngle(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_RotationAngle(This,value) (This)->lpVtbl->put_RotationAngle(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_RotationAngleInDegrees(This,value) (This)->lpVtbl->get_RotationAngleInDegrees(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_RotationAngleInDegrees(This,value) (This)->lpVtbl->put_RotationAngleInDegrees(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_RotationAxis(This,value) (This)->lpVtbl->get_RotationAxis(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_RotationAxis(This,value) (This)->lpVtbl->put_RotationAxis(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Scale(This,value) (This)->lpVtbl->get_Scale(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Scale(This,value) (This)->lpVtbl->put_Scale(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Size(This,value) (This)->lpVtbl->put_Size(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_TransformMatrix(This,value) (This)->lpVtbl->get_TransformMatrix(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_TransformMatrix(This,value) (This)->lpVtbl->put_TransformMatrix(This,value)
++#else
++/*** IUnknown methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,REFIID riid,void **ppvObject) {
++ return This->lpVtbl->QueryInterface(This,riid,ppvObject);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CIVisual_AddRef(__x_ABI_CWindows_CUI_CComposition_CIVisual* This) {
++ return This->lpVtbl->AddRef(This);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CIVisual_Release(__x_ABI_CWindows_CUI_CComposition_CIVisual* This) {
++ return This->lpVtbl->Release(This);
++}
++/*** IInspectable methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_GetIids(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,ULONG *iidCount,IID **iids) {
++ return This->lpVtbl->GetIids(This,iidCount,iids);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,HSTRING *className) {
++ return This->lpVtbl->GetRuntimeClassName(This,className);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,TrustLevel *trustLevel) {
++ return This->lpVtbl->GetTrustLevel(This,trustLevel);
++}
++/*** IVisual methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_AnchorPoint(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector2 *value) {
++ return This->lpVtbl->get_AnchorPoint(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_AnchorPoint(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector2 value) {
++ return This->lpVtbl->put_AnchorPoint(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_BackfaceVisibility(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CUI_CComposition_CCompositionBackfaceVisibility *value) {
++ return This->lpVtbl->get_BackfaceVisibility(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_BackfaceVisibility(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CUI_CComposition_CCompositionBackfaceVisibility value) {
++ return This->lpVtbl->put_BackfaceVisibility(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_BorderMode(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CUI_CComposition_CCompositionBorderMode *value) {
++ return This->lpVtbl->get_BorderMode(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_BorderMode(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CUI_CComposition_CCompositionBorderMode value) {
++ return This->lpVtbl->put_BorderMode(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_CenterPoint(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector3 *value) {
++ return This->lpVtbl->get_CenterPoint(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_CenterPoint(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector3 value) {
++ return This->lpVtbl->put_CenterPoint(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Clip(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CUI_CComposition_CCompositionClip **value) {
++ return This->lpVtbl->get_Clip(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Clip(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CUI_CComposition_CCompositionClip *value) {
++ return This->lpVtbl->put_Clip(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_CompositeMode(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CUI_CComposition_CCompositionCompositeMode *value) {
++ return This->lpVtbl->get_CompositeMode(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_CompositeMode(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CUI_CComposition_CCompositionCompositeMode value) {
++ return This->lpVtbl->put_CompositeMode(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_IsVisible(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,boolean *value) {
++ return This->lpVtbl->get_IsVisible(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_IsVisible(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,boolean value) {
++ return This->lpVtbl->put_IsVisible(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Offset(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector3 *value) {
++ return This->lpVtbl->get_Offset(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Offset(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector3 value) {
++ return This->lpVtbl->put_Offset(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Opacity(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,FLOAT *value) {
++ return This->lpVtbl->get_Opacity(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Opacity(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,FLOAT value) {
++ return This->lpVtbl->put_Opacity(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Orientation(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CQuaternion *value) {
++ return This->lpVtbl->get_Orientation(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Orientation(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CQuaternion value) {
++ return This->lpVtbl->put_Orientation(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Parent(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CUI_CComposition_CContainerVisual **value) {
++ return This->lpVtbl->get_Parent(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_RotationAngle(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,FLOAT *value) {
++ return This->lpVtbl->get_RotationAngle(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_RotationAngle(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,FLOAT value) {
++ return This->lpVtbl->put_RotationAngle(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_RotationAngleInDegrees(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,FLOAT *value) {
++ return This->lpVtbl->get_RotationAngleInDegrees(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_RotationAngleInDegrees(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,FLOAT value) {
++ return This->lpVtbl->put_RotationAngleInDegrees(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_RotationAxis(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector3 *value) {
++ return This->lpVtbl->get_RotationAxis(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_RotationAxis(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector3 value) {
++ return This->lpVtbl->put_RotationAxis(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Scale(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector3 *value) {
++ return This->lpVtbl->get_Scale(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Scale(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector3 value) {
++ return This->lpVtbl->put_Scale(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Size(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector2 *value) {
++ return This->lpVtbl->get_Size(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Size(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector2 value) {
++ return This->lpVtbl->put_Size(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_TransformMatrix(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CMatrix4x4 *value) {
++ return This->lpVtbl->get_TransformMatrix(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_TransformMatrix(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CMatrix4x4 value) {
++ return This->lpVtbl->put_TransformMatrix(This,value);
++}
++#endif
++#endif
++
++#endif
++
++#endif /* ____x_ABI_CWindows_CUI_CComposition_CIVisual_INTERFACE_DEFINED__ */
++
++/*****************************************************************************
++ * Compositor interface
++ */
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositor_INTERFACE_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CCompositor_INTERFACE_DEFINED__
++
++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CCompositor, 0x38e05581, 0x1ad1, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b);
++#if defined(__cplusplus) && !defined(CINTERFACE)
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ MIDL_INTERFACE("38e05581-1ad1-4f97-9666-402d76e4233b")
++ Compositor : public IUnknown
++ {
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#ifdef __CRT_UUID_DECL
++__CRT_UUID_DECL(ABI::Windows::UI::Composition::Compositor, 0x38e05581, 0x1ad1, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b)
++#endif
++#else
++typedef struct __x_ABI_CWindows_CUI_CComposition_CCompositorVtbl {
++ BEGIN_INTERFACE
++
++ /*** IUnknown methods ***/
++ HRESULT (STDMETHODCALLTYPE *QueryInterface)(
++ __x_ABI_CWindows_CUI_CComposition_CCompositor *This,
++ REFIID riid,
++ void **ppvObject);
++
++ ULONG (STDMETHODCALLTYPE *AddRef)(
++ __x_ABI_CWindows_CUI_CComposition_CCompositor *This);
++
++ ULONG (STDMETHODCALLTYPE *Release)(
++ __x_ABI_CWindows_CUI_CComposition_CCompositor *This);
++
++ END_INTERFACE
++} __x_ABI_CWindows_CUI_CComposition_CCompositorVtbl;
++
++interface __x_ABI_CWindows_CUI_CComposition_CCompositor {
++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CCompositorVtbl* lpVtbl;
++};
++
++#ifdef COBJMACROS
++#ifndef WIDL_C_INLINE_WRAPPERS
++/*** IUnknown methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CCompositor_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
++#define __x_ABI_CWindows_CUI_CComposition_CCompositor_AddRef(This) (This)->lpVtbl->AddRef(This)
++#define __x_ABI_CWindows_CUI_CComposition_CCompositor_Release(This) (This)->lpVtbl->Release(This)
++#else
++/*** IUnknown methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CCompositor_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CCompositor* This,REFIID riid,void **ppvObject) {
++ return This->lpVtbl->QueryInterface(This,riid,ppvObject);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CCompositor_AddRef(__x_ABI_CWindows_CUI_CComposition_CCompositor* This) {
++ return This->lpVtbl->AddRef(This);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CCompositor_Release(__x_ABI_CWindows_CUI_CComposition_CCompositor* This) {
++ return This->lpVtbl->Release(This);
++}
++#endif
++#endif
++
++#endif
++
++#endif /* ____x_ABI_CWindows_CUI_CComposition_CCompositor_INTERFACE_DEFINED__ */
++
++/*****************************************************************************
++ * CompositionPropertySet interface
++ */
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet_INTERFACE_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet_INTERFACE_DEFINED__
++
++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet, 0x38e05582, 0x1ad1, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b);
++#if defined(__cplusplus) && !defined(CINTERFACE)
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ MIDL_INTERFACE("38e05582-1ad1-4f97-9666-402d76e4233b")
++ CompositionPropertySet : public IUnknown
++ {
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#ifdef __CRT_UUID_DECL
++__CRT_UUID_DECL(ABI::Windows::UI::Composition::CompositionPropertySet, 0x38e05582, 0x1ad1, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b)
++#endif
++#else
++typedef struct __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySetVtbl {
++ BEGIN_INTERFACE
++
++ /*** IUnknown methods ***/
++ HRESULT (STDMETHODCALLTYPE *QueryInterface)(
++ __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet *This,
++ REFIID riid,
++ void **ppvObject);
++
++ ULONG (STDMETHODCALLTYPE *AddRef)(
++ __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet *This);
++
++ ULONG (STDMETHODCALLTYPE *Release)(
++ __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet *This);
++
++ END_INTERFACE
++} __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySetVtbl;
++
++interface __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet {
++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySetVtbl* lpVtbl;
++};
++
++#ifdef COBJMACROS
++#ifndef WIDL_C_INLINE_WRAPPERS
++/*** IUnknown methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
++#define __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet_AddRef(This) (This)->lpVtbl->AddRef(This)
++#define __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet_Release(This) (This)->lpVtbl->Release(This)
++#else
++/*** IUnknown methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet* This,REFIID riid,void **ppvObject) {
++ return This->lpVtbl->QueryInterface(This,riid,ppvObject);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet_AddRef(__x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet* This) {
++ return This->lpVtbl->AddRef(This);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet_Release(__x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet* This) {
++ return This->lpVtbl->Release(This);
++}
++#endif
++#endif
++
++#endif
++
++#endif /* ____x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet_INTERFACE_DEFINED__ */
++
++/*****************************************************************************
++ * CompositionAnimation interface
++ */
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionAnimation_INTERFACE_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionAnimation_INTERFACE_DEFINED__
++
++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CCompositionAnimation, 0x38e05582, 0x1ad2, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b);
++#if defined(__cplusplus) && !defined(CINTERFACE)
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ MIDL_INTERFACE("38e05582-1ad2-4f97-9666-402d76e4233b")
++ CompositionAnimation : public IUnknown
++ {
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#ifdef __CRT_UUID_DECL
++__CRT_UUID_DECL(ABI::Windows::UI::Composition::CompositionAnimation, 0x38e05582, 0x1ad2, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b)
++#endif
++#else
++typedef struct __x_ABI_CWindows_CUI_CComposition_CCompositionAnimationVtbl {
++ BEGIN_INTERFACE
++
++ /*** IUnknown methods ***/
++ HRESULT (STDMETHODCALLTYPE *QueryInterface)(
++ __x_ABI_CWindows_CUI_CComposition_CCompositionAnimation *This,
++ REFIID riid,
++ void **ppvObject);
++
++ ULONG (STDMETHODCALLTYPE *AddRef)(
++ __x_ABI_CWindows_CUI_CComposition_CCompositionAnimation *This);
++
++ ULONG (STDMETHODCALLTYPE *Release)(
++ __x_ABI_CWindows_CUI_CComposition_CCompositionAnimation *This);
++
++ END_INTERFACE
++} __x_ABI_CWindows_CUI_CComposition_CCompositionAnimationVtbl;
++
++interface __x_ABI_CWindows_CUI_CComposition_CCompositionAnimation {
++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CCompositionAnimationVtbl* lpVtbl;
++};
++
++#ifdef COBJMACROS
++#ifndef WIDL_C_INLINE_WRAPPERS
++/*** IUnknown methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CCompositionAnimation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
++#define __x_ABI_CWindows_CUI_CComposition_CCompositionAnimation_AddRef(This) (This)->lpVtbl->AddRef(This)
++#define __x_ABI_CWindows_CUI_CComposition_CCompositionAnimation_Release(This) (This)->lpVtbl->Release(This)
++#else
++/*** IUnknown methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CCompositionAnimation_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CCompositionAnimation* This,REFIID riid,void **ppvObject) {
++ return This->lpVtbl->QueryInterface(This,riid,ppvObject);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CCompositionAnimation_AddRef(__x_ABI_CWindows_CUI_CComposition_CCompositionAnimation* This) {
++ return This->lpVtbl->AddRef(This);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CCompositionAnimation_Release(__x_ABI_CWindows_CUI_CComposition_CCompositionAnimation* This) {
++ return This->lpVtbl->Release(This);
++}
++#endif
++#endif
++
++#endif
++
++#endif /* ____x_ABI_CWindows_CUI_CComposition_CCompositionAnimation_INTERFACE_DEFINED__ */
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositor_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CICompositor_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositor __x_ABI_CWindows_CUI_CComposition_CICompositor;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface ICompositor;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++/*****************************************************************************
++ * ICompositionObject interface
++ */
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionObject_INTERFACE_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CICompositionObject_INTERFACE_DEFINED__
++
++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CICompositionObject, 0xbcb4ad45, 0x7609, 0x4550, 0x93,0x4f, 0x16,0x00,0x2a,0x68,0xfd,0xed);
++#if defined(__cplusplus) && !defined(CINTERFACE)
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ MIDL_INTERFACE("bcb4ad45-7609-4550-934f-16002a68fded")
++ ICompositionObject : public IInspectable
++ {
++ virtual HRESULT STDMETHODCALLTYPE get_Compositor(
++ ABI::Windows::UI::Composition::ICompositor **value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE get_Dispatcher(
++ ABI::Windows::UI::Core::CoreDispatcher **value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE get_Properties(
++ ABI::Windows::UI::Composition::CompositionPropertySet **value) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE StartAnimation(
++ HSTRING propertyName,
++ ABI::Windows::UI::Composition::CompositionAnimation *animation) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE StopAnimation(
++ HSTRING propertyName) = 0;
++
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#ifdef __CRT_UUID_DECL
++__CRT_UUID_DECL(ABI::Windows::UI::Composition::ICompositionObject, 0xbcb4ad45, 0x7609, 0x4550, 0x93,0x4f, 0x16,0x00,0x2a,0x68,0xfd,0xed)
++#endif
++#else
++typedef struct __x_ABI_CWindows_CUI_CComposition_CICompositionObjectVtbl {
++ BEGIN_INTERFACE
++
++ /*** IUnknown methods ***/
++ HRESULT (STDMETHODCALLTYPE *QueryInterface)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionObject *This,
++ REFIID riid,
++ void **ppvObject);
++
++ ULONG (STDMETHODCALLTYPE *AddRef)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionObject *This);
++
++ ULONG (STDMETHODCALLTYPE *Release)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionObject *This);
++
++ /*** IInspectable methods ***/
++ HRESULT (STDMETHODCALLTYPE *GetIids)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionObject *This,
++ ULONG *iidCount,
++ IID **iids);
++
++ HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionObject *This,
++ HSTRING *className);
++
++ HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionObject *This,
++ TrustLevel *trustLevel);
++
++ /*** ICompositionObject methods ***/
++ HRESULT (STDMETHODCALLTYPE *get_Compositor)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionObject *This,
++ __x_ABI_CWindows_CUI_CComposition_CICompositor **value);
++
++ HRESULT (STDMETHODCALLTYPE *get_Dispatcher)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionObject *This,
++ __x_ABI_CWindows_CUI_CCore_CCoreDispatcher **value);
++
++ HRESULT (STDMETHODCALLTYPE *get_Properties)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionObject *This,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet **value);
++
++ HRESULT (STDMETHODCALLTYPE *StartAnimation)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionObject *This,
++ HSTRING propertyName,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionAnimation *animation);
++
++ HRESULT (STDMETHODCALLTYPE *StopAnimation)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionObject *This,
++ HSTRING propertyName);
++
++ END_INTERFACE
++} __x_ABI_CWindows_CUI_CComposition_CICompositionObjectVtbl;
++
++interface __x_ABI_CWindows_CUI_CComposition_CICompositionObject {
++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CICompositionObjectVtbl* lpVtbl;
++};
++
++#ifdef COBJMACROS
++#ifndef WIDL_C_INLINE_WRAPPERS
++/*** IUnknown methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject_AddRef(This) (This)->lpVtbl->AddRef(This)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject_Release(This) (This)->lpVtbl->Release(This)
++/*** IInspectable methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
++/*** ICompositionObject methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject_get_Compositor(This,value) (This)->lpVtbl->get_Compositor(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject_get_Dispatcher(This,value) (This)->lpVtbl->get_Dispatcher(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject_get_Properties(This,value) (This)->lpVtbl->get_Properties(This,value)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject_StartAnimation(This,propertyName,animation) (This)->lpVtbl->StartAnimation(This,propertyName,animation)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject_StopAnimation(This,propertyName) (This)->lpVtbl->StopAnimation(This,propertyName)
++#else
++/*** IUnknown methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionObject_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CICompositionObject* This,REFIID riid,void **ppvObject) {
++ return This->lpVtbl->QueryInterface(This,riid,ppvObject);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionObject_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionObject* This) {
++ return This->lpVtbl->AddRef(This);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionObject_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionObject* This) {
++ return This->lpVtbl->Release(This);
++}
++/*** IInspectable methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionObject_GetIids(__x_ABI_CWindows_CUI_CComposition_CICompositionObject* This,ULONG *iidCount,IID **iids) {
++ return This->lpVtbl->GetIids(This,iidCount,iids);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionObject_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CICompositionObject* This,HSTRING *className) {
++ return This->lpVtbl->GetRuntimeClassName(This,className);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionObject_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CICompositionObject* This,TrustLevel *trustLevel) {
++ return This->lpVtbl->GetTrustLevel(This,trustLevel);
++}
++/*** ICompositionObject methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionObject_get_Compositor(__x_ABI_CWindows_CUI_CComposition_CICompositionObject* This,__x_ABI_CWindows_CUI_CComposition_CICompositor **value) {
++ return This->lpVtbl->get_Compositor(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionObject_get_Dispatcher(__x_ABI_CWindows_CUI_CComposition_CICompositionObject* This,__x_ABI_CWindows_CUI_CCore_CCoreDispatcher **value) {
++ return This->lpVtbl->get_Dispatcher(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionObject_get_Properties(__x_ABI_CWindows_CUI_CComposition_CICompositionObject* This,__x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet **value) {
++ return This->lpVtbl->get_Properties(This,value);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionObject_StartAnimation(__x_ABI_CWindows_CUI_CComposition_CICompositionObject* This,HSTRING propertyName,__x_ABI_CWindows_CUI_CComposition_CCompositionAnimation *animation) {
++ return This->lpVtbl->StartAnimation(This,propertyName,animation);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionObject_StopAnimation(__x_ABI_CWindows_CUI_CComposition_CICompositionObject* This,HSTRING propertyName) {
++ return This->lpVtbl->StopAnimation(This,propertyName);
++}
++#endif
++#endif
++
++#endif
++
++#endif /* ____x_ABI_CWindows_CUI_CComposition_CICompositionObject_INTERFACE_DEFINED__ */
++
++/*****************************************************************************
++ * ColorKeyFrameAnimation interface
++ */
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation_INTERFACE_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation_INTERFACE_DEFINED__
++
++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation, 0x38e05682, 0x1ad2, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b);
++#if defined(__cplusplus) && !defined(CINTERFACE)
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ MIDL_INTERFACE("38e05682-1ad2-4f97-9666-402d76e4233b")
++ ColorKeyFrameAnimation : public IUnknown
++ {
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#ifdef __CRT_UUID_DECL
++__CRT_UUID_DECL(ABI::Windows::UI::Composition::ColorKeyFrameAnimation, 0x38e05682, 0x1ad2, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b)
++#endif
++#else
++typedef struct __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimationVtbl {
++ BEGIN_INTERFACE
++
++ /*** IUnknown methods ***/
++ HRESULT (STDMETHODCALLTYPE *QueryInterface)(
++ __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation *This,
++ REFIID riid,
++ void **ppvObject);
++
++ ULONG (STDMETHODCALLTYPE *AddRef)(
++ __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation *This);
++
++ ULONG (STDMETHODCALLTYPE *Release)(
++ __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation *This);
++
++ END_INTERFACE
++} __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimationVtbl;
++
++interface __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation {
++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimationVtbl* lpVtbl;
++};
++
++#ifdef COBJMACROS
++#ifndef WIDL_C_INLINE_WRAPPERS
++/*** IUnknown methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
++#define __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation_AddRef(This) (This)->lpVtbl->AddRef(This)
++#define __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation_Release(This) (This)->lpVtbl->Release(This)
++#else
++/*** IUnknown methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation* This,REFIID riid,void **ppvObject) {
++ return This->lpVtbl->QueryInterface(This,riid,ppvObject);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation_AddRef(__x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation* This) {
++ return This->lpVtbl->AddRef(This);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation_Release(__x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation* This) {
++ return This->lpVtbl->Release(This);
++}
++#endif
++#endif
++
++#endif
++
++#endif /* ____x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation_INTERFACE_DEFINED__ */
++
++/*****************************************************************************
++ * CompositionColorBrush interface
++ */
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush_INTERFACE_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush_INTERFACE_DEFINED__
++
++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush, 0x33e05682, 0x1ad2, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b);
++#if defined(__cplusplus) && !defined(CINTERFACE)
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ MIDL_INTERFACE("33e05682-1ad2-4f97-9666-402d76e4233b")
++ CompositionColorBrush : public IUnknown
++ {
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#ifdef __CRT_UUID_DECL
++__CRT_UUID_DECL(ABI::Windows::UI::Composition::CompositionColorBrush, 0x33e05682, 0x1ad2, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b)
++#endif
++#else
++typedef struct __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrushVtbl {
++ BEGIN_INTERFACE
++
++ /*** IUnknown methods ***/
++ HRESULT (STDMETHODCALLTYPE *QueryInterface)(
++ __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush *This,
++ REFIID riid,
++ void **ppvObject);
++
++ ULONG (STDMETHODCALLTYPE *AddRef)(
++ __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush *This);
++
++ ULONG (STDMETHODCALLTYPE *Release)(
++ __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush *This);
++
++ END_INTERFACE
++} __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrushVtbl;
++
++interface __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush {
++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrushVtbl* lpVtbl;
++};
++
++#ifdef COBJMACROS
++#ifndef WIDL_C_INLINE_WRAPPERS
++/*** IUnknown methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
++#define __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush_AddRef(This) (This)->lpVtbl->AddRef(This)
++#define __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush_Release(This) (This)->lpVtbl->Release(This)
++#else
++/*** IUnknown methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush* This,REFIID riid,void **ppvObject) {
++ return This->lpVtbl->QueryInterface(This,riid,ppvObject);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush_AddRef(__x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush* This) {
++ return This->lpVtbl->AddRef(This);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush_Release(__x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush* This) {
++ return This->lpVtbl->Release(This);
++}
++#endif
++#endif
++
++#endif
++
++#endif /* ____x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush_INTERFACE_DEFINED__ */
++
++/*****************************************************************************
++ * CubicBezierEasingFunction interface
++ */
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction_INTERFACE_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction_INTERFACE_DEFINED__
++
++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction, 0x43e05682, 0x1ad2, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b);
++#if defined(__cplusplus) && !defined(CINTERFACE)
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ MIDL_INTERFACE("43e05682-1ad2-4f97-9666-402d76e4233b")
++ CubicBezierEasingFunction : public IUnknown
++ {
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#ifdef __CRT_UUID_DECL
++__CRT_UUID_DECL(ABI::Windows::UI::Composition::CubicBezierEasingFunction, 0x43e05682, 0x1ad2, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b)
++#endif
++#else
++typedef struct __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunctionVtbl {
++ BEGIN_INTERFACE
++
++ /*** IUnknown methods ***/
++ HRESULT (STDMETHODCALLTYPE *QueryInterface)(
++ __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction *This,
++ REFIID riid,
++ void **ppvObject);
++
++ ULONG (STDMETHODCALLTYPE *AddRef)(
++ __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction *This);
++
++ ULONG (STDMETHODCALLTYPE *Release)(
++ __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction *This);
++
++ END_INTERFACE
++} __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunctionVtbl;
++
++interface __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction {
++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunctionVtbl* lpVtbl;
++};
++
++#ifdef COBJMACROS
++#ifndef WIDL_C_INLINE_WRAPPERS
++/*** IUnknown methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
++#define __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction_AddRef(This) (This)->lpVtbl->AddRef(This)
++#define __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction_Release(This) (This)->lpVtbl->Release(This)
++#else
++/*** IUnknown methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction* This,REFIID riid,void **ppvObject) {
++ return This->lpVtbl->QueryInterface(This,riid,ppvObject);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction_AddRef(__x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction* This) {
++ return This->lpVtbl->AddRef(This);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction_Release(__x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction* This) {
++ return This->lpVtbl->Release(This);
++}
++#endif
++#endif
++
++#endif
++
++#endif /* ____x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction_INTERFACE_DEFINED__ */
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionEffectFactory_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionEffectFactory_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CCompositionEffectFactory __x_ABI_CWindows_CUI_CComposition_CCompositionEffectFactory;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface CompositionEffectFactory;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CExpressionAnimation_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CExpressionAnimation_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CExpressionAnimation __x_ABI_CWindows_CUI_CComposition_CExpressionAnimation;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface ExpressionAnimation;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CInsetClip_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CInsetClip_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CInsetClip __x_ABI_CWindows_CUI_CComposition_CInsetClip;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface InsetClip;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CLinearEasingFunction_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CLinearEasingFunction_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CLinearEasingFunction __x_ABI_CWindows_CUI_CComposition_CLinearEasingFunction;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface LinearEasingFunction;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CScalarKeyFrameAnimation_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CScalarKeyFrameAnimation_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CScalarKeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CScalarKeyFrameAnimation;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface ScalarKeyFrameAnimation;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CQuaternionKeyFrameAnimation_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CQuaternionKeyFrameAnimation_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CQuaternionKeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CQuaternionKeyFrameAnimation;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface QuaternionKeyFrameAnimation;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionScopedBatch_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionScopedBatch_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CCompositionScopedBatch __x_ABI_CWindows_CUI_CComposition_CCompositionScopedBatch;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface CompositionScopedBatch;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionSurfaceBrush_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionSurfaceBrush_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CCompositionSurfaceBrush __x_ABI_CWindows_CUI_CComposition_CCompositionSurfaceBrush;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface CompositionSurfaceBrush;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CVector2KeyFrameAnimation_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CVector2KeyFrameAnimation_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CVector2KeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CVector2KeyFrameAnimation;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface Vector2KeyFrameAnimation;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CVector3KeyFrameAnimation_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CVector3KeyFrameAnimation_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CVector3KeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CVector3KeyFrameAnimation;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface Vector3KeyFrameAnimation;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CVector4KeyFrameAnimation_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CVector4KeyFrameAnimation_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CVector4KeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CVector4KeyFrameAnimation;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface Vector4KeyFrameAnimation;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionTarget_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionTarget_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CCompositionTarget __x_ABI_CWindows_CUI_CComposition_CCompositionTarget;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface CompositionTarget;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionCommitBatch_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionCommitBatch_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CCompositionCommitBatch __x_ABI_CWindows_CUI_CComposition_CCompositionCommitBatch;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface CompositionCommitBatch;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionDrawingSurface_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CCompositionDrawingSurface_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CComposition_CCompositionDrawingSurface __x_ABI_CWindows_CUI_CComposition_CCompositionDrawingSurface;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ interface CompositionDrawingSurface;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++/*****************************************************************************
++ * ICompositor interface
++ */
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositor_INTERFACE_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CICompositor_INTERFACE_DEFINED__
++
++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CICompositor, 0xb403ca50, 0x7f8c, 0x4e83, 0x98,0x5f, 0xcc,0x45,0x06,0x00,0x36,0xd8);
++#if defined(__cplusplus) && !defined(CINTERFACE)
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ MIDL_INTERFACE("b403ca50-7f8c-4e83-985f-cc45060036d8")
++ ICompositor : public IInspectable
++ {
++ virtual HRESULT STDMETHODCALLTYPE CreateColorKeyFrameAnimation(
++ ABI::Windows::UI::Composition::ColorKeyFrameAnimation **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE CreateColorBrush(
++ ABI::Windows::UI::Composition::CompositionColorBrush **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE CreateColorBrushWithColor(
++ ABI::Windows::UI::Color color,
++ ABI::Windows::UI::Composition::CompositionColorBrush **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE CreateContainerVisual(
++ ABI::Windows::UI::Composition::ContainerVisual **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE CreateCubicBezierEasingFunction(
++ ABI::Windows::Foundation::Numerics::Vector2 controlPoint1,
++ ABI::Windows::Foundation::Numerics::Vector2 controlPoint2,
++ ABI::Windows::UI::Composition::CubicBezierEasingFunction **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE CreateEffectFactory(
++ ABI::Windows::Graphics::Effects::IGraphicsEffect *graphicsEffect,
++ ABI::Windows::UI::Composition::CompositionEffectFactory **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE CreateEffectFactoryWithProperties(
++ ABI::Windows::Graphics::Effects::IGraphicsEffect *graphicsEffect,
++ int *animatableProperties,
++ ABI::Windows::UI::Composition::CompositionEffectFactory **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE CreateExpressionAnimation(
++ ABI::Windows::UI::Composition::ExpressionAnimation **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE CreateExpressionAnimationWithExpression(
++ HSTRING expression,
++ ABI::Windows::UI::Composition::ExpressionAnimation **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE CreateInsetClip(
++ ABI::Windows::UI::Composition::InsetClip **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE CreateInsetClipWithInsets(
++ FLOAT leftInset,
++ FLOAT topInset,
++ FLOAT rightInset,
++ FLOAT bottomInset,
++ ABI::Windows::UI::Composition::InsetClip **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE CreateLinearEasingFunction(
++ ABI::Windows::UI::Composition::LinearEasingFunction **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE CreatePropertySet(
++ ABI::Windows::UI::Composition::CompositionPropertySet **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE CreateQuaternionKeyFrameAnimation(
++ ABI::Windows::UI::Composition::QuaternionKeyFrameAnimation **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE CreateScalarKeyFrameAnimation(
++ ABI::Windows::UI::Composition::ScalarKeyFrameAnimation **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE CreateScopedBatch(
++ ABI::Windows::UI::Composition::CompositionBatchTypes batchType,
++ ABI::Windows::UI::Composition::CompositionScopedBatch **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE CreateSpriteVisual(
++ ABI::Windows::UI::Composition::SpriteVisual **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE CreateSurfaceBrush(
++ ABI::Windows::UI::Composition::CompositionSurfaceBrush **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE CreateSurfaceBrushWithSurface(
++ ABI::Windows::UI::Composition::ICompositionSurface *surface,
++ ABI::Windows::UI::Composition::ICompositionSurfaceBrush **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE CreateTargetForCurrentView(
++ ABI::Windows::UI::Composition::CompositionTarget **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE CreateVector2KeyFrameAnimation(
++ ABI::Windows::UI::Composition::Vector2KeyFrameAnimation **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE CreateVector3KeyFrameAnimation(
++ ABI::Windows::UI::Composition::Vector3KeyFrameAnimation **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE CreateVector4KeyFrameAnimation(
++ ABI::Windows::UI::Composition::Vector4KeyFrameAnimation **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE GetCommitBatch(
++ ABI::Windows::UI::Composition::CompositionBatchTypes batchType,
++ ABI::Windows::UI::Composition::CompositionCommitBatch **result) = 0;
++
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#ifdef __CRT_UUID_DECL
++__CRT_UUID_DECL(ABI::Windows::UI::Composition::ICompositor, 0xb403ca50, 0x7f8c, 0x4e83, 0x98,0x5f, 0xcc,0x45,0x06,0x00,0x36,0xd8)
++#endif
++#else
++typedef struct __x_ABI_CWindows_CUI_CComposition_CICompositorVtbl {
++ BEGIN_INTERFACE
++
++ /*** IUnknown methods ***/
++ HRESULT (STDMETHODCALLTYPE *QueryInterface)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ REFIID riid,
++ void **ppvObject);
++
++ ULONG (STDMETHODCALLTYPE *AddRef)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This);
++
++ ULONG (STDMETHODCALLTYPE *Release)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This);
++
++ /*** IInspectable methods ***/
++ HRESULT (STDMETHODCALLTYPE *GetIids)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ ULONG *iidCount,
++ IID **iids);
++
++ HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ HSTRING *className);
++
++ HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ TrustLevel *trustLevel);
++
++ /*** ICompositor methods ***/
++ HRESULT (STDMETHODCALLTYPE *CreateColorKeyFrameAnimation)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation **result);
++
++ HRESULT (STDMETHODCALLTYPE *CreateColorBrush)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush **result);
++
++ HRESULT (STDMETHODCALLTYPE *CreateColorBrushWithColor)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ __x_ABI_CWindows_CUI_CColor color,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush **result);
++
++ HRESULT (STDMETHODCALLTYPE *CreateContainerVisual)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ __x_ABI_CWindows_CUI_CComposition_CContainerVisual **result);
++
++ HRESULT (STDMETHODCALLTYPE *CreateCubicBezierEasingFunction)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ __x_ABI_CWindows_CFoundation_CNumerics_CVector2 controlPoint1,
++ __x_ABI_CWindows_CFoundation_CNumerics_CVector2 controlPoint2,
++ __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction **result);
++
++ HRESULT (STDMETHODCALLTYPE *CreateEffectFactory)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect *graphicsEffect,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionEffectFactory **result);
++
++ HRESULT (STDMETHODCALLTYPE *CreateEffectFactoryWithProperties)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect *graphicsEffect,
++ int *animatableProperties,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionEffectFactory **result);
++
++ HRESULT (STDMETHODCALLTYPE *CreateExpressionAnimation)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ __x_ABI_CWindows_CUI_CComposition_CExpressionAnimation **result);
++
++ HRESULT (STDMETHODCALLTYPE *CreateExpressionAnimationWithExpression)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ HSTRING expression,
++ __x_ABI_CWindows_CUI_CComposition_CExpressionAnimation **result);
++
++ HRESULT (STDMETHODCALLTYPE *CreateInsetClip)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ __x_ABI_CWindows_CUI_CComposition_CInsetClip **result);
++
++ HRESULT (STDMETHODCALLTYPE *CreateInsetClipWithInsets)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ FLOAT leftInset,
++ FLOAT topInset,
++ FLOAT rightInset,
++ FLOAT bottomInset,
++ __x_ABI_CWindows_CUI_CComposition_CInsetClip **result);
++
++ HRESULT (STDMETHODCALLTYPE *CreateLinearEasingFunction)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ __x_ABI_CWindows_CUI_CComposition_CLinearEasingFunction **result);
++
++ HRESULT (STDMETHODCALLTYPE *CreatePropertySet)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet **result);
++
++ HRESULT (STDMETHODCALLTYPE *CreateQuaternionKeyFrameAnimation)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ __x_ABI_CWindows_CUI_CComposition_CQuaternionKeyFrameAnimation **result);
++
++ HRESULT (STDMETHODCALLTYPE *CreateScalarKeyFrameAnimation)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ __x_ABI_CWindows_CUI_CComposition_CScalarKeyFrameAnimation **result);
++
++ HRESULT (STDMETHODCALLTYPE *CreateScopedBatch)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionBatchTypes batchType,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionScopedBatch **result);
++
++ HRESULT (STDMETHODCALLTYPE *CreateSpriteVisual)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ __x_ABI_CWindows_CUI_CComposition_CSpriteVisual **result);
++
++ HRESULT (STDMETHODCALLTYPE *CreateSurfaceBrush)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionSurfaceBrush **result);
++
++ HRESULT (STDMETHODCALLTYPE *CreateSurfaceBrushWithSurface)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurface *surface,
++ __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush **result);
++
++ HRESULT (STDMETHODCALLTYPE *CreateTargetForCurrentView)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionTarget **result);
++
++ HRESULT (STDMETHODCALLTYPE *CreateVector2KeyFrameAnimation)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ __x_ABI_CWindows_CUI_CComposition_CVector2KeyFrameAnimation **result);
++
++ HRESULT (STDMETHODCALLTYPE *CreateVector3KeyFrameAnimation)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ __x_ABI_CWindows_CUI_CComposition_CVector3KeyFrameAnimation **result);
++
++ HRESULT (STDMETHODCALLTYPE *CreateVector4KeyFrameAnimation)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ __x_ABI_CWindows_CUI_CComposition_CVector4KeyFrameAnimation **result);
++
++ HRESULT (STDMETHODCALLTYPE *GetCommitBatch)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionBatchTypes batchType,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionCommitBatch **result);
++
++ END_INTERFACE
++} __x_ABI_CWindows_CUI_CComposition_CICompositorVtbl;
++
++interface __x_ABI_CWindows_CUI_CComposition_CICompositor {
++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CICompositorVtbl* lpVtbl;
++};
++
++#ifdef COBJMACROS
++#ifndef WIDL_C_INLINE_WRAPPERS
++/*** IUnknown methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_AddRef(This) (This)->lpVtbl->AddRef(This)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_Release(This) (This)->lpVtbl->Release(This)
++/*** IInspectable methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
++/*** ICompositor methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateColorKeyFrameAnimation(This,result) (This)->lpVtbl->CreateColorKeyFrameAnimation(This,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateColorBrush(This,result) (This)->lpVtbl->CreateColorBrush(This,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateColorBrushWithColor(This,color,result) (This)->lpVtbl->CreateColorBrushWithColor(This,color,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateContainerVisual(This,result) (This)->lpVtbl->CreateContainerVisual(This,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateCubicBezierEasingFunction(This,controlPoint1,controlPoint2,result) (This)->lpVtbl->CreateCubicBezierEasingFunction(This,controlPoint1,controlPoint2,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateEffectFactory(This,graphicsEffect,result) (This)->lpVtbl->CreateEffectFactory(This,graphicsEffect,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateEffectFactoryWithProperties(This,graphicsEffect,animatableProperties,result) (This)->lpVtbl->CreateEffectFactoryWithProperties(This,graphicsEffect,animatableProperties,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateExpressionAnimation(This,result) (This)->lpVtbl->CreateExpressionAnimation(This,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateExpressionAnimationWithExpression(This,expression,result) (This)->lpVtbl->CreateExpressionAnimationWithExpression(This,expression,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateInsetClip(This,result) (This)->lpVtbl->CreateInsetClip(This,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateInsetClipWithInsets(This,leftInset,topInset,rightInset,bottomInset,result) (This)->lpVtbl->CreateInsetClipWithInsets(This,leftInset,topInset,rightInset,bottomInset,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateLinearEasingFunction(This,result) (This)->lpVtbl->CreateLinearEasingFunction(This,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreatePropertySet(This,result) (This)->lpVtbl->CreatePropertySet(This,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateQuaternionKeyFrameAnimation(This,result) (This)->lpVtbl->CreateQuaternionKeyFrameAnimation(This,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateScalarKeyFrameAnimation(This,result) (This)->lpVtbl->CreateScalarKeyFrameAnimation(This,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateScopedBatch(This,batchType,result) (This)->lpVtbl->CreateScopedBatch(This,batchType,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateSpriteVisual(This,result) (This)->lpVtbl->CreateSpriteVisual(This,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateSurfaceBrush(This,result) (This)->lpVtbl->CreateSurfaceBrush(This,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateSurfaceBrushWithSurface(This,surface,result) (This)->lpVtbl->CreateSurfaceBrushWithSurface(This,surface,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateTargetForCurrentView(This,result) (This)->lpVtbl->CreateTargetForCurrentView(This,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateVector2KeyFrameAnimation(This,result) (This)->lpVtbl->CreateVector2KeyFrameAnimation(This,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateVector3KeyFrameAnimation(This,result) (This)->lpVtbl->CreateVector3KeyFrameAnimation(This,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateVector4KeyFrameAnimation(This,result) (This)->lpVtbl->CreateVector4KeyFrameAnimation(This,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositor_GetCommitBatch(This,batchType,result) (This)->lpVtbl->GetCommitBatch(This,batchType,result)
++#else
++/*** IUnknown methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,REFIID riid,void **ppvObject) {
++ return This->lpVtbl->QueryInterface(This,riid,ppvObject);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositor_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositor* This) {
++ return This->lpVtbl->AddRef(This);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositor_Release(__x_ABI_CWindows_CUI_CComposition_CICompositor* This) {
++ return This->lpVtbl->Release(This);
++}
++/*** IInspectable methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_GetIids(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,ULONG *iidCount,IID **iids) {
++ return This->lpVtbl->GetIids(This,iidCount,iids);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,HSTRING *className) {
++ return This->lpVtbl->GetRuntimeClassName(This,className);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,TrustLevel *trustLevel) {
++ return This->lpVtbl->GetTrustLevel(This,trustLevel);
++}
++/*** ICompositor methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateColorKeyFrameAnimation(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation **result) {
++ return This->lpVtbl->CreateColorKeyFrameAnimation(This,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateColorBrush(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush **result) {
++ return This->lpVtbl->CreateColorBrush(This,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateColorBrushWithColor(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CColor color,__x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush **result) {
++ return This->lpVtbl->CreateColorBrushWithColor(This,color,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateContainerVisual(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CContainerVisual **result) {
++ return This->lpVtbl->CreateContainerVisual(This,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateCubicBezierEasingFunction(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector2 controlPoint1,__x_ABI_CWindows_CFoundation_CNumerics_CVector2 controlPoint2,__x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction **result) {
++ return This->lpVtbl->CreateCubicBezierEasingFunction(This,controlPoint1,controlPoint2,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateEffectFactory(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect *graphicsEffect,__x_ABI_CWindows_CUI_CComposition_CCompositionEffectFactory **result) {
++ return This->lpVtbl->CreateEffectFactory(This,graphicsEffect,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateEffectFactoryWithProperties(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect *graphicsEffect,int *animatableProperties,__x_ABI_CWindows_CUI_CComposition_CCompositionEffectFactory **result) {
++ return This->lpVtbl->CreateEffectFactoryWithProperties(This,graphicsEffect,animatableProperties,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateExpressionAnimation(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CExpressionAnimation **result) {
++ return This->lpVtbl->CreateExpressionAnimation(This,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateExpressionAnimationWithExpression(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,HSTRING expression,__x_ABI_CWindows_CUI_CComposition_CExpressionAnimation **result) {
++ return This->lpVtbl->CreateExpressionAnimationWithExpression(This,expression,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateInsetClip(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CInsetClip **result) {
++ return This->lpVtbl->CreateInsetClip(This,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateInsetClipWithInsets(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,FLOAT leftInset,FLOAT topInset,FLOAT rightInset,FLOAT bottomInset,__x_ABI_CWindows_CUI_CComposition_CInsetClip **result) {
++ return This->lpVtbl->CreateInsetClipWithInsets(This,leftInset,topInset,rightInset,bottomInset,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateLinearEasingFunction(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CLinearEasingFunction **result) {
++ return This->lpVtbl->CreateLinearEasingFunction(This,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreatePropertySet(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet **result) {
++ return This->lpVtbl->CreatePropertySet(This,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateQuaternionKeyFrameAnimation(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CQuaternionKeyFrameAnimation **result) {
++ return This->lpVtbl->CreateQuaternionKeyFrameAnimation(This,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateScalarKeyFrameAnimation(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CScalarKeyFrameAnimation **result) {
++ return This->lpVtbl->CreateScalarKeyFrameAnimation(This,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateScopedBatch(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CCompositionBatchTypes batchType,__x_ABI_CWindows_CUI_CComposition_CCompositionScopedBatch **result) {
++ return This->lpVtbl->CreateScopedBatch(This,batchType,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateSpriteVisual(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CSpriteVisual **result) {
++ return This->lpVtbl->CreateSpriteVisual(This,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateSurfaceBrush(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CCompositionSurfaceBrush **result) {
++ return This->lpVtbl->CreateSurfaceBrush(This,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateSurfaceBrushWithSurface(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CICompositionSurface *surface,__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush **result) {
++ return This->lpVtbl->CreateSurfaceBrushWithSurface(This,surface,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateTargetForCurrentView(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CCompositionTarget **result) {
++ return This->lpVtbl->CreateTargetForCurrentView(This,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateVector2KeyFrameAnimation(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CVector2KeyFrameAnimation **result) {
++ return This->lpVtbl->CreateVector2KeyFrameAnimation(This,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateVector3KeyFrameAnimation(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CVector3KeyFrameAnimation **result) {
++ return This->lpVtbl->CreateVector3KeyFrameAnimation(This,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateVector4KeyFrameAnimation(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CVector4KeyFrameAnimation **result) {
++ return This->lpVtbl->CreateVector4KeyFrameAnimation(This,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_GetCommitBatch(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CCompositionBatchTypes batchType,__x_ABI_CWindows_CUI_CComposition_CCompositionCommitBatch **result) {
++ return This->lpVtbl->GetCommitBatch(This,batchType,result);
++}
++#endif
++#endif
++
++#endif
++
++#endif /* ____x_ABI_CWindows_CUI_CComposition_CICompositor_INTERFACE_DEFINED__ */
++
++/*****************************************************************************
++ * ICompositionGraphicsDevice interface
++ */
++#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_INTERFACE_DEFINED__
++#define ____x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_INTERFACE_DEFINED__
++
++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice, 0xfb22c6e1, 0x80a2, 0x4667, 0x99,0x36, 0xdb,0xea,0xf6,0xee,0xfe,0x95);
++#if defined(__cplusplus) && !defined(CINTERFACE)
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Composition {
++ MIDL_INTERFACE("fb22c6e1-80a2-4667-9936-dbeaf6eefe95")
++ ICompositionGraphicsDevice : public IInspectable
++ {
++ virtual HRESULT STDMETHODCALLTYPE CreateDrawingSurface(
++ ABI::Windows::Foundation::Size sizePixels,
++ ABI::Windows::Graphics::DirectX::DirectXPixelFormat pixelFormat,
++ ABI::Windows::Graphics::DirectX::DirectXAlphaMode alphaMode,
++ ABI::Windows::UI::Composition::CompositionDrawingSurface **result) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE RenderingDeviceReplaced(
++ int *handler,
++ int *token) = 0;
++
++ virtual HRESULT STDMETHODCALLTYPE RenderingDeviceReplaced(
++ int token) = 0;
++
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#ifdef __CRT_UUID_DECL
++__CRT_UUID_DECL(ABI::Windows::UI::Composition::ICompositionGraphicsDevice, 0xfb22c6e1, 0x80a2, 0x4667, 0x99,0x36, 0xdb,0xea,0xf6,0xee,0xfe,0x95)
++#endif
++#else
++typedef struct __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDeviceVtbl {
++ BEGIN_INTERFACE
++
++ /*** IUnknown methods ***/
++ HRESULT (STDMETHODCALLTYPE *QueryInterface)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice *This,
++ REFIID riid,
++ void **ppvObject);
++
++ ULONG (STDMETHODCALLTYPE *AddRef)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice *This);
++
++ ULONG (STDMETHODCALLTYPE *Release)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice *This);
++
++ /*** IInspectable methods ***/
++ HRESULT (STDMETHODCALLTYPE *GetIids)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice *This,
++ ULONG *iidCount,
++ IID **iids);
++
++ HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice *This,
++ HSTRING *className);
++
++ HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice *This,
++ TrustLevel *trustLevel);
++
++ /*** ICompositionGraphicsDevice methods ***/
++ HRESULT (STDMETHODCALLTYPE *CreateDrawingSurface)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice *This,
++ __x_ABI_CWindows_CFoundation_CSize sizePixels,
++ __x_ABI_CWindows_CGraphics_CDirectX_CDirectXPixelFormat pixelFormat,
++ __x_ABI_CWindows_CGraphics_CDirectX_CDirectXAlphaMode alphaMode,
++ __x_ABI_CWindows_CUI_CComposition_CCompositionDrawingSurface **result);
++
++ HRESULT (STDMETHODCALLTYPE *RenderingDeviceReplaced)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice *This,
++ int *handler,
++ int *token);
++
++ HRESULT (STDMETHODCALLTYPE *RenderingDeviceReplaced)(
++ __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice *This,
++ int token);
++
++ END_INTERFACE
++} __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDeviceVtbl;
++
++interface __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice {
++ CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDeviceVtbl* lpVtbl;
++};
++
++#ifdef COBJMACROS
++#ifndef WIDL_C_INLINE_WRAPPERS
++/*** IUnknown methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_AddRef(This) (This)->lpVtbl->AddRef(This)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_Release(This) (This)->lpVtbl->Release(This)
++/*** IInspectable methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
++/*** ICompositionGraphicsDevice methods ***/
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_CreateDrawingSurface(This,sizePixels,pixelFormat,alphaMode,result) (This)->lpVtbl->CreateDrawingSurface(This,sizePixels,pixelFormat,alphaMode,result)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_RenderingDeviceReplaced(This,handler,token) (This)->lpVtbl->RenderingDeviceReplaced(This,handler,token)
++#define __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_RenderingDeviceReplaced(This,token) (This)->lpVtbl->RenderingDeviceReplaced(This,token)
++#else
++/*** IUnknown methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice* This,REFIID riid,void **ppvObject) {
++ return This->lpVtbl->QueryInterface(This,riid,ppvObject);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice* This) {
++ return This->lpVtbl->AddRef(This);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice* This) {
++ return This->lpVtbl->Release(This);
++}
++/*** IInspectable methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_GetIids(__x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice* This,ULONG *iidCount,IID **iids) {
++ return This->lpVtbl->GetIids(This,iidCount,iids);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice* This,HSTRING *className) {
++ return This->lpVtbl->GetRuntimeClassName(This,className);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice* This,TrustLevel *trustLevel) {
++ return This->lpVtbl->GetTrustLevel(This,trustLevel);
++}
++/*** ICompositionGraphicsDevice methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_CreateDrawingSurface(__x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice* This,__x_ABI_CWindows_CFoundation_CSize sizePixels,__x_ABI_CWindows_CGraphics_CDirectX_CDirectXPixelFormat pixelFormat,__x_ABI_CWindows_CGraphics_CDirectX_CDirectXAlphaMode alphaMode,__x_ABI_CWindows_CUI_CComposition_CCompositionDrawingSurface **result) {
++ return This->lpVtbl->CreateDrawingSurface(This,sizePixels,pixelFormat,alphaMode,result);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_RenderingDeviceReplaced(__x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice* This,int *handler,int *token) {
++ return This->lpVtbl->RenderingDeviceReplaced(This,handler,token);
++}
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_RenderingDeviceReplaced(__x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice* This,int token) {
++ return This->lpVtbl->RenderingDeviceReplaced(This,token);
++}
++#endif
++#endif
++
++#endif
++
++#endif /* ____x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_INTERFACE_DEFINED__ */
++
++extern const __declspec(selectany) WCHAR RuntimeClass_Windows_UI_Composition_SpriteVisual[] = L"Windows.UI.Composition.SpriteVisual";
++/* Begin additional prototypes for all interfaces */
++
++ULONG __RPC_USER HSTRING_UserSize (ULONG *, ULONG, HSTRING *);
++unsigned char * __RPC_USER HSTRING_UserMarshal (ULONG *, unsigned char *, HSTRING *);
++unsigned char * __RPC_USER HSTRING_UserUnmarshal(ULONG *, unsigned char *, HSTRING *);
++void __RPC_USER HSTRING_UserFree (ULONG *, HSTRING *);
++
++/* End additional prototypes */
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* __windows_ui_composition_h__ */
+diff --git a/mingw-w64-headers/include/windows.ui.composition.interop.h b/mingw-w64-headers/include/windows.ui.composition.interop.h
+new file mode 100644
+index 00000000..a82afdf1
+--- /dev/null
++++ b/mingw-w64-headers/include/windows.ui.composition.interop.h
+@@ -0,0 +1,31 @@
++#include <windows.ui.composition.h>
++
++namespace ABI {
++namespace Windows {
++namespace UI {
++namespace Composition {
++
++#undef INTERFACE
++#define INTERFACE ICompositorInterop
++ DECLARE_INTERFACE_IID_(ICompositorInterop, IUnknown, "25297d5c-3ad4-4c9c-b5cf-e36a38512330")
++ {
++ IFACEMETHOD(CreateCompositionSurfaceForHandle)(
++ HANDLE swapChain,
++ ICompositionSurface **result) PURE;
++ IFACEMETHOD(CreateCompositionSurfaceForSwapChain)(
++ IUnknown *swapChain,
++ ICompositionSurface **result) PURE;
++
++ IFACEMETHOD(CreateGraphicsDevice)(
++ IUnknown *renderingDevice,
++ ICompositionGraphicsDevice **result) PURE;
++ };
++}
++}
++}
++}
++
++#ifdef __CRT_UUID_DECL
++__CRT_UUID_DECL(ABI::Windows::UI::Composition::ICompositorInterop, 0x25297d5c,0x3ad4,0x4c9c,0xb5,0xcf,0xe3,0x6a,0x38,0x51,0x23,0x30)
++#endif
++
+diff --git a/mingw-w64-headers/include/windows.ui.core.h b/mingw-w64-headers/include/windows.ui.core.h
+new file mode 100644
+index 00000000..a3c16ac2
+--- /dev/null
++++ b/mingw-w64-headers/include/windows.ui.core.h
+@@ -0,0 +1,127 @@
++/*** Autogenerated by WIDL 4.4 from windows.ui.core.idl - Do not edit ***/
++
++#ifdef _WIN32
++#ifndef __REQUIRED_RPCNDR_H_VERSION__
++#define __REQUIRED_RPCNDR_H_VERSION__ 475
++#endif
++#include <rpc.h>
++#include <rpcndr.h>
++#endif
++
++#ifndef COM_NO_WINDOWS_H
++#include <windows.h>
++#include <ole2.h>
++#endif
++
++#ifndef __windows_ui_core_h__
++#define __windows_ui_core_h__
++
++/* Forward declarations */
++
++#ifndef ____x_ABI_CWindows_CUI_CCore_CCoreDispatcher_FWD_DEFINED__
++#define ____x_ABI_CWindows_CUI_CCore_CCoreDispatcher_FWD_DEFINED__
++typedef interface __x_ABI_CWindows_CUI_CCore_CCoreDispatcher __x_ABI_CWindows_CUI_CCore_CCoreDispatcher;
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Core {
++ interface CoreDispatcher;
++ }
++ }
++ }
++}
++#endif /* __cplusplus */
++#endif
++
++/* Headers for imported files */
++
++#include <inspectable.h>
++#include <windows.foundation.h>
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/*****************************************************************************
++ * CoreDispatcher interface
++ */
++#ifndef ____x_ABI_CWindows_CUI_CCore_CCoreDispatcher_INTERFACE_DEFINED__
++#define ____x_ABI_CWindows_CUI_CCore_CCoreDispatcher_INTERFACE_DEFINED__
++
++DEFINE_GUID(IID___x_ABI_CWindows_CUI_CCore_CCoreDispatcher, 0x3fe05581, 0x1ad1, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b);
++#if defined(__cplusplus) && !defined(CINTERFACE)
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ namespace Core {
++ MIDL_INTERFACE("3fe05581-1ad1-4f97-9666-402d76e4233b")
++ CoreDispatcher : public IUnknown
++ {
++ };
++ }
++ }
++ }
++}
++extern "C" {
++#ifdef __CRT_UUID_DECL
++__CRT_UUID_DECL(ABI::Windows::UI::Core::CoreDispatcher, 0x3fe05581, 0x1ad1, 0x4f97, 0x96,0x66, 0x40,0x2d,0x76,0xe4,0x23,0x3b)
++#endif
++#else
++typedef struct __x_ABI_CWindows_CUI_CCore_CCoreDispatcherVtbl {
++ BEGIN_INTERFACE
++
++ /*** IUnknown methods ***/
++ HRESULT (STDMETHODCALLTYPE *QueryInterface)(
++ __x_ABI_CWindows_CUI_CCore_CCoreDispatcher *This,
++ REFIID riid,
++ void **ppvObject);
++
++ ULONG (STDMETHODCALLTYPE *AddRef)(
++ __x_ABI_CWindows_CUI_CCore_CCoreDispatcher *This);
++
++ ULONG (STDMETHODCALLTYPE *Release)(
++ __x_ABI_CWindows_CUI_CCore_CCoreDispatcher *This);
++
++ END_INTERFACE
++} __x_ABI_CWindows_CUI_CCore_CCoreDispatcherVtbl;
++
++interface __x_ABI_CWindows_CUI_CCore_CCoreDispatcher {
++ CONST_VTBL __x_ABI_CWindows_CUI_CCore_CCoreDispatcherVtbl* lpVtbl;
++};
++
++#ifdef COBJMACROS
++#ifndef WIDL_C_INLINE_WRAPPERS
++/*** IUnknown methods ***/
++#define __x_ABI_CWindows_CUI_CCore_CCoreDispatcher_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
++#define __x_ABI_CWindows_CUI_CCore_CCoreDispatcher_AddRef(This) (This)->lpVtbl->AddRef(This)
++#define __x_ABI_CWindows_CUI_CCore_CCoreDispatcher_Release(This) (This)->lpVtbl->Release(This)
++#else
++/*** IUnknown methods ***/
++static FORCEINLINE HRESULT __x_ABI_CWindows_CUI_CCore_CCoreDispatcher_QueryInterface(__x_ABI_CWindows_CUI_CCore_CCoreDispatcher* This,REFIID riid,void **ppvObject) {
++ return This->lpVtbl->QueryInterface(This,riid,ppvObject);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CCore_CCoreDispatcher_AddRef(__x_ABI_CWindows_CUI_CCore_CCoreDispatcher* This) {
++ return This->lpVtbl->AddRef(This);
++}
++static FORCEINLINE ULONG __x_ABI_CWindows_CUI_CCore_CCoreDispatcher_Release(__x_ABI_CWindows_CUI_CCore_CCoreDispatcher* This) {
++ return This->lpVtbl->Release(This);
++}
++#endif
++#endif
++
++#endif
++
++#endif /* ____x_ABI_CWindows_CUI_CCore_CCoreDispatcher_INTERFACE_DEFINED__ */
++
++/* Begin additional prototypes for all interfaces */
++
++
++/* End additional prototypes */
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* __windows_ui_core_h__ */
+diff --git a/mingw-w64-headers/include/windows.ui.h b/mingw-w64-headers/include/windows.ui.h
+new file mode 100644
+index 00000000..2e4abd54
+--- /dev/null
++++ b/mingw-w64-headers/include/windows.ui.h
+@@ -0,0 +1,72 @@
++/*** Autogenerated by WIDL 4.4 from windows.ui.idl - Do not edit ***/
++
++#ifdef _WIN32
++#ifndef __REQUIRED_RPCNDR_H_VERSION__
++#define __REQUIRED_RPCNDR_H_VERSION__ 475
++#endif
++#include <rpc.h>
++#include <rpcndr.h>
++#endif
++
++#ifndef COM_NO_WINDOWS_H
++#include <windows.h>
++#include <ole2.h>
++#endif
++
++#ifndef __windows_ui_h__
++#define __windows_ui_h__
++
++/* Forward declarations */
++
++/* Headers for imported files */
++
++#include <inspectable.h>
++#include <windows.foundation.h>
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#ifdef __cplusplus
++} /* extern "C" */
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++ struct Color {
++ BYTE A;
++ BYTE R;
++ BYTE G;
++ BYTE B;
++ };
++ }
++ }
++}
++extern "C" {
++#else
++struct __x_ABI_CWindows_CUI_CColor {
++ BYTE A;
++ BYTE R;
++ BYTE G;
++ BYTE B;
++};
++#endif
++
++#ifdef __cplusplus
++namespace ABI {
++ namespace Windows {
++ namespace UI {
++typedef struct Color Color;
++ }
++ }
++}
++#endif /* __cplusplus */
++/* Begin additional prototypes for all interfaces */
++
++
++/* End additional prototypes */
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* __windows_ui_h__ */
1
0

[tor-browser/tor-browser-60.8.0esr-8.5-1] Bug 30575: Don't allow enterprise policies in Tor Browser
by gk@torproject.org 28 Aug '19
by gk@torproject.org 28 Aug '19
28 Aug '19
commit 85e9a040aea41cf3c926394da1bcf22a298bf081
Author: Georg Koppen <gk(a)torproject.org>
Date: Fri Jun 7 11:49:06 2019 +0000
Bug 30575: Don't allow enterprise policies in Tor Browser
---
.../enterprisepolicies/EnterprisePolicies.js | 18 ++++--------------
1 file changed, 4 insertions(+), 14 deletions(-)
diff --git a/browser/components/enterprisepolicies/EnterprisePolicies.js b/browser/components/enterprisepolicies/EnterprisePolicies.js
index 20cc33628f2a..4bab7d000ab0 100644
--- a/browser/components/enterprisepolicies/EnterprisePolicies.js
+++ b/browser/components/enterprisepolicies/EnterprisePolicies.js
@@ -78,20 +78,10 @@ EnterprisePoliciesManager.prototype = {
_xpcom_factory: EnterprisePoliciesFactory,
_initialize() {
- let provider = this._chooseProvider();
-
- if (!provider) {
- this.status = Ci.nsIEnterprisePolicies.INACTIVE;
- return;
- }
-
- if (provider.failed) {
- this.status = Ci.nsIEnterprisePolicies.FAILED;
- return;
- }
-
- this.status = Ci.nsIEnterprisePolicies.ACTIVE;
- this._activatePolicies(provider.policies);
+ // We don't want to have any enterprise policies in Tor Browser enabled as
+ // those can affect proxy settings etc. See: e.g. #30575.
+ this.status = Ci.nsIEnterprisePolicies.INACTIVE;
+ return;
},
_chooseProvider() {
1
0

[tor-browser-build/maint-8.5] FIXUP: recreated 27503.patch against widl sources without dev debug logging
by gk@torproject.org 28 Aug '19
by gk@torproject.org 28 Aug '19
28 Aug '19
commit 08145374a2249acd6aa90dd7705f632e8774c9d0
Author: Richard Pospesel <richard(a)torproject.org>
Date: Fri Jul 5 13:45:51 2019 -0700
FIXUP: recreated 27503.patch against widl sources without dev debug logging
---
projects/mingw-w64/27503.patch | 258 ++++++++++++++---------------------------
1 file changed, 90 insertions(+), 168 deletions(-)
diff --git a/projects/mingw-w64/27503.patch b/projects/mingw-w64/27503.patch
index f6bd197..ca542d0 100644
--- a/projects/mingw-w64/27503.patch
+++ b/projects/mingw-w64/27503.patch
@@ -1161,7 +1161,7 @@ index 0d44b403..0e62f77c 100644
return 1;
return 0;
diff --git a/mingw-w64-tools/widl/src/parser.tab.c b/mingw-w64-tools/widl/src/parser.tab.c
-index 6266e054..d7053e79 100644
+index 6266e054..8cd1605a 100644
--- a/mingw-w64-tools/widl/src/parser.tab.c
+++ b/mingw-w64-tools/widl/src/parser.tab.c
@@ -1,8 +1,8 @@
@@ -4829,7 +4829,7 @@ index 6266e054..d7053e79 100644
int top)
{
var_t *v = decl->var;
-@@ -5638,58 +5685,80 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
+@@ -5638,58 +5685,74 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
expr_t *dim;
type_t **ptype;
type_t *func_type = decl ? decl->func_type : NULL;
@@ -4912,12 +4912,6 @@ index 6266e054..d7053e79 100644
- if (!ptr_attr && top && (*pt)->details.pointer.def_fc != FC_RP)
+ if (!ptr_attr && top && type_pointer_get_default_fc(*pt) != FC_RP)
{
-+ printf("dup_pointer_type!\n");
-+ printf("type : %p name : %s\n", *pt, (*pt)->name);
-+ /* ptr_attr is ref,unique or full (FC_RP, FC_UP, FC_FP) */
-+ /* *pt could be the var's declspec's type OR a type on a typedef */
-+ /* not an array */
-+
/* FIXME: this is a horrible hack to cope with the issue that we
* store an offset to the typeformat string in the type object, but
* two typeformat strings may be written depending on whether the
@@ -4927,7 +4921,7 @@ index 6266e054..d7053e79 100644
}
}
else if (ptr_attr)
-@@ -5700,16 +5769,16 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
+@@ -5700,16 +5763,16 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
{
type_t *t = type;
@@ -4947,7 +4941,7 @@ index 6266e054..d7053e79 100644
else
break;
}
-@@ -5726,15 +5795,15 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
+@@ -5726,15 +5789,15 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
if (is_attr(v->attrs, ATTR_V1ENUM))
{
@@ -4966,7 +4960,7 @@ index 6266e054..d7053e79 100644
if (sizes) LIST_FOR_EACH_ENTRY(dim, sizes, expr_t, entry)
{
if (dim->type != EXPR_VOID)
-@@ -5747,7 +5816,7 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
+@@ -5747,7 +5810,7 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
else
*ptype = type_new_array((*ptype)->name,
type_array_get_element(*ptype), FALSE,
@@ -4975,7 +4969,7 @@ index 6266e054..d7053e79 100644
}
else if (is_ptr(*ptype))
*ptype = type_new_array((*ptype)->name, type_pointer_get_ref(*ptype), TRUE,
-@@ -5756,15 +5825,16 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
+@@ -5756,15 +5819,16 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
error_loc("%s: size_is attribute applied to illegal type\n", v->name);
}
@@ -4995,7 +4989,7 @@ index 6266e054..d7053e79 100644
if (lengs) LIST_FOR_EACH_ENTRY(dim, lengs, expr_t, entry)
{
if (dim->type != EXPR_VOID)
-@@ -5782,10 +5852,11 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
+@@ -5782,10 +5846,11 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
error_loc("%s: length_is attribute applied to illegal type\n", v->name);
}
@@ -5009,7 +5003,7 @@ index 6266e054..d7053e79 100644
else
error_loc("%s: too many expressions in length_is attribute\n", v->name);
}
-@@ -5796,29 +5867,31 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
+@@ -5796,29 +5861,31 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
if (func_type)
{
type_t *ft, *t;
@@ -5050,7 +5044,7 @@ index 6266e054..d7053e79 100644
return v;
}
-@@ -5866,6 +5939,10 @@ var_list_t *append_var(var_list_t *list, var_t *var)
+@@ -5866,6 +5933,10 @@ var_list_t *append_var(var_list_t *list, var_t *var)
list_init( list );
}
list_add_tail( list, &var->entry );
@@ -5061,7 +5055,7 @@ index 6266e054..d7053e79 100644
return list;
}
-@@ -5885,11 +5962,11 @@ var_t *make_var(char *name)
+@@ -5885,11 +5956,11 @@ var_t *make_var(char *name)
{
var_t *v = xmalloc(sizeof(var_t));
v->name = name;
@@ -5075,7 +5069,7 @@ index 6266e054..d7053e79 100644
return v;
}
-@@ -5897,10 +5974,9 @@ static var_t *copy_var(var_t *src, char *name, map_attrs_filter_t attr_filter)
+@@ -5897,10 +5968,9 @@ static var_t *copy_var(var_t *src, char *name, map_attrs_filter_t attr_filter)
{
var_t *v = xmalloc(sizeof(var_t));
v->name = name;
@@ -5087,7 +5081,7 @@ index 6266e054..d7053e79 100644
v->loc_info = src->loc_info;
return v;
}
-@@ -5920,7 +5996,7 @@ static declarator_t *make_declarator(var_t *var)
+@@ -5920,7 +5990,7 @@ static declarator_t *make_declarator(var_t *var)
{
declarator_t *d = xmalloc(sizeof(*d));
d->var = var ? var : make_var(NULL);
@@ -5096,7 +5090,7 @@ index 6266e054..d7053e79 100644
d->func_type = NULL;
d->bits = NULL;
return d;
-@@ -5928,7 +6004,15 @@ static declarator_t *make_declarator(var_t *var)
+@@ -5928,7 +5998,15 @@ static declarator_t *make_declarator(var_t *var)
static type_t *make_safearray(type_t *type)
{
@@ -5113,16 +5107,7 @@ index 6266e054..d7053e79 100644
NULL, NULL, FC_RP);
}
-@@ -6007,6 +6091,8 @@ type_t *reg_type(type_t *type, const char *name, struct namespace *namespace, in
- }
- if (!namespace)
- namespace = &global_namespace;
-+ printf("reg_type { name : %s, namespace : %s, type : %s, ptr : %p}\n", name, namespace->name, ts_to_str(t), type);
-+
- hash = hash_ident(name);
- nt = xmalloc(sizeof(struct rtype));
- nt->name = name;
-@@ -6018,15 +6104,16 @@ type_t *reg_type(type_t *type, const char *name, struct namespace *namespace, in
+@@ -6018,15 +6096,16 @@ type_t *reg_type(type_t *type, const char *name, struct namespace *namespace, in
nt->t = t;
nt->next = namespace->type_hash[hash];
namespace->type_hash[hash] = nt;
@@ -5142,7 +5127,7 @@ index 6266e054..d7053e79 100644
type_get_type_detect_alias(t) == TYPE_UNION ||
type_get_type_detect_alias(t) == TYPE_ENCAPSULATED_UNION);
}
-@@ -6034,19 +6121,16 @@ static int is_incomplete(const type_t *t)
+@@ -6034,19 +6113,16 @@ static int is_incomplete(const type_t *t)
void add_incomplete(type_t *t)
{
struct typenode *tn = xmalloc(sizeof *tn);
@@ -5166,7 +5151,7 @@ index 6266e054..d7053e79 100644
t->defined = ot->defined;
}
}
-@@ -6070,7 +6154,7 @@ static void fix_incomplete_types(type_t *complete_type)
+@@ -6070,7 +6146,7 @@ static void fix_incomplete_types(type_t *complete_type)
{
if (type_is_equal(complete_type, tn->type))
{
@@ -5175,7 +5160,7 @@ index 6266e054..d7053e79 100644
list_remove(&tn->entry);
free(tn);
}
-@@ -6094,7 +6178,13 @@ static type_t *reg_typedefs(decl_spec_t *decl_spec, declarator_list_t *decls, at
+@@ -6094,7 +6170,13 @@ static type_t *reg_typedefs(decl_spec_t *decl_spec, declarator_list_t *decls, at
type_get_type_detect_alias(type) == TYPE_ENCAPSULATED_UNION)
{
if (!type->name)
@@ -5189,13 +5174,7 @@ index 6266e054..d7053e79 100644
/* replace existing attributes when generating a typelib */
if (do_typelib)
-@@ -6120,12 +6210,12 @@ static type_t *reg_typedefs(decl_spec_t *decl_spec, declarator_list_t *decls, at
- * for cleaner solution.
- */
- if (cur && input_name == cur->loc_info.input_name)
-- error_loc("%s: redefinition error; original definition was at %s:%d\n",
-+ error_loc("FOO %s: redefinition error; original definition was at %s:%d\n",
- cur->name, cur->loc_info.input_name,
+@@ -6125,7 +6207,7 @@ static type_t *reg_typedefs(decl_spec_t *decl_spec, declarator_list_t *decls, at
cur->loc_info.line_number);
name = declare_var(attrs, decl_spec, decl, 0);
@@ -5204,16 +5183,7 @@ index 6266e054..d7053e79 100644
cur->attrs = attrs;
if (is_incomplete(cur))
-@@ -6140,6 +6230,8 @@ type_t *find_type(const char *name, struct namespace *namespace, int t)
- {
- struct rtype *cur;
-
-+ printf("find_type { name : %s, namespace %s, type : %s }\n", name, namespace ? namespace->name : NULL, ts_to_str(t));
-+
- if(namespace && namespace != &global_namespace) {
- for(cur = namespace->type_hash[hash_ident(name)]; cur; cur = cur->next) {
- if(cur->t == t && !strcmp(cur->name, name))
-@@ -6293,7 +6385,6 @@ struct allowed_attr allowed_attr[] =
+@@ -6293,7 +6375,6 @@ struct allowed_attr allowed_attr[] =
/* ATTR_CASE */ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, "case" },
/* ATTR_CODE */ { 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "code" },
/* ATTR_COMMSTATUS */ { 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "comm_status" },
@@ -5221,7 +5191,7 @@ index 6266e054..d7053e79 100644
/* ATTR_CONTEXTHANDLE */ { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "context_handle" },
/* ATTR_CONTROL */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, "control" },
/* ATTR_DECODE */ { 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "decode" },
-@@ -6328,7 +6419,6 @@ struct allowed_attr allowed_attr[] =
+@@ -6328,7 +6409,6 @@ struct allowed_attr allowed_attr[] =
/* ATTR_IMMEDIATEBIND */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "immediatebind" },
/* ATTR_IMPLICIT_HANDLE */ { 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "implicit_handle" },
/* ATTR_IN */ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "in" },
@@ -5229,7 +5199,7 @@ index 6266e054..d7053e79 100644
/* ATTR_INPUTSYNC */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "inputsync" },
/* ATTR_LENGTHIS */ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, "length_is" },
/* ATTR_LIBLCID */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, "lcid" },
-@@ -6400,10 +6490,10 @@ static attr_list_t *check_iface_attrs(const char *name, attr_list_t *attrs)
+@@ -6400,10 +6480,10 @@ static attr_list_t *check_iface_attrs(const char *name, attr_list_t *attrs)
if (attr->type == ATTR_IMPLICIT_HANDLE)
{
const var_t *var = attr->u.pval;
@@ -5243,7 +5213,7 @@ index 6266e054..d7053e79 100644
continue;
error_loc("attribute %s requires a handle type in interface %s\n",
allowed_attr[attr->type].display_name, name);
-@@ -6608,7 +6698,7 @@ static int is_ptr_guid_type(const type_t *type)
+@@ -6608,7 +6688,7 @@ static int is_ptr_guid_type(const type_t *type)
/* second, make sure it is a pointer to something of size sizeof(GUID),
* i.e. 16 bytes */
@@ -5252,7 +5222,7 @@ index 6266e054..d7053e79 100644
}
static void check_conformance_expr_list(const char *attr_name, const var_t *arg, const type_t *container_type, expr_list_t *expr_list)
-@@ -6635,7 +6725,7 @@ static void check_remoting_fields(const var_t *var, type_t *type);
+@@ -6635,7 +6715,7 @@ static void check_remoting_fields(const var_t *var, type_t *type);
static void check_field_common(const type_t *container_type,
const char *container_name, const var_t *arg)
{
@@ -5261,7 +5231,7 @@ index 6266e054..d7053e79 100644
int more_to_do;
const char *container_type_name;
const char *var_type;
-@@ -6665,7 +6755,7 @@ static void check_field_common(const type_t *container_type,
+@@ -6665,7 +6745,7 @@ static void check_field_common(const type_t *container_type,
}
if (is_attr(arg->attrs, ATTR_LENGTHIS) &&
@@ -5270,7 +5240,7 @@ index 6266e054..d7053e79 100644
error_loc_info(&arg->loc_info,
"string and length_is specified for argument %s are mutually exclusive attributes\n",
arg->name);
-@@ -6762,23 +6852,28 @@ static void check_field_common(const type_t *container_type,
+@@ -6762,23 +6842,28 @@ static void check_field_common(const type_t *container_type,
{
const type_t *t = type;
while (is_ptr(t))
@@ -5303,7 +5273,7 @@ index 6266e054..d7053e79 100644
case TGT_RANGE:
/* nothing to do */
break;
-@@ -6803,13 +6898,18 @@ static void check_remoting_fields(const var_t *var, type_t *type)
+@@ -6803,13 +6888,18 @@ static void check_remoting_fields(const var_t *var, type_t *type)
if (type_is_complete(type))
fields = type_struct_get_fields(type);
else
@@ -5325,7 +5295,7 @@ index 6266e054..d7053e79 100644
}
/* checks that arguments for a function make sense for marshalling and unmarshalling */
-@@ -6818,9 +6918,10 @@ static void check_remoting_args(const var_t *func)
+@@ -6818,9 +6908,10 @@ static void check_remoting_args(const var_t *func)
const char *funcname = func->name;
const var_t *arg;
@@ -5338,7 +5308,7 @@ index 6266e054..d7053e79 100644
/* check that [out] parameters have enough pointer levels */
if (is_attr(arg->attrs, ATTR_OUT))
-@@ -6860,16 +6961,16 @@ static void check_remoting_args(const var_t *func)
+@@ -6860,16 +6951,16 @@ static void check_remoting_args(const var_t *func)
}
}
@@ -5359,7 +5329,7 @@ index 6266e054..d7053e79 100644
free(var.name);
}
}
-@@ -6886,8 +6987,8 @@ static void add_explicit_handle_if_necessary(const type_t *iface, var_t *func)
+@@ -6886,8 +6977,8 @@ static void add_explicit_handle_if_necessary(const type_t *iface, var_t *func)
* function */
var_t *idl_handle = make_var(xstrdup("IDL_handle"));
idl_handle->attrs = append_attr(NULL, make_attr(ATTR_IN));
@@ -5370,7 +5340,7 @@ index 6266e054..d7053e79 100644
}
}
-@@ -6952,6 +7053,7 @@ static void check_async_uuid(type_t *iface)
+@@ -6952,6 +7043,7 @@ static void check_async_uuid(type_t *iface)
type_t *async_iface;
type_t *inherit;
@@ -5378,7 +5348,7 @@ index 6266e054..d7053e79 100644
if (!is_attr(iface->attrs, ATTR_ASYNCUUID)) return;
inherit = iface->details.iface->inherit;
-@@ -6968,7 +7070,8 @@ static void check_async_uuid(type_t *iface)
+@@ -6968,7 +7060,8 @@ static void check_async_uuid(type_t *iface)
var_t *begin_func, *finish_func, *func = stmt->u.var, *arg;
var_list_t *begin_args = NULL, *finish_args = NULL, *args;
@@ -5388,7 +5358,7 @@ index 6266e054..d7053e79 100644
if (args) LIST_FOR_EACH_ENTRY(arg, args, var_t, entry)
{
if (is_attr(arg->attrs, ATTR_IN) || !is_attr(arg->attrs, ATTR_OUT))
-@@ -6978,15 +7081,15 @@ static void check_async_uuid(type_t *iface)
+@@ -6978,15 +7071,15 @@ static void check_async_uuid(type_t *iface)
}
begin_func = copy_var(func, concat_str("Begin_", func->name), NULL);
@@ -5410,7 +5380,7 @@ index 6266e054..d7053e79 100644
stmts = append_statement(stmts, make_statement_declaration(finish_func));
}
-@@ -7026,6 +7129,7 @@ static void check_statements(const statement_list_t *stmts, int is_inside_librar
+@@ -7026,6 +7119,7 @@ static void check_statements(const statement_list_t *stmts, int is_inside_librar
static void check_all_user_types(const statement_list_t *stmts)
{
const statement_t *stmt;
@@ -5418,7 +5388,7 @@ index 6266e054..d7053e79 100644
if (stmts) LIST_FOR_EACH_ENTRY(stmt, stmts, const statement_t, entry)
{
-@@ -7037,7 +7141,11 @@ static void check_all_user_types(const statement_list_t *stmts)
+@@ -7037,7 +7131,11 @@ static void check_all_user_types(const statement_list_t *stmts)
const statement_t *stmt_func;
STATEMENTS_FOR_EACH_FUNC(stmt_func, type_iface_get_stmts(stmt->u.type)) {
const var_t *func = stmt_func->u.var;
@@ -5431,7 +5401,7 @@ index 6266e054..d7053e79 100644
}
}
}
-@@ -7071,6 +7179,10 @@ static statement_t *make_statement_type_decl(type_t *type)
+@@ -7071,6 +7169,10 @@ static statement_t *make_statement_type_decl(type_t *type)
{
statement_t *stmt = make_statement(STMT_TYPE);
stmt->u.type = type;
@@ -5442,7 +5412,7 @@ index 6266e054..d7053e79 100644
return stmt;
}
-@@ -7085,16 +7197,16 @@ static statement_t *make_statement_declaration(var_t *var)
+@@ -7085,16 +7187,16 @@ static statement_t *make_statement_declaration(var_t *var)
{
statement_t *stmt = make_statement(STMT_DECLARATION);
stmt->u.var = var;
@@ -5462,7 +5432,7 @@ index 6266e054..d7053e79 100644
error_loc("instantiation of data is illegal\n");
return stmt;
}
-@@ -7146,6 +7258,7 @@ static statement_t *make_statement_typedef(declarator_list_t *decls)
+@@ -7146,6 +7248,7 @@ static statement_t *make_statement_typedef(declarator_list_t *decls)
declarator_t *decl, *next;
statement_t *stmt;
type_list_t **type_list;
@@ -5470,7 +5440,7 @@ index 6266e054..d7053e79 100644
if (!decls) return NULL;
-@@ -7157,6 +7270,18 @@ static statement_t *make_statement_typedef(declarator_list_t *decls)
+@@ -7157,6 +7260,18 @@ static statement_t *make_statement_typedef(declarator_list_t *decls)
{
var_t *var = decl->var;
type_t *type = find_type_or_error(var->name, 0);
@@ -5489,7 +5459,7 @@ index 6266e054..d7053e79 100644
*type_list = xmalloc(sizeof(type_list_t));
(*type_list)->type = type;
(*type_list)->next = NULL;
-@@ -7166,6 +7291,7 @@ static statement_t *make_statement_typedef(declarator_list_t *decls)
+@@ -7166,6 +7281,7 @@ static statement_t *make_statement_typedef(declarator_list_t *decls)
free(var);
}
@@ -5497,14 +5467,13 @@ index 6266e054..d7053e79 100644
return stmt;
}
-@@ -7206,7 +7332,7 @@ void init_loc_info(loc_info_t *i)
+@@ -7206,7 +7322,7 @@ void init_loc_info(loc_info_t *i)
static void check_def(const type_t *t)
{
- if (t->defined)
-- error_loc("%s: redefinition error; original definition was at %s:%d\n",
+ if (type_is_defined(t))
-+ error_loc("BAR %s: redefinition error; original definition was at %s:%d\n",
+ error_loc("%s: redefinition error; original definition was at %s:%d\n",
t->name, t->loc_info.input_name, t->loc_info.line_number);
}
diff --git a/mingw-w64-tools/widl/src/parser.tab.h b/mingw-w64-tools/widl/src/parser.tab.h
@@ -5544,7 +5513,7 @@ index 09874726..fc7a8f4d 100644
typedef union YYSTYPE YYSTYPE;
diff --git a/mingw-w64-tools/widl/src/parser.y b/mingw-w64-tools/widl/src/parser.y
-index d9793941..bb14bf76 100644
+index d9793941..64503ac1 100644
--- a/mingw-w64-tools/widl/src/parser.y
+++ b/mingw-w64-tools/widl/src/parser.y
@@ -52,13 +52,6 @@ struct _import_t
@@ -6008,7 +5977,7 @@ index d9793941..bb14bf76 100644
int top)
{
var_t *v = decl->var;
-@@ -1523,58 +1573,80 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
+@@ -1523,58 +1573,74 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
expr_t *dim;
type_t **ptype;
type_t *func_type = decl ? decl->func_type : NULL;
@@ -6091,12 +6060,6 @@ index d9793941..bb14bf76 100644
- if (!ptr_attr && top && (*pt)->details.pointer.def_fc != FC_RP)
+ if (!ptr_attr && top && type_pointer_get_default_fc(*pt) != FC_RP)
{
-+ printf("dup_pointer_type!\n");
-+ printf("type : %p name : %s\n", *pt, (*pt)->name);
-+ /* ptr_attr is ref,unique or full (FC_RP, FC_UP, FC_FP) */
-+ /* *pt could be the var's declspec's type OR a type on a typedef */
-+ /* not an array */
-+
/* FIXME: this is a horrible hack to cope with the issue that we
* store an offset to the typeformat string in the type object, but
* two typeformat strings may be written depending on whether the
@@ -6106,7 +6069,7 @@ index d9793941..bb14bf76 100644
}
}
else if (ptr_attr)
-@@ -1585,16 +1657,16 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
+@@ -1585,16 +1651,16 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
{
type_t *t = type;
@@ -6126,7 +6089,7 @@ index d9793941..bb14bf76 100644
else
break;
}
-@@ -1611,15 +1683,15 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
+@@ -1611,15 +1677,15 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
if (is_attr(v->attrs, ATTR_V1ENUM))
{
@@ -6145,7 +6108,7 @@ index d9793941..bb14bf76 100644
if (sizes) LIST_FOR_EACH_ENTRY(dim, sizes, expr_t, entry)
{
if (dim->type != EXPR_VOID)
-@@ -1632,7 +1704,7 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
+@@ -1632,7 +1698,7 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
else
*ptype = type_new_array((*ptype)->name,
type_array_get_element(*ptype), FALSE,
@@ -6154,7 +6117,7 @@ index d9793941..bb14bf76 100644
}
else if (is_ptr(*ptype))
*ptype = type_new_array((*ptype)->name, type_pointer_get_ref(*ptype), TRUE,
-@@ -1641,15 +1713,16 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
+@@ -1641,15 +1707,16 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
error_loc("%s: size_is attribute applied to illegal type\n", v->name);
}
@@ -6174,7 +6137,7 @@ index d9793941..bb14bf76 100644
if (lengs) LIST_FOR_EACH_ENTRY(dim, lengs, expr_t, entry)
{
if (dim->type != EXPR_VOID)
-@@ -1667,10 +1740,11 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
+@@ -1667,10 +1734,11 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
error_loc("%s: length_is attribute applied to illegal type\n", v->name);
}
@@ -6188,7 +6151,7 @@ index d9793941..bb14bf76 100644
else
error_loc("%s: too many expressions in length_is attribute\n", v->name);
}
-@@ -1681,29 +1755,31 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
+@@ -1681,29 +1749,31 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
if (func_type)
{
type_t *ft, *t;
@@ -6229,7 +6192,7 @@ index d9793941..bb14bf76 100644
return v;
}
-@@ -1751,6 +1827,10 @@ var_list_t *append_var(var_list_t *list, var_t *var)
+@@ -1751,6 +1821,10 @@ var_list_t *append_var(var_list_t *list, var_t *var)
list_init( list );
}
list_add_tail( list, &var->entry );
@@ -6240,7 +6203,7 @@ index d9793941..bb14bf76 100644
return list;
}
-@@ -1770,11 +1850,11 @@ var_t *make_var(char *name)
+@@ -1770,11 +1844,11 @@ var_t *make_var(char *name)
{
var_t *v = xmalloc(sizeof(var_t));
v->name = name;
@@ -6254,7 +6217,7 @@ index d9793941..bb14bf76 100644
return v;
}
-@@ -1782,10 +1862,9 @@ static var_t *copy_var(var_t *src, char *name, map_attrs_filter_t attr_filter)
+@@ -1782,10 +1856,9 @@ static var_t *copy_var(var_t *src, char *name, map_attrs_filter_t attr_filter)
{
var_t *v = xmalloc(sizeof(var_t));
v->name = name;
@@ -6266,7 +6229,7 @@ index d9793941..bb14bf76 100644
v->loc_info = src->loc_info;
return v;
}
-@@ -1805,7 +1884,7 @@ static declarator_t *make_declarator(var_t *var)
+@@ -1805,7 +1878,7 @@ static declarator_t *make_declarator(var_t *var)
{
declarator_t *d = xmalloc(sizeof(*d));
d->var = var ? var : make_var(NULL);
@@ -6275,7 +6238,7 @@ index d9793941..bb14bf76 100644
d->func_type = NULL;
d->bits = NULL;
return d;
-@@ -1813,7 +1892,15 @@ static declarator_t *make_declarator(var_t *var)
+@@ -1813,7 +1886,15 @@ static declarator_t *make_declarator(var_t *var)
static type_t *make_safearray(type_t *type)
{
@@ -6292,16 +6255,7 @@ index d9793941..bb14bf76 100644
NULL, NULL, FC_RP);
}
-@@ -1892,6 +1979,8 @@ type_t *reg_type(type_t *type, const char *name, struct namespace *namespace, in
- }
- if (!namespace)
- namespace = &global_namespace;
-+ printf("reg_type { name : %s, namespace : %s, type : %s, ptr : %p}\n", name, namespace->name, ts_to_str(t), type);
-+
- hash = hash_ident(name);
- nt = xmalloc(sizeof(struct rtype));
- nt->name = name;
-@@ -1903,15 +1992,16 @@ type_t *reg_type(type_t *type, const char *name, struct namespace *namespace, in
+@@ -1903,15 +1984,16 @@ type_t *reg_type(type_t *type, const char *name, struct namespace *namespace, in
nt->t = t;
nt->next = namespace->type_hash[hash];
namespace->type_hash[hash] = nt;
@@ -6321,7 +6275,7 @@ index d9793941..bb14bf76 100644
type_get_type_detect_alias(t) == TYPE_UNION ||
type_get_type_detect_alias(t) == TYPE_ENCAPSULATED_UNION);
}
-@@ -1919,19 +2009,16 @@ static int is_incomplete(const type_t *t)
+@@ -1919,19 +2001,16 @@ static int is_incomplete(const type_t *t)
void add_incomplete(type_t *t)
{
struct typenode *tn = xmalloc(sizeof *tn);
@@ -6345,7 +6299,7 @@ index d9793941..bb14bf76 100644
t->defined = ot->defined;
}
}
-@@ -1955,7 +2042,7 @@ static void fix_incomplete_types(type_t *complete_type)
+@@ -1955,7 +2034,7 @@ static void fix_incomplete_types(type_t *complete_type)
{
if (type_is_equal(complete_type, tn->type))
{
@@ -6354,7 +6308,7 @@ index d9793941..bb14bf76 100644
list_remove(&tn->entry);
free(tn);
}
-@@ -1979,7 +2066,13 @@ static type_t *reg_typedefs(decl_spec_t *decl_spec, declarator_list_t *decls, at
+@@ -1979,7 +2058,13 @@ static type_t *reg_typedefs(decl_spec_t *decl_spec, declarator_list_t *decls, at
type_get_type_detect_alias(type) == TYPE_ENCAPSULATED_UNION)
{
if (!type->name)
@@ -6368,13 +6322,7 @@ index d9793941..bb14bf76 100644
/* replace existing attributes when generating a typelib */
if (do_typelib)
-@@ -2005,12 +2098,12 @@ static type_t *reg_typedefs(decl_spec_t *decl_spec, declarator_list_t *decls, at
- * for cleaner solution.
- */
- if (cur && input_name == cur->loc_info.input_name)
-- error_loc("%s: redefinition error; original definition was at %s:%d\n",
-+ error_loc("FOO %s: redefinition error; original definition was at %s:%d\n",
- cur->name, cur->loc_info.input_name,
+@@ -2010,7 +2095,7 @@ static type_t *reg_typedefs(decl_spec_t *decl_spec, declarator_list_t *decls, at
cur->loc_info.line_number);
name = declare_var(attrs, decl_spec, decl, 0);
@@ -6383,16 +6331,7 @@ index d9793941..bb14bf76 100644
cur->attrs = attrs;
if (is_incomplete(cur))
-@@ -2025,6 +2118,8 @@ type_t *find_type(const char *name, struct namespace *namespace, int t)
- {
- struct rtype *cur;
-
-+ printf("find_type { name : %s, namespace %s, type : %s }\n", name, namespace ? namespace->name : NULL, ts_to_str(t));
-+
- if(namespace && namespace != &global_namespace) {
- for(cur = namespace->type_hash[hash_ident(name)]; cur; cur = cur->next) {
- if(cur->t == t && !strcmp(cur->name, name))
-@@ -2178,7 +2273,6 @@ struct allowed_attr allowed_attr[] =
+@@ -2178,7 +2263,6 @@ struct allowed_attr allowed_attr[] =
/* ATTR_CASE */ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, "case" },
/* ATTR_CODE */ { 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "code" },
/* ATTR_COMMSTATUS */ { 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "comm_status" },
@@ -6400,7 +6339,7 @@ index d9793941..bb14bf76 100644
/* ATTR_CONTEXTHANDLE */ { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "context_handle" },
/* ATTR_CONTROL */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, "control" },
/* ATTR_DECODE */ { 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "decode" },
-@@ -2213,7 +2307,6 @@ struct allowed_attr allowed_attr[] =
+@@ -2213,7 +2297,6 @@ struct allowed_attr allowed_attr[] =
/* ATTR_IMMEDIATEBIND */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "immediatebind" },
/* ATTR_IMPLICIT_HANDLE */ { 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "implicit_handle" },
/* ATTR_IN */ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "in" },
@@ -6408,7 +6347,7 @@ index d9793941..bb14bf76 100644
/* ATTR_INPUTSYNC */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "inputsync" },
/* ATTR_LENGTHIS */ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, "length_is" },
/* ATTR_LIBLCID */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, "lcid" },
-@@ -2285,10 +2378,10 @@ static attr_list_t *check_iface_attrs(const char *name, attr_list_t *attrs)
+@@ -2285,10 +2368,10 @@ static attr_list_t *check_iface_attrs(const char *name, attr_list_t *attrs)
if (attr->type == ATTR_IMPLICIT_HANDLE)
{
const var_t *var = attr->u.pval;
@@ -6422,7 +6361,7 @@ index d9793941..bb14bf76 100644
continue;
error_loc("attribute %s requires a handle type in interface %s\n",
allowed_attr[attr->type].display_name, name);
-@@ -2493,7 +2586,7 @@ static int is_ptr_guid_type(const type_t *type)
+@@ -2493,7 +2576,7 @@ static int is_ptr_guid_type(const type_t *type)
/* second, make sure it is a pointer to something of size sizeof(GUID),
* i.e. 16 bytes */
@@ -6431,7 +6370,7 @@ index d9793941..bb14bf76 100644
}
static void check_conformance_expr_list(const char *attr_name, const var_t *arg, const type_t *container_type, expr_list_t *expr_list)
-@@ -2520,7 +2613,7 @@ static void check_remoting_fields(const var_t *var, type_t *type);
+@@ -2520,7 +2603,7 @@ static void check_remoting_fields(const var_t *var, type_t *type);
static void check_field_common(const type_t *container_type,
const char *container_name, const var_t *arg)
{
@@ -6440,7 +6379,7 @@ index d9793941..bb14bf76 100644
int more_to_do;
const char *container_type_name;
const char *var_type;
-@@ -2550,7 +2643,7 @@ static void check_field_common(const type_t *container_type,
+@@ -2550,7 +2633,7 @@ static void check_field_common(const type_t *container_type,
}
if (is_attr(arg->attrs, ATTR_LENGTHIS) &&
@@ -6449,7 +6388,7 @@ index d9793941..bb14bf76 100644
error_loc_info(&arg->loc_info,
"string and length_is specified for argument %s are mutually exclusive attributes\n",
arg->name);
-@@ -2647,23 +2740,28 @@ static void check_field_common(const type_t *container_type,
+@@ -2647,23 +2730,28 @@ static void check_field_common(const type_t *container_type,
{
const type_t *t = type;
while (is_ptr(t))
@@ -6482,7 +6421,7 @@ index d9793941..bb14bf76 100644
case TGT_RANGE:
/* nothing to do */
break;
-@@ -2688,13 +2786,18 @@ static void check_remoting_fields(const var_t *var, type_t *type)
+@@ -2688,13 +2776,18 @@ static void check_remoting_fields(const var_t *var, type_t *type)
if (type_is_complete(type))
fields = type_struct_get_fields(type);
else
@@ -6504,7 +6443,7 @@ index d9793941..bb14bf76 100644
}
/* checks that arguments for a function make sense for marshalling and unmarshalling */
-@@ -2703,9 +2806,10 @@ static void check_remoting_args(const var_t *func)
+@@ -2703,9 +2796,10 @@ static void check_remoting_args(const var_t *func)
const char *funcname = func->name;
const var_t *arg;
@@ -6517,7 +6456,7 @@ index d9793941..bb14bf76 100644
/* check that [out] parameters have enough pointer levels */
if (is_attr(arg->attrs, ATTR_OUT))
-@@ -2745,16 +2849,16 @@ static void check_remoting_args(const var_t *func)
+@@ -2745,16 +2839,16 @@ static void check_remoting_args(const var_t *func)
}
}
@@ -6538,7 +6477,7 @@ index d9793941..bb14bf76 100644
free(var.name);
}
}
-@@ -2771,8 +2875,8 @@ static void add_explicit_handle_if_necessary(const type_t *iface, var_t *func)
+@@ -2771,8 +2865,8 @@ static void add_explicit_handle_if_necessary(const type_t *iface, var_t *func)
* function */
var_t *idl_handle = make_var(xstrdup("IDL_handle"));
idl_handle->attrs = append_attr(NULL, make_attr(ATTR_IN));
@@ -6549,7 +6488,7 @@ index d9793941..bb14bf76 100644
}
}
-@@ -2837,6 +2941,7 @@ static void check_async_uuid(type_t *iface)
+@@ -2837,6 +2931,7 @@ static void check_async_uuid(type_t *iface)
type_t *async_iface;
type_t *inherit;
@@ -6557,7 +6496,7 @@ index d9793941..bb14bf76 100644
if (!is_attr(iface->attrs, ATTR_ASYNCUUID)) return;
inherit = iface->details.iface->inherit;
-@@ -2853,7 +2958,8 @@ static void check_async_uuid(type_t *iface)
+@@ -2853,7 +2948,8 @@ static void check_async_uuid(type_t *iface)
var_t *begin_func, *finish_func, *func = stmt->u.var, *arg;
var_list_t *begin_args = NULL, *finish_args = NULL, *args;
@@ -6567,7 +6506,7 @@ index d9793941..bb14bf76 100644
if (args) LIST_FOR_EACH_ENTRY(arg, args, var_t, entry)
{
if (is_attr(arg->attrs, ATTR_IN) || !is_attr(arg->attrs, ATTR_OUT))
-@@ -2863,15 +2969,15 @@ static void check_async_uuid(type_t *iface)
+@@ -2863,15 +2959,15 @@ static void check_async_uuid(type_t *iface)
}
begin_func = copy_var(func, concat_str("Begin_", func->name), NULL);
@@ -6589,7 +6528,7 @@ index d9793941..bb14bf76 100644
stmts = append_statement(stmts, make_statement_declaration(finish_func));
}
-@@ -2911,6 +3017,7 @@ static void check_statements(const statement_list_t *stmts, int is_inside_librar
+@@ -2911,6 +3007,7 @@ static void check_statements(const statement_list_t *stmts, int is_inside_librar
static void check_all_user_types(const statement_list_t *stmts)
{
const statement_t *stmt;
@@ -6597,7 +6536,7 @@ index d9793941..bb14bf76 100644
if (stmts) LIST_FOR_EACH_ENTRY(stmt, stmts, const statement_t, entry)
{
-@@ -2922,7 +3029,11 @@ static void check_all_user_types(const statement_list_t *stmts)
+@@ -2922,7 +3019,11 @@ static void check_all_user_types(const statement_list_t *stmts)
const statement_t *stmt_func;
STATEMENTS_FOR_EACH_FUNC(stmt_func, type_iface_get_stmts(stmt->u.type)) {
const var_t *func = stmt_func->u.var;
@@ -6610,7 +6549,7 @@ index d9793941..bb14bf76 100644
}
}
}
-@@ -2956,6 +3067,10 @@ static statement_t *make_statement_type_decl(type_t *type)
+@@ -2956,6 +3057,10 @@ static statement_t *make_statement_type_decl(type_t *type)
{
statement_t *stmt = make_statement(STMT_TYPE);
stmt->u.type = type;
@@ -6621,7 +6560,7 @@ index d9793941..bb14bf76 100644
return stmt;
}
-@@ -2970,16 +3085,16 @@ static statement_t *make_statement_declaration(var_t *var)
+@@ -2970,16 +3075,16 @@ static statement_t *make_statement_declaration(var_t *var)
{
statement_t *stmt = make_statement(STMT_DECLARATION);
stmt->u.var = var;
@@ -6641,7 +6580,7 @@ index d9793941..bb14bf76 100644
error_loc("instantiation of data is illegal\n");
return stmt;
}
-@@ -3031,6 +3146,7 @@ static statement_t *make_statement_typedef(declarator_list_t *decls)
+@@ -3031,6 +3136,7 @@ static statement_t *make_statement_typedef(declarator_list_t *decls)
declarator_t *decl, *next;
statement_t *stmt;
type_list_t **type_list;
@@ -6649,7 +6588,7 @@ index d9793941..bb14bf76 100644
if (!decls) return NULL;
-@@ -3042,6 +3158,18 @@ static statement_t *make_statement_typedef(declarator_list_t *decls)
+@@ -3042,6 +3148,18 @@ static statement_t *make_statement_typedef(declarator_list_t *decls)
{
var_t *var = decl->var;
type_t *type = find_type_or_error(var->name, 0);
@@ -6668,7 +6607,7 @@ index d9793941..bb14bf76 100644
*type_list = xmalloc(sizeof(type_list_t));
(*type_list)->type = type;
(*type_list)->next = NULL;
-@@ -3051,6 +3179,7 @@ static statement_t *make_statement_typedef(declarator_list_t *decls)
+@@ -3051,6 +3169,7 @@ static statement_t *make_statement_typedef(declarator_list_t *decls)
free(var);
}
@@ -6676,14 +6615,13 @@ index d9793941..bb14bf76 100644
return stmt;
}
-@@ -3091,7 +3220,7 @@ void init_loc_info(loc_info_t *i)
+@@ -3091,7 +3210,7 @@ void init_loc_info(loc_info_t *i)
static void check_def(const type_t *t)
{
- if (t->defined)
-- error_loc("%s: redefinition error; original definition was at %s:%d\n",
+ if (type_is_defined(t))
-+ error_loc("BAR %s: redefinition error; original definition was at %s:%d\n",
+ error_loc("%s: redefinition error; original definition was at %s:%d\n",
t->name, t->loc_info.input_name, t->loc_info.line_number);
}
diff --git a/mingw-w64-tools/widl/src/parser.yy.c b/mingw-w64-tools/widl/src/parser.yy.c
@@ -9337,7 +9275,7 @@ index 9b1de2c8..2c2b1276 100644
return VT_PTR;
}
diff --git a/mingw-w64-tools/widl/src/typetree.c b/mingw-w64-tools/widl/src/typetree.c
-index b93806be..f52b785f 100644
+index b93806be..488f7a49 100644
--- a/mingw-w64-tools/widl/src/typetree.c
+++ b/mingw-w64-tools/widl/src/typetree.c
@@ -30,12 +30,16 @@
@@ -9386,7 +9324,7 @@ index b93806be..f52b785f 100644
error_loc("argument '%s' has void type\n", arg->name);
if (!arg->name)
{
-@@ -178,35 +181,29 @@ type_t *type_new_function(var_list_t *args)
+@@ -178,34 +181,28 @@ type_t *type_new_function(var_list_t *args)
return t;
}
@@ -9423,23 +9361,20 @@ index b93806be..f52b785f 100644
{
type_t *type = get_type(TYPE_MODULE, name, NULL, 0);
- if (type->type_type != TYPE_MODULE || type->defined)
-- error_loc("%s: redefinition error; original definition was at %s:%d\n",
+ if (type->type_type != TYPE_MODULE || type_is_defined(type))
-+ error_loc("BAZ %s: redefinition error; original definition was at %s:%d\n",
+ error_loc("%s: redefinition error; original definition was at %s:%d\n",
type->name, type->loc_info.input_name, type->loc_info.line_number);
type->name = name;
- return type;
-@@ -215,15 +212,15 @@ type_t *type_new_module(char *name)
+@@ -215,7 +212,7 @@ type_t *type_new_module(char *name)
type_t *type_new_coclass(char *name)
{
type_t *type = get_type(TYPE_COCLASS, name, NULL, 0);
- if (type->type_type != TYPE_COCLASS || type->defined)
-- error_loc("%s: redefinition error; original definition was at %s:%d\n",
+ if (type->type_type != TYPE_COCLASS || type_is_defined(type))
-+ error_loc("BING %s: redefinition error; original definition was at %s:%d\n",
+ error_loc("%s: redefinition error; original definition was at %s:%d\n",
type->name, type->loc_info.input_name, type->loc_info.line_number);
type->name = name;
- return type;
+@@ -223,7 +220,7 @@ type_t *type_new_coclass(char *name)
}
@@ -10078,7 +10013,7 @@ index 118e2245..4f4252e3 100644
{
MODE_Os, /* inline stubs */
diff --git a/mingw-w64-tools/widl/src/widltypes.h b/mingw-w64-tools/widl/src/widltypes.h
-index 08584de5..b9c5a07d 100644
+index 08584de5..cd71e9af 100644
--- a/mingw-w64-tools/widl/src/widltypes.h
+++ b/mingw-w64-tools/widl/src/widltypes.h
@@ -40,6 +40,7 @@ typedef struct _attr_t attr_t;
@@ -10279,20 +10214,7 @@ index 08584de5..b9c5a07d 100644
void init_types(void);
type_t *alloc_type(void);
-@@ -568,6 +607,12 @@ void clear_all_offsets(void);
- #define tsSTRUCT 2
- #define tsUNION 3
-
-+static inline const char* ts_to_str(int t)
-+{
-+ static const char* strings[] = {"tsNULL", "tsENUM", "tsSTRUCT", "tsUNION"};
-+ return strings[t];
-+}
-+
- var_t *find_const(const char *name, int f);
- type_t *find_type(const char *name, struct namespace *namespace, int t);
- type_t *make_type(enum type_type type);
-@@ -582,38 +627,18 @@ void init_loc_info(loc_info_t *);
+@@ -582,38 +621,18 @@ void init_loc_info(loc_info_t *);
char *format_namespace(struct namespace *namespace, const char *prefix, const char *separator, const char *suffix);
1
0

[tor-browser-build/maint-8.5] Bug 27503: add patch for fixed widl to mingw and update build/config to apply it
by gk@torproject.org 28 Aug '19
by gk@torproject.org 28 Aug '19
28 Aug '19
commit 75a80131971499cff36930b3eba75306749a1e5c
Author: Richard Pospesel <richard(a)torproject.org>
Date: Thu Jun 6 18:08:48 2019 -0700
Bug 27503: add patch for fixed widl to mingw and update build/config to apply it
---
projects/mingw-w64/27503.patch | 10660 +++++++++++++++++++++++++++++++++++++++
projects/mingw-w64/build | 3 +
projects/mingw-w64/config | 1 +
3 files changed, 10664 insertions(+)
diff --git a/projects/mingw-w64/27503.patch b/projects/mingw-w64/27503.patch
new file mode 100644
index 0000000..f6bd197
--- /dev/null
+++ b/projects/mingw-w64/27503.patch
@@ -0,0 +1,10660 @@
+diff --git a/mingw-w64-tools/widl/src/client.c b/mingw-w64-tools/widl/src/client.c
+index a3b2bbb6..d27c6cad 100644
+--- a/mingw-w64-tools/widl/src/client.c
++++ b/mingw-w64-tools/widl/src/client.c
+@@ -20,7 +20,7 @@
+
+ #include "config.h"
+ #include "wine/port.h"
+-
++
+ #include <stdio.h>
+ #include <stdlib.h>
+ #ifdef HAVE_UNISTD_H
+@@ -34,7 +34,7 @@
+ #include "parser.h"
+ #include "header.h"
+
+-#include "widltypes.h"
++#include "typetree.h"
+ #include "typegen.h"
+ #include "expr.h"
+
+@@ -52,12 +52,13 @@ static void print_client( const char *format, ... )
+
+ static void write_client_func_decl( const type_t *iface, const var_t *func )
+ {
+- const char *callconv = get_attrp(func->type->attrs, ATTR_CALLCONV);
+- const var_list_t *args = type_get_function_args(func->type);
+- type_t *rettype = type_function_get_rettype(func->type);
++ const char *callconv = get_attrp(func->declspec.type->attrs, ATTR_CALLCONV);
++ const var_list_t *args = type_function_get_args(func->declspec.type);
++ const decl_spec_t *retdeclspec = type_function_get_retdeclspec(func->declspec.type);
+
+ if (!callconv) callconv = "__cdecl";
+- write_type_decl_left(client, rettype);
++ write_declspec_decl_left(client, retdeclspec);
++ if (func->declspec.funcspecifier == FUNCTION_SPECIFIER_INLINE) fprintf(client, " inline");
+ fprintf(client, " %s ", callconv);
+ fprintf(client, "%s%s(\n", prefix_client, get_name(func));
+ indent++;
+@@ -74,9 +75,9 @@ static void write_function_stub( const type_t *iface, const var_t *func,
+ {
+ unsigned char explicit_fc, implicit_fc;
+ int has_full_pointer = is_full_pointer_function(func);
+- var_t *retval = type_function_get_retval(func->type);
++ var_t *retval = type_function_get_retval(func->declspec.type);
+ const var_t *handle_var = get_func_handle_var( iface, func, &explicit_fc, &implicit_fc );
+- int has_ret = !is_void(retval->type);
++ int has_ret = !is_void(retval->declspec.type);
+
+ if (is_interpreted_func( iface, func ))
+ {
+@@ -97,7 +98,7 @@ static void write_function_stub( const type_t *iface, const var_t *func,
+ print_client("RPC_BINDING_HANDLE _Handle;\n");
+ }
+
+- if (has_ret && decl_indirect(retval->type))
++ if (has_ret && decl_indirect(retval->declspec.type))
+ {
+ print_client("void *_p_%s;\n", retval->name);
+ }
+@@ -136,7 +137,7 @@ static void write_function_stub( const type_t *iface, const var_t *func,
+ if (has_ret)
+ {
+ print_client("%s", "");
+- write_type_decl(client, retval->type, retval->name);
++ write_declspec_decl(client, &retval->declspec, retval->name);
+ fprintf(client, ";\n");
+ }
+ print_client("RPC_MESSAGE _RpcMessage;\n");
+@@ -147,7 +148,7 @@ static void write_function_stub( const type_t *iface, const var_t *func,
+ if (explicit_fc == FC_BIND_GENERIC)
+ print_client("__frame->%s = %s;\n", handle_var->name, handle_var->name );
+ }
+- if (has_ret && decl_indirect(retval->type))
++ if (has_ret && decl_indirect(retval->declspec.type))
+ {
+ print_client("__frame->_p_%s = &%s;\n", retval->name, retval->name);
+ }
+@@ -194,7 +195,7 @@ static void write_function_stub( const type_t *iface, const var_t *func,
+ /* if the context_handle attribute appears in the chain of types
+ * without pointers being followed, then the context handle must
+ * be direct, otherwise it is a pointer */
+- int is_ch_ptr = !is_aliaschain_attr(handle_var->type, ATTR_CONTEXTHANDLE);
++ int is_ch_ptr = !is_aliaschain_attr(handle_var->declspec.type, ATTR_CONTEXTHANDLE);
+ print_client("if (%s%s != 0)\n", is_ch_ptr ? "*" : "", handle_var->name);
+ indent++;
+ print_client("__frame->_Handle = NDRCContextBinding(%s%s);\n",
+@@ -257,9 +258,9 @@ static void write_function_stub( const type_t *iface, const var_t *func,
+ /* unmarshal return value */
+ if (has_ret)
+ {
+- if (decl_indirect(retval->type))
++ if (decl_indirect(retval->declspec.type))
+ print_client("MIDL_memset(&%s, 0, sizeof(%s));\n", retval->name, retval->name);
+- else if (is_ptr(retval->type) || is_array(retval->type))
++ else if (is_ptr(retval->declspec.type) || is_array(retval->declspec.type))
+ print_client("%s = 0;\n", retval->name);
+ write_remoting_arguments(client, indent, func, "", PASS_RETURN, PHASE_UNMARSHAL);
+ }
+@@ -291,7 +292,7 @@ static void write_serialize_function(FILE *file, const type_t *type, const type_
+ const char *func_name, const char *ret_type)
+ {
+ enum stub_mode mode = get_stub_mode();
+- static int emited_pickling_info;
++ static int emitted_pickling_info;
+
+ if (iface && !type->typestring_offset)
+ {
+@@ -301,7 +302,7 @@ static void write_serialize_function(FILE *file, const type_t *type, const type_
+ return;
+ }
+
+- if (!emited_pickling_info && iface && mode != MODE_Os)
++ if (!emitted_pickling_info && iface && mode != MODE_Os)
+ {
+ fprintf(file, "static const MIDL_TYPE_PICKLING_INFO __MIDL_TypePicklingInfo =\n");
+ fprintf(file, "{\n");
+@@ -312,7 +313,7 @@ static void write_serialize_function(FILE *file, const type_t *type, const type_
+ fprintf(file, " 0\n");
+ fprintf(file, "};\n");
+ fprintf(file, "\n");
+- emited_pickling_info = 1;
++ emitted_pickling_info = 1;
+ }
+
+ /* FIXME: Assuming explicit handle */
+@@ -365,8 +366,8 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
+ case STMT_DECLARATION:
+ {
+ const var_t *func = stmt->u.var;
+- if (stmt->u.var->stgclass != STG_NONE
+- || type_get_type_detect_alias(stmt->u.var->type) != TYPE_FUNCTION)
++ if (stmt->u.var->declspec.stgclass != STG_NONE
++ || type_get_type_detect_alias(stmt->u.var->declspec.type) != TYPE_FUNCTION)
+ continue;
+ write_function_stub( iface, func, method_count++, *proc_offset );
+ *proc_offset += get_size_procformatstring_func( iface, func );
+@@ -425,7 +426,7 @@ static void write_stubdescriptor(type_t *iface, int expr_eval_routines)
+ print_client("1, /* -error bounds_check flag */\n");
+ print_client("0x%x, /* Ndr library version */\n", get_stub_mode() == MODE_Oif ? 0x50002 : 0x10001);
+ print_client("0,\n");
+- print_client("0x50100a4, /* MIDL Version 5.1.164 */\n");
++ print_client("0x50200ca, /* MIDL Version 5.2.202 */\n");
+ print_client("0,\n");
+ print_client("%s,\n", list_empty(&user_type_list) ? "0" : "UserMarshalRoutines");
+ print_client("0, /* notify & notify_flag routine table */\n");
+@@ -488,7 +489,7 @@ static void write_implicithandledecl(type_t *iface)
+
+ if (implicit_handle)
+ {
+- write_type_decl( client, implicit_handle->type, implicit_handle->name );
++ write_declspec_decl( client, &implicit_handle->declspec, implicit_handle->name );
+ fprintf(client, ";\n\n");
+ }
+ }
+@@ -532,8 +533,8 @@ static void write_client_ifaces(const statement_list_t *stmts, int expr_eval_rou
+
+ LIST_FOR_EACH_ENTRY(stmt2, type_iface_get_stmts(iface), const statement_t, entry)
+ {
+- if (stmt2->type == STMT_DECLARATION && stmt2->u.var->stgclass == STG_NONE &&
+- type_get_type_detect_alias(stmt2->u.var->type) == TYPE_FUNCTION)
++ if (stmt2->type == STMT_DECLARATION && stmt2->u.var->declspec.stgclass == STG_NONE &&
++ type_get_type_detect_alias(stmt2->u.var->declspec.type) == TYPE_FUNCTION)
+ {
+ needs_stub = 1;
+ break;
+@@ -627,26 +628,6 @@ void write_client(const statement_list_t *stmts)
+ if (!client)
+ return;
+
+- if (do_win32 && do_win64)
+- {
+- fprintf(client, "#ifndef _WIN64\n\n");
+- pointer_size = 4;
+- write_client_routines( stmts );
+- fprintf(client, "\n#else /* _WIN64 */\n\n");
+- pointer_size = 8;
+- write_client_routines( stmts );
+- fprintf(client, "\n#endif /* _WIN64 */\n");
+- }
+- else if (do_win32)
+- {
+- pointer_size = 4;
+- write_client_routines( stmts );
+- }
+- else if (do_win64)
+- {
+- pointer_size = 8;
+- write_client_routines( stmts );
+- }
+-
++ write_client_routines( stmts );
+ fclose(client);
+ }
+diff --git a/mingw-w64-tools/widl/src/expr.c b/mingw-w64-tools/widl/src/expr.c
+index 2ed4aff6..2f075816 100644
+--- a/mingw-w64-tools/widl/src/expr.c
++++ b/mingw-w64-tools/widl/src/expr.c
+@@ -194,10 +194,10 @@ expr_t *make_exprt(enum expr_type type, var_t *var, expr_t *expr)
+ expr_t *e;
+ type_t *tref;
+
+- if (var->stgclass != STG_NONE && var->stgclass != STG_REGISTER)
++ if (var->declspec.stgclass != STG_NONE && var->declspec.stgclass != STG_REGISTER)
+ error_loc("invalid storage class for type expression\n");
+
+- tref = var->type;
++ tref = var->declspec.type;
+
+ e = xmalloc(sizeof(expr_t));
+ e->type = type;
+@@ -474,7 +474,7 @@ static type_t *find_identifier(const char *identifier, const type_t *cont_type,
+ if (fields) LIST_FOR_EACH_ENTRY( field, fields, const var_t, entry )
+ if (field->name && !strcmp(identifier, field->name))
+ {
+- type = field->type;
++ type = field->declspec.type;
+ *found_in_cont_type = 1;
+ break;
+ }
+@@ -482,7 +482,7 @@ static type_t *find_identifier(const char *identifier, const type_t *cont_type,
+ if (!type)
+ {
+ var_t *const_var = find_const(identifier, 0);
+- if (const_var) type = const_var->type;
++ if (const_var) type = const_var->declspec.type;
+ }
+
+ return type;
+@@ -521,11 +521,11 @@ static struct expression_type resolve_expression(const struct expr_loc *expr_loc
+ break;
+ case EXPR_STRLIT:
+ result.is_temporary = TRUE;
+- result.type = type_new_pointer(FC_UP, type_new_int(TYPE_BASIC_CHAR, 0), NULL);
++ result.type = type_new_pointer(FC_UP, type_new_int(TYPE_BASIC_CHAR, 0));
+ break;
+ case EXPR_WSTRLIT:
+ result.is_temporary = TRUE;
+- result.type = type_new_pointer(FC_UP, type_new_int(TYPE_BASIC_WCHAR, 0), NULL);
++ result.type = type_new_pointer(FC_UP, type_new_int(TYPE_BASIC_WCHAR, 0));
+ break;
+ case EXPR_CHARCONST:
+ result.is_temporary = TRUE;
+@@ -575,15 +575,15 @@ static struct expression_type resolve_expression(const struct expr_loc *expr_loc
+ expr_loc->attr ? expr_loc->attr : "");
+ result.is_variable = FALSE;
+ result.is_temporary = TRUE;
+- result.type = type_new_pointer(FC_UP, result.type, NULL);
++ result.type = type_new_pointer(FC_UP, result.type);
+ break;
+ case EXPR_PPTR:
+ result = resolve_expression(expr_loc, cont_type, e->ref);
+ if (result.type && is_ptr(result.type))
+- result.type = type_pointer_get_ref(result.type);
++ result.type = type_pointer_get_ref_type(result.type);
+ else if(result.type && is_array(result.type)
+ && type_array_is_decl_as_ptr(result.type))
+- result.type = type_array_get_element(result.type);
++ result.type = type_array_get_element_type(result.type);
+ else
+ error_loc_info(&expr_loc->v->loc_info, "dereference operator applied to non-pointer type in expression%s%s\n",
+ expr_loc->attr ? " for attribute " : "",
+@@ -665,7 +665,7 @@ static struct expression_type resolve_expression(const struct expr_loc *expr_loc
+ if (result.type && is_array(result.type))
+ {
+ struct expression_type index_result;
+- result.type = type_array_get_element(result.type);
++ result.type = type_array_get_element_type(result.type);
+ index_result = resolve_expression(expr_loc, cont_type /* FIXME */, e->u.ext);
+ if (!index_result.type || !is_integer_type(index_result.type))
+ error_loc_info(&expr_loc->v->loc_info, "array subscript not of integral type in expression%s%s\n",
+diff --git a/mingw-w64-tools/widl/src/header.c b/mingw-w64-tools/widl/src/header.c
+index defc7f85..d0d0dc4b 100644
+--- a/mingw-w64-tools/widl/src/header.c
++++ b/mingw-w64-tools/widl/src/header.c
+@@ -43,7 +43,7 @@ user_type_list_t user_type_list = LIST_INIT(user_type_list);
+ context_handle_list_t context_handle_list = LIST_INIT(context_handle_list);
+ generic_handle_list_t generic_handle_list = LIST_INIT(generic_handle_list);
+
+-static void write_type_def_or_decl(FILE *f, type_t *t, int field, const char *name);
++static void write_type_v(FILE *h, const decl_spec_t *ds, int is_field, int declonly, const char *name);
+
+ static void indent(FILE *h, int delta)
+ {
+@@ -69,15 +69,15 @@ int is_ptrchain_attr(const var_t *var, enum attr_type t)
+ return 1;
+ else
+ {
+- type_t *type = var->type;
++ type_t *type = var->declspec.type;
+ for (;;)
+ {
+ if (is_attr(type->attrs, t))
+ return 1;
+ else if (type_is_alias(type))
+- type = type_alias_get_aliasee(type);
++ type = type_alias_get_aliasee_type(type);
+ else if (is_ptr(type))
+- type = type_pointer_get_ref(type);
++ type = type_pointer_get_ref_type(type);
+ else return 0;
+ }
+ }
+@@ -91,7 +91,7 @@ int is_aliaschain_attr(const type_t *type, enum attr_type attr)
+ if (is_attr(t->attrs, attr))
+ return 1;
+ else if (type_is_alias(t))
+- t = type_alias_get_aliasee(t);
++ t = type_alias_get_aliasee_type(t);
+ else return 0;
+ }
+ }
+@@ -204,9 +204,9 @@ static void write_fields(FILE *h, var_list_t *fields)
+ if (!fields) return;
+
+ LIST_FOR_EACH_ENTRY( v, fields, var_t, entry ) {
+- if (!v || !v->type) continue;
++ if (!v || !v->declspec.type) continue;
+
+- switch(type_get_type_detect_alias(v->type)) {
++ switch(type_get_type_detect_alias(v->declspec.type)) {
+ case TYPE_STRUCT:
+ case TYPE_ENCAPSULATED_UNION:
+ nameless_struct_cnt++;
+@@ -220,12 +220,12 @@ static void write_fields(FILE *h, var_list_t *fields)
+ }
+
+ LIST_FOR_EACH_ENTRY( v, fields, var_t, entry ) {
+- if (!v || !v->type) continue;
++ if (!v || !v->declspec.type) continue;
+
+ indent(h, 0);
+ name = v->name;
+
+- switch(type_get_type_detect_alias(v->type)) {
++ switch(type_get_type_detect_alias(v->declspec.type)) {
+ case TYPE_STRUCT:
+ case TYPE_ENCAPSULATED_UNION:
+ if(!v->name) {
+@@ -252,7 +252,7 @@ static void write_fields(FILE *h, var_list_t *fields)
+ default:
+ ;
+ }
+- write_type_def_or_decl(h, v->type, TRUE, name);
++ write_type_v(h, &v->declspec, TRUE, v->declonly, name);
+ fprintf(h, ";\n");
+ }
+ }
+@@ -295,14 +295,21 @@ static void write_pointer_left(FILE *h, type_t *ref)
+ }
+
+ void write_type_left(FILE *h, type_t *t, enum name_type name_type, int declonly)
++{
++ decl_spec_t ds;
++ write_declspec_left(h, init_declspec(&ds, t), name_type, declonly);
++}
++
++void write_declspec_left(FILE* h, const decl_spec_t *ds, enum name_type name_type, int declonly)
+ {
+ const char *name;
++ type_t *t = ds->type;
+
+ if (!h) return;
+
+ name = type_get_name(t, name_type);
+
+- if (is_attr(t->attrs, ATTR_CONST) &&
++ if ((ds->typequalifier == TYPE_QUALIFIER_CONST) &&
+ (type_is_alias(t) || !is_ptr(t)))
+ fprintf(h, "const ");
+
+@@ -310,7 +317,7 @@ void write_type_left(FILE *h, type_t *t, enum name_type name_type, int declonly)
+ else {
+ switch (type_get_type_detect_alias(t)) {
+ case TYPE_ENUM:
+- if (!declonly && t->defined && !t->written) {
++ if (!declonly && type_is_defined(t) && !t->written) {
+ if (name) fprintf(h, "enum %s {\n", name);
+ else fprintf(h, "enum {\n");
+ t->written = TRUE;
+@@ -323,7 +330,7 @@ void write_type_left(FILE *h, type_t *t, enum name_type name_type, int declonly)
+ break;
+ case TYPE_STRUCT:
+ case TYPE_ENCAPSULATED_UNION:
+- if (!declonly && t->defined && !t->written) {
++ if (!declonly && type_is_defined(t) && !t->written) {
+ if (name) fprintf(h, "struct %s {\n", name);
+ else fprintf(h, "struct {\n");
+ t->written = TRUE;
+@@ -338,7 +345,7 @@ void write_type_left(FILE *h, type_t *t, enum name_type name_type, int declonly)
+ else fprintf(h, "struct %s", name ? name : "");
+ break;
+ case TYPE_UNION:
+- if (!declonly && t->defined && !t->written) {
++ if (!declonly && type_is_defined(t) && !t->written) {
+ if (t->name) fprintf(h, "union %s {\n", t->name);
+ else fprintf(h, "union {\n");
+ t->written = TRUE;
+@@ -351,9 +358,9 @@ void write_type_left(FILE *h, type_t *t, enum name_type name_type, int declonly)
+ break;
+ case TYPE_POINTER:
+ {
+- write_type_left(h, type_pointer_get_ref(t), name_type, declonly);
+- write_pointer_left(h, type_pointer_get_ref(t));
+- if (is_attr(t->attrs, ATTR_CONST)) fprintf(h, "const ");
++ write_declspec_left(h, type_pointer_get_ref(t), name_type, declonly);
++ write_pointer_left(h, type_pointer_get_ref_type(t));
++ if (ds->typequalifier == TYPE_QUALIFIER_CONST) fprintf(h, "const ");
+ break;
+ }
+ case TYPE_ARRAY:
+@@ -361,9 +368,9 @@ void write_type_left(FILE *h, type_t *t, enum name_type name_type, int declonly)
+ fprintf(h, "%s", t->name);
+ else
+ {
+- write_type_left(h, type_array_get_element(t), name_type, declonly);
++ write_declspec_left(h, type_array_get_element(t), name_type, declonly);
+ if (type_array_is_decl_as_ptr(t))
+- write_pointer_left(h, type_array_get_element(t));
++ write_pointer_left(h, type_array_get_element_type(t));
+ }
+ break;
+ case TYPE_BASIC:
+@@ -443,7 +450,7 @@ void write_type_right(FILE *h, type_t *t, int is_field)
+ {
+ case TYPE_ARRAY:
+ {
+- type_t *elem = type_array_get_element(t);
++ type_t *elem = type_array_get_element_type(t);
+ if (type_array_is_decl_as_ptr(t))
+ {
+ if (!type_is_alias(elem) && is_array(elem) && !type_array_is_decl_as_ptr(elem))
+@@ -461,7 +468,7 @@ void write_type_right(FILE *h, type_t *t, int is_field)
+ }
+ case TYPE_POINTER:
+ {
+- type_t *ref = type_pointer_get_ref(t);
++ type_t *ref = type_pointer_get_ref_type(t);
+ if (!type_is_alias(ref) && is_array(ref) && !type_array_is_decl_as_ptr(ref))
+ fprintf(h, ")");
+ write_type_right(h, ref, FALSE);
+@@ -485,30 +492,33 @@ void write_type_right(FILE *h, type_t *t, int is_field)
+ }
+ }
+
+-static void write_type_v(FILE *h, type_t *t, int is_field, int declonly, const char *name)
++static void write_type_v(FILE *h, const decl_spec_t *ds, int is_field, int declonly, const char *name)
+ {
++ type_t *t = ds->type;
+ type_t *pt = NULL;
+ int ptr_level = 0;
+
+ if (!h) return;
+
+ if (t) {
+- for (pt = t; is_ptr(pt); pt = type_pointer_get_ref(pt), ptr_level++)
++ const decl_spec_t *dpt = NULL;
++ for (dpt = ds; is_ptr(dpt->type); dpt = type_pointer_get_ref(dpt->type), ptr_level++)
+ ;
++ pt = dpt->type;
+
+ if (type_get_type_detect_alias(pt) == TYPE_FUNCTION) {
+ int i;
+ const char *callconv = get_attrp(pt->attrs, ATTR_CALLCONV);
+ if (!callconv && is_object_interface) callconv = "STDMETHODCALLTYPE";
+- if (is_attr(pt->attrs, ATTR_INLINE)) fprintf(h, "inline ");
+- write_type_left(h, type_function_get_rettype(pt), NAME_DEFAULT, declonly);
++ if (!is_ptr(ds->type) && dpt->funcspecifier == FUNCTION_SPECIFIER_INLINE) fprintf(h, "inline ");
++ write_declspec_left(h, type_function_get_retdeclspec(pt), NAME_DEFAULT, declonly);
+ fputc(' ', h);
+ if (ptr_level) fputc('(', h);
+ if (callconv) fprintf(h, "%s ", callconv);
+ for (i = 0; i < ptr_level; i++)
+ fputc('*', h);
+ } else
+- write_type_left(h, t, NAME_DEFAULT, declonly);
++ write_declspec_left(h, ds, NAME_DEFAULT, declonly);
+ }
+
+ if (name) fprintf(h, "%s%s", !t || needs_space_after(t) ? " " : "", name );
+@@ -529,12 +539,7 @@ static void write_type_v(FILE *h, type_t *t, int is_field, int declonly, const c
+ }
+ }
+
+-static void write_type_def_or_decl(FILE *f, type_t *t, int field, const char *name)
+-{
+- write_type_v(f, t, field, FALSE, name);
+-}
+-
+-static void write_type_definition(FILE *f, type_t *t)
++static void write_type_definition(FILE *f, type_t *t, int declonly)
+ {
+ int in_namespace = t->namespace && !is_global_namespace(t->namespace);
+ int save_written = t->written;
+@@ -545,14 +550,14 @@ static void write_type_definition(FILE *f, type_t *t)
+ write_namespace_start(f, t->namespace);
+ }
+ indent(f, 0);
+- write_type_left(f, t, NAME_DEFAULT, FALSE);
++ write_type_left(f, t, NAME_DEFAULT, declonly);
+ fprintf(f, ";\n");
+ if(in_namespace) {
+ t->written = save_written;
+ write_namespace_end(f, t->namespace);
+ fprintf(f, "extern \"C\" {\n");
+ fprintf(f, "#else\n");
+- write_type_left(f, t, NAME_C, FALSE);
++ write_type_left(f, t, NAME_C, declonly);
+ fprintf(f, ";\n");
+ fprintf(f, "#endif\n\n");
+ }
+@@ -560,12 +565,18 @@ static void write_type_definition(FILE *f, type_t *t)
+
+ void write_type_decl(FILE *f, type_t *t, const char *name)
+ {
+- write_type_v(f, t, FALSE, TRUE, name);
++ decl_spec_t ds;
++ write_declspec_decl(f, init_declspec(&ds, t), name);
++}
++
++void write_declspec_decl(FILE *f, const decl_spec_t *ds, const char *name)
++{
++ write_type_v(f, ds, FALSE, TRUE, name);
+ }
+
+-void write_type_decl_left(FILE *f, type_t *t)
++void write_declspec_decl_left(FILE *f, const decl_spec_t *ds)
+ {
+- write_type_left(f, t, NAME_DEFAULT, TRUE);
++ write_declspec_left(f, ds, NAME_DEFAULT, TRUE);
+ }
+
+ static int user_type_registered(const char *name)
+@@ -602,8 +613,8 @@ unsigned int get_context_handle_offset( const type_t *type )
+
+ while (!is_attr( type->attrs, ATTR_CONTEXTHANDLE ))
+ {
+- if (type_is_alias( type )) type = type_alias_get_aliasee( type );
+- else if (is_ptr( type )) type = type_pointer_get_ref( type );
++ if (type_is_alias( type )) type = type_alias_get_aliasee_type( type );
++ else if (is_ptr( type )) type = type_pointer_get_ref_type( type );
+ else error( "internal error: %s is not a context handle\n", type->name );
+ }
+ LIST_FOR_EACH_ENTRY( ch, &context_handle_list, context_handle_t, entry )
+@@ -622,8 +633,8 @@ unsigned int get_generic_handle_offset( const type_t *type )
+
+ while (!is_attr( type->attrs, ATTR_HANDLE ))
+ {
+- if (type_is_alias( type )) type = type_alias_get_aliasee( type );
+- else if (is_ptr( type )) type = type_pointer_get_ref( type );
++ if (type_is_alias( type )) type = type_alias_get_aliasee_type( type );
++ else if (is_ptr( type )) type = type_pointer_get_ref_type( type );
+ else error( "internal error: %s is not a generic handle\n", type->name );
+ }
+ LIST_FOR_EACH_ENTRY( gh, &generic_handle_list, generic_handle_t, entry )
+@@ -637,82 +648,77 @@ unsigned int get_generic_handle_offset( const type_t *type )
+
+ /* check for types which require additional prototypes to be generated in the
+ * header */
+-void check_for_additional_prototype_types(const var_list_t *list)
+-{
+- const var_t *v;
+-
+- if (!list) return;
+- LIST_FOR_EACH_ENTRY( v, list, const var_t, entry )
+- {
+- type_t *type = v->type;
+- if (!type) continue;
+- for (;;) {
+- const char *name = type->name;
+- if (type->user_types_registered) break;
+- type->user_types_registered = 1;
+- if (is_attr(type->attrs, ATTR_CONTEXTHANDLE)) {
+- if (!context_handle_registered(name))
+- {
+- context_handle_t *ch = xmalloc(sizeof(*ch));
+- ch->name = xstrdup(name);
+- list_add_tail(&context_handle_list, &ch->entry);
+- }
+- /* don't carry on parsing fields within this type */
+- break;
+- }
+- if ((type_get_type(type) != TYPE_BASIC ||
+- type_basic_get_type(type) != TYPE_BASIC_HANDLE) &&
+- is_attr(type->attrs, ATTR_HANDLE)) {
+- if (!generic_handle_registered(name))
+- {
+- generic_handle_t *gh = xmalloc(sizeof(*gh));
+- gh->name = xstrdup(name);
+- list_add_tail(&generic_handle_list, &gh->entry);
+- }
+- /* don't carry on parsing fields within this type */
+- break;
++void check_for_additional_prototype_types(type_t *type)
++{
++ if (!type) return;
++ for (;;) {
++ const char *name = type->name;
++ if (type->user_types_registered) break;
++ type->user_types_registered = 1;
++ if (is_attr(type->attrs, ATTR_CONTEXTHANDLE)) {
++ if (!context_handle_registered(name))
++ {
++ context_handle_t *ch = xmalloc(sizeof(*ch));
++ ch->name = xstrdup(name);
++ list_add_tail(&context_handle_list, &ch->entry);
+ }
+- if (is_attr(type->attrs, ATTR_WIREMARSHAL)) {
+- if (!user_type_registered(name))
+- {
+- user_type_t *ut = xmalloc(sizeof *ut);
+- ut->name = xstrdup(name);
+- list_add_tail(&user_type_list, &ut->entry);
+- }
+- /* don't carry on parsing fields within this type as we are already
+- * using a wire marshaled type */
+- break;
++ /* don't carry on parsing fields within this type */
++ break;
++ }
++ if ((type_get_type(type) != TYPE_BASIC ||
++ type_basic_get_type(type) != TYPE_BASIC_HANDLE) &&
++ is_attr(type->attrs, ATTR_HANDLE)) {
++ if (!generic_handle_registered(name))
++ {
++ generic_handle_t *gh = xmalloc(sizeof(*gh));
++ gh->name = xstrdup(name);
++ list_add_tail(&generic_handle_list, &gh->entry);
+ }
+- else if (type_is_complete(type))
++ /* don't carry on parsing fields within this type */
++ break;
++ }
++ if (is_attr(type->attrs, ATTR_WIREMARSHAL)) {
++ if (!user_type_registered(name))
+ {
+- var_list_t *vars;
+- switch (type_get_type_detect_alias(type))
+- {
+- case TYPE_ENUM:
+- vars = type_enum_get_values(type);
+- break;
+- case TYPE_STRUCT:
+- vars = type_struct_get_fields(type);
+- break;
+- case TYPE_UNION:
+- vars = type_union_get_cases(type);
+- break;
+- default:
+- vars = NULL;
+- break;
+- }
+- check_for_additional_prototype_types(vars);
++ user_type_t *ut = xmalloc(sizeof *ut);
++ ut->name = xstrdup(name);
++ list_add_tail(&user_type_list, &ut->entry);
+ }
+-
+- if (type_is_alias(type))
+- type = type_alias_get_aliasee(type);
+- else if (is_ptr(type))
+- type = type_pointer_get_ref(type);
+- else if (is_array(type))
+- type = type_array_get_element(type);
+- else
++ /* don't carry on parsing fields within this type as we are already
++ * using a wire marshaled type */
++ break;
++ }
++ else if (type_is_complete(type))
++ {
++ var_list_t *vars;
++ const var_t *v;
++ switch (type_get_type_detect_alias(type))
++ {
++ case TYPE_ENUM:
++ vars = type_enum_get_values(type);
++ break;
++ case TYPE_STRUCT:
++ vars = type_struct_get_fields(type);
+ break;
++ case TYPE_UNION:
++ vars = type_union_get_cases(type);
++ break;
++ default:
++ vars = NULL;
++ break;
++ }
++ if (vars) LIST_FOR_EACH_ENTRY( v, vars, const var_t, entry )
++ check_for_additional_prototype_types(v->declspec.type);
+ }
++
++ if (type_is_alias(type))
++ type = type_alias_get_aliasee_type(type);
++ else if (is_ptr(type))
++ type = type_pointer_get_ref_type(type);
++ else if (is_array(type))
++ type = type_array_get_element_type(type);
++ else
++ break;
+ }
+ }
+
+@@ -791,26 +797,26 @@ static void write_generic_handle_routines(FILE *header)
+ }
+ }
+
+-static void write_typedef(FILE *header, type_t *type)
++static void write_typedef(FILE *header, type_t *type, int declonly)
+ {
+ fprintf(header, "typedef ");
+- write_type_def_or_decl(header, type_alias_get_aliasee(type), FALSE, type->name);
++ write_type_v(header, type_alias_get_aliasee(type), FALSE, declonly, type->name);
+ fprintf(header, ";\n");
+ }
+
+ int is_const_decl(const var_t *var)
+ {
+- const type_t *t;
++ const decl_spec_t *ds;
+ /* strangely, MIDL accepts a const attribute on any pointer in the
+ * declaration to mean that data isn't being instantiated. this appears
+ * to be a bug, but there is no benefit to being incompatible with MIDL,
+ * so we'll do the same thing */
+- for (t = var->type; ; )
++ for (ds = &var->declspec; ;)
+ {
+- if (is_attr(t->attrs, ATTR_CONST))
++ if (ds->typequalifier == TYPE_QUALIFIER_CONST)
+ return TRUE;
+- else if (is_ptr(t))
+- t = type_pointer_get_ref(t);
++ else if (is_ptr(ds->type))
++ ds = type_pointer_get_ref(ds->type);
+ else break;
+ }
+ return FALSE;
+@@ -826,7 +832,7 @@ static void write_declaration(FILE *header, const var_t *v)
+ }
+ else
+ {
+- switch (v->stgclass)
++ switch (v->declspec.stgclass)
+ {
+ case STG_NONE:
+ case STG_REGISTER: /* ignored */
+@@ -838,7 +844,7 @@ static void write_declaration(FILE *header, const var_t *v)
+ fprintf(header, "extern ");
+ break;
+ }
+- write_type_def_or_decl(header, v->type, FALSE, v->name);
++ write_type_v(header, &v->declspec, FALSE, FALSE, v->name);
+ fprintf(header, ";\n\n");
+ }
+ }
+@@ -855,9 +861,9 @@ static void write_library(FILE *header, const typelib_t *typelib)
+ const type_t* get_explicit_generic_handle_type(const var_t* var)
+ {
+ const type_t *t;
+- for (t = var->type;
++ for (t = var->declspec.type;
+ is_ptr(t) || type_is_alias(t);
+- t = type_is_alias(t) ? type_alias_get_aliasee(t) : type_pointer_get_ref(t))
++ t = type_is_alias(t) ? type_alias_get_aliasee_type(t) : type_pointer_get_ref_type(t))
+ if ((type_get_type_detect_alias(t) != TYPE_BASIC || type_basic_get_type(t) != TYPE_BASIC_HANDLE) &&
+ is_attr(t->attrs, ATTR_HANDLE))
+ return t;
+@@ -868,13 +874,13 @@ const var_t *get_func_handle_var( const type_t *iface, const var_t *func,
+ unsigned char *explicit_fc, unsigned char *implicit_fc )
+ {
+ const var_t *var;
+- const var_list_t *args = type_get_function_args( func->type );
++ const var_list_t *args = type_function_get_args( func->declspec.type );
+
+ *explicit_fc = *implicit_fc = 0;
+ if (args) LIST_FOR_EACH_ENTRY( var, args, const var_t, entry )
+ {
+ if (!is_attr( var->attrs, ATTR_IN ) && is_attr( var->attrs, ATTR_OUT )) continue;
+- if (type_get_type( var->type ) == TYPE_BASIC && type_basic_get_type( var->type ) == TYPE_BASIC_HANDLE)
++ if (type_get_type( var->declspec.type ) == TYPE_BASIC && type_basic_get_type( var->declspec.type ) == TYPE_BASIC_HANDLE)
+ {
+ *explicit_fc = FC_BIND_PRIMITIVE;
+ return var;
+@@ -884,7 +890,7 @@ const var_t *get_func_handle_var( const type_t *iface, const var_t *func,
+ *explicit_fc = FC_BIND_GENERIC;
+ return var;
+ }
+- if (is_context_handle( var->type ))
++ if (is_context_handle( var->declspec.type ))
+ {
+ *explicit_fc = FC_BIND_CONTEXT;
+ return var;
+@@ -893,8 +899,8 @@ const var_t *get_func_handle_var( const type_t *iface, const var_t *func,
+
+ if ((var = get_attrp( iface->attrs, ATTR_IMPLICIT_HANDLE )))
+ {
+- if (type_get_type( var->type ) == TYPE_BASIC &&
+- type_basic_get_type( var->type ) == TYPE_BASIC_HANDLE)
++ if (type_get_type( var->declspec.type ) == TYPE_BASIC &&
++ type_basic_get_type( var->declspec.type ) == TYPE_BASIC_HANDLE)
+ *implicit_fc = FC_BIND_PRIMITIVE;
+ else
+ *implicit_fc = FC_BIND_GENERIC;
+@@ -909,13 +915,13 @@ int has_out_arg_or_return(const var_t *func)
+ {
+ const var_t *var;
+
+- if (!is_void(type_function_get_rettype(func->type)))
++ if (!is_void(type_function_get_rettype(func->declspec.type)))
+ return 1;
+
+- if (!type_get_function_args(func->type))
++ if (!type_function_get_args(func->declspec.type))
+ return 0;
+
+- LIST_FOR_EACH_ENTRY( var, type_get_function_args(func->type), const var_t, entry )
++ LIST_FOR_EACH_ENTRY( var, type_function_get_args(func->declspec.type), const var_t, entry )
+ if (is_attr(var->attrs, ATTR_OUT))
+ return 1;
+
+@@ -995,7 +1001,7 @@ static int is_override_method(const type_t *iface, const type_t *child, const va
+
+ static int is_aggregate_return(const var_t *func)
+ {
+- enum type_type type = type_get_type(type_function_get_rettype(func->type));
++ enum type_type type = type_get_type(type_function_get_rettype(func->declspec.type));
+ return type == TYPE_STRUCT || type == TYPE_UNION ||
+ type == TYPE_COCLASS || type == TYPE_INTERFACE;
+ }
+@@ -1035,8 +1041,8 @@ static void write_method_macro(FILE *header, const type_t *iface, const type_t *
+ const var_t *arg;
+
+ fprintf(header, "#define %s_%s(This", name, get_name(func));
+- if (type_get_function_args(func->type))
+- LIST_FOR_EACH_ENTRY( arg, type_get_function_args(func->type), const var_t, entry )
++ if (type_function_get_args(func->declspec.type))
++ LIST_FOR_EACH_ENTRY( arg, type_function_get_args(func->declspec.type), const var_t, entry )
+ fprintf(header, ",%s", arg->name);
+ fprintf(header, ") ");
+
+@@ -1047,8 +1053,8 @@ static void write_method_macro(FILE *header, const type_t *iface, const type_t *
+ }
+
+ fprintf(header, "(This)->lpVtbl->%s(This", get_vtbl_entry_name(iface, func));
+- if (type_get_function_args(func->type))
+- LIST_FOR_EACH_ENTRY( arg, type_get_function_args(func->type), const var_t, entry )
++ if (type_function_get_args(func->declspec.type))
++ LIST_FOR_EACH_ENTRY( arg, type_function_get_args(func->declspec.type), const var_t, entry )
+ fprintf(header, ",%s", arg->name);
+ fprintf(header, ")\n");
+ }
+@@ -1078,7 +1084,7 @@ void write_args(FILE *h, const var_list_t *args, const char *name, int method, i
+ }
+ else fprintf(h, ",");
+ }
+- write_type_decl(h, arg->type, arg->name);
++ write_declspec_decl(h, &arg->declspec, arg->name);
+ if (method == 2) {
+ const expr_t *expr = get_attrp(arg->attrs, ATTR_DEFAULTVALUE);
+ if (expr) {
+@@ -1090,7 +1096,7 @@ void write_args(FILE *h, const var_list_t *args, const char *name, int method, i
+ expr_t bstr;
+
+ /* Fixup the expression type for a BSTR like midl does. */
+- if (get_type_vt(arg->type) == VT_BSTR && expr->type == EXPR_STRLIT)
++ if (get_type_vt(arg->declspec.type) == VT_BSTR && expr->type == EXPR_STRLIT)
+ {
+ bstr = *expr;
+ bstr.type = EXPR_WSTRLIT;
+@@ -1119,8 +1125,8 @@ static void write_cpp_method_def(FILE *header, const type_t *iface)
+ {
+ const var_t *func = stmt->u.var;
+ if (!is_callas(func->attrs)) {
+- const char *callconv = get_attrp(func->type->attrs, ATTR_CALLCONV);
+- const var_list_t *args = type_get_function_args(func->type);
++ const char *callconv = get_attrp(func->declspec.type->attrs, ATTR_CALLCONV);
++ const var_list_t *args = type_function_get_args(func->declspec.type);
+ const var_t *arg;
+
+ if (!callconv) callconv = "STDMETHODCALLTYPE";
+@@ -1130,11 +1136,11 @@ static void write_cpp_method_def(FILE *header, const type_t *iface)
+
+ indent(header, 0);
+ fprintf(header, "virtual ");
+- write_type_decl_left(header, type_function_get_rettype(func->type));
++ write_declspec_decl_left(header, type_function_get_retdeclspec(func->declspec.type));
+ fprintf(header, "* %s %s(\n", callconv, get_name(func));
+ ++indentation;
+ indent(header, 0);
+- write_type_decl_left(header, type_function_get_rettype(func->type));
++ write_declspec_decl_left(header, type_function_get_retdeclspec(func->declspec.type));
+ fprintf(header, " *__ret");
+ --indentation;
+ if (args) {
+@@ -1144,7 +1150,7 @@ static void write_cpp_method_def(FILE *header, const type_t *iface)
+ fprintf(header, ") = 0;\n");
+
+ indent(header, 0);
+- write_type_decl_left(header, type_function_get_rettype(func->type));
++ write_declspec_decl_left(header, type_function_get_retdeclspec(func->declspec.type));
+ fprintf(header, " %s %s(\n", callconv, get_name(func));
+ write_args(header, args, iface->name, 2, TRUE);
+ fprintf(header, ")\n");
+@@ -1152,7 +1158,7 @@ static void write_cpp_method_def(FILE *header, const type_t *iface)
+ fprintf(header, "{\n");
+ ++indentation;
+ indent(header, 0);
+- write_type_decl_left(header, type_function_get_rettype(func->type));
++ write_declspec_decl_left(header, type_function_get_retdeclspec(func->declspec.type));
+ fprintf(header, " __ret;\n");
+ indent(header, 0);
+ fprintf(header, "return *%s(&__ret", get_name(func));
+@@ -1169,7 +1175,7 @@ static void write_cpp_method_def(FILE *header, const type_t *iface)
+
+ indent(header, 0);
+ fprintf(header, "virtual ");
+- write_type_decl_left(header, type_function_get_rettype(func->type));
++ write_declspec_decl_left(header, type_function_get_retdeclspec(func->declspec.type));
+ fprintf(header, " %s %s(\n", callconv, get_name(func));
+ write_args(header, args, iface->name, 2, TRUE);
+ fprintf(header, ") = 0;\n");
+@@ -1206,25 +1212,25 @@ static void write_inline_wrappers(FILE *header, const type_t *iface, const type_
+ const var_t *arg;
+
+ fprintf(header, "static FORCEINLINE ");
+- write_type_decl_left(header, type_function_get_rettype(func->type));
++ write_declspec_decl_left(header, type_function_get_retdeclspec(func->declspec.type));
+ fprintf(header, " %s_%s(", name, get_name(func));
+- write_args(header, type_get_function_args(func->type), name, 1, FALSE);
++ write_args(header, type_function_get_args(func->declspec.type), name, 1, FALSE);
+ fprintf(header, ") {\n");
+ ++indentation;
+ if (!is_aggregate_return(func)) {
+ indent(header, 0);
+ fprintf(header, "%sThis->lpVtbl->%s(This",
+- is_void(type_function_get_rettype(func->type)) ? "" : "return ",
++ is_void(type_function_get_rettype(func->declspec.type)) ? "" : "return ",
+ get_vtbl_entry_name(iface, func));
+ } else {
+ indent(header, 0);
+- write_type_decl_left(header, type_function_get_rettype(func->type));
++ write_declspec_decl_left(header, type_function_get_retdeclspec(func->declspec.type));
+ fprintf(header, " __ret;\n");
+ indent(header, 0);
+ fprintf(header, "return *This->lpVtbl->%s(This,&__ret", get_vtbl_entry_name(iface, func));
+ }
+- if (type_get_function_args(func->type))
+- LIST_FOR_EACH_ENTRY( arg, type_get_function_args(func->type), const var_t, entry )
++ if (type_function_get_args(func->declspec.type))
++ LIST_FOR_EACH_ENTRY( arg, type_function_get_args(func->declspec.type), const var_t, entry )
+ fprintf(header, ",%s", arg->name);
+ fprintf(header, ");\n");
+ --indentation;
+@@ -1250,10 +1256,10 @@ static void do_write_c_method_def(FILE *header, const type_t *iface, const char
+ first_iface = 0;
+ }
+ if (!is_callas(func->attrs)) {
+- const char *callconv = get_attrp(func->type->attrs, ATTR_CALLCONV);
++ const char *callconv = get_attrp(func->declspec.type->attrs, ATTR_CALLCONV);
+ if (!callconv) callconv = "STDMETHODCALLTYPE";
+ indent(header, 0);
+- write_type_decl_left(header, type_function_get_rettype(func->type));
++ write_declspec_decl_left(header, type_function_get_retdeclspec(func->declspec.type));
+ if (is_aggregate_return(func))
+ fprintf(header, " *");
+ if (is_inherited_method(iface, func))
+@@ -1266,13 +1272,13 @@ static void do_write_c_method_def(FILE *header, const type_t *iface, const char
+ if (is_aggregate_return(func)) {
+ fprintf(header, ",\n");
+ indent(header, 0);
+- write_type_decl_left(header, type_function_get_rettype(func->type));
++ write_declspec_decl_left(header, type_function_get_retdeclspec(func->declspec.type));
+ fprintf(header, " *__ret");
+ }
+ --indentation;
+- if (type_get_function_args(func->type)) {
++ if (type_function_get_args(func->declspec.type)) {
+ fprintf(header, ",\n");
+- write_args(header, type_get_function_args(func->type), name, 0, TRUE);
++ write_args(header, type_function_get_args(func->declspec.type), name, 0, TRUE);
+ }
+ fprintf(header, ");\n");
+ fprintf(header, "\n");
+@@ -1299,12 +1305,12 @@ static void write_method_proto(FILE *header, const type_t *iface)
+ const var_t *func = stmt->u.var;
+
+ if (is_callas(func->attrs)) {
+- const char *callconv = get_attrp(func->type->attrs, ATTR_CALLCONV);
++ const char *callconv = get_attrp(func->declspec.type->attrs, ATTR_CALLCONV);
+ if (!callconv) callconv = "STDMETHODCALLTYPE";
+ /* proxy prototype */
+- write_type_decl_left(header, type_function_get_rettype(func->type));
++ write_declspec_decl_left(header, type_function_get_retdeclspec(func->declspec.type));
+ fprintf(header, " %s %s_%s_Proxy(\n", callconv, iface->name, get_name(func));
+- write_args(header, type_get_function_args(func->type), iface->name, 1, TRUE);
++ write_args(header, type_function_get_args(func->declspec.type), iface->name, 1, TRUE);
+ fprintf(header, ");\n");
+ /* stub prototype */
+ fprintf(header, "void __RPC_STUB %s_%s_Stub(\n", iface->name, get_name(func));
+@@ -1337,12 +1343,12 @@ static void write_locals(FILE *fp, const type_t *iface, int body)
+ if (&stmt2->entry != type_iface_get_stmts(iface)) {
+ const var_t *m = stmt2->u.var;
+ /* proxy prototype - use local prototype */
+- write_type_decl_left(fp, type_function_get_rettype(m->type));
++ write_declspec_decl_left(fp, type_function_get_retdeclspec(m->declspec.type));
+ fprintf(fp, " CALLBACK %s_%s_Proxy(\n", iface->name, get_name(m));
+- write_args(fp, type_get_function_args(m->type), iface->name, 1, TRUE);
++ write_args(fp, type_function_get_args(m->declspec.type), iface->name, 1, TRUE);
+ fprintf(fp, ")");
+ if (body) {
+- type_t *rt = type_function_get_rettype(m->type);
++ type_t *rt = type_function_get_rettype(m->declspec.type);
+ fprintf(fp, "\n{\n");
+ fprintf(fp, " %s\n", comment);
+ if (rt->name && strcmp(rt->name, "HRESULT") == 0)
+@@ -1359,9 +1365,9 @@ static void write_locals(FILE *fp, const type_t *iface, int body)
+ else
+ fprintf(fp, ";\n");
+ /* stub prototype - use remotable prototype */
+- write_type_decl_left(fp, type_function_get_rettype(func->type));
++ write_declspec_decl_left(fp, type_function_get_retdeclspec(func->declspec.type));
+ fprintf(fp, " __RPC_STUB %s_%s_Stub(\n", iface->name, get_name(m));
+- write_args(fp, type_get_function_args(func->type), iface->name, 1, TRUE);
++ write_args(fp, type_function_get_args(func->declspec.type), iface->name, 1, TRUE);
+ fprintf(fp, ")");
+ if (body)
+ /* Remotable methods must all return HRESULTs. */
+@@ -1407,15 +1413,16 @@ void write_local_stubs(const statement_list_t *stmts)
+
+ static void write_function_proto(FILE *header, const type_t *iface, const var_t *fun, const char *prefix)
+ {
+- const char *callconv = get_attrp(fun->type->attrs, ATTR_CALLCONV);
++ const char *callconv = get_attrp(fun->declspec.type->attrs, ATTR_CALLCONV);
+
+ if (!callconv) callconv = "__cdecl";
+ /* FIXME: do we need to handle call_as? */
+- write_type_decl_left(header, type_function_get_rettype(fun->type));
++ write_declspec_decl_left(header, type_function_get_retdeclspec(fun->declspec.type));
++ if (fun->declspec.funcspecifier == FUNCTION_SPECIFIER_INLINE) fprintf(header, " inline");
+ fprintf(header, " %s ", callconv);
+ fprintf(header, "%s%s(\n", prefix, get_name(fun));
+- if (type_get_function_args(fun->type))
+- write_args(header, type_get_function_args(fun->type), iface->name, 0, TRUE);
++ if (type_function_get_args(fun->declspec.type))
++ write_args(header, type_function_get_args(fun->declspec.type), iface->name, 0, TRUE);
+ else
+ fprintf(header, " void");
+ fprintf(header, ");\n\n");
+@@ -1541,7 +1548,7 @@ static void write_rpc_interface_start(FILE *header, const type_t *iface)
+ if (var)
+ {
+ fprintf(header, "extern ");
+- write_type_decl( header, var->type, var->name );
++ write_declspec_decl( header, &var->declspec, var->name );
+ fprintf(header, ";\n");
+ }
+ if (old_names)
+@@ -1653,6 +1660,7 @@ static void write_forward_decls(FILE *header, const statement_list_t *stmts)
+ if (type_get_type(stmt->u.type) == TYPE_INTERFACE)
+ {
+ type_t *iface = stmt->u.type;
++ assert(type_get_type_detect_alias(iface) == TYPE_INTERFACE);
+ if (is_object(iface) || is_attr(iface->attrs, ATTR_DISPINTERFACE))
+ {
+ write_forward(header, iface);
+@@ -1694,6 +1702,7 @@ static void write_header_stmts(FILE *header, const statement_list_t *stmts, cons
+ {
+ type_t *iface = stmt->u.type;
+ type_t *async_iface = iface->details.iface->async_iface;
++ assert(type_get_type_detect_alias(iface) == TYPE_INTERFACE);
+ if (is_object(iface)) is_object_interface++;
+ if (is_attr(stmt->u.type->attrs, ATTR_DISPINTERFACE) || is_object(stmt->u.type))
+ {
+@@ -1718,7 +1727,7 @@ static void write_header_stmts(FILE *header, const statement_list_t *stmts, cons
+ write_coclass(header, stmt->u.type);
+ else
+ {
+- write_type_definition(header, stmt->u.type);
++ write_type_definition(header, stmt->u.type, stmt->declonly);
+ }
+ break;
+ case STMT_TYPEREF:
+@@ -1739,7 +1748,7 @@ static void write_header_stmts(FILE *header, const statement_list_t *stmts, cons
+ {
+ const type_list_t *type_entry = stmt->u.type_list;
+ for (; type_entry; type_entry = type_entry->next)
+- write_typedef(header, type_entry->type);
++ write_typedef(header, type_entry->type, stmt->declonly);
+ break;
+ }
+ case STMT_LIBRARY:
+@@ -1750,7 +1759,7 @@ static void write_header_stmts(FILE *header, const statement_list_t *stmts, cons
+ fprintf(header, "%s\n", stmt->u.str);
+ break;
+ case STMT_DECLARATION:
+- if (iface && type_get_type(stmt->u.var->type) == TYPE_FUNCTION)
++ if (iface && type_get_type(stmt->u.var->declspec.type) == TYPE_FUNCTION)
+ {
+ if (!ignore_funcs)
+ {
+@@ -1784,15 +1793,15 @@ void write_header(const statement_list_t *stmts)
+ }
+ fprintf(header, "/*** Autogenerated by WIDL %s from %s - Do not edit ***/\n\n", PACKAGE_VERSION, input_name);
+
++ fprintf(header, "#ifdef _WIN32\n");
+ fprintf(header, "#ifndef __REQUIRED_RPCNDR_H_VERSION__\n");
+ fprintf(header, "#define __REQUIRED_RPCNDR_H_VERSION__ 475\n");
+- fprintf(header, "#endif\n\n");
+-
++ fprintf(header, "#endif\n");
+ fprintf(header, "#include <rpc.h>\n" );
+ fprintf(header, "#include <rpcndr.h>\n" );
+ if (!for_each_serializable(stmts, NULL, serializable_exists))
+ fprintf(header, "#include <midles.h>\n" );
+- fprintf(header, "\n" );
++ fprintf(header, "#endif\n\n");
+
+ fprintf(header, "#ifndef COM_NO_WINDOWS_H\n");
+ fprintf(header, "#include <windows.h>\n");
+diff --git a/mingw-w64-tools/widl/src/header.h b/mingw-w64-tools/widl/src/header.h
+index 0d44b403..0e62f77c 100644
+--- a/mingw-w64-tools/widl/src/header.h
++++ b/mingw-w64-tools/widl/src/header.h
+@@ -29,10 +29,12 @@ extern int is_attr(const attr_list_t *list, enum attr_type t);
+ extern void *get_attrp(const attr_list_t *list, enum attr_type t);
+ extern unsigned int get_attrv(const attr_list_t *list, enum attr_type t);
+ extern const char* get_name(const var_t *v);
++extern void write_declspec_left(FILE *h, const decl_spec_t *ds, enum name_type name_type, int declonly);
+ extern void write_type_left(FILE *h, type_t *t, enum name_type name_type, int declonly);
+ extern void write_type_right(FILE *h, type_t *t, int is_field);
+ extern void write_type_decl(FILE *f, type_t *t, const char *name);
+-extern void write_type_decl_left(FILE *f, type_t *t);
++extern void write_declspec_decl(FILE *f, const decl_spec_t *ds, const char *name);
++extern void write_declspec_decl_left(FILE *f, const decl_spec_t *ds);
+ extern unsigned int get_context_handle_offset( const type_t *type );
+ extern unsigned int get_generic_handle_offset( const type_t *type );
+ extern int needs_space_after(type_t *t);
+@@ -83,12 +85,12 @@ static inline int is_conformant_array(const type_t *t)
+
+ static inline int last_ptr(const type_t *type)
+ {
+- return is_ptr(type) && !is_declptr(type_pointer_get_ref(type));
++ return is_ptr(type) && !is_declptr(type_pointer_get_ref_type(type));
+ }
+
+ static inline int last_array(const type_t *type)
+ {
+- return is_array(type) && !is_array(type_array_get_element(type));
++ return is_array(type) && !is_array(type_array_get_element_type(type));
+ }
+
+ static inline int is_string_type(const attr_list_t *attrs, const type_t *type)
+@@ -102,7 +104,7 @@ static inline int is_context_handle(const type_t *type)
+ const type_t *t;
+ for (t = type;
+ is_ptr(t) || type_is_alias(t);
+- t = type_is_alias(t) ? type_alias_get_aliasee(t) : type_pointer_get_ref(t))
++ t = type_is_alias(t) ? type_alias_get_aliasee_type(t) : type_pointer_get_ref_type(t))
+ if (is_attr(t->attrs, ATTR_CONTEXTHANDLE))
+ return 1;
+ return 0;
+diff --git a/mingw-w64-tools/widl/src/parser.tab.c b/mingw-w64-tools/widl/src/parser.tab.c
+index 6266e054..d7053e79 100644
+--- a/mingw-w64-tools/widl/src/parser.tab.c
++++ b/mingw-w64-tools/widl/src/parser.tab.c
+@@ -1,8 +1,8 @@
+-/* A Bison parser, made by GNU Bison 3.0.5. */
++/* A Bison parser, made by GNU Bison 3.0.4. */
+
+ /* Bison implementation for Yacc-like parsers in C
+
+- Copyright (C) 1984, 1989-1990, 2000-2015, 2018 Free Software Foundation, Inc.
++ Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+@@ -44,7 +44,7 @@
+ #define YYBISON 1
+
+ /* Bison version. */
+-#define YYBISON_VERSION "3.0.5"
++#define YYBISON_VERSION "3.0.4"
+
+ /* Skeleton name. */
+ #define YYSKELETON_NAME "yacc.c"
+@@ -125,13 +125,6 @@ struct _import_t
+ int import_performed;
+ };
+
+-typedef struct _decl_spec_t
+-{
+- type_t *type;
+- attr_list_t *attrs;
+- enum storage_class stgclass;
+-} decl_spec_t;
+-
+ typelist_t incomplete_types = LIST_INIT(incomplete_types);
+
+ static void fix_incomplete(void);
+@@ -140,7 +133,7 @@ static void fix_incomplete_types(type_t *complete_type);
+ static str_list_t *append_str(str_list_t *list, char *str);
+ static attr_list_t *append_attr(attr_list_t *list, attr_t *attr);
+ static attr_list_t *append_attr_list(attr_list_t *new_list, attr_list_t *old_list);
+-static decl_spec_t *make_decl_spec(type_t *type, decl_spec_t *left, decl_spec_t *right, attr_t *attr, enum storage_class stgclass);
++static decl_spec_t *make_decl_spec(type_t *type, decl_spec_t *left, decl_spec_t *right, enum storage_class stgclass, enum type_qualifier typequalifier, enum function_specifier funcspecifier);
+ static attr_t *make_attr(enum attr_type type);
+ static attr_t *make_attrv(enum attr_type type, unsigned int val);
+ static attr_t *make_attrp(enum attr_type type, void *val);
+@@ -156,6 +149,7 @@ static declarator_t *make_declarator(var_t *var);
+ static type_t *make_safearray(type_t *type);
+ static typelib_t *make_library(const char *name, const attr_list_t *attrs);
+ static type_t *append_chain_type(type_t *chain, type_t *type);
++static decl_spec_t *append_chain_declspec(decl_spec_t *chain, type_t *type, enum type_qualifier typequalifier);
+ static warning_list_t *append_warning(warning_list_t *, int);
+
+ static type_t *reg_typedefs(decl_spec_t *decl_spec, var_list_t *names, attr_list_t *attrs);
+@@ -212,7 +206,7 @@ static struct namespace *current_namespace = &global_namespace;
+ static typelib_t *current_typelib;
+
+
+-#line 216 "parser.tab.c" /* yacc.c:339 */
++#line 210 "parser.tab.c" /* yacc.c:339 */
+
+ # ifndef YY_NULLPTR
+ # if defined __cplusplus && 201103L <= __cplusplus
+@@ -438,7 +432,7 @@ extern int parser_debug;
+
+ union YYSTYPE
+ {
+-#line 142 "parser.y" /* yacc.c:355 */
++#line 136 "parser.y" /* yacc.c:355 */
+
+ attr_t *attr;
+ attr_list_t *attr_list;
+@@ -465,8 +459,10 @@ union YYSTYPE
+ struct _import_t *import;
+ struct _decl_spec_t *declspec;
+ enum storage_class stgclass;
++ enum type_qualifier typequalifier;
++ enum function_specifier funcspecifier;
+
+-#line 470 "parser.tab.c" /* yacc.c:355 */
++#line 466 "parser.tab.c" /* yacc.c:355 */
+ };
+
+ typedef union YYSTYPE YYSTYPE;
+@@ -483,7 +479,7 @@ int parser_parse (void);
+
+ /* Copy the second part of user declarations. */
+
+-#line 487 "parser.tab.c" /* yacc.c:358 */
++#line 483 "parser.tab.c" /* yacc.c:358 */
+
+ #ifdef short
+ # undef short
+@@ -799,48 +795,48 @@ static const yytype_uint8 yytranslate[] =
+ /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
+ static const yytype_uint16 yyrline[] =
+ {
+- 0, 325, 325, 340, 340, 342, 343, 343, 345, 346,
+- 347, 350, 353, 354, 355, 358, 359, 360, 360, 362,
+- 363, 364, 367, 368, 369, 370, 373, 374, 377, 378,
+- 382, 383, 384, 385, 386, 387, 388, 391, 402, 403,
+- 407, 408, 409, 410, 411, 412, 413, 414, 415, 418,
+- 420, 428, 434, 438, 439, 441, 445, 449, 450, 453,
+- 454, 457, 458, 462, 467, 474, 478, 479, 482, 483,
+- 487, 490, 491, 492, 495, 496, 499, 500, 501, 502,
+- 503, 504, 505, 506, 507, 508, 509, 510, 511, 512,
+- 513, 514, 515, 516, 517, 518, 519, 520, 521, 522,
+- 523, 524, 525, 526, 527, 528, 529, 530, 531, 532,
+- 533, 534, 535, 536, 537, 538, 539, 540, 541, 542,
+- 543, 544, 545, 546, 547, 548, 549, 550, 551, 552,
+- 553, 554, 555, 556, 557, 558, 559, 560, 561, 562,
+- 563, 564, 565, 566, 567, 568, 569, 570, 571, 572,
+- 573, 574, 578, 579, 580, 581, 582, 583, 584, 585,
+- 586, 587, 588, 589, 590, 591, 592, 593, 594, 595,
+- 596, 597, 598, 599, 600, 601, 605, 606, 611, 612,
+- 613, 614, 617, 618, 621, 625, 631, 632, 633, 636,
+- 640, 652, 656, 661, 664, 665, 668, 669, 672, 673,
+- 674, 675, 676, 677, 678, 679, 680, 681, 682, 683,
+- 684, 685, 686, 687, 688, 689, 690, 691, 692, 693,
+- 694, 695, 696, 697, 698, 699, 700, 701, 702, 703,
+- 704, 705, 706, 707, 708, 709, 711, 713, 714, 717,
+- 718, 721, 727, 733, 734, 737, 742, 749, 750, 753,
+- 754, 758, 759, 762, 766, 772, 780, 784, 789, 790,
+- 793, 794, 795, 798, 800, 803, 804, 805, 806, 807,
+- 808, 809, 810, 811, 812, 813, 816, 817, 820, 821,
+- 822, 823, 824, 825, 826, 827, 828, 831, 832, 840,
+- 846, 850, 853, 854, 858, 861, 862, 865, 874, 875,
+- 878, 879, 882, 888, 894, 895, 898, 899, 902, 912,
+- 922, 928, 932, 933, 936, 937, 940, 945, 952, 953,
+- 954, 958, 962, 965, 966, 969, 970, 974, 975, 979,
+- 980, 981, 985, 987, 989, 993, 994, 995, 996, 1004,
+- 1006, 1008, 1013, 1015, 1020, 1021, 1026, 1027, 1028, 1029,
+- 1034, 1043, 1045, 1046, 1051, 1053, 1057, 1058, 1065, 1066,
+- 1067, 1068, 1069, 1074, 1082, 1083, 1086, 1087, 1090, 1097,
+- 1098, 1103, 1104, 1108, 1109, 1110, 1111, 1112, 1116, 1117,
+- 1118, 1121, 1124, 1125, 1126, 1127, 1128, 1129, 1130, 1131,
+- 1132, 1133, 1136, 1143, 1145, 1151, 1152, 1153, 1156, 1158,
+- 1160, 1162, 1165, 1170, 1178, 1179, 1182, 1183, 1186, 1187,
+- 1188
++ 0, 323, 323, 338, 338, 340, 341, 341, 343, 344,
++ 345, 348, 351, 352, 353, 356, 357, 358, 358, 360,
++ 361, 362, 365, 366, 367, 368, 371, 372, 375, 376,
++ 380, 381, 382, 383, 384, 385, 386, 389, 400, 401,
++ 405, 406, 407, 408, 409, 410, 411, 412, 413, 416,
++ 418, 426, 432, 436, 437, 439, 443, 447, 448, 451,
++ 452, 455, 456, 460, 465, 472, 476, 477, 480, 481,
++ 485, 488, 489, 490, 493, 494, 497, 498, 499, 500,
++ 501, 502, 503, 504, 505, 506, 507, 508, 509, 510,
++ 511, 512, 513, 514, 515, 516, 517, 518, 519, 520,
++ 521, 522, 523, 524, 525, 526, 527, 528, 529, 530,
++ 531, 532, 533, 534, 535, 536, 537, 538, 539, 540,
++ 541, 542, 543, 544, 545, 546, 547, 548, 549, 550,
++ 551, 552, 553, 554, 555, 556, 557, 558, 559, 560,
++ 561, 562, 563, 564, 565, 566, 567, 568, 569, 570,
++ 571, 572, 576, 577, 578, 579, 580, 581, 582, 583,
++ 584, 585, 586, 587, 588, 589, 590, 591, 592, 593,
++ 594, 595, 596, 597, 598, 599, 603, 604, 609, 610,
++ 611, 612, 615, 616, 619, 623, 629, 630, 631, 634,
++ 638, 650, 654, 659, 662, 663, 666, 667, 670, 671,
++ 672, 673, 674, 675, 676, 677, 678, 679, 680, 681,
++ 682, 683, 684, 685, 686, 687, 688, 689, 690, 691,
++ 692, 693, 694, 695, 696, 697, 698, 699, 700, 701,
++ 702, 703, 704, 705, 706, 707, 709, 711, 712, 715,
++ 716, 719, 725, 731, 732, 735, 740, 747, 748, 751,
++ 752, 756, 757, 760, 764, 770, 778, 782, 787, 788,
++ 791, 792, 793, 796, 798, 801, 802, 803, 804, 805,
++ 806, 807, 808, 809, 810, 811, 814, 815, 818, 819,
++ 820, 821, 822, 823, 824, 825, 826, 829, 830, 838,
++ 844, 848, 851, 852, 856, 859, 860, 863, 872, 873,
++ 876, 877, 880, 886, 892, 893, 896, 897, 900, 910,
++ 920, 926, 930, 931, 934, 935, 938, 943, 950, 951,
++ 952, 956, 960, 963, 964, 967, 968, 972, 973, 977,
++ 978, 979, 983, 985, 987, 991, 992, 993, 994, 1002,
++ 1004, 1006, 1011, 1013, 1018, 1019, 1024, 1025, 1026, 1027,
++ 1032, 1041, 1043, 1044, 1049, 1051, 1055, 1056, 1063, 1064,
++ 1065, 1066, 1067, 1072, 1080, 1081, 1084, 1085, 1088, 1095,
++ 1096, 1101, 1102, 1106, 1107, 1108, 1109, 1110, 1114, 1115,
++ 1116, 1119, 1122, 1123, 1124, 1125, 1126, 1127, 1128, 1129,
++ 1130, 1131, 1134, 1141, 1143, 1149, 1150, 1151, 1154, 1156,
++ 1158, 1160, 1163, 1168, 1176, 1177, 1180, 1181, 1184, 1185,
++ 1186
+ };
+ #endif
+
+@@ -903,7 +899,7 @@ static const char *const yytname[] =
+ "dispinterfacedef", "inherit", "interface", "interfacehdr",
+ "interfacedef", "interfacedec", "module", "modulehdr", "moduledef",
+ "storage_cls_spec", "function_specifier", "type_qualifier",
+- "m_type_qual_list", "decl_spec", "m_decl_spec_no_type",
++ "m_type_qual_bits", "decl_spec", "m_decl_spec_no_type",
+ "decl_spec_no_type", "declarator", "direct_declarator",
+ "abstract_declarator", "abstract_declarator_no_direct",
+ "m_abstract_declarator", "abstract_direct_declarator", "any_declarator",
+@@ -2298,7 +2294,6 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
+ case N: \
+ yyformat = S; \
+ break
+- default: /* Avoid compiler warnings. */
+ YYCASE_(0, YY_("syntax error"));
+ YYCASE_(1, YY_("syntax error, unexpected %s"));
+ YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
+@@ -2615,7 +2610,7 @@ yyreduce:
+ switch (yyn)
+ {
+ case 2:
+-#line 325 "parser.y" /* yacc.c:1648 */
++#line 323 "parser.y" /* yacc.c:1646 */
+ { fix_incomplete();
+ check_statements((yyvsp[-1].stmt_list), FALSE);
+ check_all_user_types((yyvsp[-1].stmt_list));
+@@ -2629,197 +2624,197 @@ yyreduce:
+ write_dlldata((yyvsp[-1].stmt_list));
+ write_local_stubs((yyvsp[-1].stmt_list));
+ }
+-#line 2633 "parser.tab.c" /* yacc.c:1648 */
++#line 2628 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 5:
+-#line 342 "parser.y" /* yacc.c:1648 */
++#line 340 "parser.y" /* yacc.c:1646 */
+ { (yyval.stmt_list) = NULL; }
+-#line 2639 "parser.tab.c" /* yacc.c:1648 */
++#line 2634 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 6:
+-#line 343 "parser.y" /* yacc.c:1648 */
++#line 341 "parser.y" /* yacc.c:1646 */
+ { push_namespace((yyvsp[-1].str)); }
+-#line 2645 "parser.tab.c" /* yacc.c:1648 */
++#line 2640 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 7:
+-#line 344 "parser.y" /* yacc.c:1648 */
++#line 342 "parser.y" /* yacc.c:1646 */
+ { pop_namespace((yyvsp[-4].str)); (yyval.stmt_list) = append_statements((yyvsp[-5].stmt_list), (yyvsp[-1].stmt_list)); }
+-#line 2651 "parser.tab.c" /* yacc.c:1648 */
++#line 2646 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 8:
+-#line 345 "parser.y" /* yacc.c:1648 */
++#line 343 "parser.y" /* yacc.c:1646 */
+ { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_reference((yyvsp[0].type))); }
+-#line 2657 "parser.tab.c" /* yacc.c:1648 */
++#line 2652 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 9:
+-#line 346 "parser.y" /* yacc.c:1648 */
++#line 344 "parser.y" /* yacc.c:1646 */
+ { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_type_decl((yyvsp[0].type))); }
+-#line 2663 "parser.tab.c" /* yacc.c:1648 */
++#line 2658 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 10:
+-#line 347 "parser.y" /* yacc.c:1648 */
++#line 345 "parser.y" /* yacc.c:1646 */
+ { (yyval.stmt_list) = (yyvsp[-2].stmt_list);
+ reg_type((yyvsp[-1].type), (yyvsp[-1].type)->name, current_namespace, 0);
+ }
+-#line 2671 "parser.tab.c" /* yacc.c:1648 */
++#line 2666 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 11:
+-#line 350 "parser.y" /* yacc.c:1648 */
++#line 348 "parser.y" /* yacc.c:1646 */
+ { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_type_decl((yyvsp[0].type)));
+ reg_type((yyvsp[0].type), (yyvsp[0].type)->name, current_namespace, 0);
+ }
+-#line 2679 "parser.tab.c" /* yacc.c:1648 */
++#line 2674 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 12:
+-#line 353 "parser.y" /* yacc.c:1648 */
++#line 351 "parser.y" /* yacc.c:1646 */
+ { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_module((yyvsp[0].type))); }
+-#line 2685 "parser.tab.c" /* yacc.c:1648 */
++#line 2680 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 13:
+-#line 354 "parser.y" /* yacc.c:1648 */
++#line 352 "parser.y" /* yacc.c:1646 */
+ { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_library((yyvsp[0].typelib))); }
+-#line 2691 "parser.tab.c" /* yacc.c:1648 */
++#line 2686 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 14:
+-#line 355 "parser.y" /* yacc.c:1648 */
++#line 353 "parser.y" /* yacc.c:1646 */
+ { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), (yyvsp[0].statement)); }
+-#line 2697 "parser.tab.c" /* yacc.c:1648 */
++#line 2692 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 15:
+-#line 358 "parser.y" /* yacc.c:1648 */
++#line 356 "parser.y" /* yacc.c:1646 */
+ { (yyval.stmt_list) = NULL; }
+-#line 2703 "parser.tab.c" /* yacc.c:1648 */
++#line 2698 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 16:
+-#line 359 "parser.y" /* yacc.c:1648 */
++#line 357 "parser.y" /* yacc.c:1646 */
+ { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_reference((yyvsp[0].type))); }
+-#line 2709 "parser.tab.c" /* yacc.c:1648 */
++#line 2704 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 17:
+-#line 360 "parser.y" /* yacc.c:1648 */
++#line 358 "parser.y" /* yacc.c:1646 */
+ { push_namespace((yyvsp[-1].str)); }
+-#line 2715 "parser.tab.c" /* yacc.c:1648 */
++#line 2710 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 18:
+-#line 361 "parser.y" /* yacc.c:1648 */
++#line 359 "parser.y" /* yacc.c:1646 */
+ { pop_namespace((yyvsp[-4].str)); (yyval.stmt_list) = append_statements((yyvsp[-5].stmt_list), (yyvsp[-1].stmt_list)); }
+-#line 2721 "parser.tab.c" /* yacc.c:1648 */
++#line 2716 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 19:
+-#line 362 "parser.y" /* yacc.c:1648 */
++#line 360 "parser.y" /* yacc.c:1646 */
+ { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_type_decl((yyvsp[0].type))); }
+-#line 2727 "parser.tab.c" /* yacc.c:1648 */
++#line 2722 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 20:
+-#line 363 "parser.y" /* yacc.c:1648 */
++#line 361 "parser.y" /* yacc.c:1646 */
+ { (yyval.stmt_list) = (yyvsp[-2].stmt_list); reg_type((yyvsp[-1].type), (yyvsp[-1].type)->name, current_namespace, 0); }
+-#line 2733 "parser.tab.c" /* yacc.c:1648 */
++#line 2728 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 21:
+-#line 364 "parser.y" /* yacc.c:1648 */
++#line 362 "parser.y" /* yacc.c:1646 */
+ { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_type_decl((yyvsp[0].type)));
+ reg_type((yyvsp[0].type), (yyvsp[0].type)->name, current_namespace, 0);
+ }
+-#line 2741 "parser.tab.c" /* yacc.c:1648 */
++#line 2736 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 22:
+-#line 367 "parser.y" /* yacc.c:1648 */
++#line 365 "parser.y" /* yacc.c:1646 */
+ { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_module((yyvsp[0].type))); }
+-#line 2747 "parser.tab.c" /* yacc.c:1648 */
++#line 2742 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 23:
+-#line 368 "parser.y" /* yacc.c:1648 */
++#line 366 "parser.y" /* yacc.c:1646 */
+ { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), (yyvsp[0].statement)); }
+-#line 2753 "parser.tab.c" /* yacc.c:1648 */
++#line 2748 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 24:
+-#line 369 "parser.y" /* yacc.c:1648 */
++#line 367 "parser.y" /* yacc.c:1646 */
+ { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_importlib((yyvsp[0].str))); }
+-#line 2759 "parser.tab.c" /* yacc.c:1648 */
++#line 2754 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 25:
+-#line 370 "parser.y" /* yacc.c:1648 */
++#line 368 "parser.y" /* yacc.c:1646 */
+ { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_library((yyvsp[0].typelib))); }
+-#line 2765 "parser.tab.c" /* yacc.c:1648 */
++#line 2760 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 26:
+-#line 373 "parser.y" /* yacc.c:1648 */
++#line 371 "parser.y" /* yacc.c:1646 */
+ { (yyval.stmt_list) = NULL; }
+-#line 2771 "parser.tab.c" /* yacc.c:1648 */
++#line 2766 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 27:
+-#line 374 "parser.y" /* yacc.c:1648 */
++#line 372 "parser.y" /* yacc.c:1646 */
+ { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), (yyvsp[0].statement)); }
+-#line 2777 "parser.tab.c" /* yacc.c:1648 */
++#line 2772 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 30:
+-#line 382 "parser.y" /* yacc.c:1648 */
++#line 380 "parser.y" /* yacc.c:1646 */
+ { (yyval.statement) = make_statement_cppquote((yyvsp[0].str)); }
+-#line 2783 "parser.tab.c" /* yacc.c:1648 */
++#line 2778 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 31:
+-#line 383 "parser.y" /* yacc.c:1648 */
++#line 381 "parser.y" /* yacc.c:1646 */
+ { (yyval.statement) = make_statement_type_decl((yyvsp[-1].type)); }
+-#line 2789 "parser.tab.c" /* yacc.c:1648 */
++#line 2784 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 32:
+-#line 384 "parser.y" /* yacc.c:1648 */
++#line 382 "parser.y" /* yacc.c:1646 */
+ { (yyval.statement) = make_statement_declaration((yyvsp[-1].var)); }
+-#line 2795 "parser.tab.c" /* yacc.c:1648 */
++#line 2790 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 33:
+-#line 385 "parser.y" /* yacc.c:1648 */
++#line 383 "parser.y" /* yacc.c:1646 */
+ { (yyval.statement) = make_statement_import((yyvsp[0].str)); }
+-#line 2801 "parser.tab.c" /* yacc.c:1648 */
++#line 2796 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 34:
+-#line 386 "parser.y" /* yacc.c:1648 */
++#line 384 "parser.y" /* yacc.c:1646 */
+ { (yyval.statement) = (yyvsp[-1].statement); }
+-#line 2807 "parser.tab.c" /* yacc.c:1648 */
++#line 2802 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 35:
+-#line 387 "parser.y" /* yacc.c:1648 */
++#line 385 "parser.y" /* yacc.c:1646 */
+ { (yyval.statement) = make_statement_pragma((yyvsp[0].str)); }
+-#line 2813 "parser.tab.c" /* yacc.c:1648 */
++#line 2808 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 36:
+-#line 388 "parser.y" /* yacc.c:1648 */
++#line 386 "parser.y" /* yacc.c:1646 */
+ { (yyval.statement) = NULL; }
+-#line 2819 "parser.tab.c" /* yacc.c:1648 */
++#line 2814 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 37:
+-#line 392 "parser.y" /* yacc.c:1648 */
++#line 390 "parser.y" /* yacc.c:1646 */
+ {
+ int result;
+ (yyval.statement) = NULL;
+@@ -2827,909 +2822,909 @@ yyreduce:
+ if(!result)
+ error_loc("expected \"disable\" or \"enable\"\n");
+ }
+-#line 2831 "parser.tab.c" /* yacc.c:1648 */
++#line 2826 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 38:
+-#line 402 "parser.y" /* yacc.c:1648 */
++#line 400 "parser.y" /* yacc.c:1646 */
+ { (yyval.warning_list) = append_warning(NULL, (yyvsp[0].num)); }
+-#line 2837 "parser.tab.c" /* yacc.c:1648 */
++#line 2832 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 39:
+-#line 403 "parser.y" /* yacc.c:1648 */
++#line 401 "parser.y" /* yacc.c:1646 */
+ { (yyval.warning_list) = append_warning((yyvsp[-1].warning_list), (yyvsp[0].num)); }
+-#line 2843 "parser.tab.c" /* yacc.c:1648 */
++#line 2838 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 41:
+-#line 408 "parser.y" /* yacc.c:1648 */
++#line 406 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = type_new_enum((yyvsp[0].str), current_namespace, FALSE, NULL); }
+-#line 2849 "parser.tab.c" /* yacc.c:1648 */
++#line 2844 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 43:
+-#line 410 "parser.y" /* yacc.c:1648 */
++#line 408 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = type_new_struct((yyvsp[0].str), current_namespace, FALSE, NULL); }
+-#line 2855 "parser.tab.c" /* yacc.c:1648 */
++#line 2850 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 45:
+-#line 412 "parser.y" /* yacc.c:1648 */
++#line 410 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = type_new_nonencapsulated_union((yyvsp[0].str), FALSE, NULL); }
+-#line 2861 "parser.tab.c" /* yacc.c:1648 */
++#line 2856 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 46:
+-#line 413 "parser.y" /* yacc.c:1648 */
++#line 411 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = (yyvsp[0].type); (yyval.type)->attrs = check_enum_attrs((yyvsp[-1].attr_list)); }
+-#line 2867 "parser.tab.c" /* yacc.c:1648 */
++#line 2862 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 47:
+-#line 414 "parser.y" /* yacc.c:1648 */
++#line 412 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = (yyvsp[0].type); (yyval.type)->attrs = check_struct_attrs((yyvsp[-1].attr_list)); }
+-#line 2873 "parser.tab.c" /* yacc.c:1648 */
++#line 2868 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 48:
+-#line 415 "parser.y" /* yacc.c:1648 */
++#line 413 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = (yyvsp[0].type); (yyval.type)->attrs = check_union_attrs((yyvsp[-1].attr_list)); }
+-#line 2879 "parser.tab.c" /* yacc.c:1648 */
++#line 2874 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 49:
+-#line 418 "parser.y" /* yacc.c:1648 */
++#line 416 "parser.y" /* yacc.c:1646 */
+ { (yyval.str) = (yyvsp[-1].str); }
+-#line 2885 "parser.tab.c" /* yacc.c:1648 */
++#line 2880 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 50:
+-#line 420 "parser.y" /* yacc.c:1648 */
++#line 418 "parser.y" /* yacc.c:1646 */
+ { assert(yychar == YYEMPTY);
+ (yyval.import) = xmalloc(sizeof(struct _import_t));
+ (yyval.import)->name = (yyvsp[-1].str);
+ (yyval.import)->import_performed = do_import((yyvsp[-1].str));
+ if (!(yyval.import)->import_performed) yychar = aEOF;
+ }
+-#line 2896 "parser.tab.c" /* yacc.c:1648 */
++#line 2891 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 51:
+-#line 428 "parser.y" /* yacc.c:1648 */
++#line 426 "parser.y" /* yacc.c:1646 */
+ { (yyval.str) = (yyvsp[-2].import)->name;
+ if ((yyvsp[-2].import)->import_performed) pop_import();
+ free((yyvsp[-2].import));
+ }
+-#line 2905 "parser.tab.c" /* yacc.c:1648 */
++#line 2900 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 52:
+-#line 435 "parser.y" /* yacc.c:1648 */
++#line 433 "parser.y" /* yacc.c:1646 */
+ { (yyval.str) = (yyvsp[-2].str); if(!parse_only) add_importlib((yyvsp[-2].str), current_typelib); }
+-#line 2911 "parser.tab.c" /* yacc.c:1648 */
++#line 2906 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 53:
+-#line 438 "parser.y" /* yacc.c:1648 */
++#line 436 "parser.y" /* yacc.c:1646 */
+ { (yyval.str) = (yyvsp[0].str); }
+-#line 2917 "parser.tab.c" /* yacc.c:1648 */
++#line 2912 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 54:
+-#line 439 "parser.y" /* yacc.c:1648 */
++#line 437 "parser.y" /* yacc.c:1646 */
+ { (yyval.str) = (yyvsp[0].str); }
+-#line 2923 "parser.tab.c" /* yacc.c:1648 */
++#line 2918 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 55:
+-#line 441 "parser.y" /* yacc.c:1648 */
++#line 439 "parser.y" /* yacc.c:1646 */
+ { (yyval.typelib) = make_library((yyvsp[-1].str), check_library_attrs((yyvsp[-1].str), (yyvsp[-2].attr_list)));
+ if (!parse_only && do_typelib) current_typelib = (yyval.typelib);
+ }
+-#line 2931 "parser.tab.c" /* yacc.c:1648 */
++#line 2926 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 56:
+-#line 446 "parser.y" /* yacc.c:1648 */
++#line 444 "parser.y" /* yacc.c:1646 */
+ { (yyval.typelib) = (yyvsp[-3].typelib); (yyval.typelib)->stmts = (yyvsp[-2].stmt_list); }
+-#line 2937 "parser.tab.c" /* yacc.c:1648 */
++#line 2932 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 57:
+-#line 449 "parser.y" /* yacc.c:1648 */
++#line 447 "parser.y" /* yacc.c:1646 */
+ { (yyval.var_list) = NULL; }
+-#line 2943 "parser.tab.c" /* yacc.c:1648 */
++#line 2938 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 59:
+-#line 453 "parser.y" /* yacc.c:1648 */
++#line 451 "parser.y" /* yacc.c:1646 */
+ { check_arg_attrs((yyvsp[0].var)); (yyval.var_list) = append_var( NULL, (yyvsp[0].var) ); }
+-#line 2949 "parser.tab.c" /* yacc.c:1648 */
++#line 2944 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 60:
+-#line 454 "parser.y" /* yacc.c:1648 */
++#line 452 "parser.y" /* yacc.c:1646 */
+ { check_arg_attrs((yyvsp[0].var)); (yyval.var_list) = append_var( (yyvsp[-2].var_list), (yyvsp[0].var) ); }
+-#line 2955 "parser.tab.c" /* yacc.c:1648 */
++#line 2950 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 62:
+-#line 458 "parser.y" /* yacc.c:1648 */
++#line 456 "parser.y" /* yacc.c:1646 */
+ { (yyval.var_list) = append_var( (yyvsp[-2].var_list), make_var(strdup("...")) ); }
+-#line 2961 "parser.tab.c" /* yacc.c:1648 */
++#line 2956 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 63:
+-#line 462 "parser.y" /* yacc.c:1648 */
++#line 460 "parser.y" /* yacc.c:1646 */
+ { if ((yyvsp[-1].declspec)->stgclass != STG_NONE && (yyvsp[-1].declspec)->stgclass != STG_REGISTER)
+ error_loc("invalid storage class for function parameter\n");
+ (yyval.var) = declare_var((yyvsp[-2].attr_list), (yyvsp[-1].declspec), (yyvsp[0].declarator), TRUE);
+ free((yyvsp[-1].declspec)); free((yyvsp[0].declarator));
+ }
+-#line 2971 "parser.tab.c" /* yacc.c:1648 */
++#line 2966 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 64:
+-#line 467 "parser.y" /* yacc.c:1648 */
++#line 465 "parser.y" /* yacc.c:1646 */
+ { if ((yyvsp[-1].declspec)->stgclass != STG_NONE && (yyvsp[-1].declspec)->stgclass != STG_REGISTER)
+ error_loc("invalid storage class for function parameter\n");
+ (yyval.var) = declare_var(NULL, (yyvsp[-1].declspec), (yyvsp[0].declarator), TRUE);
+ free((yyvsp[-1].declspec)); free((yyvsp[0].declarator));
+ }
+-#line 2981 "parser.tab.c" /* yacc.c:1648 */
++#line 2976 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 65:
+-#line 474 "parser.y" /* yacc.c:1648 */
++#line 472 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = (yyvsp[-1].expr);
+ if (!(yyval.expr)->is_const || (yyval.expr)->cval <= 0)
+ error_loc("array dimension is not a positive integer constant\n");
+ }
+-#line 2990 "parser.tab.c" /* yacc.c:1648 */
++#line 2985 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 66:
+-#line 478 "parser.y" /* yacc.c:1648 */
++#line 476 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = make_expr(EXPR_VOID); }
+-#line 2996 "parser.tab.c" /* yacc.c:1648 */
++#line 2991 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 67:
+-#line 479 "parser.y" /* yacc.c:1648 */
++#line 477 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = make_expr(EXPR_VOID); }
+-#line 3002 "parser.tab.c" /* yacc.c:1648 */
++#line 2997 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 68:
+-#line 482 "parser.y" /* yacc.c:1648 */
++#line 480 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr_list) = NULL; }
+-#line 3008 "parser.tab.c" /* yacc.c:1648 */
++#line 3003 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 70:
+-#line 487 "parser.y" /* yacc.c:1648 */
++#line 485 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr_list) = (yyvsp[-1].attr_list); }
+-#line 3014 "parser.tab.c" /* yacc.c:1648 */
++#line 3009 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 71:
+-#line 490 "parser.y" /* yacc.c:1648 */
++#line 488 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr_list) = append_attr( NULL, (yyvsp[0].attr) ); }
+-#line 3020 "parser.tab.c" /* yacc.c:1648 */
++#line 3015 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 72:
+-#line 491 "parser.y" /* yacc.c:1648 */
++#line 489 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr_list) = append_attr( (yyvsp[-2].attr_list), (yyvsp[0].attr) ); }
+-#line 3026 "parser.tab.c" /* yacc.c:1648 */
++#line 3021 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 73:
+-#line 492 "parser.y" /* yacc.c:1648 */
++#line 490 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr_list) = append_attr( (yyvsp[-3].attr_list), (yyvsp[0].attr) ); }
+-#line 3032 "parser.tab.c" /* yacc.c:1648 */
++#line 3027 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 74:
+-#line 495 "parser.y" /* yacc.c:1648 */
++#line 493 "parser.y" /* yacc.c:1646 */
+ { (yyval.str_list) = append_str( NULL, (yyvsp[0].str) ); }
+-#line 3038 "parser.tab.c" /* yacc.c:1648 */
++#line 3033 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 75:
+-#line 496 "parser.y" /* yacc.c:1648 */
++#line 494 "parser.y" /* yacc.c:1646 */
+ { (yyval.str_list) = append_str( (yyvsp[-2].str_list), (yyvsp[0].str) ); }
+-#line 3044 "parser.tab.c" /* yacc.c:1648 */
++#line 3039 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 76:
+-#line 499 "parser.y" /* yacc.c:1648 */
++#line 497 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = NULL; }
+-#line 3050 "parser.tab.c" /* yacc.c:1648 */
++#line 3045 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 77:
+-#line 500 "parser.y" /* yacc.c:1648 */
++#line 498 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_AGGREGATABLE); }
+-#line 3056 "parser.tab.c" /* yacc.c:1648 */
++#line 3051 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 78:
+-#line 501 "parser.y" /* yacc.c:1648 */
++#line 499 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attrp(ATTR_ANNOTATION, (yyvsp[-1].str)); }
+-#line 3062 "parser.tab.c" /* yacc.c:1648 */
++#line 3057 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 79:
+-#line 502 "parser.y" /* yacc.c:1648 */
++#line 500 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_APPOBJECT); }
+-#line 3068 "parser.tab.c" /* yacc.c:1648 */
++#line 3063 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 80:
+-#line 503 "parser.y" /* yacc.c:1648 */
++#line 501 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_ASYNC); }
+-#line 3074 "parser.tab.c" /* yacc.c:1648 */
++#line 3069 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 81:
+-#line 504 "parser.y" /* yacc.c:1648 */
++#line 502 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_AUTO_HANDLE); }
+-#line 3080 "parser.tab.c" /* yacc.c:1648 */
++#line 3075 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 82:
+-#line 505 "parser.y" /* yacc.c:1648 */
++#line 503 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_BINDABLE); }
+-#line 3086 "parser.tab.c" /* yacc.c:1648 */
++#line 3081 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 83:
+-#line 506 "parser.y" /* yacc.c:1648 */
++#line 504 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_BROADCAST); }
+-#line 3092 "parser.tab.c" /* yacc.c:1648 */
++#line 3087 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 84:
+-#line 507 "parser.y" /* yacc.c:1648 */
++#line 505 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attrp(ATTR_CALLAS, (yyvsp[-1].var)); }
+-#line 3098 "parser.tab.c" /* yacc.c:1648 */
++#line 3093 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 85:
+-#line 508 "parser.y" /* yacc.c:1648 */
++#line 506 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attrp(ATTR_CASE, (yyvsp[-1].expr_list)); }
+-#line 3104 "parser.tab.c" /* yacc.c:1648 */
++#line 3099 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 86:
+-#line 509 "parser.y" /* yacc.c:1648 */
++#line 507 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_CODE); }
+-#line 3110 "parser.tab.c" /* yacc.c:1648 */
++#line 3105 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 87:
+-#line 510 "parser.y" /* yacc.c:1648 */
++#line 508 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_COMMSTATUS); }
+-#line 3116 "parser.tab.c" /* yacc.c:1648 */
++#line 3111 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 88:
+-#line 511 "parser.y" /* yacc.c:1648 */
++#line 509 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attrv(ATTR_CONTEXTHANDLE, 0); }
+-#line 3122 "parser.tab.c" /* yacc.c:1648 */
++#line 3117 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 89:
+-#line 512 "parser.y" /* yacc.c:1648 */
++#line 510 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attrv(ATTR_CONTEXTHANDLE, 0); /* RPC_CONTEXT_HANDLE_DONT_SERIALIZE */ }
+-#line 3128 "parser.tab.c" /* yacc.c:1648 */
++#line 3123 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 90:
+-#line 513 "parser.y" /* yacc.c:1648 */
++#line 511 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attrv(ATTR_CONTEXTHANDLE, 0); /* RPC_CONTEXT_HANDLE_SERIALIZE */ }
+-#line 3134 "parser.tab.c" /* yacc.c:1648 */
++#line 3129 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 91:
+-#line 514 "parser.y" /* yacc.c:1648 */
++#line 512 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_CONTROL); }
+-#line 3140 "parser.tab.c" /* yacc.c:1648 */
++#line 3135 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 92:
+-#line 515 "parser.y" /* yacc.c:1648 */
++#line 513 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_DECODE); }
+-#line 3146 "parser.tab.c" /* yacc.c:1648 */
++#line 3141 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 93:
+-#line 516 "parser.y" /* yacc.c:1648 */
++#line 514 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_DEFAULT); }
+-#line 3152 "parser.tab.c" /* yacc.c:1648 */
++#line 3147 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 94:
+-#line 517 "parser.y" /* yacc.c:1648 */
++#line 515 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_DEFAULTBIND); }
+-#line 3158 "parser.tab.c" /* yacc.c:1648 */
++#line 3153 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 95:
+-#line 518 "parser.y" /* yacc.c:1648 */
++#line 516 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_DEFAULTCOLLELEM); }
+-#line 3164 "parser.tab.c" /* yacc.c:1648 */
++#line 3159 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 96:
+-#line 519 "parser.y" /* yacc.c:1648 */
++#line 517 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attrp(ATTR_DEFAULTVALUE, (yyvsp[-1].expr)); }
+-#line 3170 "parser.tab.c" /* yacc.c:1648 */
++#line 3165 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 97:
+-#line 520 "parser.y" /* yacc.c:1648 */
++#line 518 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_DEFAULTVTABLE); }
+-#line 3176 "parser.tab.c" /* yacc.c:1648 */
++#line 3171 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 98:
+-#line 521 "parser.y" /* yacc.c:1648 */
++#line 519 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_DISABLECONSISTENCYCHECK); }
+-#line 3182 "parser.tab.c" /* yacc.c:1648 */
++#line 3177 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 99:
+-#line 522 "parser.y" /* yacc.c:1648 */
++#line 520 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_DISPLAYBIND); }
+-#line 3188 "parser.tab.c" /* yacc.c:1648 */
++#line 3183 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 100:
+-#line 523 "parser.y" /* yacc.c:1648 */
++#line 521 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attrp(ATTR_DLLNAME, (yyvsp[-1].str)); }
+-#line 3194 "parser.tab.c" /* yacc.c:1648 */
++#line 3189 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 101:
+-#line 524 "parser.y" /* yacc.c:1648 */
++#line 522 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_DUAL); }
+-#line 3200 "parser.tab.c" /* yacc.c:1648 */
++#line 3195 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 102:
+-#line 525 "parser.y" /* yacc.c:1648 */
++#line 523 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_ENABLEALLOCATE); }
+-#line 3206 "parser.tab.c" /* yacc.c:1648 */
++#line 3201 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 103:
+-#line 526 "parser.y" /* yacc.c:1648 */
++#line 524 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_ENCODE); }
+-#line 3212 "parser.tab.c" /* yacc.c:1648 */
++#line 3207 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 104:
+-#line 527 "parser.y" /* yacc.c:1648 */
++#line 525 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attrp(ATTR_ENDPOINT, (yyvsp[-1].str_list)); }
+-#line 3218 "parser.tab.c" /* yacc.c:1648 */
++#line 3213 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 105:
+-#line 528 "parser.y" /* yacc.c:1648 */
++#line 526 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attrp(ATTR_ENTRY, (yyvsp[-1].expr)); }
+-#line 3224 "parser.tab.c" /* yacc.c:1648 */
++#line 3219 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 106:
+-#line 529 "parser.y" /* yacc.c:1648 */
++#line 527 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_EXPLICIT_HANDLE); }
+-#line 3230 "parser.tab.c" /* yacc.c:1648 */
++#line 3225 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 107:
+-#line 530 "parser.y" /* yacc.c:1648 */
++#line 528 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_FAULTSTATUS); }
+-#line 3236 "parser.tab.c" /* yacc.c:1648 */
++#line 3231 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 108:
+-#line 531 "parser.y" /* yacc.c:1648 */
++#line 529 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_FORCEALLOCATE); }
+-#line 3242 "parser.tab.c" /* yacc.c:1648 */
++#line 3237 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 109:
+-#line 532 "parser.y" /* yacc.c:1648 */
++#line 530 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_HANDLE); }
+-#line 3248 "parser.tab.c" /* yacc.c:1648 */
++#line 3243 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 110:
+-#line 533 "parser.y" /* yacc.c:1648 */
++#line 531 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attrp(ATTR_HELPCONTEXT, (yyvsp[-1].expr)); }
+-#line 3254 "parser.tab.c" /* yacc.c:1648 */
++#line 3249 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 111:
+-#line 534 "parser.y" /* yacc.c:1648 */
++#line 532 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attrp(ATTR_HELPFILE, (yyvsp[-1].str)); }
+-#line 3260 "parser.tab.c" /* yacc.c:1648 */
++#line 3255 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 112:
+-#line 535 "parser.y" /* yacc.c:1648 */
++#line 533 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attrp(ATTR_HELPSTRING, (yyvsp[-1].str)); }
+-#line 3266 "parser.tab.c" /* yacc.c:1648 */
++#line 3261 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 113:
+-#line 536 "parser.y" /* yacc.c:1648 */
++#line 534 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attrp(ATTR_HELPSTRINGCONTEXT, (yyvsp[-1].expr)); }
+-#line 3272 "parser.tab.c" /* yacc.c:1648 */
++#line 3267 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 114:
+-#line 537 "parser.y" /* yacc.c:1648 */
++#line 535 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attrp(ATTR_HELPSTRINGDLL, (yyvsp[-1].str)); }
+-#line 3278 "parser.tab.c" /* yacc.c:1648 */
++#line 3273 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 115:
+-#line 538 "parser.y" /* yacc.c:1648 */
++#line 536 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_HIDDEN); }
+-#line 3284 "parser.tab.c" /* yacc.c:1648 */
++#line 3279 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 116:
+-#line 539 "parser.y" /* yacc.c:1648 */
++#line 537 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attrp(ATTR_ID, (yyvsp[-1].expr)); }
+-#line 3290 "parser.tab.c" /* yacc.c:1648 */
++#line 3285 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 117:
+-#line 540 "parser.y" /* yacc.c:1648 */
++#line 538 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_IDEMPOTENT); }
+-#line 3296 "parser.tab.c" /* yacc.c:1648 */
++#line 3291 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 118:
+-#line 541 "parser.y" /* yacc.c:1648 */
++#line 539 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_IGNORE); }
+-#line 3302 "parser.tab.c" /* yacc.c:1648 */
++#line 3297 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 119:
+-#line 542 "parser.y" /* yacc.c:1648 */
++#line 540 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attrp(ATTR_IIDIS, (yyvsp[-1].expr)); }
+-#line 3308 "parser.tab.c" /* yacc.c:1648 */
++#line 3303 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 120:
+-#line 543 "parser.y" /* yacc.c:1648 */
++#line 541 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_IMMEDIATEBIND); }
+-#line 3314 "parser.tab.c" /* yacc.c:1648 */
++#line 3309 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 121:
+-#line 544 "parser.y" /* yacc.c:1648 */
++#line 542 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attrp(ATTR_IMPLICIT_HANDLE, (yyvsp[-1].var)); }
+-#line 3320 "parser.tab.c" /* yacc.c:1648 */
++#line 3315 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 122:
+-#line 545 "parser.y" /* yacc.c:1648 */
++#line 543 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_IN); }
+-#line 3326 "parser.tab.c" /* yacc.c:1648 */
++#line 3321 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 123:
+-#line 546 "parser.y" /* yacc.c:1648 */
++#line 544 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_INPUTSYNC); }
+-#line 3332 "parser.tab.c" /* yacc.c:1648 */
++#line 3327 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 124:
+-#line 547 "parser.y" /* yacc.c:1648 */
++#line 545 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attrp(ATTR_LENGTHIS, (yyvsp[-1].expr_list)); }
+-#line 3338 "parser.tab.c" /* yacc.c:1648 */
++#line 3333 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 125:
+-#line 548 "parser.y" /* yacc.c:1648 */
++#line 546 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attrp(ATTR_LIBLCID, (yyvsp[-1].expr)); }
+-#line 3344 "parser.tab.c" /* yacc.c:1648 */
++#line 3339 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 126:
+-#line 549 "parser.y" /* yacc.c:1648 */
++#line 547 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_PARAMLCID); }
+-#line 3350 "parser.tab.c" /* yacc.c:1648 */
++#line 3345 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 127:
+-#line 550 "parser.y" /* yacc.c:1648 */
++#line 548 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_LICENSED); }
+-#line 3356 "parser.tab.c" /* yacc.c:1648 */
++#line 3351 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 128:
+-#line 551 "parser.y" /* yacc.c:1648 */
++#line 549 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_LOCAL); }
+-#line 3362 "parser.tab.c" /* yacc.c:1648 */
++#line 3357 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 129:
+-#line 552 "parser.y" /* yacc.c:1648 */
++#line 550 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_MAYBE); }
+-#line 3368 "parser.tab.c" /* yacc.c:1648 */
++#line 3363 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 130:
+-#line 553 "parser.y" /* yacc.c:1648 */
++#line 551 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_MESSAGE); }
+-#line 3374 "parser.tab.c" /* yacc.c:1648 */
++#line 3369 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 131:
+-#line 554 "parser.y" /* yacc.c:1648 */
++#line 552 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_NOCODE); }
+-#line 3380 "parser.tab.c" /* yacc.c:1648 */
++#line 3375 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 132:
+-#line 555 "parser.y" /* yacc.c:1648 */
++#line 553 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_NONBROWSABLE); }
+-#line 3386 "parser.tab.c" /* yacc.c:1648 */
++#line 3381 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 133:
+-#line 556 "parser.y" /* yacc.c:1648 */
++#line 554 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_NONCREATABLE); }
+-#line 3392 "parser.tab.c" /* yacc.c:1648 */
++#line 3387 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 134:
+-#line 557 "parser.y" /* yacc.c:1648 */
++#line 555 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_NONEXTENSIBLE); }
+-#line 3398 "parser.tab.c" /* yacc.c:1648 */
++#line 3393 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 135:
+-#line 558 "parser.y" /* yacc.c:1648 */
++#line 556 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_NOTIFY); }
+-#line 3404 "parser.tab.c" /* yacc.c:1648 */
++#line 3399 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 136:
+-#line 559 "parser.y" /* yacc.c:1648 */
++#line 557 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_NOTIFYFLAG); }
+-#line 3410 "parser.tab.c" /* yacc.c:1648 */
++#line 3405 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 137:
+-#line 560 "parser.y" /* yacc.c:1648 */
++#line 558 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_OBJECT); }
+-#line 3416 "parser.tab.c" /* yacc.c:1648 */
++#line 3411 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 138:
+-#line 561 "parser.y" /* yacc.c:1648 */
++#line 559 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_ODL); }
+-#line 3422 "parser.tab.c" /* yacc.c:1648 */
++#line 3417 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 139:
+-#line 562 "parser.y" /* yacc.c:1648 */
++#line 560 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_OLEAUTOMATION); }
+-#line 3428 "parser.tab.c" /* yacc.c:1648 */
++#line 3423 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 140:
+-#line 563 "parser.y" /* yacc.c:1648 */
++#line 561 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attrp(ATTR_OPTIMIZE, (yyvsp[-1].str)); }
+-#line 3434 "parser.tab.c" /* yacc.c:1648 */
++#line 3429 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 141:
+-#line 564 "parser.y" /* yacc.c:1648 */
++#line 562 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_OPTIONAL); }
+-#line 3440 "parser.tab.c" /* yacc.c:1648 */
++#line 3435 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 142:
+-#line 565 "parser.y" /* yacc.c:1648 */
++#line 563 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_OUT); }
+-#line 3446 "parser.tab.c" /* yacc.c:1648 */
++#line 3441 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 143:
+-#line 566 "parser.y" /* yacc.c:1648 */
++#line 564 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_PARTIALIGNORE); }
+-#line 3452 "parser.tab.c" /* yacc.c:1648 */
++#line 3447 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 144:
+-#line 567 "parser.y" /* yacc.c:1648 */
++#line 565 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attrv(ATTR_POINTERDEFAULT, (yyvsp[-1].num)); }
+-#line 3458 "parser.tab.c" /* yacc.c:1648 */
++#line 3453 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 145:
+-#line 568 "parser.y" /* yacc.c:1648 */
++#line 566 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attrp(ATTR_PROGID, (yyvsp[-1].str)); }
+-#line 3464 "parser.tab.c" /* yacc.c:1648 */
++#line 3459 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 146:
+-#line 569 "parser.y" /* yacc.c:1648 */
++#line 567 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_PROPGET); }
+-#line 3470 "parser.tab.c" /* yacc.c:1648 */
++#line 3465 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 147:
+-#line 570 "parser.y" /* yacc.c:1648 */
++#line 568 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_PROPPUT); }
+-#line 3476 "parser.tab.c" /* yacc.c:1648 */
++#line 3471 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 148:
+-#line 571 "parser.y" /* yacc.c:1648 */
++#line 569 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_PROPPUTREF); }
+-#line 3482 "parser.tab.c" /* yacc.c:1648 */
++#line 3477 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 149:
+-#line 572 "parser.y" /* yacc.c:1648 */
++#line 570 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_PROXY); }
+-#line 3488 "parser.tab.c" /* yacc.c:1648 */
++#line 3483 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 150:
+-#line 573 "parser.y" /* yacc.c:1648 */
++#line 571 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_PUBLIC); }
+-#line 3494 "parser.tab.c" /* yacc.c:1648 */
++#line 3489 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 151:
+-#line 575 "parser.y" /* yacc.c:1648 */
++#line 573 "parser.y" /* yacc.c:1646 */
+ { expr_list_t *list = append_expr( NULL, (yyvsp[-3].expr) );
+ list = append_expr( list, (yyvsp[-1].expr) );
+ (yyval.attr) = make_attrp(ATTR_RANGE, list); }
+-#line 3502 "parser.tab.c" /* yacc.c:1648 */
++#line 3497 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 152:
+-#line 578 "parser.y" /* yacc.c:1648 */
++#line 576 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_READONLY); }
+-#line 3508 "parser.tab.c" /* yacc.c:1648 */
++#line 3503 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 153:
+-#line 579 "parser.y" /* yacc.c:1648 */
++#line 577 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attrp(ATTR_REPRESENTAS, (yyvsp[-1].type)); }
+-#line 3514 "parser.tab.c" /* yacc.c:1648 */
++#line 3509 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 154:
+-#line 580 "parser.y" /* yacc.c:1648 */
++#line 578 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_REQUESTEDIT); }
+-#line 3520 "parser.tab.c" /* yacc.c:1648 */
++#line 3515 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 155:
+-#line 581 "parser.y" /* yacc.c:1648 */
++#line 579 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_RESTRICTED); }
+-#line 3526 "parser.tab.c" /* yacc.c:1648 */
++#line 3521 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 156:
+-#line 582 "parser.y" /* yacc.c:1648 */
++#line 580 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_RETVAL); }
+-#line 3532 "parser.tab.c" /* yacc.c:1648 */
++#line 3527 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 157:
+-#line 583 "parser.y" /* yacc.c:1648 */
++#line 581 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attrp(ATTR_SIZEIS, (yyvsp[-1].expr_list)); }
+-#line 3538 "parser.tab.c" /* yacc.c:1648 */
++#line 3533 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 158:
+-#line 584 "parser.y" /* yacc.c:1648 */
++#line 582 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_SOURCE); }
+-#line 3544 "parser.tab.c" /* yacc.c:1648 */
++#line 3539 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 159:
+-#line 585 "parser.y" /* yacc.c:1648 */
++#line 583 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_STRICTCONTEXTHANDLE); }
+-#line 3550 "parser.tab.c" /* yacc.c:1648 */
++#line 3545 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 160:
+-#line 586 "parser.y" /* yacc.c:1648 */
++#line 584 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_STRING); }
+-#line 3556 "parser.tab.c" /* yacc.c:1648 */
++#line 3551 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 161:
+-#line 587 "parser.y" /* yacc.c:1648 */
++#line 585 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attrp(ATTR_SWITCHIS, (yyvsp[-1].expr)); }
+-#line 3562 "parser.tab.c" /* yacc.c:1648 */
++#line 3557 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 162:
+-#line 588 "parser.y" /* yacc.c:1648 */
++#line 586 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attrp(ATTR_SWITCHTYPE, (yyvsp[-1].type)); }
+-#line 3568 "parser.tab.c" /* yacc.c:1648 */
++#line 3563 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 163:
+-#line 589 "parser.y" /* yacc.c:1648 */
++#line 587 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attrp(ATTR_TRANSMITAS, (yyvsp[-1].type)); }
+-#line 3574 "parser.tab.c" /* yacc.c:1648 */
++#line 3569 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 164:
+-#line 590 "parser.y" /* yacc.c:1648 */
++#line 588 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attrv(ATTR_THREADING, (yyvsp[-1].num)); }
+-#line 3580 "parser.tab.c" /* yacc.c:1648 */
++#line 3575 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 165:
+-#line 591 "parser.y" /* yacc.c:1648 */
++#line 589 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_UIDEFAULT); }
+-#line 3586 "parser.tab.c" /* yacc.c:1648 */
++#line 3581 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 166:
+-#line 592 "parser.y" /* yacc.c:1648 */
++#line 590 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_USESGETLASTERROR); }
+-#line 3592 "parser.tab.c" /* yacc.c:1648 */
++#line 3587 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 167:
+-#line 593 "parser.y" /* yacc.c:1648 */
++#line 591 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attrp(ATTR_USERMARSHAL, (yyvsp[-1].type)); }
+-#line 3598 "parser.tab.c" /* yacc.c:1648 */
++#line 3593 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 168:
+-#line 594 "parser.y" /* yacc.c:1648 */
++#line 592 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attrp(ATTR_UUID, (yyvsp[-1].uuid)); }
+-#line 3604 "parser.tab.c" /* yacc.c:1648 */
++#line 3599 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 169:
+-#line 595 "parser.y" /* yacc.c:1648 */
++#line 593 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attrp(ATTR_ASYNCUUID, (yyvsp[-1].uuid)); }
+-#line 3610 "parser.tab.c" /* yacc.c:1648 */
++#line 3605 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 170:
+-#line 596 "parser.y" /* yacc.c:1648 */
++#line 594 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_V1ENUM); }
+-#line 3616 "parser.tab.c" /* yacc.c:1648 */
++#line 3611 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 171:
+-#line 597 "parser.y" /* yacc.c:1648 */
++#line 595 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_VARARG); }
+-#line 3622 "parser.tab.c" /* yacc.c:1648 */
++#line 3617 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 172:
+-#line 598 "parser.y" /* yacc.c:1648 */
++#line 596 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attrv(ATTR_VERSION, (yyvsp[-1].num)); }
+-#line 3628 "parser.tab.c" /* yacc.c:1648 */
++#line 3623 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 173:
+-#line 599 "parser.y" /* yacc.c:1648 */
++#line 597 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attrp(ATTR_VIPROGID, (yyvsp[-1].str)); }
+-#line 3634 "parser.tab.c" /* yacc.c:1648 */
++#line 3629 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 174:
+-#line 600 "parser.y" /* yacc.c:1648 */
++#line 598 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attrp(ATTR_WIREMARSHAL, (yyvsp[-1].type)); }
+-#line 3640 "parser.tab.c" /* yacc.c:1648 */
++#line 3635 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 175:
+-#line 601 "parser.y" /* yacc.c:1648 */
++#line 599 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attrv(ATTR_POINTERTYPE, (yyvsp[0].num)); }
+-#line 3646 "parser.tab.c" /* yacc.c:1648 */
++#line 3641 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 177:
+-#line 606 "parser.y" /* yacc.c:1648 */
++#line 604 "parser.y" /* yacc.c:1646 */
+ { if (!is_valid_uuid((yyvsp[0].str)))
+ error_loc("invalid UUID: %s\n", (yyvsp[0].str));
+ (yyval.uuid) = parse_uuid((yyvsp[0].str)); }
+-#line 3654 "parser.tab.c" /* yacc.c:1648 */
++#line 3649 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 178:
+-#line 611 "parser.y" /* yacc.c:1648 */
++#line 609 "parser.y" /* yacc.c:1646 */
+ { (yyval.str) = xstrdup("__cdecl"); }
+-#line 3660 "parser.tab.c" /* yacc.c:1648 */
++#line 3655 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 179:
+-#line 612 "parser.y" /* yacc.c:1648 */
++#line 610 "parser.y" /* yacc.c:1646 */
+ { (yyval.str) = xstrdup("__fastcall"); }
+-#line 3666 "parser.tab.c" /* yacc.c:1648 */
++#line 3661 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 180:
+-#line 613 "parser.y" /* yacc.c:1648 */
++#line 611 "parser.y" /* yacc.c:1646 */
+ { (yyval.str) = xstrdup("__pascal"); }
+-#line 3672 "parser.tab.c" /* yacc.c:1648 */
++#line 3667 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 181:
+-#line 614 "parser.y" /* yacc.c:1648 */
++#line 612 "parser.y" /* yacc.c:1646 */
+ { (yyval.str) = xstrdup("__stdcall"); }
+-#line 3678 "parser.tab.c" /* yacc.c:1648 */
++#line 3673 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 182:
+-#line 617 "parser.y" /* yacc.c:1648 */
++#line 615 "parser.y" /* yacc.c:1646 */
+ { (yyval.var_list) = NULL; }
+-#line 3684 "parser.tab.c" /* yacc.c:1648 */
++#line 3679 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 183:
+-#line 618 "parser.y" /* yacc.c:1648 */
++#line 616 "parser.y" /* yacc.c:1646 */
+ { (yyval.var_list) = append_var( (yyvsp[-1].var_list), (yyvsp[0].var) ); }
+-#line 3690 "parser.tab.c" /* yacc.c:1648 */
++#line 3685 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 184:
+-#line 621 "parser.y" /* yacc.c:1648 */
++#line 619 "parser.y" /* yacc.c:1646 */
+ { attr_t *a = make_attrp(ATTR_CASE, append_expr( NULL, (yyvsp[-2].expr) ));
+ (yyval.var) = (yyvsp[0].var); if (!(yyval.var)) (yyval.var) = make_var(NULL);
+ (yyval.var)->attrs = append_attr( (yyval.var)->attrs, a );
+ }
+-#line 3699 "parser.tab.c" /* yacc.c:1648 */
++#line 3694 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 185:
+-#line 625 "parser.y" /* yacc.c:1648 */
++#line 623 "parser.y" /* yacc.c:1646 */
+ { attr_t *a = make_attr(ATTR_DEFAULT);
+ (yyval.var) = (yyvsp[0].var); if (!(yyval.var)) (yyval.var) = make_var(NULL);
+ (yyval.var)->attrs = append_attr( (yyval.var)->attrs, a );
+ }
+-#line 3708 "parser.tab.c" /* yacc.c:1648 */
++#line 3703 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 186:
+-#line 631 "parser.y" /* yacc.c:1648 */
++#line 629 "parser.y" /* yacc.c:1646 */
+ { (yyval.var_list) = NULL; }
+-#line 3714 "parser.tab.c" /* yacc.c:1648 */
++#line 3709 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 187:
+-#line 632 "parser.y" /* yacc.c:1648 */
++#line 630 "parser.y" /* yacc.c:1646 */
+ { (yyval.var_list) = (yyvsp[-1].var_list); }
+-#line 3720 "parser.tab.c" /* yacc.c:1648 */
++#line 3715 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 189:
+-#line 636 "parser.y" /* yacc.c:1648 */
++#line 634 "parser.y" /* yacc.c:1646 */
+ { if (!(yyvsp[0].var)->eval)
+ (yyvsp[0].var)->eval = make_exprl(EXPR_NUM, 0 /* default for first enum entry */);
+ (yyval.var_list) = append_var( NULL, (yyvsp[0].var) );
+ }
+-#line 3729 "parser.tab.c" /* yacc.c:1648 */
++#line 3724 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 190:
+-#line 640 "parser.y" /* yacc.c:1648 */
++#line 638 "parser.y" /* yacc.c:1646 */
+ { if (!(yyvsp[0].var)->eval)
+ {
+ var_t *last = LIST_ENTRY( list_tail((yyval.var_list)), var_t, entry );
+@@ -3740,656 +3735,656 @@ yyreduce:
+ }
+ (yyval.var_list) = append_var( (yyvsp[-2].var_list), (yyvsp[0].var) );
+ }
+-#line 3744 "parser.tab.c" /* yacc.c:1648 */
++#line 3739 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 191:
+-#line 652 "parser.y" /* yacc.c:1648 */
++#line 650 "parser.y" /* yacc.c:1646 */
+ { (yyval.var) = reg_const((yyvsp[-2].var));
+ (yyval.var)->eval = (yyvsp[0].expr);
+- (yyval.var)->type = type_new_int(TYPE_BASIC_INT, 0);
++ (yyval.var)->declspec.type = type_new_int(TYPE_BASIC_INT, 0);
+ }
+-#line 3753 "parser.tab.c" /* yacc.c:1648 */
++#line 3748 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 192:
+-#line 656 "parser.y" /* yacc.c:1648 */
++#line 654 "parser.y" /* yacc.c:1646 */
+ { (yyval.var) = reg_const((yyvsp[0].var));
+- (yyval.var)->type = type_new_int(TYPE_BASIC_INT, 0);
++ (yyval.var)->declspec.type = type_new_int(TYPE_BASIC_INT, 0);
+ }
+-#line 3761 "parser.tab.c" /* yacc.c:1648 */
++#line 3756 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 193:
+-#line 661 "parser.y" /* yacc.c:1648 */
++#line 659 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = type_new_enum((yyvsp[-3].str), current_namespace, TRUE, (yyvsp[-1].var_list)); }
+-#line 3767 "parser.tab.c" /* yacc.c:1648 */
++#line 3762 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 194:
+-#line 664 "parser.y" /* yacc.c:1648 */
++#line 662 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr_list) = append_expr( NULL, (yyvsp[0].expr) ); }
+-#line 3773 "parser.tab.c" /* yacc.c:1648 */
++#line 3768 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 195:
+-#line 665 "parser.y" /* yacc.c:1648 */
++#line 663 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr_list) = append_expr( (yyvsp[-2].expr_list), (yyvsp[0].expr) ); }
+-#line 3779 "parser.tab.c" /* yacc.c:1648 */
++#line 3774 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 196:
+-#line 668 "parser.y" /* yacc.c:1648 */
++#line 666 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = make_expr(EXPR_VOID); }
+-#line 3785 "parser.tab.c" /* yacc.c:1648 */
++#line 3780 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 198:
+-#line 672 "parser.y" /* yacc.c:1648 */
++#line 670 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = make_exprl(EXPR_NUM, (yyvsp[0].num)); }
+-#line 3791 "parser.tab.c" /* yacc.c:1648 */
++#line 3786 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 199:
+-#line 673 "parser.y" /* yacc.c:1648 */
++#line 671 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = make_exprl(EXPR_HEXNUM, (yyvsp[0].num)); }
+-#line 3797 "parser.tab.c" /* yacc.c:1648 */
++#line 3792 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 200:
+-#line 674 "parser.y" /* yacc.c:1648 */
++#line 672 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = make_exprd(EXPR_DOUBLE, (yyvsp[0].dbl)); }
+-#line 3803 "parser.tab.c" /* yacc.c:1648 */
++#line 3798 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 201:
+-#line 675 "parser.y" /* yacc.c:1648 */
++#line 673 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = make_exprl(EXPR_TRUEFALSE, 0); }
+-#line 3809 "parser.tab.c" /* yacc.c:1648 */
++#line 3804 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 202:
+-#line 676 "parser.y" /* yacc.c:1648 */
++#line 674 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = make_exprl(EXPR_NUM, 0); }
+-#line 3815 "parser.tab.c" /* yacc.c:1648 */
++#line 3810 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 203:
+-#line 677 "parser.y" /* yacc.c:1648 */
++#line 675 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = make_exprl(EXPR_TRUEFALSE, 1); }
+-#line 3821 "parser.tab.c" /* yacc.c:1648 */
++#line 3816 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 204:
+-#line 678 "parser.y" /* yacc.c:1648 */
++#line 676 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = make_exprs(EXPR_STRLIT, (yyvsp[0].str)); }
+-#line 3827 "parser.tab.c" /* yacc.c:1648 */
++#line 3822 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 205:
+-#line 679 "parser.y" /* yacc.c:1648 */
++#line 677 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = make_exprs(EXPR_WSTRLIT, (yyvsp[0].str)); }
+-#line 3833 "parser.tab.c" /* yacc.c:1648 */
++#line 3828 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 206:
+-#line 680 "parser.y" /* yacc.c:1648 */
++#line 678 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = make_exprs(EXPR_CHARCONST, (yyvsp[0].str)); }
+-#line 3839 "parser.tab.c" /* yacc.c:1648 */
++#line 3834 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 207:
+-#line 681 "parser.y" /* yacc.c:1648 */
++#line 679 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = make_exprs(EXPR_IDENTIFIER, (yyvsp[0].str)); }
+-#line 3845 "parser.tab.c" /* yacc.c:1648 */
++#line 3840 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 208:
+-#line 682 "parser.y" /* yacc.c:1648 */
++#line 680 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = make_expr3(EXPR_COND, (yyvsp[-4].expr), (yyvsp[-2].expr), (yyvsp[0].expr)); }
+-#line 3851 "parser.tab.c" /* yacc.c:1648 */
++#line 3846 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 209:
+-#line 683 "parser.y" /* yacc.c:1648 */
++#line 681 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = make_expr2(EXPR_LOGOR, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+-#line 3857 "parser.tab.c" /* yacc.c:1648 */
++#line 3852 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 210:
+-#line 684 "parser.y" /* yacc.c:1648 */
++#line 682 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = make_expr2(EXPR_LOGAND, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+-#line 3863 "parser.tab.c" /* yacc.c:1648 */
++#line 3858 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 211:
+-#line 685 "parser.y" /* yacc.c:1648 */
++#line 683 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = make_expr2(EXPR_OR , (yyvsp[-2].expr), (yyvsp[0].expr)); }
+-#line 3869 "parser.tab.c" /* yacc.c:1648 */
++#line 3864 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 212:
+-#line 686 "parser.y" /* yacc.c:1648 */
++#line 684 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = make_expr2(EXPR_XOR, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+-#line 3875 "parser.tab.c" /* yacc.c:1648 */
++#line 3870 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 213:
+-#line 687 "parser.y" /* yacc.c:1648 */
++#line 685 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = make_expr2(EXPR_AND, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+-#line 3881 "parser.tab.c" /* yacc.c:1648 */
++#line 3876 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 214:
+-#line 688 "parser.y" /* yacc.c:1648 */
++#line 686 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = make_expr2(EXPR_EQUALITY, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+-#line 3887 "parser.tab.c" /* yacc.c:1648 */
++#line 3882 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 215:
+-#line 689 "parser.y" /* yacc.c:1648 */
++#line 687 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = make_expr2(EXPR_INEQUALITY, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+-#line 3893 "parser.tab.c" /* yacc.c:1648 */
++#line 3888 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 216:
+-#line 690 "parser.y" /* yacc.c:1648 */
++#line 688 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = make_expr2(EXPR_GTR, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+-#line 3899 "parser.tab.c" /* yacc.c:1648 */
++#line 3894 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 217:
+-#line 691 "parser.y" /* yacc.c:1648 */
++#line 689 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = make_expr2(EXPR_LESS, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+-#line 3905 "parser.tab.c" /* yacc.c:1648 */
++#line 3900 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 218:
+-#line 692 "parser.y" /* yacc.c:1648 */
++#line 690 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = make_expr2(EXPR_GTREQL, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+-#line 3911 "parser.tab.c" /* yacc.c:1648 */
++#line 3906 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 219:
+-#line 693 "parser.y" /* yacc.c:1648 */
++#line 691 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = make_expr2(EXPR_LESSEQL, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+-#line 3917 "parser.tab.c" /* yacc.c:1648 */
++#line 3912 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 220:
+-#line 694 "parser.y" /* yacc.c:1648 */
++#line 692 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = make_expr2(EXPR_SHL, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+-#line 3923 "parser.tab.c" /* yacc.c:1648 */
++#line 3918 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 221:
+-#line 695 "parser.y" /* yacc.c:1648 */
++#line 693 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = make_expr2(EXPR_SHR, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+-#line 3929 "parser.tab.c" /* yacc.c:1648 */
++#line 3924 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 222:
+-#line 696 "parser.y" /* yacc.c:1648 */
++#line 694 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = make_expr2(EXPR_ADD, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+-#line 3935 "parser.tab.c" /* yacc.c:1648 */
++#line 3930 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 223:
+-#line 697 "parser.y" /* yacc.c:1648 */
++#line 695 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = make_expr2(EXPR_SUB, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+-#line 3941 "parser.tab.c" /* yacc.c:1648 */
++#line 3936 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 224:
+-#line 698 "parser.y" /* yacc.c:1648 */
++#line 696 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = make_expr2(EXPR_MOD, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+-#line 3947 "parser.tab.c" /* yacc.c:1648 */
++#line 3942 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 225:
+-#line 699 "parser.y" /* yacc.c:1648 */
++#line 697 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = make_expr2(EXPR_MUL, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+-#line 3953 "parser.tab.c" /* yacc.c:1648 */
++#line 3948 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 226:
+-#line 700 "parser.y" /* yacc.c:1648 */
++#line 698 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = make_expr2(EXPR_DIV, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+-#line 3959 "parser.tab.c" /* yacc.c:1648 */
++#line 3954 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 227:
+-#line 701 "parser.y" /* yacc.c:1648 */
++#line 699 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = make_expr1(EXPR_LOGNOT, (yyvsp[0].expr)); }
+-#line 3965 "parser.tab.c" /* yacc.c:1648 */
++#line 3960 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 228:
+-#line 702 "parser.y" /* yacc.c:1648 */
++#line 700 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = make_expr1(EXPR_NOT, (yyvsp[0].expr)); }
+-#line 3971 "parser.tab.c" /* yacc.c:1648 */
++#line 3966 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 229:
+-#line 703 "parser.y" /* yacc.c:1648 */
++#line 701 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = make_expr1(EXPR_POS, (yyvsp[0].expr)); }
+-#line 3977 "parser.tab.c" /* yacc.c:1648 */
++#line 3972 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 230:
+-#line 704 "parser.y" /* yacc.c:1648 */
++#line 702 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = make_expr1(EXPR_NEG, (yyvsp[0].expr)); }
+-#line 3983 "parser.tab.c" /* yacc.c:1648 */
++#line 3978 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 231:
+-#line 705 "parser.y" /* yacc.c:1648 */
++#line 703 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = make_expr1(EXPR_ADDRESSOF, (yyvsp[0].expr)); }
+-#line 3989 "parser.tab.c" /* yacc.c:1648 */
++#line 3984 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 232:
+-#line 706 "parser.y" /* yacc.c:1648 */
++#line 704 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = make_expr1(EXPR_PPTR, (yyvsp[0].expr)); }
+-#line 3995 "parser.tab.c" /* yacc.c:1648 */
++#line 3990 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 233:
+-#line 707 "parser.y" /* yacc.c:1648 */
++#line 705 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = make_expr2(EXPR_MEMBER, make_expr1(EXPR_PPTR, (yyvsp[-2].expr)), make_exprs(EXPR_IDENTIFIER, (yyvsp[0].str))); }
+-#line 4001 "parser.tab.c" /* yacc.c:1648 */
++#line 3996 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 234:
+-#line 708 "parser.y" /* yacc.c:1648 */
++#line 706 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = make_expr2(EXPR_MEMBER, (yyvsp[-2].expr), make_exprs(EXPR_IDENTIFIER, (yyvsp[0].str))); }
+-#line 4007 "parser.tab.c" /* yacc.c:1648 */
++#line 4002 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 235:
+-#line 710 "parser.y" /* yacc.c:1648 */
++#line 708 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = make_exprt(EXPR_CAST, declare_var(NULL, (yyvsp[-3].declspec), (yyvsp[-2].declarator), 0), (yyvsp[0].expr)); free((yyvsp[-3].declspec)); free((yyvsp[-2].declarator)); }
+-#line 4013 "parser.tab.c" /* yacc.c:1648 */
++#line 4008 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 236:
+-#line 712 "parser.y" /* yacc.c:1648 */
++#line 710 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = make_exprt(EXPR_SIZEOF, declare_var(NULL, (yyvsp[-2].declspec), (yyvsp[-1].declarator), 0), NULL); free((yyvsp[-2].declspec)); free((yyvsp[-1].declarator)); }
+-#line 4019 "parser.tab.c" /* yacc.c:1648 */
++#line 4014 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 237:
+-#line 713 "parser.y" /* yacc.c:1648 */
++#line 711 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = make_expr2(EXPR_ARRAY, (yyvsp[-3].expr), (yyvsp[-1].expr)); }
+-#line 4025 "parser.tab.c" /* yacc.c:1648 */
++#line 4020 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 238:
+-#line 714 "parser.y" /* yacc.c:1648 */
++#line 712 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = (yyvsp[-1].expr); }
+-#line 4031 "parser.tab.c" /* yacc.c:1648 */
++#line 4026 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 239:
+-#line 717 "parser.y" /* yacc.c:1648 */
++#line 715 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr_list) = append_expr( NULL, (yyvsp[0].expr) ); }
+-#line 4037 "parser.tab.c" /* yacc.c:1648 */
++#line 4032 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 240:
+-#line 718 "parser.y" /* yacc.c:1648 */
++#line 716 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr_list) = append_expr( (yyvsp[-2].expr_list), (yyvsp[0].expr) ); }
+-#line 4043 "parser.tab.c" /* yacc.c:1648 */
++#line 4038 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 241:
+-#line 721 "parser.y" /* yacc.c:1648 */
++#line 719 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = (yyvsp[0].expr);
+ if (!(yyval.expr)->is_const)
+ error_loc("expression is not an integer constant\n");
+ }
+-#line 4052 "parser.tab.c" /* yacc.c:1648 */
++#line 4047 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 242:
+-#line 727 "parser.y" /* yacc.c:1648 */
++#line 725 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = (yyvsp[0].expr);
+ if (!(yyval.expr)->is_const && (yyval.expr)->type != EXPR_STRLIT && (yyval.expr)->type != EXPR_WSTRLIT)
+ error_loc("expression is not constant\n");
+ }
+-#line 4061 "parser.tab.c" /* yacc.c:1648 */
++#line 4056 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 243:
+-#line 733 "parser.y" /* yacc.c:1648 */
++#line 731 "parser.y" /* yacc.c:1646 */
+ { (yyval.var_list) = NULL; }
+-#line 4067 "parser.tab.c" /* yacc.c:1648 */
++#line 4062 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 244:
+-#line 734 "parser.y" /* yacc.c:1648 */
++#line 732 "parser.y" /* yacc.c:1646 */
+ { (yyval.var_list) = append_var_list((yyvsp[-1].var_list), (yyvsp[0].var_list)); }
+-#line 4073 "parser.tab.c" /* yacc.c:1648 */
++#line 4068 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 245:
+-#line 738 "parser.y" /* yacc.c:1648 */
++#line 736 "parser.y" /* yacc.c:1646 */
+ { const char *first = LIST_ENTRY(list_head((yyvsp[-1].declarator_list)), declarator_t, entry)->var->name;
+ check_field_attrs(first, (yyvsp[-3].attr_list));
+ (yyval.var_list) = set_var_types((yyvsp[-3].attr_list), (yyvsp[-2].declspec), (yyvsp[-1].declarator_list));
+ }
+-#line 4082 "parser.tab.c" /* yacc.c:1648 */
++#line 4077 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 246:
+-#line 742 "parser.y" /* yacc.c:1648 */
++#line 740 "parser.y" /* yacc.c:1646 */
+ { var_t *v = make_var(NULL);
+- v->type = (yyvsp[-1].type); v->attrs = (yyvsp[-2].attr_list);
++ v->declspec.type = (yyvsp[-1].type); v->attrs = (yyvsp[-2].attr_list);
+ (yyval.var_list) = append_var(NULL, v);
+ }
+-#line 4091 "parser.tab.c" /* yacc.c:1648 */
++#line 4086 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 247:
+-#line 749 "parser.y" /* yacc.c:1648 */
++#line 747 "parser.y" /* yacc.c:1646 */
+ { (yyval.var) = (yyvsp[-1].var); }
+-#line 4097 "parser.tab.c" /* yacc.c:1648 */
++#line 4092 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 248:
+-#line 750 "parser.y" /* yacc.c:1648 */
++#line 748 "parser.y" /* yacc.c:1646 */
+ { (yyval.var) = make_var(NULL); (yyval.var)->attrs = (yyvsp[-1].attr_list); }
+-#line 4103 "parser.tab.c" /* yacc.c:1648 */
++#line 4098 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 249:
+-#line 753 "parser.y" /* yacc.c:1648 */
++#line 751 "parser.y" /* yacc.c:1646 */
+ { (yyval.var_list) = NULL; }
+-#line 4109 "parser.tab.c" /* yacc.c:1648 */
++#line 4104 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 250:
+-#line 754 "parser.y" /* yacc.c:1648 */
++#line 752 "parser.y" /* yacc.c:1646 */
+ { (yyval.var_list) = append_var( (yyvsp[-1].var_list), (yyvsp[0].var) ); }
+-#line 4115 "parser.tab.c" /* yacc.c:1648 */
++#line 4110 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 251:
+-#line 758 "parser.y" /* yacc.c:1648 */
++#line 756 "parser.y" /* yacc.c:1646 */
+ { (yyval.var) = (yyvsp[-1].var); }
+-#line 4121 "parser.tab.c" /* yacc.c:1648 */
++#line 4116 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 252:
+-#line 759 "parser.y" /* yacc.c:1648 */
++#line 757 "parser.y" /* yacc.c:1646 */
+ { (yyval.var) = NULL; }
+-#line 4127 "parser.tab.c" /* yacc.c:1648 */
++#line 4122 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 253:
+-#line 762 "parser.y" /* yacc.c:1648 */
++#line 760 "parser.y" /* yacc.c:1646 */
+ { (yyval.var) = declare_var(check_field_attrs((yyvsp[0].declarator)->var->name, (yyvsp[-2].attr_list)),
+ (yyvsp[-1].declspec), (yyvsp[0].declarator), FALSE);
+ free((yyvsp[0].declarator));
+ }
+-#line 4136 "parser.tab.c" /* yacc.c:1648 */
++#line 4131 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 254:
+-#line 766 "parser.y" /* yacc.c:1648 */
++#line 764 "parser.y" /* yacc.c:1646 */
+ { var_t *v = make_var(NULL);
+- v->type = (yyvsp[0].type); v->attrs = (yyvsp[-1].attr_list);
++ v->declspec.type = (yyvsp[0].type); v->attrs = (yyvsp[-1].attr_list);
+ (yyval.var) = v;
+ }
+-#line 4145 "parser.tab.c" /* yacc.c:1648 */
++#line 4140 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 255:
+-#line 772 "parser.y" /* yacc.c:1648 */
++#line 770 "parser.y" /* yacc.c:1646 */
+ { (yyval.var) = (yyvsp[0].var);
+- if (type_get_type((yyval.var)->type) != TYPE_FUNCTION)
++ if (type_get_type((yyval.var)->declspec.type) != TYPE_FUNCTION)
+ error_loc("only methods may be declared inside the methods section of a dispinterface\n");
+ check_function_attrs((yyval.var)->name, (yyval.var)->attrs);
+ }
+-#line 4155 "parser.tab.c" /* yacc.c:1648 */
++#line 4150 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 256:
+-#line 781 "parser.y" /* yacc.c:1648 */
++#line 779 "parser.y" /* yacc.c:1646 */
+ { (yyval.var) = declare_var((yyvsp[-2].attr_list), (yyvsp[-1].declspec), (yyvsp[0].declarator), FALSE);
+ free((yyvsp[0].declarator));
+ }
+-#line 4163 "parser.tab.c" /* yacc.c:1648 */
++#line 4158 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 257:
+-#line 784 "parser.y" /* yacc.c:1648 */
++#line 782 "parser.y" /* yacc.c:1646 */
+ { (yyval.var) = declare_var(NULL, (yyvsp[-1].declspec), (yyvsp[0].declarator), FALSE);
+ free((yyvsp[0].declarator));
+ }
+-#line 4171 "parser.tab.c" /* yacc.c:1648 */
++#line 4166 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 258:
+-#line 789 "parser.y" /* yacc.c:1648 */
++#line 787 "parser.y" /* yacc.c:1646 */
+ { (yyval.var) = NULL; }
+-#line 4177 "parser.tab.c" /* yacc.c:1648 */
++#line 4172 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 260:
+-#line 793 "parser.y" /* yacc.c:1648 */
++#line 791 "parser.y" /* yacc.c:1646 */
+ { (yyval.str) = NULL; }
+-#line 4183 "parser.tab.c" /* yacc.c:1648 */
++#line 4178 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 261:
+-#line 794 "parser.y" /* yacc.c:1648 */
++#line 792 "parser.y" /* yacc.c:1646 */
+ { (yyval.str) = (yyvsp[0].str); }
+-#line 4189 "parser.tab.c" /* yacc.c:1648 */
++#line 4184 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 262:
+-#line 795 "parser.y" /* yacc.c:1648 */
++#line 793 "parser.y" /* yacc.c:1646 */
+ { (yyval.str) = (yyvsp[0].str); }
+-#line 4195 "parser.tab.c" /* yacc.c:1648 */
++#line 4190 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 263:
+-#line 798 "parser.y" /* yacc.c:1648 */
++#line 796 "parser.y" /* yacc.c:1646 */
+ { (yyval.var) = make_var((yyvsp[0].str)); }
+-#line 4201 "parser.tab.c" /* yacc.c:1648 */
++#line 4196 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 264:
+-#line 800 "parser.y" /* yacc.c:1648 */
++#line 798 "parser.y" /* yacc.c:1646 */
+ { (yyval.var) = make_var((yyvsp[0].str)); }
+-#line 4207 "parser.tab.c" /* yacc.c:1648 */
++#line 4202 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 265:
+-#line 803 "parser.y" /* yacc.c:1648 */
++#line 801 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = find_type_or_error((yyvsp[0].str), 0); }
+-#line 4213 "parser.tab.c" /* yacc.c:1648 */
++#line 4208 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 266:
+-#line 804 "parser.y" /* yacc.c:1648 */
++#line 802 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = find_type_or_error((yyvsp[0].str), 0); }
+-#line 4219 "parser.tab.c" /* yacc.c:1648 */
++#line 4214 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 268:
+-#line 806 "parser.y" /* yacc.c:1648 */
++#line 804 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = type_new_int(type_basic_get_type((yyvsp[0].type)), -1); }
+-#line 4225 "parser.tab.c" /* yacc.c:1648 */
++#line 4220 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 269:
+-#line 807 "parser.y" /* yacc.c:1648 */
++#line 805 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = type_new_int(type_basic_get_type((yyvsp[0].type)), 1); }
+-#line 4231 "parser.tab.c" /* yacc.c:1648 */
++#line 4226 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 270:
+-#line 808 "parser.y" /* yacc.c:1648 */
++#line 806 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = type_new_int(TYPE_BASIC_INT, 1); }
+-#line 4237 "parser.tab.c" /* yacc.c:1648 */
++#line 4232 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 271:
+-#line 809 "parser.y" /* yacc.c:1648 */
++#line 807 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = find_type_or_error((yyvsp[0].str), 0); }
+-#line 4243 "parser.tab.c" /* yacc.c:1648 */
++#line 4238 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 272:
+-#line 810 "parser.y" /* yacc.c:1648 */
++#line 808 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = find_type_or_error((yyvsp[0].str), 0); }
+-#line 4249 "parser.tab.c" /* yacc.c:1648 */
++#line 4244 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 273:
+-#line 811 "parser.y" /* yacc.c:1648 */
++#line 809 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = find_type_or_error((yyvsp[0].str), 0); }
+-#line 4255 "parser.tab.c" /* yacc.c:1648 */
++#line 4250 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 274:
+-#line 812 "parser.y" /* yacc.c:1648 */
++#line 810 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = find_type_or_error((yyvsp[0].str), 0); }
+-#line 4261 "parser.tab.c" /* yacc.c:1648 */
++#line 4256 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 275:
+-#line 813 "parser.y" /* yacc.c:1648 */
++#line 811 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = find_type_or_error((yyvsp[0].str), 0); }
+-#line 4267 "parser.tab.c" /* yacc.c:1648 */
++#line 4262 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 278:
+-#line 820 "parser.y" /* yacc.c:1648 */
++#line 818 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = type_new_int(TYPE_BASIC_INT, 0); }
+-#line 4273 "parser.tab.c" /* yacc.c:1648 */
++#line 4268 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 279:
+-#line 821 "parser.y" /* yacc.c:1648 */
++#line 819 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = type_new_int(TYPE_BASIC_INT16, 0); }
+-#line 4279 "parser.tab.c" /* yacc.c:1648 */
++#line 4274 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 280:
+-#line 822 "parser.y" /* yacc.c:1648 */
++#line 820 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = type_new_int(TYPE_BASIC_INT8, 0); }
+-#line 4285 "parser.tab.c" /* yacc.c:1648 */
++#line 4280 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 281:
+-#line 823 "parser.y" /* yacc.c:1648 */
++#line 821 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = type_new_int(TYPE_BASIC_LONG, 0); }
+-#line 4291 "parser.tab.c" /* yacc.c:1648 */
++#line 4286 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 282:
+-#line 824 "parser.y" /* yacc.c:1648 */
++#line 822 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = type_new_int(TYPE_BASIC_HYPER, 0); }
+-#line 4297 "parser.tab.c" /* yacc.c:1648 */
++#line 4292 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 283:
+-#line 825 "parser.y" /* yacc.c:1648 */
++#line 823 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = type_new_int(TYPE_BASIC_INT64, 0); }
+-#line 4303 "parser.tab.c" /* yacc.c:1648 */
++#line 4298 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 284:
+-#line 826 "parser.y" /* yacc.c:1648 */
++#line 824 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = type_new_int(TYPE_BASIC_CHAR, 0); }
+-#line 4309 "parser.tab.c" /* yacc.c:1648 */
++#line 4304 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 285:
+-#line 827 "parser.y" /* yacc.c:1648 */
++#line 825 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = type_new_int(TYPE_BASIC_INT32, 0); }
+-#line 4315 "parser.tab.c" /* yacc.c:1648 */
++#line 4310 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 286:
+-#line 828 "parser.y" /* yacc.c:1648 */
++#line 826 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = type_new_int(TYPE_BASIC_INT3264, 0); }
+-#line 4321 "parser.tab.c" /* yacc.c:1648 */
++#line 4316 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 287:
+-#line 831 "parser.y" /* yacc.c:1648 */
++#line 829 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = type_new_coclass((yyvsp[0].str)); }
+-#line 4327 "parser.tab.c" /* yacc.c:1648 */
++#line 4322 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 288:
+-#line 832 "parser.y" /* yacc.c:1648 */
++#line 830 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = find_type((yyvsp[0].str), NULL, 0);
+ if (type_get_type_detect_alias((yyval.type)) != TYPE_COCLASS)
+ error_loc("%s was not declared a coclass at %s:%d\n",
+ (yyvsp[0].str), (yyval.type)->loc_info.input_name,
+ (yyval.type)->loc_info.line_number);
+ }
+-#line 4338 "parser.tab.c" /* yacc.c:1648 */
++#line 4333 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 289:
+-#line 840 "parser.y" /* yacc.c:1648 */
++#line 838 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = (yyvsp[0].type);
+ check_def((yyval.type));
+ (yyval.type)->attrs = check_coclass_attrs((yyvsp[0].type)->name, (yyvsp[-1].attr_list));
+ }
+-#line 4347 "parser.tab.c" /* yacc.c:1648 */
++#line 4342 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 290:
+-#line 847 "parser.y" /* yacc.c:1648 */
++#line 845 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = type_coclass_define((yyvsp[-4].type), (yyvsp[-2].ifref_list)); }
+-#line 4353 "parser.tab.c" /* yacc.c:1648 */
++#line 4348 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 291:
+-#line 850 "parser.y" /* yacc.c:1648 */
++#line 848 "parser.y" /* yacc.c:1646 */
+ { (yyval.str) = (yyvsp[0].str); }
+-#line 4359 "parser.tab.c" /* yacc.c:1648 */
++#line 4354 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 292:
+-#line 853 "parser.y" /* yacc.c:1648 */
++#line 851 "parser.y" /* yacc.c:1646 */
+ { (yyval.ifref_list) = NULL; }
+-#line 4365 "parser.tab.c" /* yacc.c:1648 */
++#line 4360 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 293:
+-#line 854 "parser.y" /* yacc.c:1648 */
++#line 852 "parser.y" /* yacc.c:1646 */
+ { (yyval.ifref_list) = append_ifref( (yyvsp[-1].ifref_list), (yyvsp[0].ifref) ); }
+-#line 4371 "parser.tab.c" /* yacc.c:1648 */
++#line 4366 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 294:
+-#line 858 "parser.y" /* yacc.c:1648 */
++#line 856 "parser.y" /* yacc.c:1646 */
+ { (yyval.ifref) = make_ifref((yyvsp[0].type)); (yyval.ifref)->attrs = (yyvsp[-1].attr_list); }
+-#line 4377 "parser.tab.c" /* yacc.c:1648 */
++#line 4372 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 295:
+-#line 861 "parser.y" /* yacc.c:1648 */
++#line 859 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = get_type(TYPE_INTERFACE, (yyvsp[0].str), current_namespace, 0); }
+-#line 4383 "parser.tab.c" /* yacc.c:1648 */
++#line 4378 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 296:
+-#line 862 "parser.y" /* yacc.c:1648 */
++#line 860 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = get_type(TYPE_INTERFACE, (yyvsp[0].str), current_namespace, 0); }
+-#line 4389 "parser.tab.c" /* yacc.c:1648 */
++#line 4384 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 297:
+-#line 865 "parser.y" /* yacc.c:1648 */
++#line 863 "parser.y" /* yacc.c:1646 */
+ { attr_t *attrs;
+ (yyval.type) = (yyvsp[0].type);
+ check_def((yyval.type));
+@@ -4397,75 +4392,75 @@ yyreduce:
+ (yyval.type)->attrs = append_attr( check_dispiface_attrs((yyvsp[0].type)->name, (yyvsp[-1].attr_list)), attrs );
+ (yyval.type)->defined = TRUE;
+ }
+-#line 4401 "parser.tab.c" /* yacc.c:1648 */
++#line 4396 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 298:
+-#line 874 "parser.y" /* yacc.c:1648 */
++#line 872 "parser.y" /* yacc.c:1646 */
+ { (yyval.var_list) = NULL; }
+-#line 4407 "parser.tab.c" /* yacc.c:1648 */
++#line 4402 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 299:
+-#line 875 "parser.y" /* yacc.c:1648 */
++#line 873 "parser.y" /* yacc.c:1646 */
+ { (yyval.var_list) = append_var( (yyvsp[-2].var_list), (yyvsp[-1].var) ); }
+-#line 4413 "parser.tab.c" /* yacc.c:1648 */
++#line 4408 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 300:
+-#line 878 "parser.y" /* yacc.c:1648 */
++#line 876 "parser.y" /* yacc.c:1646 */
+ { (yyval.var_list) = NULL; }
+-#line 4419 "parser.tab.c" /* yacc.c:1648 */
++#line 4414 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 301:
+-#line 879 "parser.y" /* yacc.c:1648 */
++#line 877 "parser.y" /* yacc.c:1646 */
+ { (yyval.var_list) = append_var( (yyvsp[-2].var_list), (yyvsp[-1].var) ); }
+-#line 4425 "parser.tab.c" /* yacc.c:1648 */
++#line 4420 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 302:
+-#line 885 "parser.y" /* yacc.c:1648 */
++#line 883 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = (yyvsp[-4].type);
+ type_dispinterface_define((yyval.type), (yyvsp[-2].var_list), (yyvsp[-1].var_list));
+ }
+-#line 4433 "parser.tab.c" /* yacc.c:1648 */
++#line 4428 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 303:
+-#line 889 "parser.y" /* yacc.c:1648 */
++#line 887 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = (yyvsp[-4].type);
+ type_dispinterface_define_from_iface((yyval.type), (yyvsp[-2].type));
+ }
+-#line 4441 "parser.tab.c" /* yacc.c:1648 */
++#line 4436 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 304:
+-#line 894 "parser.y" /* yacc.c:1648 */
++#line 892 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = NULL; }
+-#line 4447 "parser.tab.c" /* yacc.c:1648 */
++#line 4442 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 305:
+-#line 895 "parser.y" /* yacc.c:1648 */
++#line 893 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = find_type_or_error2((yyvsp[0].str), 0); }
+-#line 4453 "parser.tab.c" /* yacc.c:1648 */
++#line 4448 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 306:
+-#line 898 "parser.y" /* yacc.c:1648 */
++#line 896 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = get_type(TYPE_INTERFACE, (yyvsp[0].str), current_namespace, 0); }
+-#line 4459 "parser.tab.c" /* yacc.c:1648 */
++#line 4454 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 307:
+-#line 899 "parser.y" /* yacc.c:1648 */
++#line 897 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = get_type(TYPE_INTERFACE, (yyvsp[0].str), current_namespace, 0); }
+-#line 4465 "parser.tab.c" /* yacc.c:1648 */
++#line 4460 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 308:
+-#line 902 "parser.y" /* yacc.c:1648 */
++#line 900 "parser.y" /* yacc.c:1646 */
+ { (yyval.ifinfo).interface = (yyvsp[0].type);
+ (yyval.ifinfo).old_pointer_default = pointer_default;
+ if (is_attr((yyvsp[-1].attr_list), ATTR_POINTERDEFAULT))
+@@ -4474,11 +4469,11 @@ yyreduce:
+ (yyvsp[0].type)->attrs = check_iface_attrs((yyvsp[0].type)->name, (yyvsp[-1].attr_list));
+ (yyvsp[0].type)->defined = TRUE;
+ }
+-#line 4478 "parser.tab.c" /* yacc.c:1648 */
++#line 4473 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 309:
+-#line 913 "parser.y" /* yacc.c:1648 */
++#line 911 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = (yyvsp[-5].ifinfo).interface;
+ if((yyval.type) == (yyvsp[-4].type))
+ error_loc("Interface can't inherit from itself\n");
+@@ -4486,594 +4481,594 @@ yyreduce:
+ check_async_uuid((yyval.type));
+ pointer_default = (yyvsp[-5].ifinfo).old_pointer_default;
+ }
+-#line 4490 "parser.tab.c" /* yacc.c:1648 */
++#line 4485 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 310:
+-#line 924 "parser.y" /* yacc.c:1648 */
++#line 922 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = (yyvsp[-7].ifinfo).interface;
+ type_interface_define((yyval.type), find_type_or_error2((yyvsp[-5].str), 0), (yyvsp[-2].stmt_list));
+ pointer_default = (yyvsp[-7].ifinfo).old_pointer_default;
+ }
+-#line 4499 "parser.tab.c" /* yacc.c:1648 */
++#line 4494 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 311:
+-#line 928 "parser.y" /* yacc.c:1648 */
++#line 926 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = (yyvsp[-1].type); }
+-#line 4505 "parser.tab.c" /* yacc.c:1648 */
++#line 4500 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 312:
+-#line 932 "parser.y" /* yacc.c:1648 */
++#line 930 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = (yyvsp[-1].type); }
+-#line 4511 "parser.tab.c" /* yacc.c:1648 */
++#line 4506 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 313:
+-#line 933 "parser.y" /* yacc.c:1648 */
++#line 931 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = (yyvsp[-1].type); }
+-#line 4517 "parser.tab.c" /* yacc.c:1648 */
++#line 4512 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 314:
+-#line 936 "parser.y" /* yacc.c:1648 */
++#line 934 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = type_new_module((yyvsp[0].str)); }
+-#line 4523 "parser.tab.c" /* yacc.c:1648 */
++#line 4518 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 315:
+-#line 937 "parser.y" /* yacc.c:1648 */
++#line 935 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = type_new_module((yyvsp[0].str)); }
+-#line 4529 "parser.tab.c" /* yacc.c:1648 */
++#line 4524 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 316:
+-#line 940 "parser.y" /* yacc.c:1648 */
++#line 938 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = (yyvsp[0].type);
+ (yyval.type)->attrs = check_module_attrs((yyvsp[0].type)->name, (yyvsp[-1].attr_list));
+ }
+-#line 4537 "parser.tab.c" /* yacc.c:1648 */
++#line 4532 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 317:
+-#line 946 "parser.y" /* yacc.c:1648 */
++#line 944 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = (yyvsp[-4].type);
+ type_module_define((yyval.type), (yyvsp[-2].stmt_list));
+ }
+-#line 4545 "parser.tab.c" /* yacc.c:1648 */
++#line 4540 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 318:
+-#line 952 "parser.y" /* yacc.c:1648 */
++#line 950 "parser.y" /* yacc.c:1646 */
+ { (yyval.stgclass) = STG_EXTERN; }
+-#line 4551 "parser.tab.c" /* yacc.c:1648 */
++#line 4546 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 319:
+-#line 953 "parser.y" /* yacc.c:1648 */
++#line 951 "parser.y" /* yacc.c:1646 */
+ { (yyval.stgclass) = STG_STATIC; }
+-#line 4557 "parser.tab.c" /* yacc.c:1648 */
++#line 4552 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 320:
+-#line 954 "parser.y" /* yacc.c:1648 */
++#line 952 "parser.y" /* yacc.c:1646 */
+ { (yyval.stgclass) = STG_REGISTER; }
+-#line 4563 "parser.tab.c" /* yacc.c:1648 */
++#line 4558 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 321:
+-#line 958 "parser.y" /* yacc.c:1648 */
+- { (yyval.attr) = make_attr(ATTR_INLINE); }
+-#line 4569 "parser.tab.c" /* yacc.c:1648 */
++#line 956 "parser.y" /* yacc.c:1646 */
++ { (yyval.funcspecifier) = FUNCTION_SPECIFIER_INLINE; }
++#line 4564 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 322:
+-#line 962 "parser.y" /* yacc.c:1648 */
+- { (yyval.attr) = make_attr(ATTR_CONST); }
+-#line 4575 "parser.tab.c" /* yacc.c:1648 */
++#line 960 "parser.y" /* yacc.c:1646 */
++ { (yyval.typequalifier) = TYPE_QUALIFIER_CONST; }
++#line 4570 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 323:
+-#line 965 "parser.y" /* yacc.c:1648 */
+- { (yyval.attr_list) = NULL; }
+-#line 4581 "parser.tab.c" /* yacc.c:1648 */
++#line 963 "parser.y" /* yacc.c:1646 */
++ { (yyval.typequalifier) = TYPE_QUALIFIER_NONE; }
++#line 4576 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 324:
+-#line 966 "parser.y" /* yacc.c:1648 */
+- { (yyval.attr_list) = append_attr((yyvsp[-1].attr_list), (yyvsp[0].attr)); }
+-#line 4587 "parser.tab.c" /* yacc.c:1648 */
++#line 964 "parser.y" /* yacc.c:1646 */
++ { (yyval.typequalifier) = (yyvsp[-1].typequalifier) | (yyvsp[0].typequalifier); }
++#line 4582 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 325:
+-#line 969 "parser.y" /* yacc.c:1648 */
+- { (yyval.declspec) = make_decl_spec((yyvsp[-1].type), (yyvsp[0].declspec), NULL, NULL, STG_NONE); }
+-#line 4593 "parser.tab.c" /* yacc.c:1648 */
++#line 967 "parser.y" /* yacc.c:1646 */
++ { (yyval.declspec) = make_decl_spec((yyvsp[-1].type), (yyvsp[0].declspec), NULL, STG_NONE, TYPE_QUALIFIER_NONE, FUNCTION_SPECIFIER_NONE); }
++#line 4588 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 326:
+-#line 971 "parser.y" /* yacc.c:1648 */
+- { (yyval.declspec) = make_decl_spec((yyvsp[-1].type), (yyvsp[-2].declspec), (yyvsp[0].declspec), NULL, STG_NONE); }
+-#line 4599 "parser.tab.c" /* yacc.c:1648 */
++#line 969 "parser.y" /* yacc.c:1646 */
++ { (yyval.declspec) = make_decl_spec((yyvsp[-1].type), (yyvsp[-2].declspec), (yyvsp[0].declspec), STG_NONE, TYPE_QUALIFIER_NONE, FUNCTION_SPECIFIER_NONE); }
++#line 4594 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 327:
+-#line 974 "parser.y" /* yacc.c:1648 */
++#line 972 "parser.y" /* yacc.c:1646 */
+ { (yyval.declspec) = NULL; }
+-#line 4605 "parser.tab.c" /* yacc.c:1648 */
++#line 4600 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 329:
+-#line 979 "parser.y" /* yacc.c:1648 */
+- { (yyval.declspec) = make_decl_spec(NULL, (yyvsp[0].declspec), NULL, (yyvsp[-1].attr), STG_NONE); }
+-#line 4611 "parser.tab.c" /* yacc.c:1648 */
++#line 977 "parser.y" /* yacc.c:1646 */
++ { (yyval.declspec) = make_decl_spec(NULL, (yyvsp[0].declspec), NULL, STG_NONE, (yyvsp[-1].typequalifier), FUNCTION_SPECIFIER_NONE); }
++#line 4606 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 330:
+-#line 980 "parser.y" /* yacc.c:1648 */
+- { (yyval.declspec) = make_decl_spec(NULL, (yyvsp[0].declspec), NULL, (yyvsp[-1].attr), STG_NONE); }
+-#line 4617 "parser.tab.c" /* yacc.c:1648 */
++#line 978 "parser.y" /* yacc.c:1646 */
++ { (yyval.declspec) = make_decl_spec(NULL, (yyvsp[0].declspec), NULL, STG_NONE, TYPE_QUALIFIER_NONE, (yyvsp[-1].funcspecifier)); }
++#line 4612 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 331:
+-#line 981 "parser.y" /* yacc.c:1648 */
+- { (yyval.declspec) = make_decl_spec(NULL, (yyvsp[0].declspec), NULL, NULL, (yyvsp[-1].stgclass)); }
+-#line 4623 "parser.tab.c" /* yacc.c:1648 */
++#line 979 "parser.y" /* yacc.c:1646 */
++ { (yyval.declspec) = make_decl_spec(NULL, (yyvsp[0].declspec), NULL, (yyvsp[-1].stgclass), TYPE_QUALIFIER_NONE, FUNCTION_SPECIFIER_NONE); }
++#line 4618 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 332:
+-#line 986 "parser.y" /* yacc.c:1648 */
+- { (yyval.declarator) = (yyvsp[0].declarator); (yyval.declarator)->type = append_chain_type((yyval.declarator)->type, type_new_pointer(pointer_default, NULL, (yyvsp[-1].attr_list))); }
+-#line 4629 "parser.tab.c" /* yacc.c:1648 */
++#line 984 "parser.y" /* yacc.c:1646 */
++ { (yyval.declarator) = (yyvsp[0].declarator); append_chain_declspec(&(yyval.declarator)->declspec, type_new_pointer(pointer_default, NULL), (yyvsp[-1].typequalifier)); }
++#line 4624 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 333:
+-#line 987 "parser.y" /* yacc.c:1648 */
++#line 985 "parser.y" /* yacc.c:1646 */
+ { (yyval.declarator) = (yyvsp[0].declarator); if ((yyval.declarator)->func_type) (yyval.declarator)->func_type->attrs = append_attr((yyval.declarator)->func_type->attrs, make_attrp(ATTR_CALLCONV, (yyvsp[-1].str)));
+- else if ((yyval.declarator)->type) (yyval.declarator)->type->attrs = append_attr((yyval.declarator)->type->attrs, make_attrp(ATTR_CALLCONV, (yyvsp[-1].str))); }
+-#line 4636 "parser.tab.c" /* yacc.c:1648 */
++ else if ((yyval.declarator)->declspec.type) (yyval.declarator)->declspec.type->attrs = append_attr((yyval.declarator)->declspec.type->attrs, make_attrp(ATTR_CALLCONV, (yyvsp[-1].str))); }
++#line 4631 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 335:
+-#line 993 "parser.y" /* yacc.c:1648 */
++#line 991 "parser.y" /* yacc.c:1646 */
+ { (yyval.declarator) = make_declarator((yyvsp[0].var)); }
+-#line 4642 "parser.tab.c" /* yacc.c:1648 */
++#line 4637 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 336:
+-#line 994 "parser.y" /* yacc.c:1648 */
++#line 992 "parser.y" /* yacc.c:1646 */
+ { (yyval.declarator) = (yyvsp[-1].declarator); }
+-#line 4648 "parser.tab.c" /* yacc.c:1648 */
++#line 4643 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 337:
+-#line 995 "parser.y" /* yacc.c:1648 */
+- { (yyval.declarator) = (yyvsp[-1].declarator); (yyval.declarator)->type = append_array((yyval.declarator)->type, (yyvsp[0].expr)); }
+-#line 4654 "parser.tab.c" /* yacc.c:1648 */
++#line 993 "parser.y" /* yacc.c:1646 */
++ { (yyval.declarator) = (yyvsp[-1].declarator); (yyval.declarator)->declspec.type = append_array((yyval.declarator)->declspec.type, (yyvsp[0].expr)); }
++#line 4649 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 338:
+-#line 996 "parser.y" /* yacc.c:1648 */
++#line 994 "parser.y" /* yacc.c:1646 */
+ { (yyval.declarator) = (yyvsp[-3].declarator);
+- (yyval.declarator)->func_type = append_chain_type((yyval.declarator)->type, type_new_function((yyvsp[-1].var_list)));
+- (yyval.declarator)->type = NULL;
++ (yyval.declarator)->func_type = append_chain_type((yyval.declarator)->declspec.type, type_new_function((yyvsp[-1].var_list)));
++ (yyval.declarator)->declspec.type = NULL;
+ }
+-#line 4663 "parser.tab.c" /* yacc.c:1648 */
++#line 4658 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 339:
+-#line 1005 "parser.y" /* yacc.c:1648 */
+- { (yyval.declarator) = (yyvsp[0].declarator); (yyval.declarator)->type = append_chain_type((yyval.declarator)->type, type_new_pointer(pointer_default, NULL, (yyvsp[-1].attr_list))); }
+-#line 4669 "parser.tab.c" /* yacc.c:1648 */
++#line 1003 "parser.y" /* yacc.c:1646 */
++ { (yyval.declarator) = (yyvsp[0].declarator); append_chain_declspec(&(yyval.declarator)->declspec, type_new_pointer(pointer_default, NULL), (yyvsp[-1].typequalifier)); }
++#line 4664 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 340:
+-#line 1006 "parser.y" /* yacc.c:1648 */
++#line 1004 "parser.y" /* yacc.c:1646 */
+ { (yyval.declarator) = (yyvsp[0].declarator); if ((yyval.declarator)->func_type) (yyval.declarator)->func_type->attrs = append_attr((yyval.declarator)->func_type->attrs, make_attrp(ATTR_CALLCONV, (yyvsp[-1].str)));
+- else if ((yyval.declarator)->type) (yyval.declarator)->type->attrs = append_attr((yyval.declarator)->type->attrs, make_attrp(ATTR_CALLCONV, (yyvsp[-1].str))); }
+-#line 4676 "parser.tab.c" /* yacc.c:1648 */
++ else if ((yyval.declarator)->declspec.type) (yyval.declarator)->declspec.type->attrs = append_attr((yyval.declarator)->declspec.type->attrs, make_attrp(ATTR_CALLCONV, (yyvsp[-1].str))); }
++#line 4671 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 342:
+-#line 1014 "parser.y" /* yacc.c:1648 */
+- { (yyval.declarator) = (yyvsp[0].declarator); (yyval.declarator)->type = append_chain_type((yyval.declarator)->type, type_new_pointer(pointer_default, NULL, (yyvsp[-1].attr_list))); }
+-#line 4682 "parser.tab.c" /* yacc.c:1648 */
++#line 1012 "parser.y" /* yacc.c:1646 */
++ { (yyval.declarator) = (yyvsp[0].declarator); append_chain_declspec(&(yyval.declarator)->declspec, type_new_pointer(pointer_default, NULL), (yyvsp[-1].typequalifier)); }
++#line 4677 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 343:
+-#line 1015 "parser.y" /* yacc.c:1648 */
++#line 1013 "parser.y" /* yacc.c:1646 */
+ { (yyval.declarator) = (yyvsp[0].declarator); if ((yyval.declarator)->func_type) (yyval.declarator)->func_type->attrs = append_attr((yyval.declarator)->func_type->attrs, make_attrp(ATTR_CALLCONV, (yyvsp[-1].str)));
+- else if ((yyval.declarator)->type) (yyval.declarator)->type->attrs = append_attr((yyval.declarator)->type->attrs, make_attrp(ATTR_CALLCONV, (yyvsp[-1].str))); }
+-#line 4689 "parser.tab.c" /* yacc.c:1648 */
++ else if ((yyval.declarator)->declspec.type) (yyval.declarator)->declspec.type->attrs = append_attr((yyval.declarator)->declspec.type->attrs, make_attrp(ATTR_CALLCONV, (yyvsp[-1].str))); }
++#line 4684 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 344:
+-#line 1020 "parser.y" /* yacc.c:1648 */
++#line 1018 "parser.y" /* yacc.c:1646 */
+ { (yyval.declarator) = make_declarator(NULL); }
+-#line 4695 "parser.tab.c" /* yacc.c:1648 */
++#line 4690 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 346:
+-#line 1026 "parser.y" /* yacc.c:1648 */
++#line 1024 "parser.y" /* yacc.c:1646 */
+ { (yyval.declarator) = (yyvsp[-1].declarator); }
+-#line 4701 "parser.tab.c" /* yacc.c:1648 */
++#line 4696 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 347:
+-#line 1027 "parser.y" /* yacc.c:1648 */
+- { (yyval.declarator) = (yyvsp[-1].declarator); (yyval.declarator)->type = append_array((yyval.declarator)->type, (yyvsp[0].expr)); }
+-#line 4707 "parser.tab.c" /* yacc.c:1648 */
++#line 1025 "parser.y" /* yacc.c:1646 */
++ { (yyval.declarator) = (yyvsp[-1].declarator); (yyval.declarator)->declspec.type = append_array((yyval.declarator)->declspec.type, (yyvsp[0].expr)); }
++#line 4702 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 348:
+-#line 1028 "parser.y" /* yacc.c:1648 */
+- { (yyval.declarator) = make_declarator(NULL); (yyval.declarator)->type = append_array((yyval.declarator)->type, (yyvsp[0].expr)); }
+-#line 4713 "parser.tab.c" /* yacc.c:1648 */
++#line 1026 "parser.y" /* yacc.c:1646 */
++ { (yyval.declarator) = make_declarator(NULL); (yyval.declarator)->declspec.type = append_array((yyval.declarator)->declspec.type, (yyvsp[0].expr)); }
++#line 4708 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 349:
+-#line 1030 "parser.y" /* yacc.c:1648 */
++#line 1028 "parser.y" /* yacc.c:1646 */
+ { (yyval.declarator) = make_declarator(NULL);
+- (yyval.declarator)->func_type = append_chain_type((yyval.declarator)->type, type_new_function((yyvsp[-1].var_list)));
+- (yyval.declarator)->type = NULL;
++ (yyval.declarator)->func_type = append_chain_type((yyval.declarator)->declspec.type, type_new_function((yyvsp[-1].var_list)));
++ (yyval.declarator)->declspec.type = NULL;
+ }
+-#line 4722 "parser.tab.c" /* yacc.c:1648 */
++#line 4717 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 350:
+-#line 1035 "parser.y" /* yacc.c:1648 */
++#line 1033 "parser.y" /* yacc.c:1646 */
+ { (yyval.declarator) = (yyvsp[-3].declarator);
+- (yyval.declarator)->func_type = append_chain_type((yyval.declarator)->type, type_new_function((yyvsp[-1].var_list)));
+- (yyval.declarator)->type = NULL;
++ (yyval.declarator)->func_type = append_chain_type((yyval.declarator)->declspec.type, type_new_function((yyvsp[-1].var_list)));
++ (yyval.declarator)->declspec.type = NULL;
+ }
+-#line 4731 "parser.tab.c" /* yacc.c:1648 */
++#line 4726 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 351:
+-#line 1044 "parser.y" /* yacc.c:1648 */
+- { (yyval.declarator) = (yyvsp[0].declarator); (yyval.declarator)->type = append_chain_type((yyval.declarator)->type, type_new_pointer(pointer_default, NULL, (yyvsp[-1].attr_list))); }
+-#line 4737 "parser.tab.c" /* yacc.c:1648 */
++#line 1042 "parser.y" /* yacc.c:1646 */
++ { (yyval.declarator) = (yyvsp[0].declarator); append_chain_declspec(&(yyval.declarator)->declspec, type_new_pointer(pointer_default, NULL), (yyvsp[-1].typequalifier)); }
++#line 4732 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 352:
+-#line 1045 "parser.y" /* yacc.c:1648 */
+- { (yyval.declarator) = (yyvsp[0].declarator); (yyval.declarator)->type->attrs = append_attr((yyval.declarator)->type->attrs, make_attrp(ATTR_CALLCONV, (yyvsp[-1].str))); }
+-#line 4743 "parser.tab.c" /* yacc.c:1648 */
++#line 1043 "parser.y" /* yacc.c:1646 */
++ { (yyval.declarator) = (yyvsp[0].declarator); (yyval.declarator)->declspec.type->attrs = append_attr((yyval.declarator)->declspec.type->attrs, make_attrp(ATTR_CALLCONV, (yyvsp[-1].str))); }
++#line 4738 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 354:
+-#line 1052 "parser.y" /* yacc.c:1648 */
+- { (yyval.declarator) = (yyvsp[0].declarator); (yyval.declarator)->type = append_chain_type((yyval.declarator)->type, type_new_pointer(pointer_default, NULL, (yyvsp[-1].attr_list))); }
+-#line 4749 "parser.tab.c" /* yacc.c:1648 */
++#line 1050 "parser.y" /* yacc.c:1646 */
++ { (yyval.declarator) = (yyvsp[0].declarator); append_chain_declspec(&(yyval.declarator)->declspec, type_new_pointer(pointer_default, NULL), (yyvsp[-1].typequalifier)); }
++#line 4744 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 355:
+-#line 1053 "parser.y" /* yacc.c:1648 */
+- { (yyval.declarator) = (yyvsp[0].declarator); (yyval.declarator)->type->attrs = append_attr((yyval.declarator)->type->attrs, make_attrp(ATTR_CALLCONV, (yyvsp[-1].str))); }
+-#line 4755 "parser.tab.c" /* yacc.c:1648 */
++#line 1051 "parser.y" /* yacc.c:1646 */
++ { (yyval.declarator) = (yyvsp[0].declarator); (yyval.declarator)->declspec.type->attrs = append_attr((yyval.declarator)->declspec.type->attrs, make_attrp(ATTR_CALLCONV, (yyvsp[-1].str))); }
++#line 4750 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 356:
+-#line 1057 "parser.y" /* yacc.c:1648 */
++#line 1055 "parser.y" /* yacc.c:1646 */
+ { (yyval.declarator) = make_declarator(NULL); }
+-#line 4761 "parser.tab.c" /* yacc.c:1648 */
++#line 4756 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 358:
+-#line 1065 "parser.y" /* yacc.c:1648 */
++#line 1063 "parser.y" /* yacc.c:1646 */
+ { (yyval.declarator) = make_declarator((yyvsp[0].var)); }
+-#line 4767 "parser.tab.c" /* yacc.c:1648 */
++#line 4762 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 359:
+-#line 1066 "parser.y" /* yacc.c:1648 */
++#line 1064 "parser.y" /* yacc.c:1646 */
+ { (yyval.declarator) = (yyvsp[-1].declarator); }
+-#line 4773 "parser.tab.c" /* yacc.c:1648 */
++#line 4768 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 360:
+-#line 1067 "parser.y" /* yacc.c:1648 */
+- { (yyval.declarator) = (yyvsp[-1].declarator); (yyval.declarator)->type = append_array((yyval.declarator)->type, (yyvsp[0].expr)); }
+-#line 4779 "parser.tab.c" /* yacc.c:1648 */
++#line 1065 "parser.y" /* yacc.c:1646 */
++ { (yyval.declarator) = (yyvsp[-1].declarator); (yyval.declarator)->declspec.type = append_array((yyval.declarator)->declspec.type, (yyvsp[0].expr)); }
++#line 4774 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 361:
+-#line 1068 "parser.y" /* yacc.c:1648 */
+- { (yyval.declarator) = make_declarator(NULL); (yyval.declarator)->type = append_array((yyval.declarator)->type, (yyvsp[0].expr)); }
+-#line 4785 "parser.tab.c" /* yacc.c:1648 */
++#line 1066 "parser.y" /* yacc.c:1646 */
++ { (yyval.declarator) = make_declarator(NULL); (yyval.declarator)->declspec.type = append_array((yyval.declarator)->declspec.type, (yyvsp[0].expr)); }
++#line 4780 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 362:
+-#line 1070 "parser.y" /* yacc.c:1648 */
++#line 1068 "parser.y" /* yacc.c:1646 */
+ { (yyval.declarator) = make_declarator(NULL);
+- (yyval.declarator)->func_type = append_chain_type((yyval.declarator)->type, type_new_function((yyvsp[-1].var_list)));
+- (yyval.declarator)->type = NULL;
++ (yyval.declarator)->func_type = append_chain_type((yyval.declarator)->declspec.type, type_new_function((yyvsp[-1].var_list)));
++ (yyval.declarator)->declspec.type = NULL;
+ }
+-#line 4794 "parser.tab.c" /* yacc.c:1648 */
++#line 4789 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 363:
+-#line 1075 "parser.y" /* yacc.c:1648 */
++#line 1073 "parser.y" /* yacc.c:1646 */
+ { (yyval.declarator) = (yyvsp[-3].declarator);
+- (yyval.declarator)->func_type = append_chain_type((yyval.declarator)->type, type_new_function((yyvsp[-1].var_list)));
+- (yyval.declarator)->type = NULL;
++ (yyval.declarator)->func_type = append_chain_type((yyval.declarator)->declspec.type, type_new_function((yyvsp[-1].var_list)));
++ (yyval.declarator)->declspec.type = NULL;
+ }
+-#line 4803 "parser.tab.c" /* yacc.c:1648 */
++#line 4798 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 364:
+-#line 1082 "parser.y" /* yacc.c:1648 */
++#line 1080 "parser.y" /* yacc.c:1646 */
+ { (yyval.declarator_list) = append_declarator( NULL, (yyvsp[0].declarator) ); }
+-#line 4809 "parser.tab.c" /* yacc.c:1648 */
++#line 4804 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 365:
+-#line 1083 "parser.y" /* yacc.c:1648 */
++#line 1081 "parser.y" /* yacc.c:1646 */
+ { (yyval.declarator_list) = append_declarator( (yyvsp[-2].declarator_list), (yyvsp[0].declarator) ); }
+-#line 4815 "parser.tab.c" /* yacc.c:1648 */
++#line 4810 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 366:
+-#line 1086 "parser.y" /* yacc.c:1648 */
++#line 1084 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = NULL; }
+-#line 4821 "parser.tab.c" /* yacc.c:1648 */
++#line 4816 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 367:
+-#line 1087 "parser.y" /* yacc.c:1648 */
++#line 1085 "parser.y" /* yacc.c:1646 */
+ { (yyval.expr) = (yyvsp[0].expr); }
+-#line 4827 "parser.tab.c" /* yacc.c:1648 */
++#line 4822 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 368:
+-#line 1090 "parser.y" /* yacc.c:1648 */
++#line 1088 "parser.y" /* yacc.c:1646 */
+ { (yyval.declarator) = (yyvsp[-1].declarator); (yyval.declarator)->bits = (yyvsp[0].expr);
+ if (!(yyval.declarator)->bits && !(yyval.declarator)->var->name)
+ error_loc("unnamed fields are not allowed\n");
+ }
+-#line 4836 "parser.tab.c" /* yacc.c:1648 */
++#line 4831 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 369:
+-#line 1097 "parser.y" /* yacc.c:1648 */
++#line 1095 "parser.y" /* yacc.c:1646 */
+ { (yyval.declarator_list) = append_declarator( NULL, (yyvsp[0].declarator) ); }
+-#line 4842 "parser.tab.c" /* yacc.c:1648 */
++#line 4837 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 370:
+-#line 1099 "parser.y" /* yacc.c:1648 */
++#line 1097 "parser.y" /* yacc.c:1646 */
+ { (yyval.declarator_list) = append_declarator( (yyvsp[-2].declarator_list), (yyvsp[0].declarator) ); }
+-#line 4848 "parser.tab.c" /* yacc.c:1648 */
++#line 4843 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 371:
+-#line 1103 "parser.y" /* yacc.c:1648 */
++#line 1101 "parser.y" /* yacc.c:1646 */
+ { (yyval.declarator) = (yyvsp[0].declarator); }
+-#line 4854 "parser.tab.c" /* yacc.c:1648 */
++#line 4849 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 372:
+-#line 1104 "parser.y" /* yacc.c:1648 */
++#line 1102 "parser.y" /* yacc.c:1646 */
+ { (yyval.declarator) = (yyvsp[-2].declarator); (yyvsp[-2].declarator)->var->eval = (yyvsp[0].expr); }
+-#line 4860 "parser.tab.c" /* yacc.c:1648 */
++#line 4855 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 373:
+-#line 1108 "parser.y" /* yacc.c:1648 */
++#line 1106 "parser.y" /* yacc.c:1646 */
+ { (yyval.num) = THREADING_APARTMENT; }
+-#line 4866 "parser.tab.c" /* yacc.c:1648 */
++#line 4861 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 374:
+-#line 1109 "parser.y" /* yacc.c:1648 */
++#line 1107 "parser.y" /* yacc.c:1646 */
+ { (yyval.num) = THREADING_NEUTRAL; }
+-#line 4872 "parser.tab.c" /* yacc.c:1648 */
++#line 4867 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 375:
+-#line 1110 "parser.y" /* yacc.c:1648 */
++#line 1108 "parser.y" /* yacc.c:1646 */
+ { (yyval.num) = THREADING_SINGLE; }
+-#line 4878 "parser.tab.c" /* yacc.c:1648 */
++#line 4873 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 376:
+-#line 1111 "parser.y" /* yacc.c:1648 */
++#line 1109 "parser.y" /* yacc.c:1646 */
+ { (yyval.num) = THREADING_FREE; }
+-#line 4884 "parser.tab.c" /* yacc.c:1648 */
++#line 4879 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 377:
+-#line 1112 "parser.y" /* yacc.c:1648 */
++#line 1110 "parser.y" /* yacc.c:1646 */
+ { (yyval.num) = THREADING_BOTH; }
+-#line 4890 "parser.tab.c" /* yacc.c:1648 */
++#line 4885 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 378:
+-#line 1116 "parser.y" /* yacc.c:1648 */
++#line 1114 "parser.y" /* yacc.c:1646 */
+ { (yyval.num) = FC_RP; }
+-#line 4896 "parser.tab.c" /* yacc.c:1648 */
++#line 4891 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 379:
+-#line 1117 "parser.y" /* yacc.c:1648 */
++#line 1115 "parser.y" /* yacc.c:1646 */
+ { (yyval.num) = FC_UP; }
+-#line 4902 "parser.tab.c" /* yacc.c:1648 */
++#line 4897 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 380:
+-#line 1118 "parser.y" /* yacc.c:1648 */
++#line 1116 "parser.y" /* yacc.c:1646 */
+ { (yyval.num) = FC_FP; }
+-#line 4908 "parser.tab.c" /* yacc.c:1648 */
++#line 4903 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 381:
+-#line 1121 "parser.y" /* yacc.c:1648 */
++#line 1119 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = type_new_struct((yyvsp[-3].str), current_namespace, TRUE, (yyvsp[-1].var_list)); }
+-#line 4914 "parser.tab.c" /* yacc.c:1648 */
++#line 4909 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 382:
+-#line 1124 "parser.y" /* yacc.c:1648 */
++#line 1122 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = type_new_void(); }
+-#line 4920 "parser.tab.c" /* yacc.c:1648 */
++#line 4915 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 383:
+-#line 1125 "parser.y" /* yacc.c:1648 */
++#line 1123 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = find_type_or_error((yyvsp[0].str), 0); }
+-#line 4926 "parser.tab.c" /* yacc.c:1648 */
++#line 4921 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 384:
+-#line 1126 "parser.y" /* yacc.c:1648 */
++#line 1124 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = (yyvsp[0].type); }
+-#line 4932 "parser.tab.c" /* yacc.c:1648 */
++#line 4927 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 385:
+-#line 1127 "parser.y" /* yacc.c:1648 */
++#line 1125 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = (yyvsp[0].type); }
+-#line 4938 "parser.tab.c" /* yacc.c:1648 */
++#line 4933 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 386:
+-#line 1128 "parser.y" /* yacc.c:1648 */
++#line 1126 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = type_new_enum((yyvsp[0].str), current_namespace, FALSE, NULL); }
+-#line 4944 "parser.tab.c" /* yacc.c:1648 */
++#line 4939 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 387:
+-#line 1129 "parser.y" /* yacc.c:1648 */
++#line 1127 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = (yyvsp[0].type); }
+-#line 4950 "parser.tab.c" /* yacc.c:1648 */
++#line 4945 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 388:
+-#line 1130 "parser.y" /* yacc.c:1648 */
++#line 1128 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = type_new_struct((yyvsp[0].str), current_namespace, FALSE, NULL); }
+-#line 4956 "parser.tab.c" /* yacc.c:1648 */
++#line 4951 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 389:
+-#line 1131 "parser.y" /* yacc.c:1648 */
++#line 1129 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = (yyvsp[0].type); }
+-#line 4962 "parser.tab.c" /* yacc.c:1648 */
++#line 4957 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 390:
+-#line 1132 "parser.y" /* yacc.c:1648 */
++#line 1130 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = type_new_nonencapsulated_union((yyvsp[0].str), FALSE, NULL); }
+-#line 4968 "parser.tab.c" /* yacc.c:1648 */
++#line 4963 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 391:
+-#line 1133 "parser.y" /* yacc.c:1648 */
++#line 1131 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = make_safearray((yyvsp[-1].type)); }
+-#line 4974 "parser.tab.c" /* yacc.c:1648 */
++#line 4969 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 392:
+-#line 1137 "parser.y" /* yacc.c:1648 */
++#line 1135 "parser.y" /* yacc.c:1646 */
+ { (yyvsp[-4].attr_list) = append_attribs((yyvsp[-4].attr_list), (yyvsp[-2].attr_list));
+ reg_typedefs((yyvsp[-1].declspec), (yyvsp[0].declarator_list), check_typedef_attrs((yyvsp[-4].attr_list)));
+ (yyval.statement) = make_statement_typedef((yyvsp[0].declarator_list));
+ }
+-#line 4983 "parser.tab.c" /* yacc.c:1648 */
++#line 4978 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 393:
+-#line 1144 "parser.y" /* yacc.c:1648 */
++#line 1142 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = type_new_nonencapsulated_union((yyvsp[-3].str), TRUE, (yyvsp[-1].var_list)); }
+-#line 4989 "parser.tab.c" /* yacc.c:1648 */
++#line 4984 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 394:
+-#line 1147 "parser.y" /* yacc.c:1648 */
++#line 1145 "parser.y" /* yacc.c:1646 */
+ { (yyval.type) = type_new_encapsulated_union((yyvsp[-8].str), (yyvsp[-5].var), (yyvsp[-3].var), (yyvsp[-1].var_list)); }
+-#line 4995 "parser.tab.c" /* yacc.c:1648 */
++#line 4990 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 395:
+-#line 1151 "parser.y" /* yacc.c:1648 */
++#line 1149 "parser.y" /* yacc.c:1646 */
+ { (yyval.num) = MAKEVERSION((yyvsp[0].num), 0); }
+-#line 5001 "parser.tab.c" /* yacc.c:1648 */
++#line 4996 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 396:
+-#line 1152 "parser.y" /* yacc.c:1648 */
++#line 1150 "parser.y" /* yacc.c:1646 */
+ { (yyval.num) = MAKEVERSION((yyvsp[-2].num), (yyvsp[0].num)); }
+-#line 5007 "parser.tab.c" /* yacc.c:1648 */
++#line 5002 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 397:
+-#line 1153 "parser.y" /* yacc.c:1648 */
++#line 1151 "parser.y" /* yacc.c:1646 */
+ { (yyval.num) = (yyvsp[0].num); }
+-#line 5013 "parser.tab.c" /* yacc.c:1648 */
++#line 5008 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 402:
+-#line 1166 "parser.y" /* yacc.c:1648 */
++#line 1164 "parser.y" /* yacc.c:1646 */
+ { type_t *type = find_type_or_error((yyvsp[-1].str), 0);
+ type->attrs = append_attr_list(type->attrs, (yyvsp[-2].attr_list));
+ }
+-#line 5021 "parser.tab.c" /* yacc.c:1648 */
++#line 5016 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 403:
+-#line 1171 "parser.y" /* yacc.c:1648 */
++#line 1169 "parser.y" /* yacc.c:1646 */
+ { type_t *iface = find_type_or_error2((yyvsp[-3].str), 0);
+ if (type_get_type(iface) != TYPE_INTERFACE)
+ error_loc("%s is not an interface\n", iface->name);
+ iface->attrs = append_attr_list(iface->attrs, (yyvsp[-5].attr_list));
+ }
+-#line 5031 "parser.tab.c" /* yacc.c:1648 */
++#line 5026 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 404:
+-#line 1178 "parser.y" /* yacc.c:1648 */
++#line 1176 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr_list) = NULL; }
+-#line 5037 "parser.tab.c" /* yacc.c:1648 */
++#line 5032 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 405:
+-#line 1179 "parser.y" /* yacc.c:1648 */
++#line 1177 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr_list) = (yyvsp[-1].attr_list); }
+-#line 5043 "parser.tab.c" /* yacc.c:1648 */
++#line 5038 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 406:
+-#line 1182 "parser.y" /* yacc.c:1648 */
++#line 1180 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr_list) = append_attr(NULL, (yyvsp[0].attr)); }
+-#line 5049 "parser.tab.c" /* yacc.c:1648 */
++#line 5044 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 407:
+-#line 1183 "parser.y" /* yacc.c:1648 */
++#line 1181 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr_list) = append_attr((yyvsp[-2].attr_list), (yyvsp[0].attr)); }
+-#line 5055 "parser.tab.c" /* yacc.c:1648 */
++#line 5050 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 408:
+-#line 1186 "parser.y" /* yacc.c:1648 */
++#line 1184 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_ENCODE); }
+-#line 5061 "parser.tab.c" /* yacc.c:1648 */
++#line 5056 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 409:
+-#line 1187 "parser.y" /* yacc.c:1648 */
++#line 1185 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_DECODE); }
+-#line 5067 "parser.tab.c" /* yacc.c:1648 */
++#line 5062 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 410:
+-#line 1188 "parser.y" /* yacc.c:1648 */
++#line 1186 "parser.y" /* yacc.c:1646 */
+ { (yyval.attr) = make_attr(ATTR_EXPLICIT_HANDLE); }
+-#line 5073 "parser.tab.c" /* yacc.c:1648 */
++#line 5068 "parser.tab.c" /* yacc.c:1646 */
+ break;
+
+
+-#line 5077 "parser.tab.c" /* yacc.c:1648 */
++#line 5072 "parser.tab.c" /* yacc.c:1646 */
+ default: break;
+ }
+ /* User semantic actions sometimes alter yychar, and that requires
+@@ -5301,7 +5296,7 @@ yyreturn:
+ #endif
+ return yyresult;
+ }
+-#line 1190 "parser.y" /* yacc.c:1907 */
++#line 1188 "parser.y" /* yacc.c:1906 */
+
+
+ static void decl_builtin_basic(const char *name, enum type_basic_type type)
+@@ -5312,7 +5307,8 @@ static void decl_builtin_basic(const char *name, enum type_basic_type type)
+
+ static void decl_builtin_alias(const char *name, type_t *t)
+ {
+- reg_type(type_new_alias(t, name), name, NULL, 0);
++ decl_spec_t ds;
++ reg_type(type_new_alias(init_declspec(&ds, t), name), name, &global_namespace, 0);
+ }
+
+ void init_types(void)
+@@ -5323,7 +5319,7 @@ void init_types(void)
+ decl_builtin_basic("double", TYPE_BASIC_DOUBLE);
+ decl_builtin_basic("error_status_t", TYPE_BASIC_ERROR_STATUS_T);
+ decl_builtin_basic("handle_t", TYPE_BASIC_HANDLE);
+- decl_builtin_alias("boolean", type_new_basic(TYPE_BASIC_BYTE));
++ decl_builtin_alias("boolean", type_new_basic(TYPE_BASIC_CHAR));
+ }
+
+ static str_list_t *append_str(str_list_t *list, char *str)
+@@ -5354,6 +5350,7 @@ static attr_list_t *append_attr(attr_list_t *list, attr_t *attr)
+ LIST_FOR_EACH_ENTRY(attr_existing, list, attr_t, entry)
+ if (attr_existing->type == attr->type)
+ {
++ __builtin_trap();
+ parser_warning("duplicate attribute %s\n", get_attr_display_name(attr->type));
+ /* use the last attribute, like MIDL does */
+ list_remove(&attr_existing->entry);
+@@ -5413,53 +5410,73 @@ static attr_list_t *map_attrs(const attr_list_t *list, map_attrs_filter_t filter
+ return new_list;
+ }
+
+-static decl_spec_t *make_decl_spec(type_t *type, decl_spec_t *left, decl_spec_t *right, attr_t *attr, enum storage_class stgclass)
++static decl_spec_t *make_decl_spec(type_t *type, decl_spec_t *left, decl_spec_t *right, enum storage_class stgclass, enum type_qualifier typequalifier, enum function_specifier funcspecifier)
+ {
+ decl_spec_t *declspec = left ? left : right;
+ if (!declspec)
+ {
+ declspec = xmalloc(sizeof(*declspec));
+ declspec->type = NULL;
+- declspec->attrs = NULL;
+ declspec->stgclass = STG_NONE;
++ declspec->typequalifier = TYPE_QUALIFIER_NONE;
++ declspec->funcspecifier = FUNCTION_SPECIFIER_NONE;
+ }
+ declspec->type = type;
+ if (left && declspec != left)
+ {
+- declspec->attrs = append_attr_list(declspec->attrs, left->attrs);
+ if (declspec->stgclass == STG_NONE)
+ declspec->stgclass = left->stgclass;
+ else if (left->stgclass != STG_NONE)
+ error_loc("only one storage class can be specified\n");
++
++ if (declspec->typequalifier == TYPE_QUALIFIER_NONE)
++ declspec->typequalifier = left->typequalifier;
++ else if (left->typequalifier != TYPE_QUALIFIER_NONE)
++ error_loc("only one type qualifier can be specified\n");
++
++ if (declspec->funcspecifier == FUNCTION_SPECIFIER_NONE)
++ declspec->funcspecifier = left->funcspecifier;
++ else if (left->funcspecifier != FUNCTION_SPECIFIER_NONE)
++ error_loc("only one function specifier can be specified\n");
++
+ assert(!left->type);
+ free(left);
+ }
+ if (right && declspec != right)
+ {
+- declspec->attrs = append_attr_list(declspec->attrs, right->attrs);
+ if (declspec->stgclass == STG_NONE)
+ declspec->stgclass = right->stgclass;
+ else if (right->stgclass != STG_NONE)
+ error_loc("only one storage class can be specified\n");
++
++ if (declspec->typequalifier == TYPE_QUALIFIER_NONE)
++ declspec->typequalifier = right->typequalifier;
++ else if (right->typequalifier != TYPE_QUALIFIER_NONE)
++ error_loc("only one type qualifier can be specified\n");
++
++ if (declspec->funcspecifier == FUNCTION_SPECIFIER_NONE)
++ declspec->funcspecifier = right->funcspecifier;
++ else if (right->funcspecifier != FUNCTION_SPECIFIER_NONE)
++ error_loc("only one function specifier can be specified\n");
++
+ assert(!right->type);
+ free(right);
+ }
+
+- declspec->attrs = append_attr(declspec->attrs, attr);
+ if (declspec->stgclass == STG_NONE)
+ declspec->stgclass = stgclass;
+ else if (stgclass != STG_NONE)
+ error_loc("only one storage class can be specified\n");
+
+- /* apply attributes to type */
+- if (type && declspec->attrs)
+- {
+- attr_list_t *attrs;
+- declspec->type = duptype(type, 1);
+- attrs = map_attrs(type->attrs, NULL);
+- declspec->type->attrs = append_attr_list(attrs, declspec->attrs);
+- declspec->attrs = NULL;
+- }
++ if (declspec->typequalifier == TYPE_QUALIFIER_NONE)
++ declspec->typequalifier = typequalifier;
++ else if (typequalifier != TYPE_QUALIFIER_NONE)
++ error_loc("only one type qualifier can be specified\n");
++
++ if (declspec->funcspecifier == FUNCTION_SPECIFIER_NONE)
++ declspec->funcspecifier = funcspecifier;
++ else if (funcspecifier != FUNCTION_SPECIFIER_NONE)
++ error_loc("only one function specifier can be specified\n");
+
+ return declspec;
+ }
+@@ -5545,6 +5562,7 @@ void clear_all_offsets(void)
+
+ static void type_function_add_head_arg(type_t *type, var_t *arg)
+ {
++ assert(type_get_type_detect_alias(type) == TYPE_FUNCTION);
+ if (!type->details.function->args)
+ {
+ type->details.function->args = xmalloc( sizeof(*type->details.function->args) );
+@@ -5589,31 +5607,60 @@ static int is_allowed_range_type(const type_t *type)
+ static type_t *get_array_or_ptr_ref(type_t *type)
+ {
+ if (is_ptr(type))
+- return type_pointer_get_ref(type);
++ return type_pointer_get_ref_type(type);
+ else if (is_array(type))
+- return type_array_get_element(type);
++ return type_array_get_element_type(type);
+ return NULL;
+ }
+
+ static type_t *append_chain_type(type_t *chain, type_t *type)
+ {
+- type_t *chain_type;
++ type_t *chain_type = NULL;
+
+ if (!chain)
+ return type;
+ for (chain_type = chain; get_array_or_ptr_ref(chain_type); chain_type = get_array_or_ptr_ref(chain_type))
+ ;
+
++ assert(!type_is_alias(chain_type));
+ if (is_ptr(chain_type))
+- chain_type->details.pointer.ref = type;
++ chain_type->details.pointer.ref.type = type;
+ else if (is_array(chain_type))
+- chain_type->details.array.elem = type;
++ chain_type->details.array.elem.type = type;
+ else
+ assert(0);
+
+ return chain;
+ }
+
++static decl_spec_t *append_chain_declspec(decl_spec_t *chain, type_t *type, enum type_qualifier typequalifier)
++{
++ type_t *chain_type = chain->type;
++ decl_spec_t *chain_declspec = NULL;
++
++ if (!chain_type)
++ {
++ chain->type = type;
++ chain->typequalifier = typequalifier;
++ return chain;
++ }
++
++ for(; get_array_or_ptr_ref(chain_type); chain_type = get_array_or_ptr_ref(chain_type))
++ ;
++
++ if (is_ptr(chain_type))
++ chain_declspec = &chain_type->details.pointer.ref;
++ else if (is_array(chain_type))
++ chain_declspec = &chain_type->details.array.elem;
++ else
++ assert(NULL);
++
++ chain_declspec->type = type;
++ chain_declspec->typequalifier = typequalifier;
++
++ return chain;
++}
++
+ static warning_list_t *append_warning(warning_list_t *list, int num)
+ {
+ warning_t *entry;
+@@ -5629,7 +5676,7 @@ static warning_list_t *append_warning(warning_list_t *list, int num)
+ return list;
+ }
+
+-static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const declarator_t *decl,
++static var_t *declare_var(attr_list_t *attrs, decl_spec_t *declspec, const declarator_t *decl,
+ int top)
+ {
+ var_t *v = decl->var;
+@@ -5638,58 +5685,80 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
+ expr_t *dim;
+ type_t **ptype;
+ type_t *func_type = decl ? decl->func_type : NULL;
+- type_t *type = decl_spec->type;
++ type_t *type = declspec->type;
+
+- if (is_attr(type->attrs, ATTR_INLINE))
+- {
++
++ if (declspec->funcspecifier == FUNCTION_SPECIFIER_INLINE) {
+ if (!func_type)
+ error_loc("inline attribute applied to non-function type\n");
+ else
+ {
+- type_t *t;
+- /* move inline attribute from return type node to function node */
+- for (t = func_type; is_ptr(t); t = type_pointer_get_ref(t))
+- ;
+- t->attrs = move_attr(t->attrs, type->attrs, ATTR_INLINE);
++ v->declspec.funcspecifier = declspec->funcspecifier;
+ }
+ }
+
+- /* add type onto the end of the pointers in pident->type */
+- v->type = append_chain_type(decl ? decl->type : NULL, type);
+- v->stgclass = decl_spec->stgclass;
++ /* if the var type is a pointerish, we need to move the type qualifier to the pointee's declspec
++ * unless the pointee already has const type qualifier*/
++ if (!decl)
++ {
++ /* simplest case, no pointers to deal with here */
++ v->declspec.typequalifier = declspec->typequalifier;
++ } else if (decl->bits)
++ {
++ /* dealing with a bitfield, generate bitfield and copy over typequalifier*/
++ v->declspec.type = type_new_bitfield(declspec->type, decl->bits);
++ v->declspec.typequalifier = declspec->typequalifier;
++ }
++ else
++ {
++ /* here we're dealing with a pointerish type chain, so we need to pull
++ * the typequalifier off of the declspec and stick them in the type's attr list
++ */
++ v->declspec.type = decl->declspec.type;
++ v->declspec.typequalifier = decl->declspec.typequalifier;
++ append_chain_declspec(&v->declspec, type, declspec->typequalifier);
++ }
++
++ v->declspec.stgclass = declspec->stgclass;
+ v->attrs = attrs;
+
+ /* check for pointer attribute being applied to non-pointer, non-array
+ * type */
+- if (!is_array(v->type))
++ if (!is_array(v->declspec.type))
+ {
+ int ptr_attr = get_attrv(v->attrs, ATTR_POINTERTYPE);
+ const type_t *ptr = NULL;
+ /* pointer attributes on the left side of the type belong to the function
+ * pointer, if one is being declared */
+- type_t **pt = func_type ? &func_type : &v->type;
++ type_t **pt = func_type ? &func_type : &v->declspec.type;
+ for (ptr = *pt; ptr && !ptr_attr; )
+ {
+ ptr_attr = get_attrv(ptr->attrs, ATTR_POINTERTYPE);
+ if (!ptr_attr && type_is_alias(ptr))
+- ptr = type_alias_get_aliasee(ptr);
++ ptr = type_alias_get_aliasee_type(ptr);
+ else
+ break;
+ }
+ if (is_ptr(ptr))
+ {
+ if (ptr_attr && ptr_attr != FC_UP &&
+- type_get_type(type_pointer_get_ref(ptr)) == TYPE_INTERFACE)
++ type_get_type(type_pointer_get_ref_type(ptr)) == TYPE_INTERFACE)
+ warning_loc_info(&v->loc_info,
+ "%s: pointer attribute applied to interface "
+ "pointer type has no effect\n", v->name);
+- if (!ptr_attr && top && (*pt)->details.pointer.def_fc != FC_RP)
++ if (!ptr_attr && top && type_pointer_get_default_fc(*pt) != FC_RP)
+ {
++ printf("dup_pointer_type!\n");
++ printf("type : %p name : %s\n", *pt, (*pt)->name);
++ /* ptr_attr is ref,unique or full (FC_RP, FC_UP, FC_FP) */
++ /* *pt could be the var's declspec's type OR a type on a typedef */
++ /* not an array */
++
+ /* FIXME: this is a horrible hack to cope with the issue that we
+ * store an offset to the typeformat string in the type object, but
+ * two typeformat strings may be written depending on whether the
+ * pointer is a toplevel parameter or not */
+- *pt = duptype(*pt, 1);
++ *pt = dup_pointer_type(*pt);
+ }
+ }
+ else if (ptr_attr)
+@@ -5700,16 +5769,16 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
+ {
+ type_t *t = type;
+
+- if (!is_ptr(v->type) && !is_array(v->type))
++ if (!is_ptr(v->declspec.type) && !is_array(v->declspec.type))
+ error_loc("'%s': [string] attribute applied to non-pointer, non-array type\n",
+ v->name);
+
+ for (;;)
+ {
+ if (is_ptr(t))
+- t = type_pointer_get_ref(t);
++ t = type_pointer_get_ref_type(t);
+ else if (is_array(t))
+- t = type_array_get_element(t);
++ t = type_array_get_element_type(t);
+ else
+ break;
+ }
+@@ -5726,15 +5795,15 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
+
+ if (is_attr(v->attrs, ATTR_V1ENUM))
+ {
+- if (type_get_type_detect_alias(v->type) != TYPE_ENUM)
++ if (type_get_type_detect_alias(v->declspec.type) != TYPE_ENUM)
+ error_loc("'%s': [v1_enum] attribute applied to non-enum type\n", v->name);
+ }
+
+- if (is_attr(v->attrs, ATTR_RANGE) && !is_allowed_range_type(v->type))
++ if (is_attr(v->attrs, ATTR_RANGE) && !is_allowed_range_type(v->declspec.type))
+ error_loc("'%s': [range] attribute applied to non-integer type\n",
+ v->name);
+
+- ptype = &v->type;
++ ptype = &v->declspec.type;
+ if (sizes) LIST_FOR_EACH_ENTRY(dim, sizes, expr_t, entry)
+ {
+ if (dim->type != EXPR_VOID)
+@@ -5747,7 +5816,7 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
+ else
+ *ptype = type_new_array((*ptype)->name,
+ type_array_get_element(*ptype), FALSE,
+- 0, dim, NULL, 0);
++ 0, dim, NULL, FC_RP);
+ }
+ else if (is_ptr(*ptype))
+ *ptype = type_new_array((*ptype)->name, type_pointer_get_ref(*ptype), TRUE,
+@@ -5756,15 +5825,16 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
+ error_loc("%s: size_is attribute applied to illegal type\n", v->name);
+ }
+
++ assert(!type_is_alias(*ptype));
+ if (is_ptr(*ptype))
+- ptype = &(*ptype)->details.pointer.ref;
++ ptype = &(*ptype)->details.pointer.ref.type;
+ else if (is_array(*ptype))
+- ptype = &(*ptype)->details.array.elem;
++ ptype = &(*ptype)->details.array.elem.type;
+ else
+ error_loc("%s: too many expressions in size_is attribute\n", v->name);
+ }
+
+- ptype = &v->type;
++ ptype = &v->declspec.type;
+ if (lengs) LIST_FOR_EACH_ENTRY(dim, lengs, expr_t, entry)
+ {
+ if (dim->type != EXPR_VOID)
+@@ -5782,10 +5852,11 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
+ error_loc("%s: length_is attribute applied to illegal type\n", v->name);
+ }
+
++ assert(!type_is_alias(*ptype));
+ if (is_ptr(*ptype))
+- ptype = &(*ptype)->details.pointer.ref;
++ ptype = &(*ptype)->details.pointer.ref.type;
+ else if (is_array(*ptype))
+- ptype = &(*ptype)->details.array.elem;
++ ptype = &(*ptype)->details.array.elem.type;
+ else
+ error_loc("%s: too many expressions in length_is attribute\n", v->name);
+ }
+@@ -5796,29 +5867,31 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
+ if (func_type)
+ {
+ type_t *ft, *t;
+- type_t *return_type = v->type;
+- v->type = func_type;
+- for (ft = v->type; is_ptr(ft); ft = type_pointer_get_ref(ft))
++ type_t *return_type = v->declspec.type;
++ enum type_qualifier typequalifier = v->declspec.typequalifier;
++
++ v->declspec.type = func_type;
++ v->declspec.typequalifier = TYPE_QUALIFIER_NONE;
++ for (ft = v->declspec.type; is_ptr(ft); ft = type_pointer_get_ref_type(ft))
+ ;
+ assert(type_get_type_detect_alias(ft) == TYPE_FUNCTION);
+ ft->details.function->retval = make_var(xstrdup("_RetVal"));
+- ft->details.function->retval->type = return_type;
++ ft->details.function->retval->declspec.type = return_type;
++ ft->details.function->retval->declspec.typequalifier = typequalifier;
++
+ /* move calling convention attribute, if present, from pointer nodes to
+ * function node */
+- for (t = v->type; is_ptr(t); t = type_pointer_get_ref(t))
++ for (t = v->declspec.type; is_ptr(t); t = type_pointer_get_ref_type(t))
+ ft->attrs = move_attr(ft->attrs, t->attrs, ATTR_CALLCONV);
+ }
+ else
+ {
+ type_t *t;
+- for (t = v->type; is_ptr(t); t = type_pointer_get_ref(t))
++ for (t = v->declspec.type; is_ptr(t); t = type_pointer_get_ref_type(t))
+ if (is_attr(t->attrs, ATTR_CALLCONV))
+ error_loc("calling convention applied to non-function-pointer type\n");
+ }
+
+- if (decl->bits)
+- v->type = type_new_bitfield(v->type, decl->bits);
+-
+ return v;
+ }
+
+@@ -5866,6 +5939,10 @@ var_list_t *append_var(var_list_t *list, var_t *var)
+ list_init( list );
+ }
+ list_add_tail( list, &var->entry );
++
++ if (var->declspec.type)
++ var->declonly = !type_is_defined(var->declspec.type);
++
+ return list;
+ }
+
+@@ -5885,11 +5962,11 @@ var_t *make_var(char *name)
+ {
+ var_t *v = xmalloc(sizeof(var_t));
+ v->name = name;
+- v->type = NULL;
++ init_declspec(&v->declspec, NULL);
+ v->attrs = NULL;
+ v->eval = NULL;
+- v->stgclass = STG_NONE;
+ init_loc_info(&v->loc_info);
++ v->declonly = TRUE;
+ return v;
+ }
+
+@@ -5897,10 +5974,9 @@ static var_t *copy_var(var_t *src, char *name, map_attrs_filter_t attr_filter)
+ {
+ var_t *v = xmalloc(sizeof(var_t));
+ v->name = name;
+- v->type = src->type;
++ v->declspec = src->declspec;
+ v->attrs = map_attrs(src->attrs, attr_filter);
+ v->eval = src->eval;
+- v->stgclass = src->stgclass;
+ v->loc_info = src->loc_info;
+ return v;
+ }
+@@ -5920,7 +5996,7 @@ static declarator_t *make_declarator(var_t *var)
+ {
+ declarator_t *d = xmalloc(sizeof(*d));
+ d->var = var ? var : make_var(NULL);
+- d->type = NULL;
++ init_declspec(&d->declspec, NULL);
+ d->func_type = NULL;
+ d->bits = NULL;
+ return d;
+@@ -5928,7 +6004,15 @@ static declarator_t *make_declarator(var_t *var)
+
+ static type_t *make_safearray(type_t *type)
+ {
+- return type_new_array(NULL, type_new_alias(type, "SAFEARRAY"), TRUE, 0,
++ decl_spec_t aliasee_ds;
++ decl_spec_t element_ds;
++
++ init_declspec(&element_ds,
++ type_new_alias(
++ init_declspec(&aliasee_ds, type),
++ "SAFEARRAY"));
++
++ return type_new_array(NULL, &element_ds, TRUE, 0,
+ NULL, NULL, FC_RP);
+ }
+
+@@ -6007,6 +6091,8 @@ type_t *reg_type(type_t *type, const char *name, struct namespace *namespace, in
+ }
+ if (!namespace)
+ namespace = &global_namespace;
++ printf("reg_type { name : %s, namespace : %s, type : %s, ptr : %p}\n", name, namespace->name, ts_to_str(t), type);
++
+ hash = hash_ident(name);
+ nt = xmalloc(sizeof(struct rtype));
+ nt->name = name;
+@@ -6018,15 +6104,16 @@ type_t *reg_type(type_t *type, const char *name, struct namespace *namespace, in
+ nt->t = t;
+ nt->next = namespace->type_hash[hash];
+ namespace->type_hash[hash] = nt;
+- if ((t == tsSTRUCT || t == tsUNION))
++ if ((t == tsSTRUCT || t == tsUNION || t == tsENUM))
+ fix_incomplete_types(type);
+ return type;
+ }
+
+ static int is_incomplete(const type_t *t)
+ {
+- return !t->defined &&
+- (type_get_type_detect_alias(t) == TYPE_STRUCT ||
++ return !type_is_defined(t) &&
++ (type_get_type_detect_alias(t) == TYPE_ENUM ||
++ type_get_type_detect_alias(t) == TYPE_STRUCT ||
+ type_get_type_detect_alias(t) == TYPE_UNION ||
+ type_get_type_detect_alias(t) == TYPE_ENCAPSULATED_UNION);
+ }
+@@ -6034,19 +6121,16 @@ static int is_incomplete(const type_t *t)
+ void add_incomplete(type_t *t)
+ {
+ struct typenode *tn = xmalloc(sizeof *tn);
++ assert(is_incomplete(t));
+ tn->type = t;
+ list_add_tail(&incomplete_types, &tn->entry);
+ }
+
+ static void fix_type(type_t *t)
+ {
+- if (type_is_alias(t) && is_incomplete(t)) {
+- type_t *ot = type_alias_get_aliasee(t);
+- fix_type(ot);
+- if (type_get_type_detect_alias(ot) == TYPE_STRUCT ||
+- type_get_type_detect_alias(ot) == TYPE_UNION ||
+- type_get_type_detect_alias(ot) == TYPE_ENCAPSULATED_UNION)
+- t->details.structure = ot->details.structure;
++ if (type_is_alias(t) && is_incomplete(t))
++ {
++ type_t *ot = type_alias_get_aliasee_type(t);
+ t->defined = ot->defined;
+ }
+ }
+@@ -6070,7 +6154,7 @@ static void fix_incomplete_types(type_t *complete_type)
+ {
+ if (type_is_equal(complete_type, tn->type))
+ {
+- tn->type->details.structure = complete_type->details.structure;
++ tn->type->details = complete_type->details;
+ list_remove(&tn->entry);
+ free(tn);
+ }
+@@ -6094,7 +6178,13 @@ static type_t *reg_typedefs(decl_spec_t *decl_spec, declarator_list_t *decls, at
+ type_get_type_detect_alias(type) == TYPE_ENCAPSULATED_UNION)
+ {
+ if (!type->name)
++ {
+ type->name = gen_name();
++ /* the generated name will be used and this typedef excluded from the
++ * built typelib unless the typedef has the 'public' attribute, so add it here */
++ if (do_typelib && !is_attr(attrs, ATTR_PUBLIC))
++ attrs = append_attr(attrs, make_attr(ATTR_PUBLIC));
++ }
+
+ /* replace existing attributes when generating a typelib */
+ if (do_typelib)
+@@ -6120,12 +6210,12 @@ static type_t *reg_typedefs(decl_spec_t *decl_spec, declarator_list_t *decls, at
+ * for cleaner solution.
+ */
+ if (cur && input_name == cur->loc_info.input_name)
+- error_loc("%s: redefinition error; original definition was at %s:%d\n",
++ error_loc("FOO %s: redefinition error; original definition was at %s:%d\n",
+ cur->name, cur->loc_info.input_name,
+ cur->loc_info.line_number);
+
+ name = declare_var(attrs, decl_spec, decl, 0);
+- cur = type_new_alias(name->type, name->name);
++ cur = type_new_alias(&name->declspec, name->name);
+ cur->attrs = attrs;
+
+ if (is_incomplete(cur))
+@@ -6140,6 +6230,8 @@ type_t *find_type(const char *name, struct namespace *namespace, int t)
+ {
+ struct rtype *cur;
+
++ printf("find_type { name : %s, namespace %s, type : %s }\n", name, namespace ? namespace->name : NULL, ts_to_str(t));
++
+ if(namespace && namespace != &global_namespace) {
+ for(cur = namespace->type_hash[hash_ident(name)]; cur; cur = cur->next) {
+ if(cur->t == t && !strcmp(cur->name, name))
+@@ -6293,7 +6385,6 @@ struct allowed_attr allowed_attr[] =
+ /* ATTR_CASE */ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, "case" },
+ /* ATTR_CODE */ { 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "code" },
+ /* ATTR_COMMSTATUS */ { 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "comm_status" },
+- /* ATTR_CONST */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "const" },
+ /* ATTR_CONTEXTHANDLE */ { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "context_handle" },
+ /* ATTR_CONTROL */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, "control" },
+ /* ATTR_DECODE */ { 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "decode" },
+@@ -6328,7 +6419,6 @@ struct allowed_attr allowed_attr[] =
+ /* ATTR_IMMEDIATEBIND */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "immediatebind" },
+ /* ATTR_IMPLICIT_HANDLE */ { 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "implicit_handle" },
+ /* ATTR_IN */ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "in" },
+- /* ATTR_INLINE */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "inline" },
+ /* ATTR_INPUTSYNC */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "inputsync" },
+ /* ATTR_LENGTHIS */ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, "length_is" },
+ /* ATTR_LIBLCID */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, "lcid" },
+@@ -6400,10 +6490,10 @@ static attr_list_t *check_iface_attrs(const char *name, attr_list_t *attrs)
+ if (attr->type == ATTR_IMPLICIT_HANDLE)
+ {
+ const var_t *var = attr->u.pval;
+- if (type_get_type( var->type) == TYPE_BASIC &&
+- type_basic_get_type( var->type ) == TYPE_BASIC_HANDLE)
++ if (type_get_type( var->declspec.type) == TYPE_BASIC &&
++ type_basic_get_type( var->declspec.type ) == TYPE_BASIC_HANDLE)
+ continue;
+- if (is_aliaschain_attr( var->type, ATTR_HANDLE ))
++ if (is_aliaschain_attr( var->declspec.type, ATTR_HANDLE ))
+ continue;
+ error_loc("attribute %s requires a handle type in interface %s\n",
+ allowed_attr[attr->type].display_name, name);
+@@ -6608,7 +6698,7 @@ static int is_ptr_guid_type(const type_t *type)
+
+ /* second, make sure it is a pointer to something of size sizeof(GUID),
+ * i.e. 16 bytes */
+- return (type_memsize(type_pointer_get_ref(type)) == 16);
++ return (type_memsize(type_pointer_get_ref_type(type)) == 16);
+ }
+
+ static void check_conformance_expr_list(const char *attr_name, const var_t *arg, const type_t *container_type, expr_list_t *expr_list)
+@@ -6635,7 +6725,7 @@ static void check_remoting_fields(const var_t *var, type_t *type);
+ static void check_field_common(const type_t *container_type,
+ const char *container_name, const var_t *arg)
+ {
+- type_t *type = arg->type;
++ type_t *type = arg->declspec.type;
+ int more_to_do;
+ const char *container_type_name;
+ const char *var_type;
+@@ -6665,7 +6755,7 @@ static void check_field_common(const type_t *container_type,
+ }
+
+ if (is_attr(arg->attrs, ATTR_LENGTHIS) &&
+- (is_attr(arg->attrs, ATTR_STRING) || is_aliaschain_attr(arg->type, ATTR_STRING)))
++ (is_attr(arg->attrs, ATTR_STRING) || is_aliaschain_attr(arg->declspec.type, ATTR_STRING)))
+ error_loc_info(&arg->loc_info,
+ "string and length_is specified for argument %s are mutually exclusive attributes\n",
+ arg->name);
+@@ -6762,23 +6852,28 @@ static void check_field_common(const type_t *container_type,
+ {
+ const type_t *t = type;
+ while (is_ptr(t))
+- t = type_pointer_get_ref(t);
++ t = type_pointer_get_ref_type(t);
+ if (is_aliaschain_attr(t, ATTR_RANGE))
+ warning_loc_info(&arg->loc_info, "%s: range not verified for a string of ranged types\n", arg->name);
+ break;
+ }
+ case TGT_POINTER:
+- type = type_pointer_get_ref(type);
++ type = type_pointer_get_ref_type(type);
+ more_to_do = TRUE;
+ break;
+ case TGT_ARRAY:
+- type = type_array_get_element(type);
++ type = type_array_get_element_type(type);
+ more_to_do = TRUE;
+ break;
++ case TGT_ENUM:
++ type = type_get_real_type(type);
++ if(!type_is_complete(type))
++ {
++ error_loc_info(&arg->loc_info, "undefined type declaration enum %s\n", type->name);
++ }
+ case TGT_USER_TYPE:
+ case TGT_IFACE_POINTER:
+ case TGT_BASIC:
+- case TGT_ENUM:
+ case TGT_RANGE:
+ /* nothing to do */
+ break;
+@@ -6803,13 +6898,18 @@ static void check_remoting_fields(const var_t *var, type_t *type)
+ if (type_is_complete(type))
+ fields = type_struct_get_fields(type);
+ else
+- error_loc_info(&var->loc_info, "undefined type declaration %s\n", type->name);
++ error_loc_info(&var->loc_info, "undefined type declaration struct %s\n", type->name);
+ }
+ else if (type_get_type(type) == TYPE_UNION || type_get_type(type) == TYPE_ENCAPSULATED_UNION)
+- fields = type_union_get_cases(type);
++ {
++ if (type_is_complete(type))
++ fields = type_union_get_cases(type);
++ else
++ error_loc_info(&var->loc_info, "undefined type declaration union %s\n", type->name);
++ }
+
+ if (fields) LIST_FOR_EACH_ENTRY( field, fields, const var_t, entry )
+- if (field->type) check_field_common(type, type->name, field);
++ if (field->declspec.type) check_field_common(type, type->name, field);
+ }
+
+ /* checks that arguments for a function make sense for marshalling and unmarshalling */
+@@ -6818,9 +6918,10 @@ static void check_remoting_args(const var_t *func)
+ const char *funcname = func->name;
+ const var_t *arg;
+
+- if (func->type->details.function->args) LIST_FOR_EACH_ENTRY( arg, func->type->details.function->args, const var_t, entry )
++ assert(type_get_type_detect_alias(func->declspec.type) == TYPE_FUNCTION);
++ if (func->declspec.type->details.function->args) LIST_FOR_EACH_ENTRY( arg, func->declspec.type->details.function->args, const var_t, entry )
+ {
+- const type_t *type = arg->type;
++ const type_t *type = arg->declspec.type;
+
+ /* check that [out] parameters have enough pointer levels */
+ if (is_attr(arg->attrs, ATTR_OUT))
+@@ -6860,16 +6961,16 @@ static void check_remoting_args(const var_t *func)
+ }
+ }
+
+- check_field_common(func->type, funcname, arg);
++ check_field_common(func->declspec.type, funcname, arg);
+ }
+
+- if (type_get_type(type_function_get_rettype(func->type)) != TYPE_VOID)
++ if (type_get_type(type_function_get_rettype(func->declspec.type)) != TYPE_VOID)
+ {
+ var_t var;
+ var = *func;
+- var.type = type_function_get_rettype(func->type);
++ var.declspec.type = type_function_get_rettype(func->declspec.type);
+ var.name = xstrdup("return value");
+- check_field_common(func->type, funcname, &var);
++ check_field_common(func->declspec.type, funcname, &var);
+ free(var.name);
+ }
+ }
+@@ -6886,8 +6987,8 @@ static void add_explicit_handle_if_necessary(const type_t *iface, var_t *func)
+ * function */
+ var_t *idl_handle = make_var(xstrdup("IDL_handle"));
+ idl_handle->attrs = append_attr(NULL, make_attr(ATTR_IN));
+- idl_handle->type = find_type_or_error("handle_t", 0);
+- type_function_add_head_arg(func->type, idl_handle);
++ idl_handle->declspec.type = find_type_or_error("handle_t", 0);
++ type_function_add_head_arg(func->declspec.type, idl_handle);
+ }
+ }
+
+@@ -6952,6 +7053,7 @@ static void check_async_uuid(type_t *iface)
+ type_t *async_iface;
+ type_t *inherit;
+
++ assert(type_get_type_detect_alias(iface) == TYPE_INTERFACE);
+ if (!is_attr(iface->attrs, ATTR_ASYNCUUID)) return;
+
+ inherit = iface->details.iface->inherit;
+@@ -6968,7 +7070,8 @@ static void check_async_uuid(type_t *iface)
+ var_t *begin_func, *finish_func, *func = stmt->u.var, *arg;
+ var_list_t *begin_args = NULL, *finish_args = NULL, *args;
+
+- args = func->type->details.function->args;
++ assert(type_get_type_detect_alias(func->declspec.type) == TYPE_FUNCTION);
++ args = func->declspec.type->details.function->args;
+ if (args) LIST_FOR_EACH_ENTRY(arg, args, var_t, entry)
+ {
+ if (is_attr(arg->attrs, ATTR_IN) || !is_attr(arg->attrs, ATTR_OUT))
+@@ -6978,15 +7081,15 @@ static void check_async_uuid(type_t *iface)
+ }
+
+ begin_func = copy_var(func, concat_str("Begin_", func->name), NULL);
+- begin_func->type = type_new_function(begin_args);
+- begin_func->type->attrs = func->attrs;
+- begin_func->type->details.function->retval = func->type->details.function->retval;
++ begin_func->declspec.type = type_new_function(begin_args);
++ begin_func->declspec.type->attrs = func->attrs;
++ begin_func->declspec.type->details.function->retval = func->declspec.type->details.function->retval;
+ stmts = append_statement(stmts, make_statement_declaration(begin_func));
+
+ finish_func = copy_var(func, concat_str("Finish_", func->name), NULL);
+- finish_func->type = type_new_function(finish_args);
+- finish_func->type->attrs = func->attrs;
+- finish_func->type->details.function->retval = func->type->details.function->retval;
++ finish_func->declspec.type = type_new_function(finish_args);
++ finish_func->declspec.type->attrs = func->attrs;
++ finish_func->declspec.type->details.function->retval = func->declspec.type->details.function->retval;
+ stmts = append_statement(stmts, make_statement_declaration(finish_func));
+ }
+
+@@ -7026,6 +7129,7 @@ static void check_statements(const statement_list_t *stmts, int is_inside_librar
+ static void check_all_user_types(const statement_list_t *stmts)
+ {
+ const statement_t *stmt;
++ const var_t *v;
+
+ if (stmts) LIST_FOR_EACH_ENTRY(stmt, stmts, const statement_t, entry)
+ {
+@@ -7037,7 +7141,11 @@ static void check_all_user_types(const statement_list_t *stmts)
+ const statement_t *stmt_func;
+ STATEMENTS_FOR_EACH_FUNC(stmt_func, type_iface_get_stmts(stmt->u.type)) {
+ const var_t *func = stmt_func->u.var;
+- check_for_additional_prototype_types(func->type->details.function->args);
++ assert(type_get_type_detect_alias(func->declspec.type) == TYPE_FUNCTION);
++ if (func->declspec.type->details.function->args)
++ LIST_FOR_EACH_ENTRY( v, func->declspec.type->details.function->args, const var_t, entry )
++ check_for_additional_prototype_types(v->declspec.type);
++ check_for_additional_prototype_types(type_function_get_rettype(func->declspec.type));
+ }
+ }
+ }
+@@ -7071,6 +7179,10 @@ static statement_t *make_statement_type_decl(type_t *type)
+ {
+ statement_t *stmt = make_statement(STMT_TYPE);
+ stmt->u.type = type;
++ if (type_is_defined(type))
++ {
++ stmt->declonly = FALSE;
++ }
+ return stmt;
+ }
+
+@@ -7085,16 +7197,16 @@ static statement_t *make_statement_declaration(var_t *var)
+ {
+ statement_t *stmt = make_statement(STMT_DECLARATION);
+ stmt->u.var = var;
+- if (var->stgclass == STG_EXTERN && var->eval)
++ if (var->declspec.stgclass == STG_EXTERN && var->eval)
+ warning("'%s' initialised and declared extern\n", var->name);
+ if (is_const_decl(var))
+ {
+ if (var->eval)
+ reg_const(var);
+ }
+- else if (type_get_type(var->type) == TYPE_FUNCTION)
++ else if (type_get_type(var->declspec.type) == TYPE_FUNCTION)
+ check_function_attrs(var->name, var->attrs);
+- else if (var->stgclass == STG_NONE || var->stgclass == STG_REGISTER)
++ else if (var->declspec.stgclass == STG_NONE || var->declspec.stgclass == STG_REGISTER)
+ error_loc("instantiation of data is illegal\n");
+ return stmt;
+ }
+@@ -7146,6 +7258,7 @@ static statement_t *make_statement_typedef(declarator_list_t *decls)
+ declarator_t *decl, *next;
+ statement_t *stmt;
+ type_list_t **type_list;
++ int defined = TRUE;
+
+ if (!decls) return NULL;
+
+@@ -7157,6 +7270,18 @@ static statement_t *make_statement_typedef(declarator_list_t *decls)
+ {
+ var_t *var = decl->var;
+ type_t *type = find_type_or_error(var->name, 0);
++
++ /* ensure that all of the types in this typedef statement have been defined
++ * before setting its declonly flag */
++ if (type_is_pointerish(type))
++ {
++ defined = defined & type_is_defined(type_get_pointer_chain_tail(type));
++ }
++ else
++ {
++ defined = defined & type_is_defined(type_get_real_type(type));
++ }
++
+ *type_list = xmalloc(sizeof(type_list_t));
+ (*type_list)->type = type;
+ (*type_list)->next = NULL;
+@@ -7166,6 +7291,7 @@ static statement_t *make_statement_typedef(declarator_list_t *decls)
+ free(var);
+ }
+
++ stmt->declonly = !defined;
+ return stmt;
+ }
+
+@@ -7206,7 +7332,7 @@ void init_loc_info(loc_info_t *i)
+
+ static void check_def(const type_t *t)
+ {
+- if (t->defined)
+- error_loc("%s: redefinition error; original definition was at %s:%d\n",
++ if (type_is_defined(t))
++ error_loc("BAR %s: redefinition error; original definition was at %s:%d\n",
+ t->name, t->loc_info.input_name, t->loc_info.line_number);
+ }
+diff --git a/mingw-w64-tools/widl/src/parser.tab.h b/mingw-w64-tools/widl/src/parser.tab.h
+index 09874726..fc7a8f4d 100644
+--- a/mingw-w64-tools/widl/src/parser.tab.h
++++ b/mingw-w64-tools/widl/src/parser.tab.h
+@@ -1,8 +1,8 @@
+-/* A Bison parser, made by GNU Bison 3.0.5. */
++/* A Bison parser, made by GNU Bison 3.0.4. */
+
+ /* Bison interface for Yacc-like parsers in C
+
+- Copyright (C) 1984, 1989-1990, 2000-2015, 2018 Free Software Foundation, Inc.
++ Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+@@ -239,7 +239,7 @@ extern int parser_debug;
+
+ union YYSTYPE
+ {
+-#line 142 "parser.y" /* yacc.c:1910 */
++#line 136 "parser.y" /* yacc.c:1909 */
+
+ attr_t *attr;
+ attr_list_t *attr_list;
+@@ -266,8 +266,10 @@ union YYSTYPE
+ struct _import_t *import;
+ struct _decl_spec_t *declspec;
+ enum storage_class stgclass;
++ enum type_qualifier typequalifier;
++ enum function_specifier funcspecifier;
+
+-#line 271 "parser.tab.h" /* yacc.c:1910 */
++#line 273 "parser.tab.h" /* yacc.c:1909 */
+ };
+
+ typedef union YYSTYPE YYSTYPE;
+diff --git a/mingw-w64-tools/widl/src/parser.y b/mingw-w64-tools/widl/src/parser.y
+index d9793941..bb14bf76 100644
+--- a/mingw-w64-tools/widl/src/parser.y
++++ b/mingw-w64-tools/widl/src/parser.y
+@@ -52,13 +52,6 @@ struct _import_t
+ int import_performed;
+ };
+
+-typedef struct _decl_spec_t
+-{
+- type_t *type;
+- attr_list_t *attrs;
+- enum storage_class stgclass;
+-} decl_spec_t;
+-
+ typelist_t incomplete_types = LIST_INIT(incomplete_types);
+
+ static void fix_incomplete(void);
+@@ -67,7 +60,7 @@ static void fix_incomplete_types(type_t *complete_type);
+ static str_list_t *append_str(str_list_t *list, char *str);
+ static attr_list_t *append_attr(attr_list_t *list, attr_t *attr);
+ static attr_list_t *append_attr_list(attr_list_t *new_list, attr_list_t *old_list);
+-static decl_spec_t *make_decl_spec(type_t *type, decl_spec_t *left, decl_spec_t *right, attr_t *attr, enum storage_class stgclass);
++static decl_spec_t *make_decl_spec(type_t *type, decl_spec_t *left, decl_spec_t *right, enum storage_class stgclass, enum type_qualifier typequalifier, enum function_specifier funcspecifier);
+ static attr_t *make_attr(enum attr_type type);
+ static attr_t *make_attrv(enum attr_type type, unsigned int val);
+ static attr_t *make_attrp(enum attr_type type, void *val);
+@@ -83,6 +76,7 @@ static declarator_t *make_declarator(var_t *var);
+ static type_t *make_safearray(type_t *type);
+ static typelib_t *make_library(const char *name, const attr_list_t *attrs);
+ static type_t *append_chain_type(type_t *chain, type_t *type);
++static decl_spec_t *append_chain_declspec(decl_spec_t *chain, type_t *type, enum type_qualifier typequalifier);
+ static warning_list_t *append_warning(warning_list_t *, int);
+
+ static type_t *reg_typedefs(decl_spec_t *decl_spec, var_list_t *names, attr_list_t *attrs);
+@@ -165,6 +159,8 @@ static typelib_t *current_typelib;
+ struct _import_t *import;
+ struct _decl_spec_t *declspec;
+ enum storage_class stgclass;
++ enum type_qualifier typequalifier;
++ enum function_specifier funcspecifier;
+ }
+
+ %token <str> aIDENTIFIER aPRAGMA
+@@ -266,14 +262,16 @@ static typelib_t *current_typelib;
+ %token tWCHAR tWIREMARSHAL
+ %token tAPARTMENT tNEUTRAL tSINGLE tFREE tBOTH
+
+-%type <attr> attribute type_qualifier function_specifier acf_attribute
+-%type <attr_list> m_attributes attributes attrib_list m_type_qual_list
++%type <attr> attribute acf_attribute
++%type <attr_list> m_attributes attributes attrib_list
+ %type <attr_list> acf_attributes acf_attribute_list
+ %type <str_list> str_list
+ %type <expr> m_expr expr expr_const expr_int_const array m_bitfield
+ %type <expr_list> m_exprs /* exprs expr_list */ expr_list_int_const
+ %type <ifinfo> interfacehdr
+ %type <stgclass> storage_cls_spec
++%type <typequalifier> type_qualifier m_type_qual_bits
++%type <funcspecifier> function_specifier
+ %type <declspec> decl_spec decl_spec_no_type m_decl_spec_no_type
+ %type <type> inherit interface interfacedef interfacedec
+ %type <type> dispinterface dispinterfacehdr dispinterfacedef
+@@ -318,7 +316,7 @@ static typelib_t *current_typelib;
+ %right '!' '~' CAST PPTR POS NEG ADDRESSOF tSIZEOF
+ %left '.' MEMBERPTR '[' ']'
+
+-%error-verbose
++%define parse.error verbose
+
+ %%
+
+@@ -651,10 +649,10 @@ enum_list: enum { if (!$1->eval)
+
+ enum: ident '=' expr_int_const { $$ = reg_const($1);
+ $$->eval = $3;
+- $$->type = type_new_int(TYPE_BASIC_INT, 0);
++ $$->declspec.type = type_new_int(TYPE_BASIC_INT, 0);
+ }
+ | ident { $$ = reg_const($1);
+- $$->type = type_new_int(TYPE_BASIC_INT, 0);
++ $$->declspec.type = type_new_int(TYPE_BASIC_INT, 0);
+ }
+ ;
+
+@@ -740,7 +738,7 @@ field: m_attributes decl_spec struct_declarator_list ';'
+ $$ = set_var_types($1, $2, $3);
+ }
+ | m_attributes uniondef ';' { var_t *v = make_var(NULL);
+- v->type = $2; v->attrs = $1;
++ v->declspec.type = $2; v->attrs = $1;
+ $$ = append_var(NULL, v);
+ }
+ ;
+@@ -764,13 +762,13 @@ s_field: m_attributes decl_spec declarator { $$ = declare_var(check_field_attrs
+ free($3);
+ }
+ | m_attributes structdef { var_t *v = make_var(NULL);
+- v->type = $2; v->attrs = $1;
++ v->declspec.type = $2; v->attrs = $1;
+ $$ = v;
+ }
+ ;
+
+ funcdef: declaration { $$ = $1;
+- if (type_get_type($$->type) != TYPE_FUNCTION)
++ if (type_get_type($$->declspec.type) != TYPE_FUNCTION)
+ error_loc("only methods may be declared inside the methods section of a dispinterface\n");
+ check_function_attrs($$->name, $$->attrs);
+ }
+@@ -955,20 +953,20 @@ storage_cls_spec:
+ ;
+
+ function_specifier:
+- tINLINE { $$ = make_attr(ATTR_INLINE); }
++ tINLINE { $$ = FUNCTION_SPECIFIER_INLINE; }
+ ;
+
+ type_qualifier:
+- tCONST { $$ = make_attr(ATTR_CONST); }
++ tCONST { $$ = TYPE_QUALIFIER_CONST; }
+ ;
+
+-m_type_qual_list: { $$ = NULL; }
+- | m_type_qual_list type_qualifier { $$ = append_attr($1, $2); }
++m_type_qual_bits: { $$ = TYPE_QUALIFIER_NONE; }
++ | m_type_qual_bits type_qualifier { $$ = $1 | $2; }
+ ;
+
+-decl_spec: type m_decl_spec_no_type { $$ = make_decl_spec($1, $2, NULL, NULL, STG_NONE); }
++decl_spec: type m_decl_spec_no_type { $$ = make_decl_spec($1, $2, NULL, STG_NONE, TYPE_QUALIFIER_NONE, FUNCTION_SPECIFIER_NONE); }
+ | decl_spec_no_type type m_decl_spec_no_type
+- { $$ = make_decl_spec($2, $1, $3, NULL, STG_NONE); }
++ { $$ = make_decl_spec($2, $1, $3, STG_NONE, TYPE_QUALIFIER_NONE, FUNCTION_SPECIFIER_NONE); }
+ ;
+
+ m_decl_spec_no_type: { $$ = NULL; }
+@@ -976,44 +974,44 @@ m_decl_spec_no_type: { $$ = NULL; }
+ ;
+
+ decl_spec_no_type:
+- type_qualifier m_decl_spec_no_type { $$ = make_decl_spec(NULL, $2, NULL, $1, STG_NONE); }
+- | function_specifier m_decl_spec_no_type { $$ = make_decl_spec(NULL, $2, NULL, $1, STG_NONE); }
+- | storage_cls_spec m_decl_spec_no_type { $$ = make_decl_spec(NULL, $2, NULL, NULL, $1); }
++ type_qualifier m_decl_spec_no_type { $$ = make_decl_spec(NULL, $2, NULL, STG_NONE, $1, FUNCTION_SPECIFIER_NONE); }
++ | function_specifier m_decl_spec_no_type { $$ = make_decl_spec(NULL, $2, NULL, STG_NONE, TYPE_QUALIFIER_NONE, $1); }
++ | storage_cls_spec m_decl_spec_no_type { $$ = make_decl_spec(NULL, $2, NULL, $1, TYPE_QUALIFIER_NONE, FUNCTION_SPECIFIER_NONE); }
+ ;
+
+ declarator:
+- '*' m_type_qual_list declarator %prec PPTR
+- { $$ = $3; $$->type = append_chain_type($$->type, type_new_pointer(pointer_default, NULL, $2)); }
++ '*' m_type_qual_bits declarator %prec PPTR
++ { $$ = $3; append_chain_declspec(&$$->declspec, type_new_pointer(pointer_default, NULL), $2); }
+ | callconv declarator { $$ = $2; if ($$->func_type) $$->func_type->attrs = append_attr($$->func_type->attrs, make_attrp(ATTR_CALLCONV, $1));
+- else if ($$->type) $$->type->attrs = append_attr($$->type->attrs, make_attrp(ATTR_CALLCONV, $1)); }
++ else if ($$->declspec.type) $$->declspec.type->attrs = append_attr($$->declspec.type->attrs, make_attrp(ATTR_CALLCONV, $1)); }
+ | direct_declarator
+ ;
+
+ direct_declarator:
+ ident { $$ = make_declarator($1); }
+ | '(' declarator ')' { $$ = $2; }
+- | direct_declarator array { $$ = $1; $$->type = append_array($$->type, $2); }
++ | direct_declarator array { $$ = $1; $$->declspec.type = append_array($$->declspec.type, $2); }
+ | direct_declarator '(' m_args ')' { $$ = $1;
+- $$->func_type = append_chain_type($$->type, type_new_function($3));
+- $$->type = NULL;
++ $$->func_type = append_chain_type($$->declspec.type, type_new_function($3));
++ $$->declspec.type = NULL;
+ }
+ ;
+
+ /* abstract declarator */
+ abstract_declarator:
+- '*' m_type_qual_list m_abstract_declarator %prec PPTR
+- { $$ = $3; $$->type = append_chain_type($$->type, type_new_pointer(pointer_default, NULL, $2)); }
++ '*' m_type_qual_bits m_abstract_declarator %prec PPTR
++ { $$ = $3; append_chain_declspec(&$$->declspec, type_new_pointer(pointer_default, NULL), $2); }
+ | callconv m_abstract_declarator { $$ = $2; if ($$->func_type) $$->func_type->attrs = append_attr($$->func_type->attrs, make_attrp(ATTR_CALLCONV, $1));
+- else if ($$->type) $$->type->attrs = append_attr($$->type->attrs, make_attrp(ATTR_CALLCONV, $1)); }
++ else if ($$->declspec.type) $$->declspec.type->attrs = append_attr($$->declspec.type->attrs, make_attrp(ATTR_CALLCONV, $1)); }
+ | abstract_direct_declarator
+ ;
+
+ /* abstract declarator without accepting direct declarator */
+ abstract_declarator_no_direct:
+- '*' m_type_qual_list m_any_declarator %prec PPTR
+- { $$ = $3; $$->type = append_chain_type($$->type, type_new_pointer(pointer_default, NULL, $2)); }
++ '*' m_type_qual_bits m_any_declarator %prec PPTR
++ { $$ = $3; append_chain_declspec(&$$->declspec, type_new_pointer(pointer_default, NULL), $2); }
+ | callconv m_any_declarator { $$ = $2; if ($$->func_type) $$->func_type->attrs = append_attr($$->func_type->attrs, make_attrp(ATTR_CALLCONV, $1));
+- else if ($$->type) $$->type->attrs = append_attr($$->type->attrs, make_attrp(ATTR_CALLCONV, $1)); }
++ else if ($$->declspec.type) $$->declspec.type->attrs = append_attr($$->declspec.type->attrs, make_attrp(ATTR_CALLCONV, $1)); }
+ ;
+
+ /* abstract declarator or empty */
+@@ -1024,33 +1022,33 @@ m_abstract_declarator: { $$ = make_declarator(NULL); }
+ /* abstract direct declarator */
+ abstract_direct_declarator:
+ '(' abstract_declarator_no_direct ')' { $$ = $2; }
+- | abstract_direct_declarator array { $$ = $1; $$->type = append_array($$->type, $2); }
+- | array { $$ = make_declarator(NULL); $$->type = append_array($$->type, $1); }
++ | abstract_direct_declarator array { $$ = $1; $$->declspec.type = append_array($$->declspec.type, $2); }
++ | array { $$ = make_declarator(NULL); $$->declspec.type = append_array($$->declspec.type, $1); }
+ | '(' m_args ')'
+ { $$ = make_declarator(NULL);
+- $$->func_type = append_chain_type($$->type, type_new_function($2));
+- $$->type = NULL;
++ $$->func_type = append_chain_type($$->declspec.type, type_new_function($2));
++ $$->declspec.type = NULL;
+ }
+ | abstract_direct_declarator '(' m_args ')'
+ { $$ = $1;
+- $$->func_type = append_chain_type($$->type, type_new_function($3));
+- $$->type = NULL;
++ $$->func_type = append_chain_type($$->declspec.type, type_new_function($3));
++ $$->declspec.type = NULL;
+ }
+ ;
+
+ /* abstract or non-abstract declarator */
+ any_declarator:
+- '*' m_type_qual_list m_any_declarator %prec PPTR
+- { $$ = $3; $$->type = append_chain_type($$->type, type_new_pointer(pointer_default, NULL, $2)); }
+- | callconv m_any_declarator { $$ = $2; $$->type->attrs = append_attr($$->type->attrs, make_attrp(ATTR_CALLCONV, $1)); }
++ '*' m_type_qual_bits m_any_declarator %prec PPTR
++ { $$ = $3; append_chain_declspec(&$$->declspec, type_new_pointer(pointer_default, NULL), $2); }
++ | callconv m_any_declarator { $$ = $2; $$->declspec.type->attrs = append_attr($$->declspec.type->attrs, make_attrp(ATTR_CALLCONV, $1)); }
+ | any_direct_declarator
+ ;
+
+ /* abstract or non-abstract declarator without accepting direct declarator */
+ any_declarator_no_direct:
+- '*' m_type_qual_list m_any_declarator %prec PPTR
+- { $$ = $3; $$->type = append_chain_type($$->type, type_new_pointer(pointer_default, NULL, $2)); }
+- | callconv m_any_declarator { $$ = $2; $$->type->attrs = append_attr($$->type->attrs, make_attrp(ATTR_CALLCONV, $1)); }
++ '*' m_type_qual_bits m_any_declarator %prec PPTR
++ { $$ = $3; append_chain_declspec(&$$->declspec, type_new_pointer(pointer_default, NULL), $2); }
++ | callconv m_any_declarator { $$ = $2; $$->declspec.type->attrs = append_attr($$->declspec.type->attrs, make_attrp(ATTR_CALLCONV, $1)); }
+ ;
+
+ /* abstract or non-abstract declarator or empty */
+@@ -1064,17 +1062,17 @@ m_any_declarator: { $$ = make_declarator(NULL); }
+ any_direct_declarator:
+ ident { $$ = make_declarator($1); }
+ | '(' any_declarator_no_direct ')' { $$ = $2; }
+- | any_direct_declarator array { $$ = $1; $$->type = append_array($$->type, $2); }
+- | array { $$ = make_declarator(NULL); $$->type = append_array($$->type, $1); }
++ | any_direct_declarator array { $$ = $1; $$->declspec.type = append_array($$->declspec.type, $2); }
++ | array { $$ = make_declarator(NULL); $$->declspec.type = append_array($$->declspec.type, $1); }
+ | '(' m_args ')'
+ { $$ = make_declarator(NULL);
+- $$->func_type = append_chain_type($$->type, type_new_function($2));
+- $$->type = NULL;
++ $$->func_type = append_chain_type($$->declspec.type, type_new_function($2));
++ $$->declspec.type = NULL;
+ }
+ | any_direct_declarator '(' m_args ')'
+ { $$ = $1;
+- $$->func_type = append_chain_type($$->type, type_new_function($3));
+- $$->type = NULL;
++ $$->func_type = append_chain_type($$->declspec.type, type_new_function($3));
++ $$->declspec.type = NULL;
+ }
+ ;
+
+@@ -1197,7 +1195,8 @@ static void decl_builtin_basic(const char *name, enum type_basic_type type)
+
+ static void decl_builtin_alias(const char *name, type_t *t)
+ {
+- reg_type(type_new_alias(t, name), name, NULL, 0);
++ decl_spec_t ds;
++ reg_type(type_new_alias(init_declspec(&ds, t), name), name, &global_namespace, 0);
+ }
+
+ void init_types(void)
+@@ -1208,7 +1207,7 @@ void init_types(void)
+ decl_builtin_basic("double", TYPE_BASIC_DOUBLE);
+ decl_builtin_basic("error_status_t", TYPE_BASIC_ERROR_STATUS_T);
+ decl_builtin_basic("handle_t", TYPE_BASIC_HANDLE);
+- decl_builtin_alias("boolean", type_new_basic(TYPE_BASIC_BYTE));
++ decl_builtin_alias("boolean", type_new_basic(TYPE_BASIC_CHAR));
+ }
+
+ static str_list_t *append_str(str_list_t *list, char *str)
+@@ -1239,6 +1238,7 @@ static attr_list_t *append_attr(attr_list_t *list, attr_t *attr)
+ LIST_FOR_EACH_ENTRY(attr_existing, list, attr_t, entry)
+ if (attr_existing->type == attr->type)
+ {
++ __builtin_trap();
+ parser_warning("duplicate attribute %s\n", get_attr_display_name(attr->type));
+ /* use the last attribute, like MIDL does */
+ list_remove(&attr_existing->entry);
+@@ -1298,53 +1298,73 @@ static attr_list_t *map_attrs(const attr_list_t *list, map_attrs_filter_t filter
+ return new_list;
+ }
+
+-static decl_spec_t *make_decl_spec(type_t *type, decl_spec_t *left, decl_spec_t *right, attr_t *attr, enum storage_class stgclass)
++static decl_spec_t *make_decl_spec(type_t *type, decl_spec_t *left, decl_spec_t *right, enum storage_class stgclass, enum type_qualifier typequalifier, enum function_specifier funcspecifier)
+ {
+ decl_spec_t *declspec = left ? left : right;
+ if (!declspec)
+ {
+ declspec = xmalloc(sizeof(*declspec));
+ declspec->type = NULL;
+- declspec->attrs = NULL;
+ declspec->stgclass = STG_NONE;
++ declspec->typequalifier = TYPE_QUALIFIER_NONE;
++ declspec->funcspecifier = FUNCTION_SPECIFIER_NONE;
+ }
+ declspec->type = type;
+ if (left && declspec != left)
+ {
+- declspec->attrs = append_attr_list(declspec->attrs, left->attrs);
+ if (declspec->stgclass == STG_NONE)
+ declspec->stgclass = left->stgclass;
+ else if (left->stgclass != STG_NONE)
+ error_loc("only one storage class can be specified\n");
++
++ if (declspec->typequalifier == TYPE_QUALIFIER_NONE)
++ declspec->typequalifier = left->typequalifier;
++ else if (left->typequalifier != TYPE_QUALIFIER_NONE)
++ error_loc("only one type qualifier can be specified\n");
++
++ if (declspec->funcspecifier == FUNCTION_SPECIFIER_NONE)
++ declspec->funcspecifier = left->funcspecifier;
++ else if (left->funcspecifier != FUNCTION_SPECIFIER_NONE)
++ error_loc("only one function specifier can be specified\n");
++
+ assert(!left->type);
+ free(left);
+ }
+ if (right && declspec != right)
+ {
+- declspec->attrs = append_attr_list(declspec->attrs, right->attrs);
+ if (declspec->stgclass == STG_NONE)
+ declspec->stgclass = right->stgclass;
+ else if (right->stgclass != STG_NONE)
+ error_loc("only one storage class can be specified\n");
++
++ if (declspec->typequalifier == TYPE_QUALIFIER_NONE)
++ declspec->typequalifier = right->typequalifier;
++ else if (right->typequalifier != TYPE_QUALIFIER_NONE)
++ error_loc("only one type qualifier can be specified\n");
++
++ if (declspec->funcspecifier == FUNCTION_SPECIFIER_NONE)
++ declspec->funcspecifier = right->funcspecifier;
++ else if (right->funcspecifier != FUNCTION_SPECIFIER_NONE)
++ error_loc("only one function specifier can be specified\n");
++
+ assert(!right->type);
+ free(right);
+ }
+
+- declspec->attrs = append_attr(declspec->attrs, attr);
+ if (declspec->stgclass == STG_NONE)
+ declspec->stgclass = stgclass;
+ else if (stgclass != STG_NONE)
+ error_loc("only one storage class can be specified\n");
+
+- /* apply attributes to type */
+- if (type && declspec->attrs)
+- {
+- attr_list_t *attrs;
+- declspec->type = duptype(type, 1);
+- attrs = map_attrs(type->attrs, NULL);
+- declspec->type->attrs = append_attr_list(attrs, declspec->attrs);
+- declspec->attrs = NULL;
+- }
++ if (declspec->typequalifier == TYPE_QUALIFIER_NONE)
++ declspec->typequalifier = typequalifier;
++ else if (typequalifier != TYPE_QUALIFIER_NONE)
++ error_loc("only one type qualifier can be specified\n");
++
++ if (declspec->funcspecifier == FUNCTION_SPECIFIER_NONE)
++ declspec->funcspecifier = funcspecifier;
++ else if (funcspecifier != FUNCTION_SPECIFIER_NONE)
++ error_loc("only one function specifier can be specified\n");
+
+ return declspec;
+ }
+@@ -1430,6 +1450,7 @@ void clear_all_offsets(void)
+
+ static void type_function_add_head_arg(type_t *type, var_t *arg)
+ {
++ assert(type_get_type_detect_alias(type) == TYPE_FUNCTION);
+ if (!type->details.function->args)
+ {
+ type->details.function->args = xmalloc( sizeof(*type->details.function->args) );
+@@ -1474,31 +1495,60 @@ static int is_allowed_range_type(const type_t *type)
+ static type_t *get_array_or_ptr_ref(type_t *type)
+ {
+ if (is_ptr(type))
+- return type_pointer_get_ref(type);
++ return type_pointer_get_ref_type(type);
+ else if (is_array(type))
+- return type_array_get_element(type);
++ return type_array_get_element_type(type);
+ return NULL;
+ }
+
+ static type_t *append_chain_type(type_t *chain, type_t *type)
+ {
+- type_t *chain_type;
++ type_t *chain_type = NULL;
+
+ if (!chain)
+ return type;
+ for (chain_type = chain; get_array_or_ptr_ref(chain_type); chain_type = get_array_or_ptr_ref(chain_type))
+ ;
+
++ assert(!type_is_alias(chain_type));
+ if (is_ptr(chain_type))
+- chain_type->details.pointer.ref = type;
++ chain_type->details.pointer.ref.type = type;
+ else if (is_array(chain_type))
+- chain_type->details.array.elem = type;
++ chain_type->details.array.elem.type = type;
+ else
+ assert(0);
+
+ return chain;
+ }
+
++static decl_spec_t *append_chain_declspec(decl_spec_t *chain, type_t *type, enum type_qualifier typequalifier)
++{
++ type_t *chain_type = chain->type;
++ decl_spec_t *chain_declspec = NULL;
++
++ if (!chain_type)
++ {
++ chain->type = type;
++ chain->typequalifier = typequalifier;
++ return chain;
++ }
++
++ for(; get_array_or_ptr_ref(chain_type); chain_type = get_array_or_ptr_ref(chain_type))
++ ;
++
++ if (is_ptr(chain_type))
++ chain_declspec = &chain_type->details.pointer.ref;
++ else if (is_array(chain_type))
++ chain_declspec = &chain_type->details.array.elem;
++ else
++ assert(NULL);
++
++ chain_declspec->type = type;
++ chain_declspec->typequalifier = typequalifier;
++
++ return chain;
++}
++
+ static warning_list_t *append_warning(warning_list_t *list, int num)
+ {
+ warning_t *entry;
+@@ -1514,7 +1564,7 @@ static warning_list_t *append_warning(warning_list_t *list, int num)
+ return list;
+ }
+
+-static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const declarator_t *decl,
++static var_t *declare_var(attr_list_t *attrs, decl_spec_t *declspec, const declarator_t *decl,
+ int top)
+ {
+ var_t *v = decl->var;
+@@ -1523,58 +1573,80 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
+ expr_t *dim;
+ type_t **ptype;
+ type_t *func_type = decl ? decl->func_type : NULL;
+- type_t *type = decl_spec->type;
++ type_t *type = declspec->type;
+
+- if (is_attr(type->attrs, ATTR_INLINE))
+- {
++
++ if (declspec->funcspecifier == FUNCTION_SPECIFIER_INLINE) {
+ if (!func_type)
+ error_loc("inline attribute applied to non-function type\n");
+ else
+ {
+- type_t *t;
+- /* move inline attribute from return type node to function node */
+- for (t = func_type; is_ptr(t); t = type_pointer_get_ref(t))
+- ;
+- t->attrs = move_attr(t->attrs, type->attrs, ATTR_INLINE);
++ v->declspec.funcspecifier = declspec->funcspecifier;
+ }
+ }
+
+- /* add type onto the end of the pointers in pident->type */
+- v->type = append_chain_type(decl ? decl->type : NULL, type);
+- v->stgclass = decl_spec->stgclass;
++ /* if the var type is a pointerish, we need to move the type qualifier to the pointee's declspec
++ * unless the pointee already has const type qualifier*/
++ if (!decl)
++ {
++ /* simplest case, no pointers to deal with here */
++ v->declspec.typequalifier = declspec->typequalifier;
++ } else if (decl->bits)
++ {
++ /* dealing with a bitfield, generate bitfield and copy over typequalifier*/
++ v->declspec.type = type_new_bitfield(declspec->type, decl->bits);
++ v->declspec.typequalifier = declspec->typequalifier;
++ }
++ else
++ {
++ /* here we're dealing with a pointerish type chain, so we need to pull
++ * the typequalifier off of the declspec and stick them in the type's attr list
++ */
++ v->declspec.type = decl->declspec.type;
++ v->declspec.typequalifier = decl->declspec.typequalifier;
++ append_chain_declspec(&v->declspec, type, declspec->typequalifier);
++ }
++
++ v->declspec.stgclass = declspec->stgclass;
+ v->attrs = attrs;
+
+ /* check for pointer attribute being applied to non-pointer, non-array
+ * type */
+- if (!is_array(v->type))
++ if (!is_array(v->declspec.type))
+ {
+ int ptr_attr = get_attrv(v->attrs, ATTR_POINTERTYPE);
+ const type_t *ptr = NULL;
+ /* pointer attributes on the left side of the type belong to the function
+ * pointer, if one is being declared */
+- type_t **pt = func_type ? &func_type : &v->type;
++ type_t **pt = func_type ? &func_type : &v->declspec.type;
+ for (ptr = *pt; ptr && !ptr_attr; )
+ {
+ ptr_attr = get_attrv(ptr->attrs, ATTR_POINTERTYPE);
+ if (!ptr_attr && type_is_alias(ptr))
+- ptr = type_alias_get_aliasee(ptr);
++ ptr = type_alias_get_aliasee_type(ptr);
+ else
+ break;
+ }
+ if (is_ptr(ptr))
+ {
+ if (ptr_attr && ptr_attr != FC_UP &&
+- type_get_type(type_pointer_get_ref(ptr)) == TYPE_INTERFACE)
++ type_get_type(type_pointer_get_ref_type(ptr)) == TYPE_INTERFACE)
+ warning_loc_info(&v->loc_info,
+ "%s: pointer attribute applied to interface "
+ "pointer type has no effect\n", v->name);
+- if (!ptr_attr && top && (*pt)->details.pointer.def_fc != FC_RP)
++ if (!ptr_attr && top && type_pointer_get_default_fc(*pt) != FC_RP)
+ {
++ printf("dup_pointer_type!\n");
++ printf("type : %p name : %s\n", *pt, (*pt)->name);
++ /* ptr_attr is ref,unique or full (FC_RP, FC_UP, FC_FP) */
++ /* *pt could be the var's declspec's type OR a type on a typedef */
++ /* not an array */
++
+ /* FIXME: this is a horrible hack to cope with the issue that we
+ * store an offset to the typeformat string in the type object, but
+ * two typeformat strings may be written depending on whether the
+ * pointer is a toplevel parameter or not */
+- *pt = duptype(*pt, 1);
++ *pt = dup_pointer_type(*pt);
+ }
+ }
+ else if (ptr_attr)
+@@ -1585,16 +1657,16 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
+ {
+ type_t *t = type;
+
+- if (!is_ptr(v->type) && !is_array(v->type))
++ if (!is_ptr(v->declspec.type) && !is_array(v->declspec.type))
+ error_loc("'%s': [string] attribute applied to non-pointer, non-array type\n",
+ v->name);
+
+ for (;;)
+ {
+ if (is_ptr(t))
+- t = type_pointer_get_ref(t);
++ t = type_pointer_get_ref_type(t);
+ else if (is_array(t))
+- t = type_array_get_element(t);
++ t = type_array_get_element_type(t);
+ else
+ break;
+ }
+@@ -1611,15 +1683,15 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
+
+ if (is_attr(v->attrs, ATTR_V1ENUM))
+ {
+- if (type_get_type_detect_alias(v->type) != TYPE_ENUM)
++ if (type_get_type_detect_alias(v->declspec.type) != TYPE_ENUM)
+ error_loc("'%s': [v1_enum] attribute applied to non-enum type\n", v->name);
+ }
+
+- if (is_attr(v->attrs, ATTR_RANGE) && !is_allowed_range_type(v->type))
++ if (is_attr(v->attrs, ATTR_RANGE) && !is_allowed_range_type(v->declspec.type))
+ error_loc("'%s': [range] attribute applied to non-integer type\n",
+ v->name);
+
+- ptype = &v->type;
++ ptype = &v->declspec.type;
+ if (sizes) LIST_FOR_EACH_ENTRY(dim, sizes, expr_t, entry)
+ {
+ if (dim->type != EXPR_VOID)
+@@ -1632,7 +1704,7 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
+ else
+ *ptype = type_new_array((*ptype)->name,
+ type_array_get_element(*ptype), FALSE,
+- 0, dim, NULL, 0);
++ 0, dim, NULL, FC_RP);
+ }
+ else if (is_ptr(*ptype))
+ *ptype = type_new_array((*ptype)->name, type_pointer_get_ref(*ptype), TRUE,
+@@ -1641,15 +1713,16 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
+ error_loc("%s: size_is attribute applied to illegal type\n", v->name);
+ }
+
++ assert(!type_is_alias(*ptype));
+ if (is_ptr(*ptype))
+- ptype = &(*ptype)->details.pointer.ref;
++ ptype = &(*ptype)->details.pointer.ref.type;
+ else if (is_array(*ptype))
+- ptype = &(*ptype)->details.array.elem;
++ ptype = &(*ptype)->details.array.elem.type;
+ else
+ error_loc("%s: too many expressions in size_is attribute\n", v->name);
+ }
+
+- ptype = &v->type;
++ ptype = &v->declspec.type;
+ if (lengs) LIST_FOR_EACH_ENTRY(dim, lengs, expr_t, entry)
+ {
+ if (dim->type != EXPR_VOID)
+@@ -1667,10 +1740,11 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
+ error_loc("%s: length_is attribute applied to illegal type\n", v->name);
+ }
+
++ assert(!type_is_alias(*ptype));
+ if (is_ptr(*ptype))
+- ptype = &(*ptype)->details.pointer.ref;
++ ptype = &(*ptype)->details.pointer.ref.type;
+ else if (is_array(*ptype))
+- ptype = &(*ptype)->details.array.elem;
++ ptype = &(*ptype)->details.array.elem.type;
+ else
+ error_loc("%s: too many expressions in length_is attribute\n", v->name);
+ }
+@@ -1681,29 +1755,31 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
+ if (func_type)
+ {
+ type_t *ft, *t;
+- type_t *return_type = v->type;
+- v->type = func_type;
+- for (ft = v->type; is_ptr(ft); ft = type_pointer_get_ref(ft))
++ type_t *return_type = v->declspec.type;
++ enum type_qualifier typequalifier = v->declspec.typequalifier;
++
++ v->declspec.type = func_type;
++ v->declspec.typequalifier = TYPE_QUALIFIER_NONE;
++ for (ft = v->declspec.type; is_ptr(ft); ft = type_pointer_get_ref_type(ft))
+ ;
+ assert(type_get_type_detect_alias(ft) == TYPE_FUNCTION);
+ ft->details.function->retval = make_var(xstrdup("_RetVal"));
+- ft->details.function->retval->type = return_type;
++ ft->details.function->retval->declspec.type = return_type;
++ ft->details.function->retval->declspec.typequalifier = typequalifier;
++
+ /* move calling convention attribute, if present, from pointer nodes to
+ * function node */
+- for (t = v->type; is_ptr(t); t = type_pointer_get_ref(t))
++ for (t = v->declspec.type; is_ptr(t); t = type_pointer_get_ref_type(t))
+ ft->attrs = move_attr(ft->attrs, t->attrs, ATTR_CALLCONV);
+ }
+ else
+ {
+ type_t *t;
+- for (t = v->type; is_ptr(t); t = type_pointer_get_ref(t))
++ for (t = v->declspec.type; is_ptr(t); t = type_pointer_get_ref_type(t))
+ if (is_attr(t->attrs, ATTR_CALLCONV))
+ error_loc("calling convention applied to non-function-pointer type\n");
+ }
+
+- if (decl->bits)
+- v->type = type_new_bitfield(v->type, decl->bits);
+-
+ return v;
+ }
+
+@@ -1751,6 +1827,10 @@ var_list_t *append_var(var_list_t *list, var_t *var)
+ list_init( list );
+ }
+ list_add_tail( list, &var->entry );
++
++ if (var->declspec.type)
++ var->declonly = !type_is_defined(var->declspec.type);
++
+ return list;
+ }
+
+@@ -1770,11 +1850,11 @@ var_t *make_var(char *name)
+ {
+ var_t *v = xmalloc(sizeof(var_t));
+ v->name = name;
+- v->type = NULL;
++ init_declspec(&v->declspec, NULL);
+ v->attrs = NULL;
+ v->eval = NULL;
+- v->stgclass = STG_NONE;
+ init_loc_info(&v->loc_info);
++ v->declonly = TRUE;
+ return v;
+ }
+
+@@ -1782,10 +1862,9 @@ static var_t *copy_var(var_t *src, char *name, map_attrs_filter_t attr_filter)
+ {
+ var_t *v = xmalloc(sizeof(var_t));
+ v->name = name;
+- v->type = src->type;
++ v->declspec = src->declspec;
+ v->attrs = map_attrs(src->attrs, attr_filter);
+ v->eval = src->eval;
+- v->stgclass = src->stgclass;
+ v->loc_info = src->loc_info;
+ return v;
+ }
+@@ -1805,7 +1884,7 @@ static declarator_t *make_declarator(var_t *var)
+ {
+ declarator_t *d = xmalloc(sizeof(*d));
+ d->var = var ? var : make_var(NULL);
+- d->type = NULL;
++ init_declspec(&d->declspec, NULL);
+ d->func_type = NULL;
+ d->bits = NULL;
+ return d;
+@@ -1813,7 +1892,15 @@ static declarator_t *make_declarator(var_t *var)
+
+ static type_t *make_safearray(type_t *type)
+ {
+- return type_new_array(NULL, type_new_alias(type, "SAFEARRAY"), TRUE, 0,
++ decl_spec_t aliasee_ds;
++ decl_spec_t element_ds;
++
++ init_declspec(&element_ds,
++ type_new_alias(
++ init_declspec(&aliasee_ds, type),
++ "SAFEARRAY"));
++
++ return type_new_array(NULL, &element_ds, TRUE, 0,
+ NULL, NULL, FC_RP);
+ }
+
+@@ -1892,6 +1979,8 @@ type_t *reg_type(type_t *type, const char *name, struct namespace *namespace, in
+ }
+ if (!namespace)
+ namespace = &global_namespace;
++ printf("reg_type { name : %s, namespace : %s, type : %s, ptr : %p}\n", name, namespace->name, ts_to_str(t), type);
++
+ hash = hash_ident(name);
+ nt = xmalloc(sizeof(struct rtype));
+ nt->name = name;
+@@ -1903,15 +1992,16 @@ type_t *reg_type(type_t *type, const char *name, struct namespace *namespace, in
+ nt->t = t;
+ nt->next = namespace->type_hash[hash];
+ namespace->type_hash[hash] = nt;
+- if ((t == tsSTRUCT || t == tsUNION))
++ if ((t == tsSTRUCT || t == tsUNION || t == tsENUM))
+ fix_incomplete_types(type);
+ return type;
+ }
+
+ static int is_incomplete(const type_t *t)
+ {
+- return !t->defined &&
+- (type_get_type_detect_alias(t) == TYPE_STRUCT ||
++ return !type_is_defined(t) &&
++ (type_get_type_detect_alias(t) == TYPE_ENUM ||
++ type_get_type_detect_alias(t) == TYPE_STRUCT ||
+ type_get_type_detect_alias(t) == TYPE_UNION ||
+ type_get_type_detect_alias(t) == TYPE_ENCAPSULATED_UNION);
+ }
+@@ -1919,19 +2009,16 @@ static int is_incomplete(const type_t *t)
+ void add_incomplete(type_t *t)
+ {
+ struct typenode *tn = xmalloc(sizeof *tn);
++ assert(is_incomplete(t));
+ tn->type = t;
+ list_add_tail(&incomplete_types, &tn->entry);
+ }
+
+ static void fix_type(type_t *t)
+ {
+- if (type_is_alias(t) && is_incomplete(t)) {
+- type_t *ot = type_alias_get_aliasee(t);
+- fix_type(ot);
+- if (type_get_type_detect_alias(ot) == TYPE_STRUCT ||
+- type_get_type_detect_alias(ot) == TYPE_UNION ||
+- type_get_type_detect_alias(ot) == TYPE_ENCAPSULATED_UNION)
+- t->details.structure = ot->details.structure;
++ if (type_is_alias(t) && is_incomplete(t))
++ {
++ type_t *ot = type_alias_get_aliasee_type(t);
+ t->defined = ot->defined;
+ }
+ }
+@@ -1955,7 +2042,7 @@ static void fix_incomplete_types(type_t *complete_type)
+ {
+ if (type_is_equal(complete_type, tn->type))
+ {
+- tn->type->details.structure = complete_type->details.structure;
++ tn->type->details = complete_type->details;
+ list_remove(&tn->entry);
+ free(tn);
+ }
+@@ -1979,7 +2066,13 @@ static type_t *reg_typedefs(decl_spec_t *decl_spec, declarator_list_t *decls, at
+ type_get_type_detect_alias(type) == TYPE_ENCAPSULATED_UNION)
+ {
+ if (!type->name)
++ {
+ type->name = gen_name();
++ /* the generated name will be used and this typedef excluded from the
++ * built typelib unless the typedef has the 'public' attribute, so add it here */
++ if (do_typelib && !is_attr(attrs, ATTR_PUBLIC))
++ attrs = append_attr(attrs, make_attr(ATTR_PUBLIC));
++ }
+
+ /* replace existing attributes when generating a typelib */
+ if (do_typelib)
+@@ -2005,12 +2098,12 @@ static type_t *reg_typedefs(decl_spec_t *decl_spec, declarator_list_t *decls, at
+ * for cleaner solution.
+ */
+ if (cur && input_name == cur->loc_info.input_name)
+- error_loc("%s: redefinition error; original definition was at %s:%d\n",
++ error_loc("FOO %s: redefinition error; original definition was at %s:%d\n",
+ cur->name, cur->loc_info.input_name,
+ cur->loc_info.line_number);
+
+ name = declare_var(attrs, decl_spec, decl, 0);
+- cur = type_new_alias(name->type, name->name);
++ cur = type_new_alias(&name->declspec, name->name);
+ cur->attrs = attrs;
+
+ if (is_incomplete(cur))
+@@ -2025,6 +2118,8 @@ type_t *find_type(const char *name, struct namespace *namespace, int t)
+ {
+ struct rtype *cur;
+
++ printf("find_type { name : %s, namespace %s, type : %s }\n", name, namespace ? namespace->name : NULL, ts_to_str(t));
++
+ if(namespace && namespace != &global_namespace) {
+ for(cur = namespace->type_hash[hash_ident(name)]; cur; cur = cur->next) {
+ if(cur->t == t && !strcmp(cur->name, name))
+@@ -2178,7 +2273,6 @@ struct allowed_attr allowed_attr[] =
+ /* ATTR_CASE */ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, "case" },
+ /* ATTR_CODE */ { 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "code" },
+ /* ATTR_COMMSTATUS */ { 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "comm_status" },
+- /* ATTR_CONST */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "const" },
+ /* ATTR_CONTEXTHANDLE */ { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "context_handle" },
+ /* ATTR_CONTROL */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, "control" },
+ /* ATTR_DECODE */ { 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "decode" },
+@@ -2213,7 +2307,6 @@ struct allowed_attr allowed_attr[] =
+ /* ATTR_IMMEDIATEBIND */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "immediatebind" },
+ /* ATTR_IMPLICIT_HANDLE */ { 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "implicit_handle" },
+ /* ATTR_IN */ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "in" },
+- /* ATTR_INLINE */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "inline" },
+ /* ATTR_INPUTSYNC */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "inputsync" },
+ /* ATTR_LENGTHIS */ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, "length_is" },
+ /* ATTR_LIBLCID */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, "lcid" },
+@@ -2285,10 +2378,10 @@ static attr_list_t *check_iface_attrs(const char *name, attr_list_t *attrs)
+ if (attr->type == ATTR_IMPLICIT_HANDLE)
+ {
+ const var_t *var = attr->u.pval;
+- if (type_get_type( var->type) == TYPE_BASIC &&
+- type_basic_get_type( var->type ) == TYPE_BASIC_HANDLE)
++ if (type_get_type( var->declspec.type) == TYPE_BASIC &&
++ type_basic_get_type( var->declspec.type ) == TYPE_BASIC_HANDLE)
+ continue;
+- if (is_aliaschain_attr( var->type, ATTR_HANDLE ))
++ if (is_aliaschain_attr( var->declspec.type, ATTR_HANDLE ))
+ continue;
+ error_loc("attribute %s requires a handle type in interface %s\n",
+ allowed_attr[attr->type].display_name, name);
+@@ -2493,7 +2586,7 @@ static int is_ptr_guid_type(const type_t *type)
+
+ /* second, make sure it is a pointer to something of size sizeof(GUID),
+ * i.e. 16 bytes */
+- return (type_memsize(type_pointer_get_ref(type)) == 16);
++ return (type_memsize(type_pointer_get_ref_type(type)) == 16);
+ }
+
+ static void check_conformance_expr_list(const char *attr_name, const var_t *arg, const type_t *container_type, expr_list_t *expr_list)
+@@ -2520,7 +2613,7 @@ static void check_remoting_fields(const var_t *var, type_t *type);
+ static void check_field_common(const type_t *container_type,
+ const char *container_name, const var_t *arg)
+ {
+- type_t *type = arg->type;
++ type_t *type = arg->declspec.type;
+ int more_to_do;
+ const char *container_type_name;
+ const char *var_type;
+@@ -2550,7 +2643,7 @@ static void check_field_common(const type_t *container_type,
+ }
+
+ if (is_attr(arg->attrs, ATTR_LENGTHIS) &&
+- (is_attr(arg->attrs, ATTR_STRING) || is_aliaschain_attr(arg->type, ATTR_STRING)))
++ (is_attr(arg->attrs, ATTR_STRING) || is_aliaschain_attr(arg->declspec.type, ATTR_STRING)))
+ error_loc_info(&arg->loc_info,
+ "string and length_is specified for argument %s are mutually exclusive attributes\n",
+ arg->name);
+@@ -2647,23 +2740,28 @@ static void check_field_common(const type_t *container_type,
+ {
+ const type_t *t = type;
+ while (is_ptr(t))
+- t = type_pointer_get_ref(t);
++ t = type_pointer_get_ref_type(t);
+ if (is_aliaschain_attr(t, ATTR_RANGE))
+ warning_loc_info(&arg->loc_info, "%s: range not verified for a string of ranged types\n", arg->name);
+ break;
+ }
+ case TGT_POINTER:
+- type = type_pointer_get_ref(type);
++ type = type_pointer_get_ref_type(type);
+ more_to_do = TRUE;
+ break;
+ case TGT_ARRAY:
+- type = type_array_get_element(type);
++ type = type_array_get_element_type(type);
+ more_to_do = TRUE;
+ break;
++ case TGT_ENUM:
++ type = type_get_real_type(type);
++ if(!type_is_complete(type))
++ {
++ error_loc_info(&arg->loc_info, "undefined type declaration enum %s\n", type->name);
++ }
+ case TGT_USER_TYPE:
+ case TGT_IFACE_POINTER:
+ case TGT_BASIC:
+- case TGT_ENUM:
+ case TGT_RANGE:
+ /* nothing to do */
+ break;
+@@ -2688,13 +2786,18 @@ static void check_remoting_fields(const var_t *var, type_t *type)
+ if (type_is_complete(type))
+ fields = type_struct_get_fields(type);
+ else
+- error_loc_info(&var->loc_info, "undefined type declaration %s\n", type->name);
++ error_loc_info(&var->loc_info, "undefined type declaration struct %s\n", type->name);
+ }
+ else if (type_get_type(type) == TYPE_UNION || type_get_type(type) == TYPE_ENCAPSULATED_UNION)
+- fields = type_union_get_cases(type);
++ {
++ if (type_is_complete(type))
++ fields = type_union_get_cases(type);
++ else
++ error_loc_info(&var->loc_info, "undefined type declaration union %s\n", type->name);
++ }
+
+ if (fields) LIST_FOR_EACH_ENTRY( field, fields, const var_t, entry )
+- if (field->type) check_field_common(type, type->name, field);
++ if (field->declspec.type) check_field_common(type, type->name, field);
+ }
+
+ /* checks that arguments for a function make sense for marshalling and unmarshalling */
+@@ -2703,9 +2806,10 @@ static void check_remoting_args(const var_t *func)
+ const char *funcname = func->name;
+ const var_t *arg;
+
+- if (func->type->details.function->args) LIST_FOR_EACH_ENTRY( arg, func->type->details.function->args, const var_t, entry )
++ assert(type_get_type_detect_alias(func->declspec.type) == TYPE_FUNCTION);
++ if (func->declspec.type->details.function->args) LIST_FOR_EACH_ENTRY( arg, func->declspec.type->details.function->args, const var_t, entry )
+ {
+- const type_t *type = arg->type;
++ const type_t *type = arg->declspec.type;
+
+ /* check that [out] parameters have enough pointer levels */
+ if (is_attr(arg->attrs, ATTR_OUT))
+@@ -2745,16 +2849,16 @@ static void check_remoting_args(const var_t *func)
+ }
+ }
+
+- check_field_common(func->type, funcname, arg);
++ check_field_common(func->declspec.type, funcname, arg);
+ }
+
+- if (type_get_type(type_function_get_rettype(func->type)) != TYPE_VOID)
++ if (type_get_type(type_function_get_rettype(func->declspec.type)) != TYPE_VOID)
+ {
+ var_t var;
+ var = *func;
+- var.type = type_function_get_rettype(func->type);
++ var.declspec.type = type_function_get_rettype(func->declspec.type);
+ var.name = xstrdup("return value");
+- check_field_common(func->type, funcname, &var);
++ check_field_common(func->declspec.type, funcname, &var);
+ free(var.name);
+ }
+ }
+@@ -2771,8 +2875,8 @@ static void add_explicit_handle_if_necessary(const type_t *iface, var_t *func)
+ * function */
+ var_t *idl_handle = make_var(xstrdup("IDL_handle"));
+ idl_handle->attrs = append_attr(NULL, make_attr(ATTR_IN));
+- idl_handle->type = find_type_or_error("handle_t", 0);
+- type_function_add_head_arg(func->type, idl_handle);
++ idl_handle->declspec.type = find_type_or_error("handle_t", 0);
++ type_function_add_head_arg(func->declspec.type, idl_handle);
+ }
+ }
+
+@@ -2837,6 +2941,7 @@ static void check_async_uuid(type_t *iface)
+ type_t *async_iface;
+ type_t *inherit;
+
++ assert(type_get_type_detect_alias(iface) == TYPE_INTERFACE);
+ if (!is_attr(iface->attrs, ATTR_ASYNCUUID)) return;
+
+ inherit = iface->details.iface->inherit;
+@@ -2853,7 +2958,8 @@ static void check_async_uuid(type_t *iface)
+ var_t *begin_func, *finish_func, *func = stmt->u.var, *arg;
+ var_list_t *begin_args = NULL, *finish_args = NULL, *args;
+
+- args = func->type->details.function->args;
++ assert(type_get_type_detect_alias(func->declspec.type) == TYPE_FUNCTION);
++ args = func->declspec.type->details.function->args;
+ if (args) LIST_FOR_EACH_ENTRY(arg, args, var_t, entry)
+ {
+ if (is_attr(arg->attrs, ATTR_IN) || !is_attr(arg->attrs, ATTR_OUT))
+@@ -2863,15 +2969,15 @@ static void check_async_uuid(type_t *iface)
+ }
+
+ begin_func = copy_var(func, concat_str("Begin_", func->name), NULL);
+- begin_func->type = type_new_function(begin_args);
+- begin_func->type->attrs = func->attrs;
+- begin_func->type->details.function->retval = func->type->details.function->retval;
++ begin_func->declspec.type = type_new_function(begin_args);
++ begin_func->declspec.type->attrs = func->attrs;
++ begin_func->declspec.type->details.function->retval = func->declspec.type->details.function->retval;
+ stmts = append_statement(stmts, make_statement_declaration(begin_func));
+
+ finish_func = copy_var(func, concat_str("Finish_", func->name), NULL);
+- finish_func->type = type_new_function(finish_args);
+- finish_func->type->attrs = func->attrs;
+- finish_func->type->details.function->retval = func->type->details.function->retval;
++ finish_func->declspec.type = type_new_function(finish_args);
++ finish_func->declspec.type->attrs = func->attrs;
++ finish_func->declspec.type->details.function->retval = func->declspec.type->details.function->retval;
+ stmts = append_statement(stmts, make_statement_declaration(finish_func));
+ }
+
+@@ -2911,6 +3017,7 @@ static void check_statements(const statement_list_t *stmts, int is_inside_librar
+ static void check_all_user_types(const statement_list_t *stmts)
+ {
+ const statement_t *stmt;
++ const var_t *v;
+
+ if (stmts) LIST_FOR_EACH_ENTRY(stmt, stmts, const statement_t, entry)
+ {
+@@ -2922,7 +3029,11 @@ static void check_all_user_types(const statement_list_t *stmts)
+ const statement_t *stmt_func;
+ STATEMENTS_FOR_EACH_FUNC(stmt_func, type_iface_get_stmts(stmt->u.type)) {
+ const var_t *func = stmt_func->u.var;
+- check_for_additional_prototype_types(func->type->details.function->args);
++ assert(type_get_type_detect_alias(func->declspec.type) == TYPE_FUNCTION);
++ if (func->declspec.type->details.function->args)
++ LIST_FOR_EACH_ENTRY( v, func->declspec.type->details.function->args, const var_t, entry )
++ check_for_additional_prototype_types(v->declspec.type);
++ check_for_additional_prototype_types(type_function_get_rettype(func->declspec.type));
+ }
+ }
+ }
+@@ -2956,6 +3067,10 @@ static statement_t *make_statement_type_decl(type_t *type)
+ {
+ statement_t *stmt = make_statement(STMT_TYPE);
+ stmt->u.type = type;
++ if (type_is_defined(type))
++ {
++ stmt->declonly = FALSE;
++ }
+ return stmt;
+ }
+
+@@ -2970,16 +3085,16 @@ static statement_t *make_statement_declaration(var_t *var)
+ {
+ statement_t *stmt = make_statement(STMT_DECLARATION);
+ stmt->u.var = var;
+- if (var->stgclass == STG_EXTERN && var->eval)
++ if (var->declspec.stgclass == STG_EXTERN && var->eval)
+ warning("'%s' initialised and declared extern\n", var->name);
+ if (is_const_decl(var))
+ {
+ if (var->eval)
+ reg_const(var);
+ }
+- else if (type_get_type(var->type) == TYPE_FUNCTION)
++ else if (type_get_type(var->declspec.type) == TYPE_FUNCTION)
+ check_function_attrs(var->name, var->attrs);
+- else if (var->stgclass == STG_NONE || var->stgclass == STG_REGISTER)
++ else if (var->declspec.stgclass == STG_NONE || var->declspec.stgclass == STG_REGISTER)
+ error_loc("instantiation of data is illegal\n");
+ return stmt;
+ }
+@@ -3031,6 +3146,7 @@ static statement_t *make_statement_typedef(declarator_list_t *decls)
+ declarator_t *decl, *next;
+ statement_t *stmt;
+ type_list_t **type_list;
++ int defined = TRUE;
+
+ if (!decls) return NULL;
+
+@@ -3042,6 +3158,18 @@ static statement_t *make_statement_typedef(declarator_list_t *decls)
+ {
+ var_t *var = decl->var;
+ type_t *type = find_type_or_error(var->name, 0);
++
++ /* ensure that all of the types in this typedef statement have been defined
++ * before setting its declonly flag */
++ if (type_is_pointerish(type))
++ {
++ defined = defined & type_is_defined(type_get_pointer_chain_tail(type));
++ }
++ else
++ {
++ defined = defined & type_is_defined(type_get_real_type(type));
++ }
++
+ *type_list = xmalloc(sizeof(type_list_t));
+ (*type_list)->type = type;
+ (*type_list)->next = NULL;
+@@ -3051,6 +3179,7 @@ static statement_t *make_statement_typedef(declarator_list_t *decls)
+ free(var);
+ }
+
++ stmt->declonly = !defined;
+ return stmt;
+ }
+
+@@ -3091,7 +3220,7 @@ void init_loc_info(loc_info_t *i)
+
+ static void check_def(const type_t *t)
+ {
+- if (t->defined)
+- error_loc("%s: redefinition error; original definition was at %s:%d\n",
++ if (type_is_defined(t))
++ error_loc("BAR %s: redefinition error; original definition was at %s:%d\n",
+ t->name, t->loc_info.input_name, t->loc_info.line_number);
+ }
+diff --git a/mingw-w64-tools/widl/src/parser.yy.c b/mingw-w64-tools/widl/src/parser.yy.c
+index 2aaf3c27..0482aa7e 100644
+--- a/mingw-w64-tools/widl/src/parser.yy.c
++++ b/mingw-w64-tools/widl/src/parser.yy.c
+@@ -1,6 +1,6 @@
+-#line 1 "parser.yy.c"
++#line 2 "parser.yy.c"
+
+-#line 3 "parser.yy.c"
++#line 4 "parser.yy.c"
+
+ #define YY_INT_ALIGNED short int
+
+@@ -1041,13 +1041,13 @@ UUID *parse_uuid(const char *u)
+ return uuid;
+ }
+
+-#line 1044 "parser.yy.c"
++#line 1045 "parser.yy.c"
+ /*
+ **************************************************************************
+ * The flexer starts here
+ **************************************************************************
+ */
+-#line 1050 "parser.yy.c"
++#line 1051 "parser.yy.c"
+
+ #define INITIAL 0
+ #define QUOTE 1
+@@ -1281,7 +1281,7 @@ YY_DECL
+ {
+ #line 132 "parser.l"
+
+-#line 1284 "parser.yy.c"
++#line 1285 "parser.yy.c"
+
+ while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */
+ {
+@@ -1616,7 +1616,7 @@ YY_RULE_SETUP
+ #line 239 "parser.l"
+ ECHO;
+ YY_BREAK
+-#line 1619 "parser.yy.c"
++#line 1620 "parser.yy.c"
+
+ case YY_END_OF_BUFFER:
+ {
+diff --git a/mingw-w64-tools/widl/src/proxy.c b/mingw-w64-tools/widl/src/proxy.c
+index 87c27be9..36b552be 100644
+--- a/mingw-w64-tools/widl/src/proxy.c
++++ b/mingw-w64-tools/widl/src/proxy.c
+@@ -67,7 +67,7 @@ static void write_stubdesc(int expr_eval_routines)
+ print_proxy( "1, /* -error bounds_check flag */\n");
+ print_proxy( "0x%x, /* Ndr library version */\n", get_stub_mode() == MODE_Oif ? 0x50002 : 0x10001);
+ print_proxy( "0,\n");
+- print_proxy( "0x50100a4, /* MIDL Version 5.1.164 */\n");
++ print_proxy( "0x50200ca, /* MIDL Version 5.2.202 */\n");
+ print_proxy( "0,\n");
+ print_proxy("%s,\n", list_empty(&user_type_list) ? "0" : "UserMarshalRoutines");
+ print_proxy( "0, /* notify & notify_flag routine table */\n");
+@@ -105,15 +105,15 @@ static void clear_output_vars( const var_list_t *args )
+ {
+ if (is_attr(arg->attrs, ATTR_IN)) continue;
+ if (!is_attr(arg->attrs, ATTR_OUT)) continue;
+- if (is_ptr(arg->type))
++ if (is_ptr(arg->declspec.type))
+ {
+- if (type_get_type(type_pointer_get_ref(arg->type)) == TYPE_BASIC) continue;
+- if (type_get_type(type_pointer_get_ref(arg->type)) == TYPE_ENUM) continue;
++ if (type_get_type(type_pointer_get_ref_type(arg->declspec.type)) == TYPE_BASIC) continue;
++ if (type_get_type(type_pointer_get_ref_type(arg->declspec.type)) == TYPE_ENUM) continue;
+ }
+ print_proxy( "if (%s) MIDL_memset( %s, 0, ", arg->name, arg->name );
+- if (is_array(arg->type) && type_array_has_conformance(arg->type))
++ if (is_array(arg->declspec.type) && type_array_has_conformance(arg->declspec.type))
+ {
+- write_expr( proxy, type_array_get_conformance(arg->type), 1, 1, NULL, NULL, "" );
++ write_expr( proxy, type_array_get_conformance(arg->declspec.type), 1, 1, NULL, NULL, "" );
+ fprintf( proxy, " * " );
+ }
+ fprintf( proxy, "sizeof( *%s ));\n", arg->name );
+@@ -147,7 +147,7 @@ static int need_delegation_indirect(const type_t *iface)
+ static void free_variable( const var_t *arg, const char *local_var_prefix )
+ {
+ unsigned int type_offset = arg->typestring_offset;
+- type_t *type = arg->type;
++ type_t *type = arg->declspec.type;
+
+ write_parameter_conf_or_var_exprs(proxy, indent, local_var_prefix, PHASE_FREE, arg, FALSE);
+
+@@ -191,18 +191,18 @@ static void proxy_free_variables( var_list_t *args, const char *local_var_prefix
+ static void gen_proxy(type_t *iface, const var_t *func, int idx,
+ unsigned int proc_offset)
+ {
+- var_t *retval = type_function_get_retval(func->type);
+- int has_ret = !is_void(retval->type);
++ var_t *retval = type_function_get_retval(func->declspec.type);
++ int has_ret = !is_void(retval->declspec.type);
+ int has_full_pointer = is_full_pointer_function(func);
+- const char *callconv = get_attrp(func->type->attrs, ATTR_CALLCONV);
+- const var_list_t *args = type_get_function_args(func->type);
++ const char *callconv = get_attrp(func->declspec.type->attrs, ATTR_CALLCONV);
++ const var_list_t *args = type_function_get_args(func->declspec.type);
+ if (!callconv) callconv = "STDMETHODCALLTYPE";
+
+ indent = 0;
+ if (is_interpreted_func( iface, func ))
+ {
+ if (get_stub_mode() == MODE_Oif && !is_callas( func->attrs )) return;
+- write_type_decl_left(proxy, retval->type);
++ write_declspec_decl_left(proxy, &retval->declspec);
+ print_proxy( " %s %s_%s_Proxy(\n", callconv, iface->name, get_name(func));
+ write_args(proxy, args, iface->name, 1, TRUE);
+ print_proxy( ")\n");
+@@ -219,7 +219,7 @@ static void gen_proxy(type_t *iface, const var_t *func, int idx,
+ print_proxy( "}\n");
+ print_proxy( "\n");
+
+- write_type_decl_left(proxy, retval->type);
++ write_declspec_decl_left(proxy, &retval->declspec);
+ print_proxy( " %s %s_%s_Proxy(\n", callconv, iface->name, get_name(func));
+ write_args(proxy, args, iface->name, 1, TRUE);
+ print_proxy( ")\n");
+@@ -229,12 +229,12 @@ static void gen_proxy(type_t *iface, const var_t *func, int idx,
+ /* local variables */
+ if (has_ret) {
+ print_proxy( "%s", "" );
+- write_type_decl(proxy, retval->type, retval->name);
++ write_declspec_decl(proxy, &retval->declspec, retval->name);
+ fprintf( proxy, ";\n" );
+ }
+ print_proxy( "RPC_MESSAGE _RpcMessage;\n" );
+ if (has_ret) {
+- if (decl_indirect(retval->type))
++ if (decl_indirect(retval->declspec.type))
+ print_proxy("void *_p_%s = &%s;\n", retval->name, retval->name);
+ }
+ print_proxy( "\n");
+@@ -246,7 +246,7 @@ static void gen_proxy(type_t *iface, const var_t *func, int idx,
+ write_full_pointer_init(proxy, indent, func, FALSE);
+
+ /* FIXME: trace */
+- clear_output_vars( type_get_function_args(func->type) );
++ clear_output_vars( type_function_get_args(func->declspec.type) );
+
+ print_proxy( "RpcTryExcept\n" );
+ print_proxy( "{\n" );
+@@ -279,9 +279,9 @@ static void gen_proxy(type_t *iface, const var_t *func, int idx,
+
+ if (has_ret)
+ {
+- if (decl_indirect(retval->type))
++ if (decl_indirect(retval->declspec.type))
+ print_proxy("MIDL_memset(&%s, 0, sizeof(%s));\n", retval->name, retval->name);
+- else if (is_ptr(retval->type) || is_array(retval->type))
++ else if (is_ptr(retval->declspec.type) || is_array(retval->declspec.type))
+ print_proxy("%s = 0;\n", retval->name);
+ write_remoting_arguments(proxy, indent, func, "", PASS_RETURN, PHASE_UNMARSHAL);
+ }
+@@ -301,7 +301,7 @@ static void gen_proxy(type_t *iface, const var_t *func, int idx,
+ print_proxy( "{\n" );
+ if (has_ret) {
+ indent++;
+- proxy_free_variables( type_get_function_args(func->type), "" );
++ proxy_free_variables( type_function_get_args(func->declspec.type), "" );
+ print_proxy( "_RetVal = NdrProxyErrorHandler(RpcExceptionCode());\n" );
+ indent--;
+ }
+@@ -320,7 +320,7 @@ static void gen_stub(type_t *iface, const var_t *func, const char *cas,
+ unsigned int proc_offset)
+ {
+ const var_t *arg;
+- int has_ret = !is_void(type_function_get_rettype(func->type));
++ int has_ret = !is_void(type_function_get_rettype(func->declspec.type));
+ int has_full_pointer = is_full_pointer_function(func);
+
+ if (is_interpreted_func( iface, func )) return;
+@@ -389,10 +389,10 @@ static void gen_stub(type_t *iface, const var_t *func, const char *cas,
+ else fprintf(proxy, "__frame->_This->lpVtbl->%s", get_name(func));
+ fprintf(proxy, "(__frame->_This");
+
+- if (type_get_function_args(func->type))
++ if (type_function_get_args(func->declspec.type))
+ {
+- LIST_FOR_EACH_ENTRY( arg, type_get_function_args(func->type), const var_t, entry )
+- fprintf(proxy, ", %s__frame->%s", is_array(arg->type) && !type_array_is_decl_as_ptr(arg->type) ? "*" :"" , arg->name);
++ LIST_FOR_EACH_ENTRY( arg, type_function_get_args(func->declspec.type), const var_t, entry )
++ fprintf(proxy, ", %s__frame->%s", is_array(arg->declspec.type) && !type_array_is_decl_as_ptr(arg->declspec.type) ? "*" :"" , arg->name);
+ }
+ fprintf(proxy, ");\n");
+ fprintf(proxy, "\n");
+@@ -401,7 +401,7 @@ static void gen_stub(type_t *iface, const var_t *func, const char *cas,
+
+ write_remoting_arguments(proxy, indent, func, "__frame->", PASS_OUT, PHASE_BUFFERSIZE);
+
+- if (!is_void(type_function_get_rettype(func->type)))
++ if (!is_void(type_function_get_rettype(func->declspec.type)))
+ write_remoting_arguments(proxy, indent, func, "__frame->", PASS_RETURN, PHASE_BUFFERSIZE);
+
+ print_proxy("NdrStubGetBuffer(This, _pRpcChannelBuffer, &__frame->_StubMsg);\n");
+@@ -410,7 +410,7 @@ static void gen_stub(type_t *iface, const var_t *func, const char *cas,
+ fprintf(proxy, "\n");
+
+ /* marshall the return value */
+- if (!is_void(type_function_get_rettype(func->type)))
++ if (!is_void(type_function_get_rettype(func->declspec.type)))
+ write_remoting_arguments(proxy, indent, func, "__frame->", PASS_RETURN, PHASE_MARSHAL);
+
+ indent--;
+@@ -432,16 +432,16 @@ static void gen_stub(type_t *iface, const var_t *func, const char *cas,
+
+ static void gen_stub_thunk( type_t *iface, const var_t *func, unsigned int proc_offset )
+ {
+- int has_ret = !is_void( type_function_get_rettype( func->type ));
++ int has_ret = !is_void( type_function_get_rettype( func->declspec.type ));
+ const var_t *arg, *callas = is_callas( func->attrs );
+- const var_list_t *args = type_get_function_args( func->type );
++ const var_list_t *args = type_function_get_args( func->declspec.type );
+
+ indent = 0;
+ print_proxy( "void __RPC_API %s_%s_Thunk( PMIDL_STUB_MESSAGE pStubMsg )\n",
+ iface->name, get_name(func) );
+ print_proxy( "{\n");
+ indent++;
+- write_func_param_struct( proxy, iface, func->type,
++ write_func_param_struct( proxy, iface, func->declspec.type,
+ "*pParamStruct = (struct _PARAM_STRUCT *)pStubMsg->StackTop", has_ret );
+ print_proxy( "%s%s_%s_Stub( pParamStruct->This",
+ has_ret ? "pParamStruct->_RetVal = " : "", iface->name, callas->name );
+@@ -526,6 +526,7 @@ static int write_proxy_methods(type_t *iface, int skip)
+ if (skip || (is_local(func->attrs) && !get_callas_source(iface, func)))
+ print_proxy( "0, /* %s::%s */\n", iface->name, get_name(func));
+ else if (is_interpreted_func( iface, func ) &&
++ get_stub_mode() == MODE_Oif &&
+ !is_local( func->attrs ) &&
+ type_iface_get_inherit(iface))
+ print_proxy( "(void *)-1, /* %s::%s */\n", iface->name, get_name(func));
+@@ -613,14 +614,14 @@ static void write_proxy(type_t *iface, unsigned int *proc_offset)
+ if (!is_local(func->attrs)) {
+ const var_t *cas = is_callas(func->attrs);
+ const char *cname = cas ? cas->name : NULL;
+- int idx = func->type->details.function->idx;
++ int idx = type_get_details(func->declspec.type)->function->idx;
+ if (cname) {
+ const statement_t *stmt2;
+ STATEMENTS_FOR_EACH_FUNC(stmt2, type_iface_get_stmts(iface)) {
+ const var_t *m = stmt2->u.var;
+ if (!strcmp(m->name, cname))
+ {
+- idx = m->type->details.function->idx;
++ idx = type_get_details(m->declspec.type)->function->idx;
+ break;
+ }
+ }
+@@ -738,7 +739,7 @@ static void write_proxy(type_t *iface, unsigned int *proc_offset)
+ print_proxy( "{\n");
+ indent++;
+ print_proxy( "%s_%s\n",
+- iface->details.iface->async_iface == iface ? "CStdAsyncStubBuffer" : "CStdStubBuffer",
++ type_get_details(iface)->iface->async_iface == iface ? "CStdAsyncStubBuffer" : "CStdStubBuffer",
+ need_delegation_indirect(iface) ? "DELEGATING_METHODS" : "METHODS");
+ indent--;
+ print_proxy( "}\n");
+@@ -839,8 +840,8 @@ static void write_proxy_stmts(const statement_list_t *stmts, unsigned int *proc_
+ if (need_proxy(iface))
+ {
+ write_proxy(iface, proc_offset);
+- if (iface->details.iface->async_iface)
+- write_proxy(iface->details.iface->async_iface, proc_offset);
++ if (type_get_details(iface)->iface->async_iface)
++ write_proxy(type_get_details(iface)->iface->async_iface, proc_offset);
+ }
+ }
+ }
+@@ -869,9 +870,9 @@ static void build_iface_list( const statement_list_t *stmts, type_t **ifaces[],
+ {
+ *ifaces = xrealloc( *ifaces, (*count + 1) * sizeof(**ifaces) );
+ (*ifaces)[(*count)++] = iface;
+- if (iface->details.iface->async_iface)
++ if (type_get_details(iface)->iface->async_iface)
+ {
+- iface = iface->details.iface->async_iface;
++ iface = type_get_details(iface)->iface->async_iface;
+ *ifaces = xrealloc( *ifaces, (*count + 1) * sizeof(**ifaces) );
+ (*ifaces)[(*count)++] = iface;
+ }
+@@ -942,7 +943,7 @@ static void write_proxy_routines(const statement_list_t *stmts)
+ write_stubdesc(expr_eval_routines);
+
+ print_proxy( "#if !defined(__RPC_WIN%u__)\n", pointer_size == 8 ? 64 : 32);
+- print_proxy( "#error Currently only Wine and WIN32 are supported.\n");
++ print_proxy( "#error Invalid build platform for this proxy.\n");
+ print_proxy( "#endif\n");
+ print_proxy( "\n");
+ write_procformatstring(proxy, stmts, need_proxy);
+@@ -1011,7 +1012,7 @@ static void write_proxy_routines(const statement_list_t *stmts)
+ table_version = get_stub_mode() == MODE_Oif ? 2 : 1;
+ for (i = 0; i < count; i++)
+ {
+- if (interfaces[i]->details.iface->async_iface != interfaces[i]) continue;
++ if (type_get_details(interfaces[i])->iface->async_iface != interfaces[i]) continue;
+ if (table_version != 6)
+ {
+ fprintf(proxy, "static const IID *_AsyncInterfaceTable[] =\n");
+@@ -1053,26 +1054,6 @@ void write_proxies(const statement_list_t *stmts)
+ init_proxy(stmts);
+ if(!proxy) return;
+
+- if (do_win32 && do_win64)
+- {
+- fprintf(proxy, "\n#ifndef _WIN64\n\n");
+- pointer_size = 4;
+- write_proxy_routines( stmts );
+- fprintf(proxy, "\n#else /* _WIN64 */\n\n");
+- pointer_size = 8;
+- write_proxy_routines( stmts );
+- fprintf(proxy, "\n#endif /* _WIN64 */\n");
+- }
+- else if (do_win32)
+- {
+- pointer_size = 4;
+- write_proxy_routines( stmts );
+- }
+- else if (do_win64)
+- {
+- pointer_size = 8;
+- write_proxy_routines( stmts );
+- }
+-
++ write_proxy_routines( stmts );
+ fclose(proxy);
+ }
+diff --git a/mingw-w64-tools/widl/src/register.c b/mingw-w64-tools/widl/src/register.c
+index 210fb747..1c369e7c 100644
+--- a/mingw-w64-tools/widl/src/register.c
++++ b/mingw-w64-tools/widl/src/register.c
+@@ -325,7 +325,7 @@ void output_typelib_regscript( const typelib_t *typelib )
+ sprintf(resname, "%s\\%d", typelib_name, expr->cval);
+ }
+ put_str( indent, "'%x' { %s = s '%%MODULE%%%s' }\n",
+- lcid_expr ? lcid_expr->cval : 0, typelib_kind == SYS_WIN64 ? "win64" : "win32", id_part );
++ lcid_expr ? lcid_expr->cval : 0, pointer_size == 8 ? "win64" : "win32", id_part );
+ put_str( indent, "FLAGS = s '%u'\n", flags );
+ put_str( --indent, "}\n" );
+ put_str( --indent, "}\n" );
+diff --git a/mingw-w64-tools/widl/src/server.c b/mingw-w64-tools/widl/src/server.c
+index 783ff900..dbed870a 100644
+--- a/mingw-w64-tools/widl/src/server.c
++++ b/mingw-w64-tools/widl/src/server.c
+@@ -55,6 +55,8 @@ static void write_function_stub(const type_t *iface, const var_t *func, unsigned
+ unsigned char explicit_fc, implicit_fc;
+ int has_full_pointer = is_full_pointer_function(func);
+ const var_t *handle_var = get_func_handle_var( iface, func, &explicit_fc, &implicit_fc );
++ const decl_spec_t *ret_declspec = type_function_get_retdeclspec(func->declspec.type);
++ type_t *ret_type = ret_declspec->type;
+
+ if (is_interpreted_func( iface, func )) return;
+
+@@ -75,7 +77,7 @@ static void write_function_stub(const type_t *iface, const var_t *func, unsigned
+ indent++;
+ write_remoting_arguments(server, indent, func, "__frame->", PASS_OUT, PHASE_FREE);
+
+- if (!is_void(type_function_get_rettype(func->type)))
++ if (!is_void(ret_type))
+ write_remoting_arguments(server, indent, func, "__frame->", PASS_RETURN, PHASE_FREE);
+
+ if (has_full_pointer)
+@@ -120,7 +122,7 @@ static void write_function_stub(const type_t *iface, const var_t *func, unsigned
+ if (has_full_pointer)
+ write_full_pointer_init(server, indent, func, TRUE);
+
+- if (type_get_function_args(func->type))
++ if (type_function_get_args(func->declspec.type))
+ {
+ print_server("if ((_pRpcMessage->DataRepresentation & 0x0000FFFFUL) != NDR_LOCAL_DATA_REPRESENTATION)\n");
+ indent++;
+@@ -154,35 +156,42 @@ static void write_function_stub(const type_t *iface, const var_t *func, unsigned
+ assign_stub_out_args(server, indent, func, "__frame->");
+
+ /* Call the real server function */
+- print_server("%s%s%s",
+- is_void(type_function_get_rettype(func->type)) ? "" : "__frame->_RetVal = ",
+- prefix_server, get_name(func));
++ if (is_context_handle(ret_type))
++ {
++ print_server("__frame->_RetVal = NDRSContextUnmarshall((char*)0, _pRpcMessage->DataRepresentation);\n");
++ print_server("*((");
++ write_declspec_decl(server, ret_declspec, NULL);
++ fprintf(server, "*)NDRSContextValue(__frame->_RetVal)) = ");
++ }
++ else
++ print_server("%s", is_void(ret_type) ? "" : "__frame->_RetVal = ");
++ fprintf(server, "%s%s", prefix_server, get_name(func));
+
+- if (type_get_function_args(func->type))
++ if (type_function_get_args(func->declspec.type))
+ {
+ int first_arg = 1;
+
+ fprintf(server, "(\n");
+ indent++;
+- LIST_FOR_EACH_ENTRY( var, type_get_function_args(func->type), const var_t, entry )
++ LIST_FOR_EACH_ENTRY( var, type_function_get_args(func->declspec.type), const var_t, entry )
+ {
+ if (first_arg)
+ first_arg = 0;
+ else
+ fprintf(server, ",\n");
+- if (is_context_handle(var->type))
++ if (is_context_handle(var->declspec.type))
+ {
+ /* if the context_handle attribute appears in the chain of types
+ * without pointers being followed, then the context handle must
+ * be direct, otherwise it is a pointer */
+- const char *ch_ptr = is_aliaschain_attr(var->type, ATTR_CONTEXTHANDLE) ? "*" : "";
++ const char *ch_ptr = is_aliaschain_attr(var->declspec.type, ATTR_CONTEXTHANDLE) ? "*" : "";
+ print_server("(");
+- write_type_decl_left(server, var->type);
++ write_declspec_decl_left(server, &var->declspec);
+ fprintf(server, ")%sNDRSContextValue(__frame->%s)", ch_ptr, var->name);
+ }
+ else
+ {
+- print_server("%s__frame->%s", is_array(var->type) && !type_array_is_decl_as_ptr(var->type) ? "*" : "", var->name);
++ print_server("%s__frame->%s", is_array(var->declspec.type) && !type_array_is_decl_as_ptr(var->declspec.type) ? "*" : "", var->name);
+ }
+ }
+ fprintf(server, ");\n");
+@@ -197,7 +206,7 @@ static void write_function_stub(const type_t *iface, const var_t *func, unsigned
+ {
+ write_remoting_arguments(server, indent, func, "__frame->", PASS_OUT, PHASE_BUFFERSIZE);
+
+- if (!is_void(type_function_get_rettype(func->type)))
++ if (!is_void(ret_type))
+ write_remoting_arguments(server, indent, func, "__frame->", PASS_RETURN, PHASE_BUFFERSIZE);
+
+ print_server("_pRpcMessage->BufferLength = __frame->_StubMsg.BufferLength;\n");
+@@ -216,7 +225,7 @@ static void write_function_stub(const type_t *iface, const var_t *func, unsigned
+ write_remoting_arguments(server, indent, func, "__frame->", PASS_OUT, PHASE_MARSHAL);
+
+ /* marshall the return value */
+- if (!is_void(type_function_get_rettype(func->type)))
++ if (!is_void(ret_type))
+ write_remoting_arguments(server, indent, func, "__frame->", PASS_RETURN, PHASE_MARSHAL);
+
+ indent--;
+@@ -378,7 +387,7 @@ static void write_stubdescriptor(type_t *iface, int expr_eval_routines)
+ print_server("1, /* -error bounds_check flag */\n");
+ print_server("0x%x, /* Ndr library version */\n", get_stub_mode() == MODE_Oif ? 0x50002 : 0x10001);
+ print_server("0,\n");
+- print_server("0x50100a4, /* MIDL Version 5.1.164 */\n");
++ print_server("0x50200ca, /* MIDL Version 5.2.202 */\n");
+ print_server("0,\n");
+ print_server("%s,\n", list_empty(&user_type_list) ? "0" : "UserMarshalRoutines");
+ print_server("0, /* notify & notify_flag routine table */\n");
+@@ -544,26 +553,6 @@ void write_server(const statement_list_t *stmts)
+ if (!server)
+ return;
+
+- if (do_win32 && do_win64)
+- {
+- fprintf(server, "#ifndef _WIN64\n\n");
+- pointer_size = 4;
+- write_server_routines( stmts );
+- fprintf(server, "\n#else /* _WIN64 */\n\n");
+- pointer_size = 8;
+- write_server_routines( stmts );
+- fprintf(server, "\n#endif /* _WIN64 */\n");
+- }
+- else if (do_win32)
+- {
+- pointer_size = 4;
+- write_server_routines( stmts );
+- }
+- else if (do_win64)
+- {
+- pointer_size = 8;
+- write_server_routines( stmts );
+- }
+-
++ write_server_routines( stmts );
+ fclose(server);
+ }
+diff --git a/mingw-w64-tools/widl/src/typegen.c b/mingw-w64-tools/widl/src/typegen.c
+index 27ba60fc..eebb99f0 100644
+--- a/mingw-w64-tools/widl/src/typegen.c
++++ b/mingw-w64-tools/widl/src/typegen.c
+@@ -67,6 +67,7 @@ enum type_context
+ TYPE_CONTEXT_PARAM,
+ TYPE_CONTEXT_CONTAINER,
+ TYPE_CONTEXT_CONTAINER_NO_POINTERS,
++ TYPE_CONTEXT_RETVAL,
+ };
+
+ /* parameter flags in Oif mode */
+@@ -84,14 +85,14 @@ static const unsigned short IsSimpleRef = 0x0100;
+
+ static unsigned int field_memsize(const type_t *type, unsigned int *offset);
+ static unsigned int fields_memsize(const var_list_t *fields, unsigned int *align);
+-static unsigned int write_array_tfs(FILE *file, const attr_list_t *attrs, type_t *type,
++static unsigned int write_array_tfs(FILE *file, const attr_list_t *attrs, const decl_spec_t *declspec,
+ const char *name, unsigned int *typestring_offset);
+-static unsigned int write_struct_tfs(FILE *file, type_t *type, const char *name, unsigned int *tfsoff);
+-static int write_embedded_types(FILE *file, const attr_list_t *attrs, type_t *type,
++static unsigned int write_struct_tfs(FILE *file, const decl_spec_t *declspec, const char *name, unsigned int *tfsoff);
++static int write_embedded_types(FILE *file, const attr_list_t *attrs, const decl_spec_t *declspec,
+ const char *name, int write_ptr, unsigned int *tfsoff);
+ static const var_t *find_array_or_string_in_struct(const type_t *type);
+ static unsigned int write_string_tfs(FILE *file, const attr_list_t *attrs,
+- type_t *type, enum type_context context,
++ const decl_spec_t *declspec, enum type_context context,
+ const char *name, unsigned int *typestring_offset);
+ static unsigned int get_required_buffer_size_type( const type_t *type, const char *name,
+ const attr_list_t *attrs, int toplevel_param,
+@@ -196,7 +197,7 @@ static void *get_aliaschain_attrp(const type_t *type, enum attr_type attr)
+ if (is_attr(t->attrs, attr))
+ return get_attrp(t->attrs, attr);
+ else if (type_is_alias(t))
+- t = type_alias_get_aliasee(t);
++ t = type_alias_get_aliasee_type(t);
+ else return NULL;
+ }
+ }
+@@ -266,7 +267,7 @@ unsigned char get_pointer_fc(const type_t *type, const attr_list_t *attrs, int t
+ if (pointer_type)
+ return pointer_type;
+
+- for (t = type; type_is_alias(t); t = type_alias_get_aliasee(t))
++ for (t = type; type_is_alias(t); t = type_alias_get_aliasee_type(t))
+ {
+ pointer_type = get_attrv(t->attrs, ATTR_POINTERTYPE);
+ if (pointer_type)
+@@ -287,7 +288,7 @@ static unsigned char get_pointer_fc_context( const type_t *type, const attr_list
+ int pointer_fc = get_pointer_fc(type, attrs, context == TYPE_CONTEXT_TOPLEVELPARAM);
+
+ if (pointer_fc == FC_UP && is_attr( attrs, ATTR_OUT ) &&
+- context == TYPE_CONTEXT_PARAM && is_object( current_iface ))
++ (context == TYPE_CONTEXT_PARAM || context == TYPE_CONTEXT_RETVAL) && is_object( current_iface ))
+ pointer_fc = FC_OP;
+
+ return pointer_fc;
+@@ -315,7 +316,7 @@ static type_t *get_user_type(const type_t *t, const char **pname)
+ }
+
+ if (type_is_alias(t))
+- t = type_alias_get_aliasee(t);
++ t = type_alias_get_aliasee_type(t);
+ else
+ return NULL;
+ }
+@@ -350,10 +351,10 @@ enum typegen_type typegen_detect_type(const type_t *type, const attr_list_t *att
+ return TGT_RANGE;
+ return TGT_ENUM;
+ case TYPE_POINTER:
+- if (type_get_type(type_pointer_get_ref(type)) == TYPE_INTERFACE ||
+- (type_get_type(type_pointer_get_ref(type)) == TYPE_VOID && is_attr(attrs, ATTR_IIDIS)))
++ if (type_get_type(type_pointer_get_ref_type(type)) == TYPE_INTERFACE ||
++ (type_get_type(type_pointer_get_ref_type(type)) == TYPE_VOID && is_attr(attrs, ATTR_IIDIS)))
+ return TGT_IFACE_POINTER;
+- else if (is_aliaschain_attr(type_pointer_get_ref(type), ATTR_CONTEXTHANDLE))
++ else if (is_aliaschain_attr(type_pointer_get_ref_type(type), ATTR_CONTEXTHANDLE))
+ return TGT_CTXT_HANDLE_POINTER;
+ else
+ return TGT_POINTER;
+@@ -378,13 +379,13 @@ enum typegen_type typegen_detect_type(const type_t *type, const attr_list_t *att
+
+ static int cant_be_null(const var_t *v)
+ {
+- switch (typegen_detect_type(v->type, v->attrs, TDT_IGNORE_STRINGS))
++ switch (typegen_detect_type(v->declspec.type, v->attrs, TDT_IGNORE_STRINGS))
+ {
+ case TGT_ARRAY:
+- if (!type_array_is_decl_as_ptr( v->type )) return 0;
++ if (!type_array_is_decl_as_ptr( v->declspec.type )) return 0;
+ /* fall through */
+ case TGT_POINTER:
+- return (get_pointer_fc(v->type, v->attrs, TRUE) == FC_RP);
++ return (get_pointer_fc(v->declspec.type, v->attrs, TRUE) == FC_RP);
+ case TGT_CTXT_HANDLE_POINTER:
+ return TRUE;
+ default:
+@@ -404,7 +405,7 @@ static int get_padding(const var_list_t *fields)
+
+ LIST_FOR_EACH_ENTRY(f, fields, const var_t, entry)
+ {
+- type_t *ft = f->type;
++ type_t *ft = f->declspec.type;
+ unsigned int align = 0;
+ unsigned int size = type_memsize_and_alignment(ft, &align);
+ align = clamp_align(align);
+@@ -421,7 +422,7 @@ static unsigned int get_stack_size( const var_t *var, int *by_value )
+ unsigned int stack_size;
+ int by_val;
+
+- switch (typegen_detect_type( var->type, var->attrs, TDT_ALL_TYPES ))
++ switch (typegen_detect_type( var->declspec.type, var->attrs, TDT_ALL_TYPES ))
+ {
+ case TGT_BASIC:
+ case TGT_ENUM:
+@@ -429,7 +430,7 @@ static unsigned int get_stack_size( const var_t *var, int *by_value )
+ case TGT_STRUCT:
+ case TGT_UNION:
+ case TGT_USER_TYPE:
+- stack_size = type_memsize( var->type );
++ stack_size = type_memsize( var->declspec.type );
+ by_val = (pointer_size < 8 || stack_size <= pointer_size); /* FIXME: should be platform-specific */
+ break;
+ default:
+@@ -442,23 +443,27 @@ static unsigned int get_stack_size( const var_t *var, int *by_value )
+ }
+
+ static unsigned char get_contexthandle_flags( const type_t *iface, const attr_list_t *attrs,
+- const type_t *type )
++ const type_t *type, int is_return )
+ {
+ unsigned char flags = 0;
++ int is_out;
+
+ if (is_attr(iface->attrs, ATTR_STRICTCONTEXTHANDLE)) flags |= NDR_STRICT_CONTEXT_HANDLE;
+
+ if (is_ptr(type) &&
+ !is_attr( type->attrs, ATTR_CONTEXTHANDLE ) &&
+ !is_attr( attrs, ATTR_CONTEXTHANDLE ))
+- flags |= 0x80;
++ flags |= HANDLE_PARAM_IS_VIA_PTR;
+
+- if (is_attr(attrs, ATTR_IN))
++ if (is_return) return flags | HANDLE_PARAM_IS_OUT | HANDLE_PARAM_IS_RETURN;
++
++ is_out = is_attr(attrs, ATTR_OUT);
++ if (is_attr(attrs, ATTR_IN) || !is_out)
+ {
+- flags |= 0x40;
+- if (!is_attr(attrs, ATTR_OUT)) flags |= NDR_CONTEXT_HANDLE_CANNOT_BE_NULL;
++ flags |= HANDLE_PARAM_IS_IN;
++ if (!is_out) flags |= NDR_CONTEXT_HANDLE_CANNOT_BE_NULL;
+ }
+- if (is_attr(attrs, ATTR_OUT)) flags |= 0x20;
++ if (is_out) flags |= HANDLE_PARAM_IS_OUT;
+
+ return flags;
+ }
+@@ -490,14 +495,14 @@ unsigned char get_struct_fc(const type_t *type)
+
+ if (fields) LIST_FOR_EACH_ENTRY( field, fields, var_t, entry )
+ {
+- type_t *t = field->type;
++ type_t *t = field->declspec.type;
+ enum typegen_type typegen_type;
+
+ typegen_type = typegen_detect_type(t, field->attrs, TDT_IGNORE_STRINGS);
+
+ if (typegen_type == TGT_ARRAY && !type_array_is_decl_as_ptr(t))
+ {
+- if (is_string_type(field->attrs, field->type))
++ if (is_string_type(field->attrs, field->declspec.type))
+ {
+ if (is_conformant_array(t))
+ has_conformance = 1;
+@@ -505,10 +510,10 @@ unsigned char get_struct_fc(const type_t *type)
+ continue;
+ }
+
+- if (is_array(type_array_get_element(field->type)))
++ if (is_array(type_array_get_element_type(field->declspec.type)))
+ return FC_BOGUS_STRUCT;
+
+- if (type_array_has_conformance(field->type))
++ if (type_array_has_conformance(field->declspec.type))
+ {
+ has_conformance = 1;
+ if (list_next(fields, &field->entry))
+@@ -518,7 +523,7 @@ unsigned char get_struct_fc(const type_t *type)
+ if (type_array_has_variance(t))
+ has_variance = 1;
+
+- t = type_array_get_element(t);
++ t = type_array_get_element_type(t);
+ typegen_type = typegen_detect_type(t, field->attrs, TDT_IGNORE_STRINGS);
+ }
+
+@@ -620,7 +625,7 @@ static unsigned char get_array_fc(const type_t *type)
+ const expr_t *size_is;
+ const type_t *elem_type;
+
+- elem_type = type_array_get_element(type);
++ elem_type = type_array_get_element_type(type);
+ size_is = type_array_get_conformance(type);
+
+ if (!size_is)
+@@ -709,14 +714,14 @@ static int type_has_pointers(const type_t *type)
+ case TGT_POINTER:
+ return TRUE;
+ case TGT_ARRAY:
+- return type_array_is_decl_as_ptr(type) || type_has_pointers(type_array_get_element(type));
++ return type_array_is_decl_as_ptr(type) || type_has_pointers(type_array_get_element_type(type));
+ case TGT_STRUCT:
+ {
+ var_list_t *fields = type_struct_get_fields(type);
+ const var_t *field;
+ if (fields) LIST_FOR_EACH_ENTRY( field, fields, const var_t, entry )
+ {
+- if (type_has_pointers(field->type))
++ if (type_has_pointers(field->declspec.type))
+ return TRUE;
+ }
+ break;
+@@ -728,7 +733,7 @@ static int type_has_pointers(const type_t *type)
+ fields = type_union_get_cases(type);
+ if (fields) LIST_FOR_EACH_ENTRY( field, fields, const var_t, entry )
+ {
+- if (field->type && type_has_pointers(field->type))
++ if (field->declspec.type && type_has_pointers(field->declspec.type))
+ return TRUE;
+ }
+ break;
+@@ -763,14 +768,14 @@ static int type_has_full_pointer(const type_t *type, const attr_list_t *attrs,
+ if (get_pointer_fc(type, attrs, toplevel_param) == FC_FP)
+ return TRUE;
+ else
+- return type_has_full_pointer(type_array_get_element(type), NULL, FALSE);
++ return type_has_full_pointer(type_array_get_element_type(type), NULL, FALSE);
+ case TGT_STRUCT:
+ {
+ var_list_t *fields = type_struct_get_fields(type);
+ const var_t *field;
+ if (fields) LIST_FOR_EACH_ENTRY( field, fields, const var_t, entry )
+ {
+- if (type_has_full_pointer(field->type, field->attrs, FALSE))
++ if (type_has_full_pointer(field->declspec.type, field->attrs, FALSE))
+ return TRUE;
+ }
+ break;
+@@ -782,7 +787,7 @@ static int type_has_full_pointer(const type_t *type, const attr_list_t *attrs,
+ fields = type_union_get_cases(type);
+ if (fields) LIST_FOR_EACH_ENTRY( field, fields, const var_t, entry )
+ {
+- if (field->type && type_has_full_pointer(field->type, field->attrs, FALSE))
++ if (field->declspec.type && type_has_full_pointer(field->declspec.type, field->attrs, FALSE))
+ return TRUE;
+ }
+ break;
+@@ -852,7 +857,7 @@ static const char *get_context_handle_type_name(const type_t *type)
+ const type_t *t;
+ for (t = type;
+ is_ptr(t) || type_is_alias(t);
+- t = type_is_alias(t) ? type_alias_get_aliasee(t) : type_pointer_get_ref(t))
++ t = type_is_alias(t) ? type_alias_get_aliasee_type(t) : type_pointer_get_ref_type(t))
+ if (is_attr(t->attrs, ATTR_CONTEXTHANDLE))
+ return t->name;
+ assert(0);
+@@ -902,16 +907,16 @@ static void write_var_init(FILE *file, int indent, const type_t *t, const char *
+
+ void write_parameters_init(FILE *file, int indent, const var_t *func, const char *local_var_prefix)
+ {
+- const var_t *var = type_function_get_retval(func->type);
++ const var_t *var = type_function_get_retval(func->declspec.type);
+
+- if (!is_void(var->type))
+- write_var_init(file, indent, var->type, var->name, local_var_prefix);
++ if (!is_void(var->declspec.type))
++ write_var_init(file, indent, var->declspec.type, var->name, local_var_prefix);
+
+- if (!type_get_function_args(func->type))
++ if (!type_function_get_args(func->declspec.type))
+ return;
+
+- LIST_FOR_EACH_ENTRY( var, type_get_function_args(func->type), const var_t, entry )
+- write_var_init(file, indent, var->type, var->name, local_var_prefix);
++ LIST_FOR_EACH_ENTRY( var, type_function_get_args(func->declspec.type), const var_t, entry )
++ write_var_init(file, indent, var->declspec.type, var->name, local_var_prefix);
+
+ fprintf(file, "\n");
+ }
+@@ -975,14 +980,14 @@ static unsigned char get_parameter_fc( const var_t *var, int is_return, unsigned
+ if (is_out) *flags |= IsOut;
+ if (is_return) *flags |= IsReturn;
+
+- if (!is_string_type( var->attrs, var->type ))
+- buffer_size = get_required_buffer_size_type( var->type, NULL, var->attrs, TRUE, &alignment );
++ if (!is_string_type( var->attrs, var->declspec.type ))
++ buffer_size = get_required_buffer_size_type( var->declspec.type, NULL, var->attrs, TRUE, &alignment );
+
+- switch (typegen_detect_type( var->type, var->attrs, TDT_ALL_TYPES ))
++ switch (typegen_detect_type( var->declspec.type, var->attrs, TDT_ALL_TYPES ))
+ {
+ case TGT_BASIC:
+ *flags |= IsBasetype;
+- fc = get_basic_fc_signed( var->type );
++ fc = get_basic_fc_signed( var->declspec.type );
+ if (fc == FC_BIND_PRIMITIVE)
+ {
+ buffer_size = 4; /* actually 0 but avoids setting MustSize */
+@@ -991,7 +996,7 @@ static unsigned char get_parameter_fc( const var_t *var, int is_return, unsigned
+ break;
+ case TGT_ENUM:
+ *flags |= IsBasetype;
+- fc = get_enum_fc( var->type );
++ fc = get_enum_fc( var->declspec.type );
+ break;
+ case TGT_RANGE:
+ *flags |= IsByValue;
+@@ -1006,19 +1011,19 @@ static unsigned char get_parameter_fc( const var_t *var, int is_return, unsigned
+ break;
+ case TGT_ARRAY:
+ *flags |= MustFree;
+- if (type_array_is_decl_as_ptr(var->type) && var->type->details.array.ptr_tfsoff &&
+- get_pointer_fc( var->type, var->attrs, !is_return ) == FC_RP)
++ if (type_array_is_decl_as_ptr(var->declspec.type) && type_get_details(var->declspec.type)->array.ptr_tfsoff &&
++ get_pointer_fc( var->declspec.type, var->attrs, !is_return ) == FC_RP)
+ {
+- *typestring_offset = var->type->typestring_offset;
++ *typestring_offset = var->declspec.type->typestring_offset;
+ *flags |= IsSimpleRef;
+ }
+ break;
+ case TGT_STRING:
+ *flags |= MustFree;
+- if (is_declptr( var->type ) && get_pointer_fc( var->type, var->attrs, !is_return ) == FC_RP)
++ if (is_declptr( var->declspec.type ) && get_pointer_fc( var->declspec.type, var->attrs, !is_return ) == FC_RP)
+ {
+ /* skip over pointer description straight to string description */
+- if (is_conformant_array( var->type )) *typestring_offset += 4;
++ if (is_conformant_array( var->declspec.type )) *typestring_offset += 4;
+ else *typestring_offset += 2;
+ *flags |= IsSimpleRef;
+ }
+@@ -1031,9 +1036,9 @@ static unsigned char get_parameter_fc( const var_t *var, int is_return, unsigned
+ buffer_size = 20;
+ break;
+ case TGT_POINTER:
+- if (get_pointer_fc( var->type, var->attrs, !is_return ) == FC_RP)
++ if (get_pointer_fc( var->declspec.type, var->attrs, !is_return ) == FC_RP)
+ {
+- const type_t *ref = type_pointer_get_ref( var->type );
++ const type_t *ref = type_pointer_get_ref_type( var->declspec.type );
+
+ if (!is_string_type( var->attrs, ref ))
+ buffer_size = get_required_buffer_size_type( ref, NULL, NULL, TRUE, &alignment );
+@@ -1059,11 +1064,19 @@ static unsigned char get_parameter_fc( const var_t *var, int is_return, unsigned
+ case TGT_UNION:
+ case TGT_USER_TYPE:
+ case TGT_RANGE:
+- case TGT_ARRAY:
+- *flags |= IsSimpleRef | MustFree;
++ *flags |= MustFree | IsSimpleRef;
+ *typestring_offset = ref->typestring_offset;
+ if (!is_in && is_out) server_size = type_memsize( ref );
+ break;
++ case TGT_ARRAY:
++ *flags |= MustFree;
++ if (!type_array_is_decl_as_ptr(ref))
++ {
++ *flags |= IsSimpleRef;
++ *typestring_offset = ref->typestring_offset;
++ }
++ if (!is_in && is_out) server_size = type_memsize( ref );
++ break;
+ case TGT_STRING:
+ case TGT_POINTER:
+ case TGT_CTXT_HANDLE:
+@@ -1115,8 +1128,8 @@ static unsigned char get_parameter_fc( const var_t *var, int is_return, unsigned
+ static unsigned char get_func_oi2_flags( const var_t *func )
+ {
+ const var_t *var;
+- var_list_t *args = type_get_function_args( func->type );
+- var_t *retval = type_function_get_retval( func->type );
++ var_list_t *args = type_function_get_args( func->declspec.type );
++ var_t *retval = type_function_get_retval( func->declspec.type );
+ unsigned char oi2_flags = 0x40; /* HasExtensions */
+ unsigned short flags;
+ unsigned int stack_size, typestring_offset;
+@@ -1131,7 +1144,7 @@ static unsigned char get_func_oi2_flags( const var_t *func )
+ }
+ }
+
+- if (!is_void( retval->type ))
++ if (!is_void( retval->declspec.type ))
+ {
+ oi2_flags |= 0x04; /* HasRet */
+ get_parameter_fc( retval, 1, &flags, &stack_size, &typestring_offset );
+@@ -1185,8 +1198,8 @@ static unsigned int write_old_procformatstring_type(FILE *file, int indent, cons
+
+ if (!is_in && !is_out) is_in = TRUE;
+
+- if (type_get_type(var->type) == TYPE_BASIC ||
+- type_get_type(var->type) == TYPE_ENUM)
++ if (type_get_type(var->declspec.type) == TYPE_BASIC ||
++ type_get_type(var->declspec.type) == TYPE_ENUM)
+ {
+ unsigned char fc;
+
+@@ -1195,13 +1208,13 @@ static unsigned int write_old_procformatstring_type(FILE *file, int indent, cons
+ else
+ print_file(file, indent, "0x4e, /* FC_IN_PARAM_BASETYPE */\n");
+
+- if (type_get_type(var->type) == TYPE_ENUM)
++ if (type_get_type(var->declspec.type) == TYPE_ENUM)
+ {
+- fc = get_enum_fc(var->type);
++ fc = get_enum_fc(var->declspec.type);
+ }
+ else
+ {
+- fc = get_basic_fc_signed(var->type);
++ fc = get_basic_fc_signed(var->declspec.type);
+
+ if (fc == FC_BIND_PRIMITIVE)
+ fc = FC_IGNORE;
+@@ -1215,10 +1228,12 @@ static unsigned int write_old_procformatstring_type(FILE *file, int indent, cons
+ {
+ unsigned short offset = var->typestring_offset;
+
+- if (!is_interpreted && is_array(var->type) &&
+- type_array_is_decl_as_ptr(var->type) &&
+- var->type->details.array.ptr_tfsoff)
+- offset = var->type->typestring_offset;
++ if (!is_interpreted && is_array(var->declspec.type) &&
++ type_array_is_decl_as_ptr(var->declspec.type) &&
++ type_get_details(var->declspec.type)->array.ptr_tfsoff)
++ {
++ offset = var->declspec.type->typestring_offset;
++ }
+
+ if (is_return)
+ print_file(file, indent, "0x52, /* FC_RETURN_PARAM */\n");
+@@ -1241,8 +1256,8 @@ int is_interpreted_func( const type_t *iface, const var_t *func )
+ {
+ const char *str;
+ const var_t *var;
+- const var_list_t *args = type_get_function_args( func->type );
+- const type_t *ret_type = type_function_get_rettype( func->type );
++ const var_list_t *args = type_function_get_args( func->declspec.type );
++ const type_t *ret_type = type_function_get_rettype( func->declspec.type );
+
+ if (type_get_type( ret_type ) == TYPE_BASIC)
+ {
+@@ -1264,10 +1279,10 @@ int is_interpreted_func( const type_t *iface, const var_t *func )
+ if (get_stub_mode() != MODE_Oif && args)
+ {
+ LIST_FOR_EACH_ENTRY( var, args, const var_t, entry )
+- switch (type_get_type( var->type ))
++ switch (type_get_type( var->declspec.type ))
+ {
+ case TYPE_BASIC:
+- switch (type_basic_get_type( var->type ))
++ switch (type_basic_get_type( var->declspec.type ))
+ {
+ /* floating point arguments are not supported in Oi mode */
+ case TYPE_BASIC_FLOAT: return 0;
+@@ -1292,7 +1307,7 @@ static void write_proc_func_header( FILE *file, int indent, const type_t *iface,
+ unsigned short num_proc )
+ {
+ var_t *var;
+- var_list_t *args = type_get_function_args( func->type );
++ var_list_t *args = type_function_get_args( func->declspec.type );
+ unsigned char explicit_fc, implicit_fc;
+ unsigned char handle_flags;
+ const var_t *handle_var = get_func_handle_var( iface, func, &explicit_fc, &implicit_fc );
+@@ -1323,7 +1338,7 @@ static void write_proc_func_header( FILE *file, int indent, const type_t *iface,
+ param_num++;
+ nb_args++;
+ }
+- if (!is_void( type_function_get_rettype( func->type )))
++ if (!is_void( type_function_get_rettype( func->declspec.type )))
+ {
+ stack_size += pointer_size;
+ nb_args++;
+@@ -1351,22 +1366,22 @@ static void write_proc_func_header( FILE *file, int indent, const type_t *iface,
+ *offset += 4;
+ break;
+ case FC_BIND_GENERIC:
+- handle_flags = type_memsize( handle_var->type );
++ handle_flags = type_memsize( handle_var->declspec.type );
+ print_file( file, indent, "0x%02x,\t/* %s */\n", explicit_fc, string_of_type(explicit_fc) );
+ print_file( file, indent, "0x%02x,\n", handle_flags );
+ print_file( file, indent, "NdrFcShort(0x%hx),\t/* stack offset = %hu */\n",
+ handle_stack_offset, handle_stack_offset );
+- print_file( file, indent, "0x%02x,\n", get_generic_handle_offset( handle_var->type ) );
++ print_file( file, indent, "0x%02x,\n", get_generic_handle_offset( handle_var->declspec.type ) );
+ print_file( file, indent, "0x%x,\t/* FC_PAD */\n", FC_PAD);
+ *offset += 6;
+ break;
+ case FC_BIND_CONTEXT:
+- handle_flags = get_contexthandle_flags( iface, handle_var->attrs, handle_var->type );
++ handle_flags = get_contexthandle_flags( iface, handle_var->attrs, handle_var->declspec.type, 0 );
+ print_file( file, indent, "0x%02x,\t/* %s */\n", explicit_fc, string_of_type(explicit_fc) );
+ print_file( file, indent, "0x%02x,\n", handle_flags );
+ print_file( file, indent, "NdrFcShort(0x%hx),\t/* stack offset = %hu */\n",
+ handle_stack_offset, handle_stack_offset );
+- print_file( file, indent, "0x%02x,\n", get_context_handle_offset( handle_var->type ) );
++ print_file( file, indent, "0x%02x,\n", get_context_handle_offset( handle_var->declspec.type ) );
+ print_file( file, indent, "0x%02x,\t/* param %hu */\n", handle_param_num, handle_param_num );
+ *offset += 6;
+ break;
+@@ -1381,7 +1396,7 @@ static void write_proc_func_header( FILE *file, int indent, const type_t *iface,
+
+ if (is_attr( func->attrs, ATTR_NOTIFY )) ext_flags |= 0x08; /* HasNotify */
+ if (is_attr( func->attrs, ATTR_NOTIFYFLAG )) ext_flags |= 0x10; /* HasNotify2 */
+- if (iface == iface->details.iface->async_iface) oi2_flags |= 0x20;
++ if (iface == type_get_const_details(iface)->iface->async_iface) oi2_flags |= 0x20;
+
+ size = get_function_buffer_size( func, PASS_IN );
+ print_file( file, indent, "NdrFcShort(0x%x),\t/* client buffer = %u */\n", size, size );
+@@ -1402,9 +1417,9 @@ static void write_proc_func_header( FILE *file, int indent, const type_t *iface,
+ if (is_object( iface )) pos += 2;
+ if (args) LIST_FOR_EACH_ENTRY( var, args, var_t, entry )
+ {
+- if (type_get_type( var->type ) == TYPE_BASIC)
++ if (type_get_type( var->declspec.type ) == TYPE_BASIC)
+ {
+- switch (type_basic_get_type( var->type ))
++ switch (type_basic_get_type( var->declspec.type ))
+ {
+ case TYPE_BASIC_FLOAT: fpu_mask |= 1 << pos; break;
+ case TYPE_BASIC_DOUBLE: fpu_mask |= 2 << pos; break;
+@@ -1427,15 +1442,15 @@ static void write_procformatstring_func( FILE *file, int indent, const type_t *i
+ unsigned int stack_offset = is_object( iface ) ? pointer_size : 0;
+ int is_interpreted = is_interpreted_func( iface, func );
+ int is_new_style = is_interpreted && (get_stub_mode() == MODE_Oif);
+- var_t *retval = type_function_get_retval( func->type );
++ var_t *retval = type_function_get_retval( func->declspec.type );
+
+ if (is_interpreted) write_proc_func_header( file, indent, iface, func, offset, num_proc );
+
+ /* emit argument data */
+- if (type_get_function_args(func->type))
++ if (type_function_get_args(func->declspec.type))
+ {
+ const var_t *var;
+- LIST_FOR_EACH_ENTRY( var, type_get_function_args(func->type), const var_t, entry )
++ LIST_FOR_EACH_ENTRY( var, type_function_get_args(func->declspec.type), const var_t, entry )
+ {
+ print_file( file, 0, "/* %u (parameter %s) */\n", *offset, var->name );
+ if (is_new_style)
+@@ -1446,7 +1461,7 @@ static void write_procformatstring_func( FILE *file, int indent, const type_t *i
+ }
+
+ /* emit return value data */
+- if (is_void(retval->type))
++ if (is_void(retval->declspec.type))
+ {
+ if (!is_new_style)
+ {
+@@ -1475,13 +1490,13 @@ static void for_each_iface(const statement_list_t *stmts,
+
+ if (stmts) LIST_FOR_EACH_ENTRY( stmt, stmts, const statement_t, entry )
+ {
+- if (stmt->type != STMT_TYPE || type_get_type(stmt->u.type) != TYPE_INTERFACE)
++ if (stmt->type != STMT_TYPE || type_get_type_detect_alias(stmt->u.type) != TYPE_INTERFACE)
+ continue;
+ iface = stmt->u.type;
+ if (!pred(iface)) continue;
+ proc(iface, file, indent, offset);
+- if (iface->details.iface->async_iface)
+- proc(iface->details.iface->async_iface, file, indent, offset);
++ if (type_get_const_details(iface)->iface->async_iface)
++ proc(type_get_const_details(iface)->iface->async_iface, file, indent, offset);
+ }
+ }
+
+@@ -1593,7 +1608,7 @@ static unsigned int write_conf_or_var_desc(FILE *file, const type_t *cont_type,
+ {
+ conftype = FC_TOP_LEVEL_CONFORMANCE;
+ conftype_string = "parameter";
+- cont_type = current_func->type;
++ cont_type = current_func->declspec.type;
+ name = current_func->name;
+ iface = current_iface;
+ }
+@@ -1656,7 +1671,7 @@ static unsigned int write_conf_or_var_desc(FILE *file, const type_t *cont_type,
+
+ if (type_get_type(cont_type) == TYPE_FUNCTION)
+ {
+- var_list_t *args = type_get_function_args( cont_type );
++ var_list_t *args = type_function_get_args( cont_type );
+
+ if (is_object( iface )) offset += pointer_size;
+ if (args) LIST_FOR_EACH_ENTRY( var, args, const var_t, entry )
+@@ -1664,7 +1679,7 @@ static unsigned int write_conf_or_var_desc(FILE *file, const type_t *cont_type,
+ if (var->name && !strcmp(var->name, subexpr->u.sval))
+ {
+ expr_loc.v = var;
+- correlation_variable = var->type;
++ correlation_variable = var->declspec.type;
+ break;
+ }
+ offset += get_stack_size( var, NULL );
+@@ -1676,11 +1691,11 @@ static unsigned int write_conf_or_var_desc(FILE *file, const type_t *cont_type,
+
+ if (fields) LIST_FOR_EACH_ENTRY( var, fields, const var_t, entry )
+ {
+- unsigned int size = field_memsize( var->type, &offset );
++ unsigned int size = field_memsize( var->declspec.type, &offset );
+ if (var->name && !strcmp(var->name, subexpr->u.sval))
+ {
+ expr_loc.v = var;
+- correlation_variable = var->type;
++ correlation_variable = var->declspec.type;
+ break;
+ }
+ offset += size;
+@@ -1819,7 +1834,7 @@ static unsigned int fields_memsize(const var_list_t *fields, unsigned int *align
+ LIST_FOR_EACH_ENTRY( v, fields, const var_t, entry )
+ {
+ unsigned int falign = 0;
+- unsigned int fsize = type_memsize_and_alignment(v->type, &falign);
++ unsigned int fsize = type_memsize_and_alignment(v->declspec.type, &falign);
+ if (*align < falign) *align = falign;
+ falign = clamp_align(falign);
+ size = ROUND_SIZE(size, falign);
+@@ -1841,9 +1856,9 @@ static unsigned int union_memsize(const var_list_t *fields, unsigned int *pmaxa)
+ if (fields) LIST_FOR_EACH_ENTRY( v, fields, const var_t, entry )
+ {
+ /* we could have an empty default field with NULL type */
+- if (v->type)
++ if (v->declspec.type)
+ {
+- size = type_memsize_and_alignment(v->type, &align);
++ size = type_memsize_and_alignment(v->declspec.type, &align);
+ if (maxs < size) maxs = size;
+ if (*pmaxa < align) *pmaxa = align;
+ }
+@@ -1931,12 +1946,12 @@ unsigned int type_memsize_and_alignment(const type_t *t, unsigned int *align)
+ {
+ if (is_conformant_array(t))
+ {
+- type_memsize_and_alignment(type_array_get_element(t), align);
++ type_memsize_and_alignment(type_array_get_element_type(t), align);
+ size = 0;
+ }
+ else
+ size = type_array_get_dim(t) *
+- type_memsize_and_alignment(type_array_get_element(t), align);
++ type_memsize_and_alignment(type_array_get_element_type(t), align);
+ }
+ else /* declared as a pointer */
+ {
+@@ -2016,8 +2031,8 @@ static unsigned int type_buffer_alignment(const type_t *t)
+ if (!(fields = type_struct_get_fields(t))) break;
+ LIST_FOR_EACH_ENTRY( var, fields, const var_t, entry )
+ {
+- if (!var->type) continue;
+- align = type_buffer_alignment( var->type );
++ if (!var->declspec.type) continue;
++ align = type_buffer_alignment( var->declspec.type );
+ if (max < align) max = align;
+ }
+ break;
+@@ -2025,8 +2040,8 @@ static unsigned int type_buffer_alignment(const type_t *t)
+ if (!(fields = type_encapsulated_union_get_fields(t))) break;
+ LIST_FOR_EACH_ENTRY( var, fields, const var_t, entry )
+ {
+- if (!var->type) continue;
+- align = type_buffer_alignment( var->type );
++ if (!var->declspec.type) continue;
++ align = type_buffer_alignment( var->declspec.type );
+ if (max < align) max = align;
+ }
+ break;
+@@ -2034,14 +2049,14 @@ static unsigned int type_buffer_alignment(const type_t *t)
+ if (!(fields = type_union_get_cases(t))) break;
+ LIST_FOR_EACH_ENTRY( var, fields, const var_t, entry )
+ {
+- if (!var->type) continue;
+- align = type_buffer_alignment( var->type );
++ if (!var->declspec.type) continue;
++ align = type_buffer_alignment( var->declspec.type );
+ if (max < align) max = align;
+ }
+ break;
+ case TYPE_ARRAY:
+ if (!type_array_is_decl_as_ptr(t))
+- return type_buffer_alignment( type_array_get_element(t) );
++ return type_buffer_alignment( type_array_get_element_type(t) );
+ /* else fall through */
+ case TYPE_POINTER:
+ return 4;
+@@ -2064,12 +2079,12 @@ static unsigned int type_buffer_alignment(const type_t *t)
+ int is_full_pointer_function(const var_t *func)
+ {
+ const var_t *var;
+- if (type_has_full_pointer(type_function_get_rettype(func->type), func->attrs, TRUE))
++ if (type_has_full_pointer(type_function_get_rettype(func->declspec.type), func->attrs, TRUE))
+ return TRUE;
+- if (!type_get_function_args(func->type))
++ if (!type_function_get_args(func->declspec.type))
+ return FALSE;
+- LIST_FOR_EACH_ENTRY( var, type_get_function_args(func->type), const var_t, entry )
+- if (type_has_full_pointer( var->type, var->attrs, TRUE ))
++ LIST_FOR_EACH_ENTRY( var, type_function_get_args(func->declspec.type), const var_t, entry )
++ if (type_has_full_pointer( var->declspec.type, var->attrs, TRUE ))
+ return TRUE;
+ return FALSE;
+ }
+@@ -2114,12 +2129,13 @@ static unsigned int write_nonsimple_pointer(FILE *file, const attr_list_t *attrs
+ {
+ if (context == TYPE_CONTEXT_TOPLEVELPARAM && is_ptr(type) && pointer_type == FC_RP)
+ {
+- switch (typegen_detect_type(type_pointer_get_ref(type), NULL, TDT_ALL_TYPES))
++ switch (typegen_detect_type(type_pointer_get_ref_type(type), NULL, TDT_ALL_TYPES))
+ {
+ case TGT_STRING:
+ case TGT_POINTER:
+ case TGT_CTXT_HANDLE:
+ case TGT_CTXT_HANDLE_POINTER:
++ case TGT_ARRAY:
+ flags |= FC_ALLOCED_ON_STACK;
+ break;
+ case TGT_IFACE_POINTER:
+@@ -2134,7 +2150,7 @@ static unsigned int write_nonsimple_pointer(FILE *file, const attr_list_t *attrs
+
+ if (is_ptr(type))
+ {
+- type_t *ref = type_pointer_get_ref(type);
++ type_t *ref = type_pointer_get_ref_type(type);
+ if(is_declptr(ref) && !is_user_type(ref))
+ flags |= FC_POINTER_DEREF;
+ }
+@@ -2175,7 +2191,7 @@ static unsigned int write_simple_pointer(FILE *file, const attr_list_t *attrs,
+
+ pointer_fc = get_pointer_fc_context(type, attrs, context);
+
+- ref = type_pointer_get_ref(type);
++ ref = type_pointer_get_ref_type(type);
+ if (type_get_type(ref) == TYPE_ENUM)
+ fc = get_enum_fc(ref);
+ else
+@@ -2200,22 +2216,23 @@ static unsigned int write_simple_pointer(FILE *file, const attr_list_t *attrs,
+ return 4;
+ }
+
+-static void print_start_tfs_comment(FILE *file, type_t *t, unsigned int tfsoff)
++static void print_start_tfs_comment(FILE *file, const decl_spec_t *ds, unsigned int tfsoff)
+ {
+ print_file(file, 0, "/* %u (", tfsoff);
+- write_type_decl(file, t, NULL);
++ write_declspec_decl(file, ds, NULL);
+ print_file(file, 0, ") */\n");
+ }
+
+ static unsigned int write_pointer_tfs(FILE *file, const attr_list_t *attrs,
+- type_t *type, unsigned int ref_offset,
++ const decl_spec_t *declspec, unsigned int ref_offset,
+ enum type_context context,
+ unsigned int *typestring_offset)
+ {
+ unsigned int offset = *typestring_offset;
+- type_t *ref = type_pointer_get_ref(type);
++ type_t *type = declspec->type;
++ type_t *ref = type_pointer_get_ref_type(type);
+
+- print_start_tfs_comment(file, type, offset);
++ print_start_tfs_comment(file, declspec, offset);
+ update_tfsoff(type, offset, file);
+
+ switch (typegen_detect_type(ref, attrs, TDT_ALL_TYPES))
+@@ -2258,10 +2275,11 @@ static int user_type_has_variable_size(const type_t *t)
+ return FALSE;
+ }
+
+-static unsigned int write_user_tfs(FILE *file, type_t *type, unsigned int *tfsoff)
++static unsigned int write_user_tfs(FILE *file, const decl_spec_t *declspec, unsigned int *tfsoff)
+ {
+ unsigned int start, absoff, flags;
+ const char *name = NULL;
++ type_t *type = declspec->type;
+ type_t *utype = get_user_type(type, &name);
+ unsigned int usize = type_memsize(utype);
+ unsigned int ualign = type_buffer_alignment(utype);
+@@ -2279,6 +2297,7 @@ static unsigned int write_user_tfs(FILE *file, type_t *type, unsigned int *tfsof
+ type_get_type(utype) == TYPE_ENUM)
+ {
+ unsigned char fc;
++ decl_spec_t ds;
+
+ if (type_get_type(utype) == TYPE_ENUM)
+ fc = get_enum_fc(utype);
+@@ -2286,7 +2305,7 @@ static unsigned int write_user_tfs(FILE *file, type_t *type, unsigned int *tfsof
+ fc = get_basic_fc(utype);
+
+ absoff = *tfsoff;
+- print_start_tfs_comment(file, utype, absoff);
++ print_start_tfs_comment(file, init_declspec(&ds, utype), absoff);
+ print_file(file, 2, "0x%x,\t/* %s */\n", fc, string_of_type(fc));
+ print_file(file, 2, "0x5c,\t/* FC_PAD */\n");
+ *tfsoff += 2;
+@@ -2294,7 +2313,10 @@ static unsigned int write_user_tfs(FILE *file, type_t *type, unsigned int *tfsof
+ else
+ {
+ if (!processed(utype))
+- write_embedded_types(file, NULL, utype, utype->name, TRUE, tfsoff);
++ {
++ decl_spec_t ds;
++ write_embedded_types(file, NULL, init_declspec(&ds, utype), utype->name, TRUE, tfsoff);
++ }
+ absoff = utype->typestring_offset;
+ }
+
+@@ -2307,7 +2329,7 @@ static unsigned int write_user_tfs(FILE *file, type_t *type, unsigned int *tfsof
+
+ start = *tfsoff;
+ update_tfsoff(type, start, file);
+- print_start_tfs_comment(file, type, start);
++ print_start_tfs_comment(file, declspec, start);
+ print_file(file, 2, "0x%x,\t/* FC_USER_MARSHAL */\n", FC_USER_MARSHAL);
+ print_file(file, 2, "0x%x,\t/* Alignment= %d, Flags= %02x */\n",
+ flags | (ualign - 1), ualign - 1, flags);
+@@ -2364,11 +2386,12 @@ static void write_member_type(FILE *file, const type_t *cont,
+ static void write_array_element_type(FILE *file, const attr_list_t *attrs, const type_t *type,
+ int cont_is_complex, unsigned int *tfsoff)
+ {
+- type_t *elem = type_array_get_element(type);
++ const decl_spec_t *element = type_array_get_element(type);
++ type_t *elem = element->type;
+
+ if (!is_embedded_complex(elem) && is_ptr(elem))
+ {
+- type_t *ref = type_pointer_get_ref(elem);
++ type_t *ref = type_pointer_get_ref_type(elem);
+
+ if (processed(ref))
+ {
+@@ -2378,7 +2401,7 @@ static void write_array_element_type(FILE *file, const attr_list_t *attrs, const
+ }
+ if (cont_is_complex && is_string_type(attrs, elem))
+ {
+- write_string_tfs(file, NULL, elem, TYPE_CONTEXT_CONTAINER, NULL, tfsoff);
++ write_string_tfs(file, NULL, element, TYPE_CONTEXT_CONTAINER, NULL, tfsoff);
+ return;
+ }
+ if (!is_string_type(NULL, elem) &&
+@@ -2410,7 +2433,7 @@ static void write_descriptors(FILE *file, type_t *type, unsigned int *tfsoff)
+
+ if (fs) LIST_FOR_EACH_ENTRY(f, fs, var_t, entry)
+ {
+- type_t *ft = f->type;
++ type_t *ft = f->declspec.type;
+ unsigned int size = field_memsize( ft, &offset );
+ if (type_get_type(ft) == TYPE_UNION && is_attr(f->attrs, ATTR_SWITCHIS))
+ {
+@@ -2433,13 +2456,14 @@ static void write_descriptors(FILE *file, type_t *type, unsigned int *tfsoff)
+ }
+
+ static int write_pointer_description_offsets(
+- FILE *file, const attr_list_t *attrs, type_t *type,
++ FILE *file, const attr_list_t *attrs, const decl_spec_t *declspec,
+ unsigned int *offset_in_memory, unsigned int *offset_in_buffer,
+ unsigned int *typestring_offset)
+ {
++ type_t *type = declspec->type;
+ int written = 0;
+
+- if ((is_ptr(type) && type_get_type(type_pointer_get_ref(type)) != TYPE_INTERFACE) ||
++ if ((is_ptr(type) && type_get_type(type_pointer_get_ref_type(type)) != TYPE_INTERFACE) ||
+ (is_array(type) && type_array_is_decl_as_ptr(type)))
+ {
+ if (offset_in_memory && offset_in_buffer)
+@@ -2464,10 +2488,10 @@ static int write_pointer_description_offsets(
+
+ if (is_ptr(type))
+ {
+- type_t *ref = type_pointer_get_ref(type);
++ type_t *ref = type_pointer_get_ref_type(type);
+
+ if (is_string_type(attrs, type))
+- write_string_tfs(file, attrs, type, TYPE_CONTEXT_CONTAINER, NULL, typestring_offset);
++ write_string_tfs(file, attrs, declspec, TYPE_CONTEXT_CONTAINER, NULL, typestring_offset);
+ else if (processed(ref))
+ write_nonsimple_pointer(file, attrs, type, TYPE_CONTEXT_CONTAINER,
+ ref->typestring_offset, typestring_offset);
+@@ -2505,13 +2529,13 @@ static int write_pointer_description_offsets(
+ {
+ unsigned int padding;
+ unsigned int align = 0;
+- type_memsize_and_alignment(v->type, &align);
++ type_memsize_and_alignment(v->declspec.type, &align);
+ padding = ROUNDING(*offset_in_memory, align);
+ *offset_in_memory += padding;
+ *offset_in_buffer += padding;
+ }
+ written += write_pointer_description_offsets(
+- file, v->attrs, v->type, offset_in_memory, offset_in_buffer,
++ file, v->attrs, &v->declspec, offset_in_memory, offset_in_buffer,
+ typestring_offset);
+ }
+ }
+@@ -2531,10 +2555,11 @@ static int write_pointer_description_offsets(
+ }
+
+ static int write_no_repeat_pointer_descriptions(
+- FILE *file, const attr_list_t *attrs, type_t *type,
++ FILE *file, const attr_list_t *attrs, const decl_spec_t *declspec,
+ unsigned int *offset_in_memory, unsigned int *offset_in_buffer,
+ unsigned int *typestring_offset)
+ {
++ type_t *type = declspec->type;
+ int written = 0;
+
+ if (is_ptr(type) ||
+@@ -2544,7 +2569,7 @@ static int write_no_repeat_pointer_descriptions(
+ print_file(file, 2, "0x%02x, /* FC_PAD */\n", FC_PAD);
+ *typestring_offset += 2;
+
+- return write_pointer_description_offsets(file, attrs, type,
++ return write_pointer_description_offsets(file, attrs, declspec,
+ offset_in_memory, offset_in_buffer, typestring_offset);
+ }
+
+@@ -2557,13 +2582,13 @@ static int write_no_repeat_pointer_descriptions(
+ {
+ unsigned int padding;
+ unsigned int align = 0;
+- type_memsize_and_alignment(v->type, &align);
++ type_memsize_and_alignment(v->declspec.type, &align);
+ padding = ROUNDING(*offset_in_memory, align);
+ *offset_in_memory += padding;
+ *offset_in_buffer += padding;
+ }
+ written += write_no_repeat_pointer_descriptions(
+- file, v->attrs, v->type,
++ file, v->attrs, &v->declspec,
+ offset_in_memory, offset_in_buffer, typestring_offset);
+ }
+ }
+@@ -2582,10 +2607,11 @@ static int write_no_repeat_pointer_descriptions(
+ /* Note: if file is NULL return value is number of pointers to write, else
+ * it is the number of type format characters written */
+ static int write_fixed_array_pointer_descriptions(
+- FILE *file, const attr_list_t *attrs, type_t *type,
++ FILE *file, const attr_list_t *attrs, const decl_spec_t *declspec,
+ unsigned int *offset_in_memory, unsigned int *offset_in_buffer,
+ unsigned int *typestring_offset)
+ {
++ type_t *type = declspec->type;
+ int pointer_count = 0;
+
+ if (type_get_type(type) == TYPE_ARRAY &&
+@@ -2602,7 +2628,7 @@ static int write_fixed_array_pointer_descriptions(
+ unsigned int offset_of_array_pointer_mem = 0;
+ unsigned int offset_of_array_pointer_buf = 0;
+
+- increment_size = type_memsize(type_array_get_element(type));
++ increment_size = type_memsize(type_array_get_element_type(type));
+
+ print_file(file, 2, "0x%02x, /* FC_FIXED_REPEAT */\n", FC_FIXED_REPEAT);
+ print_file(file, 2, "0x%02x, /* FC_PAD */\n", FC_PAD);
+@@ -2613,7 +2639,7 @@ static int write_fixed_array_pointer_descriptions(
+ *typestring_offset += 10;
+
+ pointer_count = write_pointer_description_offsets(
+- file, attrs, type, &offset_of_array_pointer_mem,
++ file, attrs, declspec, &offset_of_array_pointer_mem,
+ &offset_of_array_pointer_buf, typestring_offset);
+ }
+ }
+@@ -2626,13 +2652,13 @@ static int write_fixed_array_pointer_descriptions(
+ {
+ unsigned int padding;
+ unsigned int align = 0;
+- type_memsize_and_alignment(v->type, &align);
++ type_memsize_and_alignment(v->declspec.type, &align);
+ padding = ROUNDING(*offset_in_memory, align);
+ *offset_in_memory += padding;
+ *offset_in_buffer += padding;
+ }
+ pointer_count += write_fixed_array_pointer_descriptions(
+- file, v->attrs, v->type, offset_in_memory, offset_in_buffer,
++ file, v->attrs, &v->declspec, offset_in_memory, offset_in_buffer,
+ typestring_offset);
+ }
+ }
+@@ -2673,7 +2699,7 @@ static int write_conformant_array_pointer_descriptions(
+ unsigned int offset_of_array_pointer_mem = offset_in_memory;
+ unsigned int offset_of_array_pointer_buf = offset_in_memory;
+
+- increment_size = type_memsize(type_array_get_element(type));
++ increment_size = type_memsize(type_array_get_element_type(type));
+
+ if (increment_size > USHRT_MAX)
+ error("array size of %u bytes is too large\n", increment_size);
+@@ -2715,7 +2741,7 @@ static int write_varying_array_pointer_descriptions(
+ {
+ unsigned int increment_size;
+
+- increment_size = type_memsize(type_array_get_element(type));
++ increment_size = type_memsize(type_array_get_element_type(type));
+
+ if (increment_size > USHRT_MAX)
+ error("array size of %u bytes is too large\n", increment_size);
+@@ -2741,20 +2767,20 @@ static int write_varying_array_pointer_descriptions(
+ {
+ unsigned int align = 0, padding;
+
+- if (is_array(v->type) && type_array_has_variance(v->type))
++ if (is_array(v->declspec.type) && type_array_has_variance(v->declspec.type))
+ {
+ *offset_in_buffer = ROUND_SIZE(*offset_in_buffer, 4);
+ /* skip over variance and offset in buffer */
+ *offset_in_buffer += 8;
+ }
+
+- type_memsize_and_alignment(v->type, &align);
++ type_memsize_and_alignment(v->declspec.type, &align);
+ padding = ROUNDING(*offset_in_memory, align);
+ *offset_in_memory += padding;
+ *offset_in_buffer += padding;
+ }
+ pointer_count += write_varying_array_pointer_descriptions(
+- file, v->attrs, v->type, offset_in_memory, offset_in_buffer,
++ file, v->attrs, v->declspec.type, offset_in_memory, offset_in_buffer,
+ typestring_offset);
+ }
+ }
+@@ -2773,9 +2799,10 @@ static int write_varying_array_pointer_descriptions(
+ return pointer_count;
+ }
+
+-static void write_pointer_description(FILE *file, const attr_list_t *attrs, type_t *type,
++static void write_pointer_description(FILE *file, const attr_list_t *attrs, const decl_spec_t *declspec,
+ unsigned int *typestring_offset)
+ {
++ type_t *type = declspec->type;
+ unsigned int offset_in_buffer;
+ unsigned int offset_in_memory;
+
+@@ -2786,7 +2813,7 @@ static void write_pointer_description(FILE *file, const attr_list_t *attrs, type
+ offset_in_memory = 0;
+ offset_in_buffer = 0;
+ write_no_repeat_pointer_descriptions(
+- file, NULL, type,
++ file, NULL, declspec,
+ &offset_in_memory, &offset_in_buffer, typestring_offset);
+ }
+
+@@ -2794,7 +2821,7 @@ static void write_pointer_description(FILE *file, const attr_list_t *attrs, type
+ offset_in_memory = 0;
+ offset_in_buffer = 0;
+ write_fixed_array_pointer_descriptions(
+- file, NULL, type,
++ file, NULL, declspec,
+ &offset_in_memory, &offset_in_buffer, typestring_offset);
+
+ /* pass 3: search for pointers in conformant only arrays (but don't descend
+@@ -2806,7 +2833,7 @@ static void write_pointer_description(FILE *file, const attr_list_t *attrs, type
+ else if (type_get_type(type) == TYPE_STRUCT &&
+ get_struct_fc(type) == FC_CPSTRUCT)
+ {
+- type_t *carray = find_array_or_string_in_struct(type)->type;
++ type_t *carray = find_array_or_string_in_struct(type)->declspec.type;
+ write_conformant_array_pointer_descriptions( file, NULL, carray,
+ type_memsize(type), typestring_offset);
+ }
+@@ -2820,9 +2847,10 @@ static void write_pointer_description(FILE *file, const attr_list_t *attrs, type
+ }
+
+ static unsigned int write_string_tfs(FILE *file, const attr_list_t *attrs,
+- type_t *type, enum type_context context,
++ const decl_spec_t *declspec, enum type_context context,
+ const char *name, unsigned int *typestring_offset)
+ {
++ type_t *type = declspec->type;
+ unsigned int start_offset;
+ unsigned char rtype;
+ type_t *elem_type;
+@@ -2836,7 +2864,7 @@ static unsigned int write_string_tfs(FILE *file, const attr_list_t *attrs,
+ int pointer_type = get_pointer_fc_context(type, attrs, context);
+ if (!pointer_type)
+ pointer_type = FC_RP;
+- print_start_tfs_comment(file, type, *typestring_offset);
++ print_start_tfs_comment(file, declspec, *typestring_offset);
+ print_file(file, 2,"0x%x, 0x%x,\t/* %s%s */\n",
+ pointer_type, flag, string_of_type(pointer_type),
+ flag ? " [simple_pointer]" : "");
+@@ -2850,12 +2878,12 @@ static unsigned int write_string_tfs(FILE *file, const attr_list_t *attrs,
+ }
+
+ if (is_array(type))
+- elem_type = type_array_get_element(type);
++ elem_type = type_array_get_element_type(type);
+ else
+- elem_type = type_pointer_get_ref(type);
++ elem_type = type_pointer_get_ref_type(type);
+
+ if (type_get_type(elem_type) == TYPE_POINTER && is_array(type))
+- return write_array_tfs(file, attrs, type, name, typestring_offset);
++ return write_array_tfs(file, attrs, declspec, name, typestring_offset);
+
+ if (type_get_type(elem_type) != TYPE_BASIC)
+ {
+@@ -2929,34 +2957,31 @@ static unsigned int write_string_tfs(FILE *file, const attr_list_t *attrs,
+ }
+ }
+
+-static unsigned int write_array_tfs(FILE *file, const attr_list_t *attrs, type_t *type,
++static unsigned int write_array_tfs(FILE *file, const attr_list_t *attrs, const decl_spec_t *declspec,
+ const char *name, unsigned int *typestring_offset)
+ {
++ type_t *type = declspec->type;
+ const expr_t *length_is = type_array_get_variance(type);
+ const expr_t *size_is = type_array_get_conformance(type);
+ unsigned int align;
+ unsigned int size;
+ unsigned int start_offset;
+ unsigned char fc;
+- int pointer_type = get_attrv(attrs, ATTR_POINTERTYPE);
+ unsigned int baseoff
+ = !type_array_is_decl_as_ptr(type) && current_structure
+ ? type_memsize(current_structure)
+ : 0;
+
+- if (!pointer_type)
+- pointer_type = FC_RP;
+-
+- if (!is_string_type(attrs, type_array_get_element(type)))
++ if (!is_string_type(attrs, type_array_get_element_type(type)))
+ write_embedded_types(file, attrs, type_array_get_element(type), name, FALSE, typestring_offset);
+
+- size = type_memsize(is_conformant_array(type) ? type_array_get_element(type) : type);
+- align = type_buffer_alignment(is_conformant_array(type) ? type_array_get_element(type) : type);
++ size = type_memsize(is_conformant_array(type) ? type_array_get_element_type(type) : type);
++ align = type_buffer_alignment(is_conformant_array(type) ? type_array_get_element_type(type) : type);
+ fc = get_array_fc(type);
+
+ start_offset = *typestring_offset;
+ update_tfsoff(type, start_offset, file);
+- print_start_tfs_comment(file, type, start_offset);
++ print_start_tfs_comment(file, declspec, start_offset);
+ print_file(file, 2, "0x%02x,\t/* %s */\n", fc, string_of_type(fc));
+ print_file(file, 2, "0x%x,\t/* %d */\n", align - 1, align - 1);
+ *typestring_offset += 2;
+@@ -2982,7 +3007,7 @@ static unsigned int write_array_tfs(FILE *file, const attr_list_t *attrs, type_t
+
+ if (fc == FC_SMVARRAY || fc == FC_LGVARRAY)
+ {
+- unsigned int elsize = type_memsize(type_array_get_element(type));
++ unsigned int elsize = type_memsize(type_array_get_element_type(type));
+ unsigned int dim = type_array_get_dim(type);
+
+ if (fc == FC_LGVARRAY)
+@@ -3005,13 +3030,13 @@ static unsigned int write_array_tfs(FILE *file, const attr_list_t *attrs, type_t
+ += write_conf_or_var_desc(file, current_structure, baseoff,
+ type, length_is);
+
+- if (type_has_pointers(type_array_get_element(type)) &&
++ if (type_has_pointers(type_array_get_element_type(type)) &&
+ (type_array_is_decl_as_ptr(type) || !current_structure))
+ {
+ print_file(file, 2, "0x%x,\t/* FC_PP */\n", FC_PP);
+ print_file(file, 2, "0x%x,\t/* FC_PAD */\n", FC_PAD);
+ *typestring_offset += 2;
+- write_pointer_description(file, is_string_type(attrs, type) ? attrs : NULL, type, typestring_offset);
++ write_pointer_description(file, is_string_type(attrs, type) ? attrs : NULL, declspec, typestring_offset);
+ print_file(file, 2, "0x%x,\t/* FC_END */\n", FC_END);
+ *typestring_offset += 1;
+ }
+@@ -3048,7 +3073,7 @@ static const var_t *find_array_or_string_in_struct(const type_t *type)
+ return NULL;
+
+ last_field = LIST_ENTRY( list_tail(fields), const var_t, entry );
+- ft = last_field->type;
++ ft = last_field->declspec.type;
+
+ if (is_conformant_array(ft) && !type_array_is_decl_as_ptr(ft))
+ return last_field;
+@@ -3071,7 +3096,7 @@ static void write_struct_members(FILE *file, const type_t *type,
+
+ if (fields) LIST_FOR_EACH_ENTRY( field, fields, const var_t, entry )
+ {
+- type_t *ft = field->type;
++ type_t *ft = field->declspec.type;
+ unsigned int align = 0;
+ unsigned int size = type_memsize_and_alignment(ft, &align);
+ align = clamp_align(align);
+@@ -3100,7 +3125,7 @@ static void write_struct_members(FILE *file, const type_t *type,
+ offset = ROUND_SIZE(offset, align);
+ *typestring_offset += 1;
+ }
+- write_member_type(file, type, is_complex, field->attrs, field->type, corroff,
++ write_member_type(file, type, is_complex, field->attrs, field->declspec.type, corroff,
+ typestring_offset);
+ offset += size;
+ }
+@@ -3118,9 +3143,10 @@ static void write_struct_members(FILE *file, const type_t *type,
+ write_end(file, typestring_offset);
+ }
+
+-static unsigned int write_struct_tfs(FILE *file, type_t *type,
++static unsigned int write_struct_tfs(FILE *file, const decl_spec_t *declspec,
+ const char *name, unsigned int *tfsoff)
+ {
++ type_t *type = declspec->type;
+ const type_t *save_current_structure = current_structure;
+ unsigned int total_size;
+ const var_t *array;
+@@ -3143,15 +3169,15 @@ static unsigned int write_struct_tfs(FILE *file, type_t *type,
+ name, USHRT_MAX, total_size - USHRT_MAX);
+
+ if (fields) LIST_FOR_EACH_ENTRY(f, fields, var_t, entry)
+- write_embedded_types(file, f->attrs, f->type, f->name, FALSE, tfsoff);
++ write_embedded_types(file, f->attrs, &f->declspec, f->name, FALSE, tfsoff);
+
+ array = find_array_or_string_in_struct(type);
+- if (array && !processed(array->type))
++ if (array && !processed(array->declspec.type))
+ {
+- if(is_string_type(array->attrs, array->type))
+- write_string_tfs(file, array->attrs, array->type, TYPE_CONTEXT_CONTAINER, array->name, tfsoff);
++ if(is_string_type(array->attrs, array->declspec.type))
++ write_string_tfs(file, array->attrs, &array->declspec, TYPE_CONTEXT_CONTAINER, array->name, tfsoff);
+ else
+- write_array_tfs(file, array->attrs, array->type, array->name, tfsoff);
++ write_array_tfs(file, array->attrs, &array->declspec, array->name, tfsoff);
+ }
+
+ corroff = *tfsoff;
+@@ -3159,7 +3185,7 @@ static unsigned int write_struct_tfs(FILE *file, type_t *type,
+
+ start_offset = *tfsoff;
+ update_tfsoff(type, start_offset, file);
+- print_start_tfs_comment(file, type, start_offset);
++ print_start_tfs_comment(file, declspec, start_offset);
+ print_file(file, 2, "0x%x,\t/* %s */\n", fc, string_of_type(fc));
+ print_file(file, 2, "0x%x,\t/* %d */\n", align - 1, align - 1);
+ print_file(file, 2, "NdrFcShort(0x%hx),\t/* %d */\n", (unsigned short)total_size, total_size);
+@@ -3167,7 +3193,7 @@ static unsigned int write_struct_tfs(FILE *file, type_t *type,
+
+ if (array)
+ {
+- unsigned int absoff = array->type->typestring_offset;
++ unsigned int absoff = array->declspec.type->typestring_offset;
+ short reloff = absoff - *tfsoff;
+ print_file(file, 2, "NdrFcShort(0x%hx),\t/* Offset= %hd (%u) */\n",
+ reloff, reloff, absoff);
+@@ -3198,7 +3224,7 @@ static unsigned int write_struct_tfs(FILE *file, type_t *type,
+ print_file(file, 2, "0x%x,\t/* FC_PP */\n", FC_PP);
+ print_file(file, 2, "0x%x,\t/* FC_PAD */\n", FC_PAD);
+ *tfsoff += 2;
+- write_pointer_description(file, NULL, type, tfsoff);
++ write_pointer_description(file, NULL, declspec, tfsoff);
+ print_file(file, 2, "0x%x,\t/* FC_END */\n", FC_END);
+ *tfsoff += 1;
+ }
+@@ -3213,15 +3239,16 @@ static unsigned int write_struct_tfs(FILE *file, type_t *type,
+ type->ptrdesc = *tfsoff;
+ if (fields) LIST_FOR_EACH_ENTRY(f, fields, const var_t, entry)
+ {
+- type_t *ft = f->type;
++ const decl_spec_t *fds = &f->declspec;
++ type_t *ft = fds->type;
+ switch (typegen_detect_type(ft, f->attrs, TDT_IGNORE_STRINGS))
+ {
+ case TGT_POINTER:
+ if (is_string_type(f->attrs, ft))
+- write_string_tfs(file, f->attrs, ft, TYPE_CONTEXT_CONTAINER, f->name, tfsoff);
++ write_string_tfs(file, f->attrs, fds, TYPE_CONTEXT_CONTAINER, f->name, tfsoff);
+ else
+- write_pointer_tfs(file, f->attrs, ft,
+- type_pointer_get_ref(ft)->typestring_offset,
++ write_pointer_tfs(file, f->attrs, fds,
++ type_pointer_get_ref_type(ft)->typestring_offset,
+ TYPE_CONTEXT_CONTAINER, tfsoff);
+ break;
+ case TGT_ARRAY:
+@@ -3283,8 +3310,9 @@ static void write_branch_type(FILE *file, const type_t *t, unsigned int *tfsoff)
+ }
+
+ static unsigned int write_union_tfs(FILE *file, const attr_list_t *attrs,
+- type_t *type, unsigned int *tfsoff)
++ const decl_spec_t *declspec, unsigned int *tfsoff)
+ {
++ type_t* type = declspec->type;
+ unsigned int start_offset;
+ unsigned int size;
+ var_list_t *fields;
+@@ -3309,17 +3337,17 @@ static unsigned int write_union_tfs(FILE *file, const attr_list_t *attrs,
+ expr_list_t *cases = get_attrp(f->attrs, ATTR_CASE);
+ if (cases)
+ nbranch += list_count(cases);
+- if (f->type)
+- write_embedded_types(file, f->attrs, f->type, f->name, TRUE, tfsoff);
++ if (f->declspec.type)
++ write_embedded_types(file, f->attrs, &f->declspec, f->name, TRUE, tfsoff);
+ }
+
+ start_offset = *tfsoff;
+ update_tfsoff(type, start_offset, file);
+- print_start_tfs_comment(file, type, start_offset);
++ print_start_tfs_comment(file, declspec, start_offset);
+ if (type_get_type(type) == TYPE_ENCAPSULATED_UNION)
+ {
+ const var_t *sv = type_union_get_switch_value(type);
+- const type_t *st = sv->type;
++ const type_t *st = sv->declspec.type;
+ unsigned int align = 0;
+ unsigned char fc;
+
+@@ -3351,8 +3379,8 @@ static unsigned int write_union_tfs(FILE *file, const attr_list_t *attrs,
+ type_memsize_and_alignment(st, &align);
+ if (fields) LIST_FOR_EACH_ENTRY(f, fields, var_t, entry)
+ {
+- if (f->type)
+- type_memsize_and_alignment(f->type, &align);
++ if (f->declspec.type)
++ type_memsize_and_alignment(f->declspec.type, &align);
+ }
+
+ print_file(file, 2, "0x%x,\t/* FC_ENCAPSULATED_UNION */\n", FC_ENCAPSULATED_UNION);
+@@ -3407,7 +3435,7 @@ static unsigned int write_union_tfs(FILE *file, const attr_list_t *attrs,
+
+ if (fields) LIST_FOR_EACH_ENTRY(f, fields, var_t, entry)
+ {
+- type_t *ft = f->type;
++ type_t *ft = f->declspec.type;
+ expr_list_t *cases = get_attrp(f->attrs, ATTR_CASE);
+ int deflt = is_attr(f->attrs, ATTR_DEFAULT);
+ expr_t *c;
+@@ -3448,16 +3476,17 @@ static unsigned int write_union_tfs(FILE *file, const attr_list_t *attrs,
+ return start_offset;
+ }
+
+-static unsigned int write_ip_tfs(FILE *file, const attr_list_t *attrs, type_t *type,
++static unsigned int write_ip_tfs(FILE *file, const attr_list_t *attrs, const decl_spec_t *declspec,
+ unsigned int *typeformat_offset)
+ {
+ unsigned int i;
++ type_t *type = declspec->type;
+ unsigned int start_offset = *typeformat_offset;
+ expr_t *iid = get_attrp(attrs, ATTR_IIDIS);
+
+ if (!iid && processed(type)) return type->typestring_offset;
+
+- print_start_tfs_comment(file, type, start_offset);
++ print_start_tfs_comment(file, declspec, start_offset);
+ update_tfsoff(type, start_offset, file);
+
+ if (iid)
+@@ -3469,7 +3498,7 @@ static unsigned int write_ip_tfs(FILE *file, const attr_list_t *attrs, type_t *t
+ }
+ else
+ {
+- const type_t *base = is_ptr(type) ? type_pointer_get_ref(type) : type;
++ const type_t *base = is_ptr(type) ? type_pointer_get_ref_type(type) : type;
+ const UUID *uuid = get_attrp(base->attrs, ATTR_UUID);
+
+ if (! uuid)
+@@ -3493,18 +3522,19 @@ static unsigned int write_ip_tfs(FILE *file, const attr_list_t *attrs, type_t *t
+
+ static unsigned int write_contexthandle_tfs(FILE *file,
+ const attr_list_t *attrs,
+- type_t *type,
+- int toplevel_param,
++ const decl_spec_t *declspec,
++ enum type_context context,
+ unsigned int *typeformat_offset)
+ {
++ type_t *type = declspec->type;
+ unsigned int start_offset = *typeformat_offset;
+- unsigned char flags = get_contexthandle_flags( current_iface, attrs, type );
++ unsigned char flags = get_contexthandle_flags( current_iface, attrs, type, context == TYPE_CONTEXT_RETVAL );
+
+- print_start_tfs_comment(file, type, start_offset);
++ print_start_tfs_comment(file, declspec, start_offset);
+
+ if (flags & 0x80) /* via ptr */
+ {
+- int pointer_type = get_pointer_fc( type, attrs, toplevel_param );
++ int pointer_type = get_pointer_fc( type, attrs, context == TYPE_CONTEXT_TOPLEVELPARAM );
+ if (!pointer_type) pointer_type = FC_RP;
+ *typeformat_offset += 4;
+ print_file(file, 2,"0x%x, 0x0,\t/* %s */\n", pointer_type, string_of_type(pointer_type) );
+@@ -3514,8 +3544,7 @@ static unsigned int write_contexthandle_tfs(FILE *file,
+
+ print_file(file, 2, "0x%02x,\t/* FC_BIND_CONTEXT */\n", FC_BIND_CONTEXT);
+ print_file(file, 2, "0x%x,\t/* Context flags: ", flags);
+- /* return and can't be null values overlap */
+- if (((flags & 0x21) != 0x21) && (flags & NDR_CONTEXT_HANDLE_CANNOT_BE_NULL))
++ if (flags & NDR_CONTEXT_HANDLE_CANNOT_BE_NULL)
+ print_file(file, 0, "can't be null, ");
+ if (flags & NDR_CONTEXT_HANDLE_SERIALIZE)
+ print_file(file, 0, "serialize, ");
+@@ -3523,13 +3552,13 @@ static unsigned int write_contexthandle_tfs(FILE *file,
+ print_file(file, 0, "no serialize, ");
+ if (flags & NDR_STRICT_CONTEXT_HANDLE)
+ print_file(file, 0, "strict, ");
+- if ((flags & 0x21) == 0x20)
+- print_file(file, 0, "out, ");
+- if ((flags & 0x21) == 0x21)
++ if (flags & HANDLE_PARAM_IS_RETURN)
+ print_file(file, 0, "return, ");
+- if (flags & 0x40)
++ if (flags & HANDLE_PARAM_IS_OUT)
++ print_file(file, 0, "out, ");
++ if (flags & HANDLE_PARAM_IS_IN)
+ print_file(file, 0, "in, ");
+- if (flags & 0x80)
++ if (flags & HANDLE_PARAM_IS_VIA_PTR)
+ print_file(file, 0, "via ptr, ");
+ print_file(file, 0, "*/\n");
+ print_file(file, 2, "0x%x,\t/* rundown routine */\n", get_context_handle_offset( type ));
+@@ -3568,24 +3597,23 @@ static unsigned int write_range_tfs(FILE *file, const attr_list_t *attrs,
+ return start_offset;
+ }
+
+-static unsigned int write_type_tfs(FILE *file, int indent,
+- const attr_list_t *attrs, type_t *type,
+- const char *name,
++static unsigned int write_type_tfs(FILE *file, const attr_list_t *attrs,
++ const decl_spec_t *declspec, const char *name,
+ enum type_context context,
+ unsigned int *typeformat_offset)
+ {
+ unsigned int offset;
++ type_t *type = declspec->type;
+
+ switch (typegen_detect_type(type, attrs, TDT_ALL_TYPES))
+ {
+ case TGT_CTXT_HANDLE:
+ case TGT_CTXT_HANDLE_POINTER:
+- return write_contexthandle_tfs(file, attrs, type,
+- context == TYPE_CONTEXT_TOPLEVELPARAM, typeformat_offset);
++ return write_contexthandle_tfs(file, attrs, declspec, context, typeformat_offset);
+ case TGT_USER_TYPE:
+- return write_user_tfs(file, type, typeformat_offset);
++ return write_user_tfs(file, declspec, typeformat_offset);
+ case TGT_STRING:
+- return write_string_tfs(file, attrs, type, context, name, typeformat_offset);
++ return write_string_tfs(file, attrs, declspec, context, name, typeformat_offset);
+ case TGT_ARRAY:
+ {
+ unsigned int off;
+@@ -3593,15 +3621,14 @@ static unsigned int write_type_tfs(FILE *file, int indent,
+ if ((context != TYPE_CONTEXT_CONTAINER &&
+ context != TYPE_CONTEXT_CONTAINER_NO_POINTERS) ||
+ !is_conformant_array(type) || type_array_is_decl_as_ptr(type))
+- off = write_array_tfs(file, attrs, type, name, typeformat_offset);
++ off = write_array_tfs(file, attrs, declspec, name, typeformat_offset);
+ else
+ off = 0;
+ if (context != TYPE_CONTEXT_CONTAINER &&
+ context != TYPE_CONTEXT_CONTAINER_NO_POINTERS)
+ {
+ int ptr_type;
+- ptr_type = get_pointer_fc(type, attrs,
+- context == TYPE_CONTEXT_TOPLEVELPARAM);
++ ptr_type = get_pointer_fc_context(type, attrs, context);
+ if (ptr_type != FC_RP || type_array_is_decl_as_ptr(type))
+ {
+ unsigned int absoff = type->typestring_offset;
+@@ -3615,14 +3642,14 @@ static unsigned int write_type_tfs(FILE *file, int indent,
+ if (ptr_type != FC_RP) update_tfsoff( type, off, file );
+ *typeformat_offset += 4;
+ }
+- type->details.array.ptr_tfsoff = off;
++ type_get_details(type)->array.ptr_tfsoff = off;
+ }
+ return off;
+ }
+ case TGT_STRUCT:
+- return write_struct_tfs(file, type, name, typeformat_offset);
++ return write_struct_tfs(file, declspec, name, typeformat_offset);
+ case TGT_UNION:
+- return write_union_tfs(file, attrs, type, typeformat_offset);
++ return write_union_tfs(file, attrs, declspec, typeformat_offset);
+ case TGT_ENUM:
+ case TGT_BASIC:
+ /* nothing to do */
+@@ -3635,11 +3662,11 @@ static unsigned int write_type_tfs(FILE *file, int indent,
+ return write_range_tfs(file, attrs, type, range_list, typeformat_offset);
+ }
+ case TGT_IFACE_POINTER:
+- return write_ip_tfs(file, attrs, type, typeformat_offset);
++ return write_ip_tfs(file, attrs, declspec, typeformat_offset);
+ case TGT_POINTER:
+ {
+ enum type_context ref_context;
+- type_t *ref = type_pointer_get_ref(type);
++ const decl_spec_t *ref = type_pointer_get_ref(type);
+
+ if (context == TYPE_CONTEXT_TOPLEVELPARAM)
+ ref_context = TYPE_CONTEXT_PARAM;
+@@ -3648,22 +3675,22 @@ static unsigned int write_type_tfs(FILE *file, int indent,
+ else
+ ref_context = context;
+
+- if (is_string_type(attrs, ref))
++ if (is_string_type(attrs, ref->type))
+ {
+ if (context != TYPE_CONTEXT_CONTAINER_NO_POINTERS)
+- write_pointer_tfs(file, attrs, type, *typeformat_offset + 4, context, typeformat_offset);
++ write_pointer_tfs(file, attrs, declspec, *typeformat_offset + 4, context, typeformat_offset);
+
+- offset = write_type_tfs(file, indent, attrs, ref, name, ref_context, typeformat_offset);
++ offset = write_type_tfs(file, attrs, ref, name, ref_context, typeformat_offset);
+ if (context == TYPE_CONTEXT_CONTAINER_NO_POINTERS)
+ return 0;
+ return offset;
+ }
+
+- offset = write_type_tfs( file, indent, attrs, type_pointer_get_ref(type), name,
++ offset = write_type_tfs( file, attrs, type_pointer_get_ref(type), name,
+ ref_context, typeformat_offset);
+ if (context == TYPE_CONTEXT_CONTAINER_NO_POINTERS)
+ return 0;
+- return write_pointer_tfs(file, attrs, type, offset, context, typeformat_offset);
++ return write_pointer_tfs(file, attrs, declspec, offset, context, typeformat_offset);
+ }
+ case TGT_INVALID:
+ break;
+@@ -3672,10 +3699,10 @@ static unsigned int write_type_tfs(FILE *file, int indent,
+ return 0;
+ }
+
+-static int write_embedded_types(FILE *file, const attr_list_t *attrs, type_t *type,
++static int write_embedded_types(FILE *file, const attr_list_t *attrs, const decl_spec_t *declspec,
+ const char *name, int write_ptr, unsigned int *tfsoff)
+ {
+- return write_type_tfs(file, 2, attrs, type, name, write_ptr ? TYPE_CONTEXT_CONTAINER : TYPE_CONTEXT_CONTAINER_NO_POINTERS, tfsoff);
++ return write_type_tfs(file, attrs, declspec, name, write_ptr ? TYPE_CONTEXT_CONTAINER : TYPE_CONTEXT_CONTAINER_NO_POINTERS, tfsoff);
+ }
+
+ static void process_tfs_iface(type_t *iface, FILE *file, int indent, unsigned int *offset)
+@@ -3693,21 +3720,21 @@ static void process_tfs_iface(type_t *iface, FILE *file, int indent, unsigned in
+ {
+ const var_t *func = stmt->u.var;
+
+- if(stmt->u.var->stgclass != STG_NONE
+- || type_get_type_detect_alias(stmt->u.var->type) != TYPE_FUNCTION)
++ if(stmt->u.var->declspec.stgclass != STG_NONE
++ || type_get_type_detect_alias(stmt->u.var->declspec.type) != TYPE_FUNCTION)
+ continue;
+
+ current_func = func;
+ if (is_local(func->attrs)) continue;
+
+- var = type_function_get_retval(func->type);
+- if (!is_void(var->type))
+- var->typestring_offset = write_type_tfs( file, 2, func->attrs, var->type, func->name,
+- TYPE_CONTEXT_PARAM, offset);
++ var = type_function_get_retval(func->declspec.type);
++ if (!is_void(var->declspec.type))
++ var->typestring_offset = write_type_tfs( file, var->attrs, &var->declspec, func->name,
++ TYPE_CONTEXT_RETVAL, offset);
+
+- if (type_get_function_args(func->type))
+- LIST_FOR_EACH_ENTRY( var, type_get_function_args(func->type), var_t, entry )
+- var->typestring_offset = write_type_tfs( file, 2, var->attrs, var->type, var->name,
++ if (type_function_get_args(func->declspec.type))
++ LIST_FOR_EACH_ENTRY( var, type_function_get_args(func->declspec.type), var_t, entry )
++ var->typestring_offset = write_type_tfs( file, var->attrs, &var->declspec, var->name,
+ TYPE_CONTEXT_TOPLEVELPARAM, offset );
+ break;
+
+@@ -3719,9 +3746,12 @@ static void process_tfs_iface(type_t *iface, FILE *file, int indent, unsigned in
+ {
+ if (is_attr(type_entry->type->attrs, ATTR_ENCODE)
+ || is_attr(type_entry->type->attrs, ATTR_DECODE))
+- type_entry->type->typestring_offset = write_type_tfs( file, 2,
+- type_entry->type->attrs, type_entry->type, type_entry->type->name,
++ {
++ decl_spec_t ds;
++ type_entry->type->typestring_offset = write_type_tfs( file,
++ type_entry->type->attrs, init_declspec(&ds, type_entry->type), type_entry->type->name,
+ TYPE_CONTEXT_CONTAINER, offset);
++ }
+ }
+ break;
+ }
+@@ -3842,7 +3872,7 @@ static unsigned int get_required_buffer_size_type(
+ case TGT_POINTER:
+ {
+ unsigned int size, align;
+- const type_t *ref = type_pointer_get_ref(type);
++ const type_t *ref = type_pointer_get_ref_type(type);
+ if (is_string_type( attrs, ref )) break;
+ if (!(size = get_required_buffer_size_type( ref, name, NULL, FALSE, &align ))) break;
+ if (get_pointer_fc(type, attrs, toplevel_param) != FC_RP)
+@@ -3862,7 +3892,7 @@ static unsigned int get_required_buffer_size_type(
+ case FC_SMFARRAY:
+ case FC_LGFARRAY:
+ return type_array_get_dim(type) *
+- get_required_buffer_size_type(type_array_get_element(type), name,
++ get_required_buffer_size_type(type_array_get_element_type(type), name,
+ NULL, FALSE, alignment);
+ }
+ }
+@@ -3893,8 +3923,8 @@ static unsigned int get_required_buffer_size(const var_t *var, unsigned int *ali
+ return 20;
+ }
+
+- if (!is_string_type(var->attrs, var->type))
+- return get_required_buffer_size_type(var->type, var->name,
++ if (!is_string_type(var->attrs, var->declspec.type))
++ return get_required_buffer_size_type(var->declspec.type, var->name,
+ var->attrs, TRUE, alignment);
+ }
+ return 0;
+@@ -3905,19 +3935,19 @@ static unsigned int get_function_buffer_size( const var_t *func, enum pass pass
+ const var_t *var;
+ unsigned int total_size = 0, alignment;
+
+- if (type_get_function_args(func->type))
++ if (type_function_get_args(func->declspec.type))
+ {
+- LIST_FOR_EACH_ENTRY( var, type_get_function_args(func->type), const var_t, entry )
++ LIST_FOR_EACH_ENTRY( var, type_function_get_args(func->declspec.type), const var_t, entry )
+ {
+ total_size += get_required_buffer_size(var, &alignment, pass);
+ total_size += alignment;
+ }
+ }
+
+- if (pass == PASS_OUT && !is_void(type_function_get_rettype(func->type)))
++ if (pass == PASS_OUT && !is_void(type_function_get_rettype(func->declspec.type)))
+ {
+ var_t v = *func;
+- v.type = type_function_get_rettype(func->type);
++ v.declspec.type = type_function_get_rettype(func->declspec.type);
+ total_size += get_required_buffer_size(&v, &alignment, PASS_RETURN);
+ total_size += alignment;
+ }
+@@ -3953,9 +3983,9 @@ static void print_phase_function(FILE *file, int indent, const char *type,
+ print_file(file, indent, "&__frame->_StubMsg,\n");
+ print_file(file, indent, "%s%s%s%s%s,\n",
+ (phase == PHASE_UNMARSHAL) ? "(unsigned char **)" : "(unsigned char *)",
+- (phase == PHASE_UNMARSHAL || decl_indirect(var->type)) ? "&" : "",
++ (phase == PHASE_UNMARSHAL || decl_indirect(var->declspec.type)) ? "&" : "",
+ local_var_prefix,
+- (phase == PHASE_UNMARSHAL && decl_indirect(var->type)) ? "_p_" : "",
++ (phase == PHASE_UNMARSHAL && decl_indirect(var->declspec.type)) ? "_p_" : "",
+ var->name);
+ print_file(file, indent, "(PFORMAT_STRING)&__MIDL_TypeFormatString.Format[%d]%s\n",
+ type_offset, (phase == PHASE_UNMARSHAL) ? "," : ");");
+@@ -3968,7 +3998,8 @@ void print_phase_basetype(FILE *file, int indent, const char *local_var_prefix,
+ enum remoting_phase phase, enum pass pass, const var_t *var,
+ const char *varname)
+ {
+- type_t *type = var->type;
++ const decl_spec_t *declspec = &var->declspec;
++ type_t *type = declspec->type;
+ unsigned int alignment = 0;
+
+ /* no work to do for other phases, buffer sizing is done elsewhere */
+@@ -3999,8 +4030,8 @@ void print_phase_basetype(FILE *file, int indent, const char *local_var_prefix,
+ }
+ else
+ {
+- const type_t *ref = is_ptr(type) ? type_pointer_get_ref(type) : type;
+- switch (get_basic_fc(ref))
++ const decl_spec_t *ref = is_ptr(type) ? type_pointer_get_ref(type) : declspec;
++ switch (get_basic_fc(ref->type))
+ {
+ case FC_BYTE:
+ case FC_CHAR:
+@@ -4037,7 +4068,7 @@ void print_phase_basetype(FILE *file, int indent, const char *local_var_prefix,
+
+ default:
+ error("print_phase_basetype: Unsupported type: %s (0x%02x, ptr_level: 0)\n",
+- var->name, get_basic_fc(ref));
++ var->name, get_basic_fc(ref->type));
+ }
+
+ if (phase == PHASE_MARSHAL && alignment > 1)
+@@ -4048,7 +4079,7 @@ void print_phase_basetype(FILE *file, int indent, const char *local_var_prefix,
+ if (phase == PHASE_MARSHAL)
+ {
+ print_file(file, indent, "*(");
+- write_type_decl(file, is_ptr(type) ? type_pointer_get_ref(type) : type, NULL);
++ write_declspec_decl(file, is_ptr(type) ? type_pointer_get_ref(type) : declspec, NULL);
+ if (is_ptr(type))
+ fprintf(file, " *)__frame->_StubMsg.Buffer = *");
+ else
+@@ -4059,7 +4090,7 @@ void print_phase_basetype(FILE *file, int indent, const char *local_var_prefix,
+ else if (phase == PHASE_UNMARSHAL)
+ {
+ print_file(file, indent, "if (__frame->_StubMsg.Buffer + sizeof(");
+- write_type_decl(file, is_ptr(type) ? type_pointer_get_ref(type) : type, NULL);
++ write_declspec_decl(file, is_ptr(type) ? type_pointer_get_ref(type) : declspec, NULL);
+ fprintf(file, ") > __frame->_StubMsg.BufferEnd)\n");
+ print_file(file, indent, "{\n");
+ print_file(file, indent + 1, "RpcRaiseException(RPC_X_BAD_STUB_DATA);\n");
+@@ -4071,12 +4102,12 @@ void print_phase_basetype(FILE *file, int indent, const char *local_var_prefix,
+ fprintf(file, " = (");
+ else
+ fprintf(file, " = *(");
+- write_type_decl(file, is_ptr(type) ? type_pointer_get_ref(type) : type, NULL);
++ write_declspec_decl(file, is_ptr(type) ? type_pointer_get_ref(type) : declspec, NULL);
+ fprintf(file, " *)__frame->_StubMsg.Buffer;\n");
+ }
+
+ print_file(file, indent, "__frame->_StubMsg.Buffer += sizeof(");
+- write_type_decl(file, is_ptr(type) ? type_pointer_get_ref(type) : type, NULL);
++ write_declspec_decl(file, is_ptr(type) ? type_pointer_get_ref(type) : declspec, NULL);
+ fprintf(file, ");\n");
+ }
+ }
+@@ -4092,7 +4123,7 @@ expr_t *get_size_is_expr(const type_t *t, const char *name)
+ {
+ expr_t *x = NULL;
+
+- for ( ; is_array(t); t = type_array_get_element(t))
++ for ( ; is_array(t); t = type_array_get_element_type(t))
+ if (type_array_has_conformance(t) &&
+ type_array_get_conformance(t)->type != EXPR_VOID)
+ {
+@@ -4110,7 +4141,7 @@ expr_t *get_size_is_expr(const type_t *t, const char *name)
+ void write_parameter_conf_or_var_exprs(FILE *file, int indent, const char *local_var_prefix,
+ enum remoting_phase phase, const var_t *var, int valid_variance)
+ {
+- const type_t *type = var->type;
++ const type_t *type = var->declspec.type;
+ /* get fundamental type for the argument */
+ for (;;)
+ {
+@@ -4162,7 +4193,7 @@ void write_parameter_conf_or_var_exprs(FILE *file, int indent, const char *local
+ break;
+ }
+ case TGT_POINTER:
+- type = type_pointer_get_ref(type);
++ type = type_pointer_get_ref_type(type);
+ continue;
+ case TGT_INVALID:
+ case TGT_USER_TYPE:
+@@ -4184,7 +4215,7 @@ static void write_remoting_arg(FILE *file, int indent, const var_t *func, const
+ {
+ int in_attr, out_attr, pointer_type;
+ const char *type_str = NULL;
+- const type_t *type = var->type;
++ const type_t *type = var->declspec.type;
+ unsigned int alignment, start_offset = type->typestring_offset;
+
+ if (is_ptr(type) || is_array(type))
+@@ -4237,19 +4268,20 @@ static void write_remoting_arg(FILE *file, int indent, const var_t *func, const
+ print_file(file, indent, "NdrServerContextNewMarshall(\n");
+ print_file(file, indent + 1, "&__frame->_StubMsg,\n");
+ print_file(file, indent + 1, "(NDR_SCONTEXT)%s%s,\n", local_var_prefix, var->name);
+- print_file(file, indent + 1, "(NDR_RUNDOWN)%s_rundown,\n", get_context_handle_type_name(var->type));
++ print_file(file, indent + 1, "(NDR_RUNDOWN)%s_rundown,\n", get_context_handle_type_name(var->declspec.type));
+ print_file(file, indent + 1, "(PFORMAT_STRING)&__MIDL_TypeFormatString.Format[%d]);\n", start_offset);
+ }
+ }
+ else if (phase == PHASE_UNMARSHAL)
+ {
+- if (pass == PASS_OUT)
++ if (pass == PASS_OUT || pass == PASS_RETURN)
+ {
+ if (!in_attr)
+ print_file(file, indent, "*%s%s = 0;\n", local_var_prefix, var->name);
+ print_file(file, indent, "NdrClientContextUnmarshall(\n");
+ print_file(file, indent + 1, "&__frame->_StubMsg,\n");
+- print_file(file, indent + 1, "(NDR_CCONTEXT *)%s%s,\n", local_var_prefix, var->name);
++ print_file(file, indent + 1, "(NDR_CCONTEXT *)%s%s%s,\n",
++ pass == PASS_RETURN ? "&" : "", local_var_prefix, var->name);
+ print_file(file, indent + 1, "__frame->_Handle);\n");
+ }
+ else
+@@ -4343,10 +4375,10 @@ static void write_remoting_arg(FILE *file, int indent, const var_t *func, const
+ ((tc == FC_SMVARRAY || tc == FC_LGVARRAY) && in_attr) ||
+ (tc == FC_CARRAY && !in_attr))
+ {
+- if (type_array_is_decl_as_ptr(type) && type->details.array.ptr_tfsoff)
++ if (type_array_is_decl_as_ptr(type) && type_get_const_details(type)->array.ptr_tfsoff)
+ {
+ print_phase_function(file, indent, "Pointer", local_var_prefix, phase, var,
+- type->details.array.ptr_tfsoff);
++ type_get_const_details(type)->array.ptr_tfsoff);
+ break;
+ }
+ print_phase_function(file, indent, array_type, local_var_prefix, phase, var, start_offset);
+@@ -4380,9 +4412,9 @@ static void write_remoting_arg(FILE *file, int indent, const var_t *func, const
+ range_max = LIST_ENTRY(list_next(range_list, list_head(range_list)), const expr_t, entry);
+
+ print_file(file, indent, "if ((%s%s < (", local_var_prefix, var->name);
+- write_type_decl(file, var->type, NULL);
++ write_declspec_decl(file, &var->declspec, NULL);
+ fprintf(file, ")0x%x) || (%s%s > (", range_min->cval, local_var_prefix, var->name);
+- write_type_decl(file, var->type, NULL);
++ write_declspec_decl(file, &var->declspec, NULL);
+ fprintf(file, ")0x%x))\n", range_max->cval);
+ print_file(file, indent, "{\n");
+ print_file(file, indent+1, "RpcRaiseException(RPC_S_INVALID_BOUND);\n");
+@@ -4428,7 +4460,7 @@ static void write_remoting_arg(FILE *file, int indent, const var_t *func, const
+ }
+ case TGT_POINTER:
+ {
+- const type_t *ref = type_pointer_get_ref(type);
++ const type_t *ref = type_pointer_get_ref_type(type);
+ if (pointer_type == FC_RP) switch (typegen_detect_type(ref, NULL, TDT_ALL_TYPES))
+ {
+ case TGT_BASIC:
+@@ -4549,14 +4581,14 @@ void write_remoting_arguments(FILE *file, int indent, const var_t *func, const c
+ if (pass == PASS_RETURN)
+ {
+ write_remoting_arg( file, indent, func, local_var_prefix, pass, phase,
+- type_function_get_retval(func->type) );
++ type_function_get_retval(func->declspec.type) );
+ }
+ else
+ {
+ const var_t *var;
+- if (!type_get_function_args(func->type))
++ if (!type_function_get_args(func->declspec.type))
+ return;
+- LIST_FOR_EACH_ENTRY( var, type_get_function_args(func->type), const var_t, entry )
++ LIST_FOR_EACH_ENTRY( var, type_function_get_args(func->declspec.type), const var_t, entry )
+ write_remoting_arg( file, indent, func, local_var_prefix, pass, phase, var );
+ }
+ }
+@@ -4597,57 +4629,62 @@ void declare_stub_args( FILE *file, int indent, const var_t *func )
+ {
+ int in_attr, out_attr;
+ int i = 0;
+- const var_t *var = type_function_get_retval(func->type);
++ const var_t *var = type_function_get_retval(func->declspec.type);
+
+ /* declare return value */
+- if (!is_void(var->type))
++ if (!is_void(var->declspec.type))
+ {
+- print_file(file, indent, "%s", "");
+- write_type_decl(file, var->type, var->name);
+- fprintf(file, ";\n");
++ if (is_context_handle(var->declspec.type))
++ print_file(file, indent, "NDR_SCONTEXT %s;\n", var->name);
++ else
++ {
++ print_file(file, indent, "%s", "");
++ write_declspec_decl(file, &var->declspec, var->name);
++ fprintf(file, ";\n");
++ }
+ }
+
+- if (!type_get_function_args(func->type))
++ if (!type_function_get_args(func->declspec.type))
+ return;
+
+- LIST_FOR_EACH_ENTRY( var, type_get_function_args(func->type), const var_t, entry )
++ LIST_FOR_EACH_ENTRY( var, type_function_get_args(func->declspec.type), const var_t, entry )
+ {
+ in_attr = is_attr(var->attrs, ATTR_IN);
+ out_attr = is_attr(var->attrs, ATTR_OUT);
+ if (!out_attr && !in_attr)
+ in_attr = 1;
+
+- if (is_context_handle(var->type))
++ if (is_context_handle(var->declspec.type))
+ print_file(file, indent, "NDR_SCONTEXT %s;\n", var->name);
+ else
+ {
+- if (!in_attr && !is_conformant_array(var->type))
++ if (!in_attr && !is_conformant_array(var->declspec.type))
+ {
+- type_t *type_to_print;
++ const decl_spec_t *declspec_to_print;
+ char name[16];
+ print_file(file, indent, "%s", "");
+- if (type_get_type(var->type) == TYPE_ARRAY &&
+- !type_array_is_decl_as_ptr(var->type))
+- type_to_print = var->type;
++ if (type_get_type(var->declspec.type) == TYPE_ARRAY &&
++ !type_array_is_decl_as_ptr(var->declspec.type))
++ declspec_to_print = &var->declspec;
+ else
+- type_to_print = type_pointer_get_ref(var->type);
++ declspec_to_print = type_pointer_get_ref(var->declspec.type);
+ sprintf(name, "_W%u", i++);
+- write_type_decl(file, type_to_print, name);
++ write_declspec_decl(file, declspec_to_print, name);
+ fprintf(file, ";\n");
+ }
+
+ print_file(file, indent, "%s", "");
+- write_type_decl_left(file, var->type);
++ write_declspec_decl_left(file, &var->declspec);
+ fprintf(file, " ");
+- if (type_get_type(var->type) == TYPE_ARRAY &&
+- !type_array_is_decl_as_ptr(var->type)) {
++ if (type_get_type(var->declspec.type) == TYPE_ARRAY &&
++ !type_array_is_decl_as_ptr(var->declspec.type)) {
+ fprintf(file, "(*%s)", var->name);
+ } else
+ fprintf(file, "%s", var->name);
+- write_type_right(file, var->type, FALSE);
++ write_type_right(file, var->declspec.type, FALSE);
+ fprintf(file, ";\n");
+
+- if (decl_indirect(var->type))
++ if (decl_indirect(var->declspec.type))
+ print_file(file, indent, "void *_p_%s;\n", var->name);
+ }
+ }
+@@ -4661,10 +4698,10 @@ void assign_stub_out_args( FILE *file, int indent, const var_t *func, const char
+ const var_t *var;
+ type_t *ref;
+
+- if (!type_get_function_args(func->type))
++ if (!type_function_get_args(func->declspec.type))
+ return;
+
+- LIST_FOR_EACH_ENTRY( var, type_get_function_args(func->type), const var_t, entry )
++ LIST_FOR_EACH_ENTRY( var, type_function_get_args(func->declspec.type), const var_t, entry )
+ {
+ in_attr = is_attr(var->attrs, ATTR_IN);
+ out_attr = is_attr(var->attrs, ATTR_OUT);
+@@ -4675,7 +4712,7 @@ void assign_stub_out_args( FILE *file, int indent, const var_t *func, const char
+ {
+ print_file(file, indent, "%s%s", local_var_prefix, var->name);
+
+- switch (typegen_detect_type(var->type, var->attrs, TDT_IGNORE_STRINGS))
++ switch (typegen_detect_type(var->declspec.type, var->attrs, TDT_IGNORE_STRINGS))
+ {
+ case TGT_CTXT_HANDLE_POINTER:
+ fprintf(file, " = NdrContextHandleInitialize(\n");
+@@ -4684,15 +4721,15 @@ void assign_stub_out_args( FILE *file, int indent, const var_t *func, const char
+ var->typestring_offset);
+ break;
+ case TGT_ARRAY:
+- if (type_array_has_conformance(var->type))
++ if (type_array_has_conformance(var->declspec.type))
+ {
+ unsigned int size;
+ type_t *type;
+
+ fprintf(file, " = NdrAllocate(&__frame->_StubMsg, ");
+- for (type = var->type;
++ for (type = var->declspec.type;
+ is_array(type) && type_array_has_conformance(type);
+- type = type_array_get_element(type))
++ type = type_array_get_element_type(type))
+ {
+ write_expr(file, type_array_get_conformance(type), TRUE,
+ TRUE, NULL, NULL, local_var_prefix);
+@@ -4702,9 +4739,9 @@ void assign_stub_out_args( FILE *file, int indent, const var_t *func, const char
+ fprintf(file, "%u);\n", size);
+
+ print_file(file, indent, "memset(%s%s, 0, ", local_var_prefix, var->name);
+- for (type = var->type;
++ for (type = var->declspec.type;
+ is_array(type) && type_array_has_conformance(type);
+- type = type_array_get_element(type))
++ type = type_array_get_element_type(type))
+ {
+ write_expr(file, type_array_get_conformance(type), TRUE,
+ TRUE, NULL, NULL, local_var_prefix);
+@@ -4718,7 +4755,7 @@ void assign_stub_out_args( FILE *file, int indent, const var_t *func, const char
+ break;
+ case TGT_POINTER:
+ fprintf(file, " = &%s_W%u;\n", local_var_prefix, i);
+- ref = type_pointer_get_ref(var->type);
++ ref = type_pointer_get_ref_type(var->declspec.type);
+ switch (typegen_detect_type(ref, var->attrs, TDT_IGNORE_STRINGS))
+ {
+ case TGT_BASIC:
+@@ -4738,7 +4775,7 @@ void assign_stub_out_args( FILE *file, int indent, const var_t *func, const char
+ print_file(file, indent, "%s_W%u = 0;\n", local_var_prefix, i);
+ break;
+ }
+- ref = type_array_get_element(ref);
++ ref = type_array_get_element_type(ref);
+ /* fall through */
+ case TGT_STRUCT:
+ case TGT_UNION:
+@@ -4771,14 +4808,14 @@ void write_func_param_struct( FILE *file, const type_t *iface, const type_t *fun
+ const char *var_decl, int add_retval )
+ {
+ var_t *retval = type_function_get_retval( func );
+- const var_list_t *args = type_get_function_args( func );
++ const var_list_t *args = type_function_get_args( func );
+ const var_t *arg;
+ int needs_packing;
+ unsigned int align = 0;
+
+ if (args)
+ LIST_FOR_EACH_ENTRY( arg, args, const var_t, entry )
+- if (!is_array( arg->type )) type_memsize_and_alignment( arg->type, &align );
++ if (!is_array( arg->declspec.type )) type_memsize_and_alignment( arg->declspec.type, &align );
+
+ needs_packing = (align > pointer_size);
+
+@@ -4790,26 +4827,26 @@ void write_func_param_struct( FILE *file, const type_t *iface, const type_t *fun
+ if (args) LIST_FOR_EACH_ENTRY( arg, args, const var_t, entry )
+ {
+ print_file(file, 2, "%s", "");
+- write_type_left( file, (type_t *)arg->type, NAME_DEFAULT, TRUE );
+- if (needs_space_after( arg->type )) fputc( ' ', file );
+- if (is_array( arg->type ) && !type_array_is_decl_as_ptr( arg->type )) fputc( '*', file );
++ write_declspec_left( file, &arg->declspec, NAME_DEFAULT, TRUE );
++ if (needs_space_after( arg->declspec.type )) fputc( ' ', file );
++ if (is_array( arg->declspec.type ) && !type_array_is_decl_as_ptr( arg->declspec.type )) fputc( '*', file );
+
+ /* FIXME: should check for large args being passed by pointer */
+ align = 0;
+- if (is_array( arg->type ) || is_ptr( arg->type )) align = pointer_size;
+- else type_memsize_and_alignment( arg->type, &align );
++ if (is_array( arg->declspec.type ) || is_ptr( arg->declspec.type )) align = pointer_size;
++ else type_memsize_and_alignment( arg->declspec.type, &align );
+
+ if (align >= pointer_size)
+ fprintf( file, "%s;\n", arg->name );
+ else
+ fprintf( file, "%s DECLSPEC_ALIGN(%u);\n", arg->name, pointer_size );
+ }
+- if (add_retval && !is_void( retval->type ))
++ if (add_retval && !is_void( retval->declspec.type ))
+ {
+ print_file(file, 2, "%s", "");
+- write_type_decl( file, retval->type, retval->name );
+- if (is_array( retval->type ) || is_ptr( retval->type ) ||
+- type_memsize( retval->type ) == pointer_size)
++ write_declspec_decl( file, &retval->declspec, retval->name );
++ if (is_array( retval->declspec.type ) || is_ptr( retval->declspec.type ) ||
++ type_memsize( retval->declspec.type ) == pointer_size)
+ fprintf( file, ";\n" );
+ else
+ fprintf( file, " DECLSPEC_ALIGN(%u);\n", pointer_size );
+@@ -4821,7 +4858,7 @@ void write_func_param_struct( FILE *file, const type_t *iface, const type_t *fun
+
+ void write_pointer_checks( FILE *file, int indent, const var_t *func )
+ {
+- const var_list_t *args = type_get_function_args( func->type );
++ const var_list_t *args = type_function_get_args( func->declspec.type );
+ const var_t *var;
+
+ if (!args) return;
+@@ -4854,10 +4891,11 @@ int write_expr_eval_routines(FILE *file, const char *iface)
+ }
+ else
+ {
++ decl_spec_t declspec;
+ print_file(file, 1, "%s", "");
+- write_type_left(file, (type_t *)eval->cont_type, NAME_DEFAULT, TRUE);
++ write_declspec_left(file, init_declspec(&declspec, (type_t*)eval->cont_type), NAME_DEFAULT, TRUE);
+ fprintf(file, " *%s = (", var_name);
+- write_type_left(file, (type_t *)eval->cont_type, NAME_DEFAULT, TRUE);
++ write_declspec_left(file, init_declspec(&declspec, (type_t*)eval->cont_type), NAME_DEFAULT, TRUE);
+ fprintf(file, " *)(pStubMsg->StackTop - %u);\n", eval->baseoff);
+ }
+ print_file(file, 1, "pStubMsg->Offset = 0;\n"); /* FIXME */
+@@ -4951,9 +4989,10 @@ error:
+ void write_client_call_routine( FILE *file, const type_t *iface, const var_t *func,
+ const char *prefix, unsigned int proc_offset )
+ {
+- type_t *rettype = type_function_get_rettype( func->type );
++ const decl_spec_t *retdeclspec = type_function_get_retdeclspec(func->declspec.type);
++ type_t *rettype = retdeclspec->type;
+ int has_ret = !is_void( rettype );
+- const var_list_t *args = type_get_function_args( func->type );
++ const var_list_t *args = type_function_get_args( func->declspec.type );
+ const var_t *arg;
+ int len, needs_params = 0;
+
+@@ -4964,7 +5003,7 @@ void write_client_call_routine( FILE *file, const type_t *iface, const var_t *fu
+ if (needs_params)
+ {
+ if (has_ret) print_file( file, 1, "%s", "CLIENT_CALL_RETURN _RetVal;\n" );
+- write_func_param_struct( file, iface, func->type, "__params", FALSE );
++ write_func_param_struct( file, iface, func->declspec.type, "__params", FALSE );
+ if (is_object( iface )) print_file( file, 1, "__params.This = This;\n" );
+ if (args)
+ LIST_FOR_EACH_ENTRY( arg, args, const var_t, entry )
+@@ -5001,7 +5040,7 @@ void write_client_call_routine( FILE *file, const type_t *iface, const var_t *fu
+ if (has_ret)
+ {
+ print_file( file, 1, "return (" );
+- write_type_decl_left(file, rettype);
++ write_declspec_decl_left(file, retdeclspec);
+ fprintf( file, ")%s;\n", pointer_size == 8 ? "_RetVal.Simple" : "*(LONG_PTR *)&_RetVal" );
+ }
+ print_file( file, 0, "}\n\n");
+@@ -5029,7 +5068,7 @@ void write_exceptions( FILE *file )
+ fprintf( file, " EXCEPTION_REGISTRATION_RECORD frame; \\\n");
+ fprintf( file, " __filter_func filter; \\\n");
+ fprintf( file, " __finally_func finally; \\\n");
+- fprintf( file, " sigjmp_buf jmp; \\\n");
++ fprintf( file, " __wine_jmp_buf jmp; \\\n");
+ fprintf( file, " DWORD code; \\\n");
+ fprintf( file, " unsigned char abnormal_termination; \\\n");
+ fprintf( file, " unsigned char filter_level; \\\n");
+@@ -5049,13 +5088,13 @@ void write_exceptions( FILE *file )
+ fprintf( file, " __wine_pop_frame( &exc_frame->frame );\n");
+ fprintf( file, " }\n");
+ fprintf( file, " exc_frame->filter_level = 0;\n");
+- fprintf( file, " siglongjmp( exc_frame->jmp, 1 );\n");
++ fprintf( file, " __wine_longjmp( &exc_frame->jmp, 1 );\n");
+ fprintf( file, "}\n");
+ fprintf( file, "\n");
+- fprintf( file, "static DWORD __widl_exception_handler( EXCEPTION_RECORD *record,\n");
+- fprintf( file, " EXCEPTION_REGISTRATION_RECORD *frame,\n");
+- fprintf( file, " CONTEXT *context,\n");
+- fprintf( file, " EXCEPTION_REGISTRATION_RECORD **pdispatcher )\n");
++ fprintf( file, "static DWORD __cdecl __widl_exception_handler( EXCEPTION_RECORD *record,\n");
++ fprintf( file, " EXCEPTION_REGISTRATION_RECORD *frame,\n");
++ fprintf( file, " CONTEXT *context,\n");
++ fprintf( file, " EXCEPTION_REGISTRATION_RECORD **pdispatcher )\n");
+ fprintf( file, "{\n");
+ fprintf( file, " struct __exception_frame *exc_frame = (struct __exception_frame *)frame;\n");
+ fprintf( file, "\n");
+@@ -5075,7 +5114,7 @@ void write_exceptions( FILE *file )
+ fprintf( file, "}\n");
+ fprintf( file, "\n");
+ fprintf( file, "#define RpcTryExcept \\\n");
+- fprintf( file, " if (!sigsetjmp( __frame->jmp, 0 )) \\\n");
++ fprintf( file, " if (!__wine_setjmpex( &__frame->jmp, &__frame->frame )) \\\n");
+ fprintf( file, " { \\\n");
+ fprintf( file, " if (!__frame->finally_level) \\\n" );
+ fprintf( file, " __wine_push_frame( &__frame->frame ); \\\n");
+diff --git a/mingw-w64-tools/widl/src/typelib.c b/mingw-w64-tools/widl/src/typelib.c
+index 9b1de2c8..2c2b1276 100644
+--- a/mingw-w64-tools/widl/src/typelib.c
++++ b/mingw-w64-tools/widl/src/typelib.c
+@@ -97,9 +97,9 @@ static unsigned short builtin_vt(const type_t *t)
+ {
+ const type_t *elem_type;
+ if (is_array(t))
+- elem_type = type_array_get_element(t);
++ elem_type = type_array_get_element_type(t);
+ else
+- elem_type = type_pointer_get_ref(t);
++ elem_type = type_pointer_get_ref_type(t);
+ if (type_get_type(elem_type) == TYPE_BASIC)
+ {
+ switch (type_basic_get_type(elem_type))
+@@ -129,7 +129,8 @@ unsigned short get_type_vt(type_t *t)
+ if (vt) return vt;
+ }
+
+- if (type_is_alias(t) && is_attr(t->attrs, ATTR_PUBLIC))
++ if (type_is_alias(t) &&
++ (is_attr(t->attrs, ATTR_PUBLIC) || is_attr(t->attrs, ATTR_WIREMARSHAL)))
+ return VT_USERDEFINED;
+
+ switch (type_get_type(t)) {
+@@ -169,7 +170,7 @@ unsigned short get_type_vt(type_t *t)
+ else
+ return VT_I8;
+ case TYPE_BASIC_INT3264:
+- if (typelib_kind == SYS_WIN64)
++ if (pointer_size == 8)
+ {
+ if (type_basic_get_sign(t) > 0)
+ return VT_UI8;
+@@ -198,7 +199,7 @@ unsigned short get_type_vt(type_t *t)
+ case TYPE_ARRAY:
+ if (type_array_is_decl_as_ptr(t))
+ {
+- if (match(type_array_get_element(t)->name, "SAFEARRAY"))
++ if (match(type_array_get_element_type(t)->name, "SAFEARRAY"))
+ return VT_SAFEARRAY;
+ return VT_PTR;
+ }
+diff --git a/mingw-w64-tools/widl/src/typetree.c b/mingw-w64-tools/widl/src/typetree.c
+index b93806be..f52b785f 100644
+--- a/mingw-w64-tools/widl/src/typetree.c
++++ b/mingw-w64-tools/widl/src/typetree.c
+@@ -30,12 +30,16 @@
+ #include "typetree.h"
+ #include "header.h"
+
+-type_t *duptype(type_t *t, int dupname)
++/* this function is only used in declare_var in parser.y, see FIXME note */
++type_t *dup_pointer_type(type_t *t)
+ {
+- type_t *d = alloc_type();
++ type_t *d;
+
++ assert(is_ptr(t) && t->details.pointer.def_fc != FC_RP);
++
++ d = alloc_type();
+ *d = *t;
+- if (dupname && t->name)
++ if (t->name)
+ d->name = xstrdup(t->name);
+
+ return d;
+@@ -49,7 +53,6 @@ type_t *make_type(enum type_type type)
+ t->type_type = type;
+ t->attrs = NULL;
+ t->c_name = NULL;
+- t->orig = NULL;
+ memset(&t->details, 0, sizeof(t->details));
+ t->typestring_offset = 0;
+ t->ptrdesc = 0;
+@@ -137,7 +140,7 @@ type_t *type_new_function(var_list_t *args)
+ if (args)
+ {
+ arg = LIST_ENTRY(list_head(args), var_t, entry);
+- if (list_count(args) == 1 && !arg->name && arg->type && type_get_type(arg->type) == TYPE_VOID)
++ if (list_count(args) == 1 && !arg->name && arg->declspec.type && type_get_type(arg->declspec.type) == TYPE_VOID)
+ {
+ list_remove(&arg->entry);
+ free(arg);
+@@ -147,7 +150,7 @@ type_t *type_new_function(var_list_t *args)
+ }
+ if (args) LIST_FOR_EACH_ENTRY(arg, args, var_t, entry)
+ {
+- if (arg->type && type_get_type(arg->type) == TYPE_VOID)
++ if (arg->declspec.type && type_get_type(arg->declspec.type) == TYPE_VOID)
+ error_loc("argument '%s' has void type\n", arg->name);
+ if (!arg->name)
+ {
+@@ -178,35 +181,29 @@ type_t *type_new_function(var_list_t *args)
+ return t;
+ }
+
+-type_t *type_new_pointer(unsigned char pointer_default, type_t *ref, attr_list_t *attrs)
++type_t *type_new_pointer(unsigned char pointer_default, type_t *ref)
+ {
+ type_t *t = make_type(TYPE_POINTER);
+ t->details.pointer.def_fc = pointer_default;
+- t->details.pointer.ref = ref;
+- t->attrs = attrs;
++ t->details.pointer.ref.type = ref;
+ return t;
+ }
+
+-type_t *type_new_alias(type_t *t, const char *name)
++type_t *type_new_alias(const decl_spec_t *ds, const char *name)
+ {
+- type_t *a = duptype(t, 0);
+-
++ type_t *a = make_type(ds->type->type_type);
+ a->name = xstrdup(name);
+ a->attrs = NULL;
+- a->orig = t;
++ a->details.alias.aliasee = *ds;
+ a->is_alias = TRUE;
+- /* for pointer types */
+- a->details = t->details;
+- init_loc_info(&a->loc_info);
+-
+ return a;
+ }
+
+ type_t *type_new_module(char *name)
+ {
+ type_t *type = get_type(TYPE_MODULE, name, NULL, 0);
+- if (type->type_type != TYPE_MODULE || type->defined)
+- error_loc("%s: redefinition error; original definition was at %s:%d\n",
++ if (type->type_type != TYPE_MODULE || type_is_defined(type))
++ error_loc("BAZ %s: redefinition error; original definition was at %s:%d\n",
+ type->name, type->loc_info.input_name, type->loc_info.line_number);
+ type->name = name;
+ return type;
+@@ -215,15 +212,15 @@ type_t *type_new_module(char *name)
+ type_t *type_new_coclass(char *name)
+ {
+ type_t *type = get_type(TYPE_COCLASS, name, NULL, 0);
+- if (type->type_type != TYPE_COCLASS || type->defined)
+- error_loc("%s: redefinition error; original definition was at %s:%d\n",
++ if (type->type_type != TYPE_COCLASS || type_is_defined(type))
++ error_loc("BING %s: redefinition error; original definition was at %s:%d\n",
+ type->name, type->loc_info.input_name, type->loc_info.line_number);
+ type->name = name;
+ return type;
+ }
+
+
+-type_t *type_new_array(const char *name, type_t *element, int declptr,
++type_t *type_new_array(const char *name, const decl_spec_t *element, int declptr,
+ unsigned int dim, expr_t *size_is, expr_t *length_is,
+ unsigned char ptr_default_fc)
+ {
+@@ -235,7 +232,9 @@ type_t *type_new_array(const char *name, type_t *element, int declptr,
+ t->details.array.size_is = size_is;
+ else
+ t->details.array.dim = dim;
+- t->details.array.elem = element;
++ if (element) {
++ t->details.array.elem = *element;
++ }
+ t->details.array.ptr_def_fc = ptr_default_fc;
+ return t;
+ }
+@@ -273,80 +272,99 @@ type_t *type_new_void(void)
+
+ type_t *type_new_enum(const char *name, struct namespace *namespace, int defined, var_list_t *enums)
+ {
+- type_t *tag_type = name ? find_type(name, namespace, tsENUM) : NULL;
+- type_t *t = make_type(TYPE_ENUM);
+- t->name = name;
+- t->namespace = namespace;
+-
+- if (tag_type && tag_type->details.enumeration)
+- t->details.enumeration = tag_type->details.enumeration;
+- else if (defined)
++ type_t *t = NULL;
++
++ if (name)
++ t = find_type(name, namespace, tsENUM);
++
++ if (!t)
+ {
+- t->details.enumeration = xmalloc(sizeof(*t->details.enumeration));
+- t->details.enumeration->enums = enums;
+- t->defined = TRUE;
++ t = make_type(TYPE_ENUM);
++ t->name = name;
++ t->namespace = namespace;
++ if (name)
++ reg_type(t, name, namespace, tsENUM);
+ }
+
+- if (name)
++ if (!type_is_defined(t))
+ {
+ if (defined)
+- reg_type(t, name, namespace, tsENUM);
++ {
++ t->details.enumeration = xmalloc(sizeof(*t->details.enumeration));
++ t->details.enumeration->enums = enums;
++ t->defined = TRUE;
++ }
+ else
++ {
+ add_incomplete(t);
++ }
+ }
++
+ return t;
+ }
+
+ type_t *type_new_struct(char *name, struct namespace *namespace, int defined, var_list_t *fields)
+ {
+- type_t *tag_type = name ? find_type(name, namespace, tsSTRUCT) : NULL;
+- type_t *t;
+-
+- /* avoid creating duplicate typelib type entries */
+- if (tag_type && do_typelib) return tag_type;
++ type_t *t = NULL;
+
+- t = make_type(TYPE_STRUCT);
+- t->name = name;
+- t->namespace = namespace;
++ if (name)
++ t = find_type(name, namespace, tsSTRUCT);
+
+- if (tag_type && tag_type->details.structure)
+- t->details.structure = tag_type->details.structure;
+- else if (defined)
++ if (!t)
+ {
+- t->details.structure = xmalloc(sizeof(*t->details.structure));
+- t->details.structure->fields = fields;
+- t->defined = TRUE;
++ t = make_type(TYPE_STRUCT);
++ t->name = name;
++ t->namespace = namespace;
++ if (name)
++ reg_type(t, name, namespace, tsSTRUCT);
+ }
+- if (name)
++
++ if (!type_is_defined(t))
+ {
+ if (defined)
+- reg_type(t, name, namespace, tsSTRUCT);
++ {
++ t->details.structure = xmalloc(sizeof(*t->details.structure));
++ t->details.structure->fields = fields;
++ t->defined = TRUE;
++ }
+ else
++ {
+ add_incomplete(t);
++ }
+ }
++
+ return t;
+ }
+
+ type_t *type_new_nonencapsulated_union(const char *name, int defined, var_list_t *fields)
+ {
+- type_t *tag_type = name ? find_type(name, NULL, tsUNION) : NULL;
+- type_t *t = make_type(TYPE_UNION);
+- t->name = name;
+- if (tag_type && tag_type->details.structure)
+- t->details.structure = tag_type->details.structure;
+- else if (defined)
++ type_t *t = NULL;
++
++ if (name)
++ t = find_type(name, NULL, tsUNION);
++
++ if (!t)
+ {
+- t->details.structure = xmalloc(sizeof(*t->details.structure));
+- t->details.structure->fields = fields;
+- t->defined = TRUE;
++ t = make_type(TYPE_UNION);
++ t->name = name;
++ if (name)
++ reg_type(t, name, NULL, tsUNION);
+ }
+- if (name)
++
++ if (!type_is_defined(t))
+ {
+ if (defined)
+- reg_type(t, name, NULL, tsUNION);
++ {
++ t->details.structure = xmalloc(sizeof(*t->details.structure));
++ t->details.structure->fields = fields;
++ t->defined = TRUE;
++ }
+ else
++ {
+ add_incomplete(t);
++ }
+ }
++
+ return t;
+ }
+
+@@ -354,7 +372,7 @@ type_t *type_new_encapsulated_union(char *name, var_t *switch_field, var_t *unio
+ {
+ type_t *t = get_type(TYPE_ENCAPSULATED_UNION, name, NULL, tsUNION);
+ if (!union_field) union_field = make_var( xstrdup("tagged_union") );
+- union_field->type = type_new_nonencapsulated_union(NULL, TRUE, cases);
++ union_field->declspec.type = type_new_nonencapsulated_union(NULL, TRUE, cases);
+ t->details.structure = xmalloc(sizeof(*t->details.structure));
+ t->details.structure->fields = append_var( NULL, switch_field );
+ t->details.structure->fields = append_var( t->details.structure->fields, union_field );
+@@ -430,7 +448,7 @@ static int compute_method_indexes(type_t *iface)
+ {
+ var_t *func = stmt->u.var;
+ if (!is_callas(func->attrs))
+- func->type->details.function->idx = idx++;
++ func->declspec.type->details.function->idx = idx++;
+ }
+
+ return idx;
+@@ -438,6 +456,7 @@ static int compute_method_indexes(type_t *iface)
+
+ void type_interface_define(type_t *iface, type_t *inherit, statement_list_t *stmts)
+ {
++ assert(type_get_type_detect_alias(iface) == TYPE_INTERFACE);
+ iface->details.iface = xmalloc(sizeof(*iface->details.iface));
+ iface->details.iface->disp_props = NULL;
+ iface->details.iface->disp_methods = NULL;
+@@ -451,6 +470,7 @@ void type_interface_define(type_t *iface, type_t *inherit, statement_list_t *stm
+
+ void type_dispinterface_define(type_t *iface, var_list_t *props, var_list_t *methods)
+ {
++ assert(type_get_type_detect_alias(iface) == TYPE_INTERFACE);
+ iface->details.iface = xmalloc(sizeof(*iface->details.iface));
+ iface->details.iface->disp_props = props;
+ iface->details.iface->disp_methods = methods;
+@@ -465,6 +485,7 @@ void type_dispinterface_define(type_t *iface, var_list_t *props, var_list_t *met
+
+ void type_dispinterface_define_from_iface(type_t *dispiface, type_t *iface)
+ {
++ assert(type_get_type_detect_alias(iface) == TYPE_INTERFACE);
+ dispiface->details.iface = xmalloc(sizeof(*dispiface->details.iface));
+ dispiface->details.iface->disp_props = NULL;
+ dispiface->details.iface->disp_methods = NULL;
+@@ -479,6 +500,7 @@ void type_dispinterface_define_from_iface(type_t *dispiface, type_t *iface)
+
+ void type_module_define(type_t *module, statement_list_t *stmts)
+ {
++ assert(type_get_type_detect_alias(module) == TYPE_MODULE);
+ if (module->details.module) error_loc("multiple definition error\n");
+ module->details.module = xmalloc(sizeof(*module->details.module));
+ module->details.module->stmts = stmts;
+@@ -487,6 +509,7 @@ void type_module_define(type_t *module, statement_list_t *stmts)
+
+ type_t *type_coclass_define(type_t *coclass, ifref_list_t *ifaces)
+ {
++ assert(type_get_type_detect_alias(coclass) == TYPE_COCLASS);
+ coclass->details.coclass.ifaces = ifaces;
+ coclass->defined = TRUE;
+ return coclass;
+diff --git a/mingw-w64-tools/widl/src/typetree.h b/mingw-w64-tools/widl/src/typetree.h
+index fc134cd5..96fcae8d 100644
+--- a/mingw-w64-tools/widl/src/typetree.h
++++ b/mingw-w64-tools/widl/src/typetree.h
+@@ -30,10 +30,10 @@ enum name_type {
+ };
+
+ type_t *type_new_function(var_list_t *args);
+-type_t *type_new_pointer(unsigned char pointer_default, type_t *ref, attr_list_t *attrs);
+-type_t *type_new_alias(type_t *t, const char *name);
++type_t *type_new_pointer(unsigned char pointer_default, type_t *ref);
++type_t *type_new_alias(const decl_spec_t *aliasee, const char *name);
+ type_t *type_new_module(char *name);
+-type_t *type_new_array(const char *name, type_t *element, int declptr,
++type_t *type_new_array(const char* name, const decl_spec_t *element, int declptr,
+ unsigned int dim, expr_t *size_is, expr_t *length_is,
+ unsigned char ptr_default_fc);
+ type_t *type_new_basic(enum type_basic_type basic_type);
+@@ -53,14 +53,38 @@ type_t *type_coclass_define(type_t *coclass, ifref_list_t *ifaces);
+ int type_is_equal(const type_t *type1, const type_t *type2);
+ const char *type_get_name(const type_t *type, enum name_type name_type);
+
+-/* FIXME: shouldn't need to export this */
+-type_t *duptype(type_t *t, int dupname);
++/* copy pointer type to deal with need for duplicate typeformat strings */
++type_t *dup_pointer_type(type_t *t);
++
++#define STATEMENTS_FOR_EACH_FUNC(stmt, stmts) \
++ if (stmts) LIST_FOR_EACH_ENTRY( stmt, stmts, statement_t, entry ) \
++ if (stmt->type == STMT_DECLARATION && stmt->u.var->declspec.stgclass == STG_NONE && \
++ type_get_type_detect_alias(stmt->u.var->declspec.type) == TYPE_FUNCTION)
++
++static inline enum type_type type_get_type_detect_alias(const type_t *type)
++{
++ if (type->is_alias)
++ return TYPE_ALIAS;
++ return type->type_type;
++}
++
++static inline int statements_has_func(const statement_list_t *stmts)
++{
++ const statement_t *stmt;
++ int has_func = 0;
++ STATEMENTS_FOR_EACH_FUNC(stmt, stmts)
++ {
++ has_func = 1;
++ break;
++ }
++ return has_func;
++}
+
+ /* un-alias the type until finding the non-alias type */
+ static inline type_t *type_get_real_type(const type_t *type)
+ {
+ if (type->is_alias)
+- return type_get_real_type(type->orig);
++ return type_get_real_type(type->details.alias.aliasee.type);
+ else
+ return (type_t *)type;
+ }
+@@ -105,9 +129,14 @@ static inline var_t *type_function_get_retval(const type_t *type)
+ return type->details.function->retval;
+ }
+
++static inline const decl_spec_t *type_function_get_retdeclspec(const type_t *type)
++{
++ return &type_function_get_retval(type)->declspec;
++}
++
+ static inline type_t *type_function_get_rettype(const type_t *type)
+ {
+- return type_function_get_retval(type)->type;
++ return type_function_get_retdeclspec(type)->type;
+ }
+
+ static inline var_list_t *type_enum_get_values(const type_t *type)
+@@ -142,7 +171,7 @@ static inline var_list_t *type_union_get_cases(const type_t *type)
+ if (type_type == TYPE_ENCAPSULATED_UNION)
+ {
+ const var_t *uv = LIST_ENTRY(list_tail(type->details.structure->fields), const var_t, entry);
+- return uv->type->details.structure->fields;
++ return uv->declspec.type->details.structure->fields;
+ }
+ else
+ return type->details.structure->fields;
+@@ -250,11 +279,16 @@ static inline expr_t *type_array_get_variance(const type_t *type)
+ return type->details.array.length_is;
+ }
+
+-static inline type_t *type_array_get_element(const type_t *type)
++static inline const decl_spec_t *type_array_get_element(const type_t *type)
+ {
+ type = type_get_real_type(type);
+ assert(type_get_type(type) == TYPE_ARRAY);
+- return type->details.array.elem;
++ return &type->details.array.elem;
++}
++
++static inline type_t *type_array_get_element_type(const type_t *type)
++{
++ return type_array_get_element(type)->type;
+ }
+
+ static inline int type_array_is_decl_as_ptr(const type_t *type)
+@@ -276,10 +310,15 @@ static inline int type_is_alias(const type_t *type)
+ return type->is_alias;
+ }
+
+-static inline type_t *type_alias_get_aliasee(const type_t *type)
++static inline const decl_spec_t *type_alias_get_aliasee(const type_t *type)
+ {
+ assert(type_is_alias(type));
+- return type->orig;
++ return &type->details.alias.aliasee;
++}
++
++static inline type_t *type_alias_get_aliasee_type(const type_t *type)
++{
++ return type_alias_get_aliasee(type)->type;
+ }
+
+ static inline ifref_list_t *type_coclass_get_ifaces(const type_t *type)
+@@ -289,11 +328,16 @@ static inline ifref_list_t *type_coclass_get_ifaces(const type_t *type)
+ return type->details.coclass.ifaces;
+ }
+
+-static inline type_t *type_pointer_get_ref(const type_t *type)
++static inline const decl_spec_t *type_pointer_get_ref(const type_t *type)
+ {
+ type = type_get_real_type(type);
+ assert(type_get_type(type) == TYPE_POINTER);
+- return type->details.pointer.ref;
++ return &type->details.pointer.ref;
++}
++
++static inline type_t *type_pointer_get_ref_type(const type_t *type)
++{
++ return type_pointer_get_ref(type)->type;
+ }
+
+ static inline unsigned char type_pointer_get_default_fc(const type_t *type)
+@@ -317,4 +361,54 @@ static inline const expr_t *type_bitfield_get_bits(const type_t *type)
+ return type->details.bitfield.bits;
+ }
+
++/* gets pointer to details_t union with the assumption the caller wants to write to it
++ * so assert if we're actually dealing with an alias and writing to the details would
++ * overwrite the alias_details
++ */
++static inline details_t *type_get_details(type_t* type)
++{
++ assert(!type_is_alias(type));
++ return &type->details;
++}
++
++/* const overload of type_get_details */
++
++static inline const details_t *type_get_const_details(const type_t* type)
++{
++ assert(!type_is_alias(type));
++ return &type->details;
++}
++
++static inline int type_is_pointerish(const type_t *type)
++{
++ type = type_get_real_type(type);
++ return type_get_type(type) == TYPE_ARRAY || type_get_type(type) == TYPE_POINTER;
++}
++
++static inline type_t * type_get_pointer_chain_tail(const type_t *type)
++{
++ type_t *pointee = NULL;
++ type_t *pointer = type_get_real_type(type);
++
++ if (type_get_type(pointer) == TYPE_ARRAY)
++ {
++ pointee = type_array_get_element_type(pointer);
++ }
++ else if (type_get_type(pointer) == TYPE_POINTER)
++ {
++ pointee = type_pointer_get_ref_type(pointer);
++ }
++ else
++ {
++ assert(FALSE);
++ }
++
++ if (type_is_pointerish(pointee))
++ {
++ return type_get_pointer_chain_tail(pointee);
++ }
++
++ return pointee;
++}
++
+ #endif /* WIDL_TYPE_TREE_H */
+diff --git a/mingw-w64-tools/widl/src/widl.c b/mingw-w64-tools/widl/src/widl.c
+index 1af42509..8542e518 100644
+--- a/mingw-w64-tools/widl/src/widl.c
++++ b/mingw-w64-tools/widl/src/widl.c
+@@ -44,11 +44,6 @@
+ #include "header.h"
+ #include "pathtools.h"
+
+-/* future options to reserve characters for: */
+-/* A = ACF input filename */
+-/* J = do not search standard include path */
+-/* w = select win16/win32 output (?) */
+-
+ static const char usage[] =
+ "Usage: widl [options...] infile.idl\n"
+ " or: widl [options...] --dlldata-only name1 [name2...]\n"
+@@ -64,7 +59,7 @@ static const char usage[] =
+ " -H file Name of header file (default is infile.h)\n"
+ " -I path Set include search dir to path (multiple -I allowed)\n"
+ " --local-stubs=file Write empty stubs for call_as/local methods to file\n"
+-" -m32, -m64 Set the kind of typelib to build (Win32 or Win64)\n"
++" -m32, -m64 Set the target architecture (Win32 or Win64)\n"
+ " -N Do not preprocess input\n"
+ " --oldnames Use old naming conventions\n"
+ " -o, --output=NAME Set the output file name\n"
+@@ -82,8 +77,7 @@ static const char usage[] =
+ " -u Generate interface identifiers file\n"
+ " -V Print version and exit\n"
+ " -W Enable pedantic warnings\n"
+-" --win32 Only generate 32-bit code\n"
+-" --win64 Only generate 64-bit code\n"
++" --win32, --win64 Set the target architecture (Win32 or Win64)\n"
+ " --win32-align n Set win32 structure alignment to 'n'\n"
+ " --win64-align n Set win64 structure alignment to 'n'\n"
+ "Debug level 'n' is a bitmask with following meaning:\n"
+@@ -98,6 +92,20 @@ static const char usage[] =
+ static const char version_string[] = "Wine IDL Compiler version " PACKAGE_VERSION "\n"
+ "Copyright 2002 Ove Kaaven\n";
+
++#ifdef __i386__
++enum target_cpu target_cpu = CPU_x86;
++#elif defined(__x86_64__)
++enum target_cpu target_cpu = CPU_x86_64;
++#elif defined(__powerpc__)
++enum target_cpu target_cpu = CPU_POWERPC;
++#elif defined(__arm__)
++enum target_cpu target_cpu = CPU_ARM;
++#elif defined(__aarch64__)
++enum target_cpu target_cpu = CPU_ARM64;
++#else
++#error Unsupported CPU
++#endif
++
+ int debuglevel = DEBUGLEVEL_NONE;
+ int parser_debug, yy_flex_debug;
+
+@@ -114,8 +122,6 @@ int do_idfile = 0;
+ int do_dlldata = 0;
+ static int no_preprocess = 0;
+ int old_names = 0;
+-int do_win32 = 1;
+-int do_win64 = 1;
+ int win32_packing = 8;
+ int win64_packing = 8;
+ int winrt_mode = 0;
+@@ -148,7 +154,6 @@ int line_number = 1;
+ static FILE *idfile;
+
+ unsigned int pointer_size = 0;
+-syskind_t typelib_kind = sizeof(void*) == 8 ? SYS_WIN64 : SYS_WIN32;
+
+ time_t now;
+
+@@ -188,6 +193,7 @@ static const struct option long_options[] = {
+ { "prefix-client", 1, NULL, PREFIX_CLIENT_OPTION },
+ { "prefix-server", 1, NULL, PREFIX_SERVER_OPTION },
+ { "robust", 0, NULL, ROBUST_OPTION },
++ { "target", 0, NULL, 'b' },
+ { "winrt", 0, NULL, RT_OPTION },
+ { "win32", 0, NULL, WIN32_OPTION },
+ { "win64", 0, NULL, WIN64_OPTION },
+@@ -269,20 +275,25 @@ static void set_target( const char *target )
+ {
+ static const struct
+ {
+- const char *name;
+- syskind_t kind;
++ const char *name;
++ enum target_cpu cpu;
+ } cpu_names[] =
+ {
+- { "i386", SYS_WIN32 },
+- { "i486", SYS_WIN32 },
+- { "i586", SYS_WIN32 },
+- { "i686", SYS_WIN32 },
+- { "i786", SYS_WIN32 },
+- { "amd64", SYS_WIN64 },
+- { "x86_64", SYS_WIN64 },
+- { "powerpc", SYS_WIN32 },
+- { "arm", SYS_WIN32 },
+- { "aarch64", SYS_WIN64 }
++ { "i386", CPU_x86 },
++ { "i486", CPU_x86 },
++ { "i586", CPU_x86 },
++ { "i686", CPU_x86 },
++ { "i786", CPU_x86 },
++ { "amd64", CPU_x86_64 },
++ { "x86_64", CPU_x86_64 },
++ { "powerpc", CPU_POWERPC },
++ { "arm", CPU_ARM },
++ { "armv5", CPU_ARM },
++ { "armv6", CPU_ARM },
++ { "armv7", CPU_ARM },
++ { "armv7a", CPU_ARM },
++ { "arm64", CPU_ARM64 },
++ { "aarch64", CPU_ARM64 },
+ };
+
+ unsigned int i;
+@@ -296,7 +307,7 @@ static void set_target( const char *target )
+ {
+ if (!strcmp( cpu_names[i].name, spec ))
+ {
+- typelib_kind = cpu_names[i].kind;
++ target_cpu = cpu_names[i].cpu;
+ free( spec );
+ return;
+ }
+@@ -484,6 +495,7 @@ static void write_id_data_stmts(const statement_list_t *stmts)
+ uuid = get_attrp(type->attrs, ATTR_UUID);
+ write_id_guid(idfile, "IID", is_attr(type->attrs, ATTR_DISPINTERFACE) ? "DIID" : "IID",
+ type->name, uuid);
++ assert(type_get_type_detect_alias(type) == TYPE_INTERFACE);
+ if (type->details.iface->async_iface)
+ {
+ uuid = get_attrp(type->details.iface->async_iface->attrs, ATTR_UUID);
+@@ -606,12 +618,10 @@ int main(int argc,char *argv[])
+ use_abi_namespace = 1;
+ break;
+ case WIN32_OPTION:
+- do_win32 = 1;
+- do_win64 = 0;
++ pointer_size = 4;
+ break;
+ case WIN64_OPTION:
+- do_win32 = 0;
+- do_win64 = 1;
++ pointer_size = 8;
+ break;
+ case WIN32_ALIGN_OPTION:
+ win32_packing = strtol(optarg, NULL, 0);
+@@ -664,8 +674,8 @@ int main(int argc,char *argv[])
+ wpp_add_include_path(optarg);
+ break;
+ case 'm':
+- if (!strcmp( optarg, "32" )) typelib_kind = SYS_WIN32;
+- else if (!strcmp( optarg, "64" )) typelib_kind = SYS_WIN64;
++ if (!strcmp( optarg, "32" )) pointer_size = 4;
++ else if (!strcmp( optarg, "64" )) pointer_size = 8;
+ break;
+ case 'N':
+ no_preprocess = 1;
+@@ -726,6 +736,7 @@ int main(int argc,char *argv[])
+ }
+
+ #ifdef DEFAULT_INCLUDE_DIR
++ wpp_add_include_path(DEFAULT_INCLUDE_DIR);
+ char exe_path[PATH_MAX];
+ get_executable_path (argv[0], &exe_path[0], sizeof (exe_path) / sizeof (exe_path[0]));
+ char * rel_to_includedir = get_relative_path (DEFAULT_BINDIR, DEFAULT_INCLUDE_DIR);
+@@ -739,6 +750,26 @@ int main(int argc,char *argv[])
+ wpp_add_include_path(relocated_default_include_dir);
+ #endif
+
++ switch (target_cpu)
++ {
++ case CPU_x86:
++ if (pointer_size == 8) target_cpu = CPU_x86_64;
++ else pointer_size = 4;
++ break;
++ case CPU_x86_64:
++ if (pointer_size == 4) target_cpu = CPU_x86;
++ else pointer_size = 8;
++ break;
++ case CPU_ARM64:
++ if (pointer_size == 4) error( "Cannot build 32-bit code for this CPU\n" );
++ pointer_size = 8;
++ break;
++ default:
++ if (pointer_size == 8) error( "Cannot build 64-bit code for this CPU\n" );
++ pointer_size = 4;
++ break;
++ }
++
+ /* if nothing specified, try to guess output type from the output file name */
+ if (output_name && do_everything && !do_header && !do_typelib && !do_proxies &&
+ !do_client && !do_server && !do_regscript && !do_idfile && !do_dlldata)
+diff --git a/mingw-w64-tools/widl/src/widl.h b/mingw-w64-tools/widl/src/widl.h
+index 118e2245..4f4252e3 100644
+--- a/mingw-w64-tools/widl/src/widl.h
++++ b/mingw-w64-tools/widl/src/widl.h
+@@ -45,8 +45,6 @@ extern int do_regscript;
+ extern int do_idfile;
+ extern int do_dlldata;
+ extern int old_names;
+-extern int do_win32;
+-extern int do_win64;
+ extern int win32_packing;
+ extern int win64_packing;
+ extern int winrt_mode;
+@@ -76,6 +74,13 @@ extern time_t now;
+ extern int line_number;
+ extern int char_number;
+
++enum target_cpu
++{
++ CPU_x86, CPU_x86_64, CPU_POWERPC, CPU_ARM, CPU_ARM64, CPU_LAST = CPU_ARM64
++};
++
++extern enum target_cpu target_cpu;
++
+ enum stub_mode
+ {
+ MODE_Os, /* inline stubs */
+diff --git a/mingw-w64-tools/widl/src/widltypes.h b/mingw-w64-tools/widl/src/widltypes.h
+index 08584de5..b9c5a07d 100644
+--- a/mingw-w64-tools/widl/src/widltypes.h
++++ b/mingw-w64-tools/widl/src/widltypes.h
+@@ -40,6 +40,7 @@ typedef struct _attr_t attr_t;
+ typedef struct _expr_t expr_t;
+ typedef struct _type_t type_t;
+ typedef struct _var_t var_t;
++typedef struct _decl_spec_t decl_spec_t;
+ typedef struct _declarator_t declarator_t;
+ typedef struct _ifref_t ifref_t;
+ typedef struct _typelib_entry_t typelib_entry_t;
+@@ -80,7 +81,6 @@ enum attr_type
+ ATTR_CASE,
+ ATTR_CODE,
+ ATTR_COMMSTATUS,
+- ATTR_CONST, /* const pseudo-attribute */
+ ATTR_CONTEXTHANDLE,
+ ATTR_CONTROL,
+ ATTR_DECODE,
+@@ -115,7 +115,6 @@ enum attr_type
+ ATTR_IMMEDIATEBIND,
+ ATTR_IMPLICIT_HANDLE,
+ ATTR_IN,
+- ATTR_INLINE,
+ ATTR_INPUTSYNC,
+ ATTR_LENGTHIS,
+ ATTR_LIBLCID,
+@@ -234,6 +233,18 @@ enum storage_class
+ STG_REGISTER,
+ };
+
++enum type_qualifier
++{
++ TYPE_QUALIFIER_NONE = 0,
++ TYPE_QUALIFIER_CONST = 1,
++};
++
++enum function_specifier
++{
++ FUNCTION_SPECIFIER_NONE,
++ FUNCTION_SPECIFIER_INLINE,
++};
++
+ enum statement_type
+ {
+ STMT_LIBRARY,
+@@ -293,6 +304,14 @@ struct str_list_entry_t
+ struct list entry;
+ };
+
++struct _decl_spec_t
++{
++ type_t *type;
++ enum storage_class stgclass;
++ enum type_qualifier typequalifier;
++ enum function_specifier funcspecifier;
++};
++
+ struct _attr_t {
+ enum attr_type type;
+ union {
+@@ -356,7 +375,7 @@ struct array_details
+ {
+ expr_t *size_is;
+ expr_t *length_is;
+- struct _type_t *elem;
++ struct _decl_spec_t elem;
+ unsigned int dim;
+ unsigned char ptr_def_fc;
+ unsigned char declptr; /* if declared as a pointer */
+@@ -376,7 +395,7 @@ struct basic_details
+
+ struct pointer_details
+ {
+- struct _type_t *ref;
++ struct _decl_spec_t ref;
+ unsigned char def_fc;
+ };
+
+@@ -386,6 +405,11 @@ struct bitfield_details
+ const expr_t *bits;
+ };
+
++struct alias_details
++{
++ struct _decl_spec_t aliasee;
++};
++
+ #define HASHMAX 64
+
+ struct namespace {
+@@ -414,26 +438,28 @@ enum type_type
+ TYPE_BITFIELD,
+ };
+
++typedef union _details_t
++{
++ struct struct_details *structure;
++ struct enumeration_details *enumeration;
++ struct func_details *function;
++ struct iface_details *iface;
++ struct module_details *module;
++ struct array_details array;
++ struct coclass_details coclass;
++ struct basic_details basic;
++ struct pointer_details pointer;
++ struct bitfield_details bitfield;
++ struct alias_details alias;
++} details_t;
++
+ struct _type_t {
+ const char *name;
+ struct namespace *namespace;
+ enum type_type type_type;
+ attr_list_t *attrs;
+- union
+- {
+- struct struct_details *structure;
+- struct enumeration_details *enumeration;
+- struct func_details *function;
+- struct iface_details *iface;
+- struct module_details *module;
+- struct array_details array;
+- struct coclass_details coclass;
+- struct basic_details basic;
+- struct pointer_details pointer;
+- struct bitfield_details bitfield;
+- } details;
++ details_t details;
+ const char *c_name;
+- type_t *orig; /* dup'd types */
+ unsigned int typestring_offset;
+ unsigned int ptrdesc; /* used for complex structs */
+ int typelib_idx;
+@@ -449,14 +475,20 @@ struct _type_t {
+
+ struct _var_t {
+ char *name;
+- type_t *type;
++ decl_spec_t declspec;
+ attr_list_t *attrs;
+ expr_t *eval;
+- enum storage_class stgclass;
+ unsigned int procstring_offset;
+ unsigned int typestring_offset;
+
+ struct _loc_info_t loc_info;
++ /* this flag indicates that this var's type (or pointed to type in the case of
++ * array or pointer) was not fully defined at the time of declaration.
++ * If this flag is set to TRUE then the type definition will not be written for this var
++ * If this flag is set to FALSE then the type definition will only be written if it has not
++ * been written yet (determined by the type_t's 'written' flag)
++ */
++ int declonly : 1;
+
+ /* parser-internal */
+ struct list entry;
+@@ -464,7 +496,7 @@ struct _var_t {
+
+ struct _declarator_t {
+ var_t *var;
+- type_t *type;
++ decl_spec_t declspec;
+ type_t *func_type;
+ expr_t *bits;
+
+@@ -497,6 +529,7 @@ struct _importinfo_t {
+ };
+
+ struct _importlib_t {
++ int offset;
+ char *name;
+
+ int version;
+@@ -539,6 +572,13 @@ struct _statement_t {
+ typelib_t *lib;
+ type_list_t *type_list;
+ } u;
++ /* this flag indicates that this statement's type (or pointed to type in the case of
++ * array or pointer) was not fully defined at the time of declaration.
++ * If this flag is set to TRUE then the type definition will not be written for this statement
++ * If this flag is set to FALSE then the type definition will only be written if it has not
++ * been written yet (determined by the type_t's 'written' flag)
++ */
++ int declonly : 1;
+ };
+
+ struct _warning_t {
+@@ -553,11 +593,10 @@ typedef enum {
+ SYS_WIN64
+ } syskind_t;
+
+-extern syskind_t typelib_kind;
+ extern user_type_list_t user_type_list;
+ extern context_handle_list_t context_handle_list;
+ extern generic_handle_list_t generic_handle_list;
+-void check_for_additional_prototype_types(const var_list_t *list);
++void check_for_additional_prototype_types(type_t *type);
+
+ void init_types(void);
+ type_t *alloc_type(void);
+@@ -568,6 +607,12 @@ void clear_all_offsets(void);
+ #define tsSTRUCT 2
+ #define tsUNION 3
+
++static inline const char* ts_to_str(int t)
++{
++ static const char* strings[] = {"tsNULL", "tsENUM", "tsSTRUCT", "tsUNION"};
++ return strings[t];
++}
++
+ var_t *find_const(const char *name, int f);
+ type_t *find_type(const char *name, struct namespace *namespace, int t);
+ type_t *make_type(enum type_type type);
+@@ -582,38 +627,18 @@ void init_loc_info(loc_info_t *);
+
+ char *format_namespace(struct namespace *namespace, const char *prefix, const char *separator, const char *suffix);
+
+-static inline var_list_t *type_get_function_args(const type_t *func_type)
+-{
+- return func_type->details.function->args;
+-}
+-
+-static inline enum type_type type_get_type_detect_alias(const type_t *type)
+-{
+- if (type->is_alias)
+- return TYPE_ALIAS;
+- return type->type_type;
+-}
+-
+-#define STATEMENTS_FOR_EACH_FUNC(stmt, stmts) \
+- if (stmts) LIST_FOR_EACH_ENTRY( stmt, stmts, statement_t, entry ) \
+- if (stmt->type == STMT_DECLARATION && stmt->u.var->stgclass == STG_NONE && \
+- type_get_type_detect_alias(stmt->u.var->type) == TYPE_FUNCTION)
+-
+-static inline int statements_has_func(const statement_list_t *stmts)
++static inline int is_global_namespace(const struct namespace *namespace)
+ {
+- const statement_t *stmt;
+- int has_func = 0;
+- STATEMENTS_FOR_EACH_FUNC(stmt, stmts)
+- {
+- has_func = 1;
+- break;
+- }
+- return has_func;
++ return !namespace->name;
+ }
+
+-static inline int is_global_namespace(const struct namespace *namespace)
++static inline decl_spec_t *init_declspec(decl_spec_t *declspec, type_t *type)
+ {
+- return !namespace->name;
++ declspec->type = type;
++ declspec->stgclass = STG_NONE;
++ declspec->typequalifier=TYPE_QUALIFIER_NONE;
++ declspec->funcspecifier=FUNCTION_SPECIFIER_NONE;
++ return declspec;
+ }
+
+ #endif
+diff --git a/mingw-w64-tools/widl/src/write_msft.c b/mingw-w64-tools/widl/src/write_msft.c
+index 88a80d12..da7ce89d 100644
+--- a/mingw-w64-tools/widl/src/write_msft.c
++++ b/mingw-w64-tools/widl/src/write_msft.c
+@@ -702,15 +702,15 @@ static void alloc_importinfo(msft_typelib_t *typelib, importinfo_t *importinfo)
+
+ guid_idx = ctl2_alloc_guid(typelib, &guid);
+
+- alloc_importfile(typelib, guid_idx, importlib->version&0xffff,
+- importlib->version>>16, importlib->name);
++ importlib->offset = alloc_importfile(typelib, guid_idx, importlib->version & 0xffff,
++ importlib->version >> 16, importlib->name);
+ }
+
+ if(importinfo->offset == -1 || !(importinfo->flags & MSFT_IMPINFO_OFFSET_IS_GUID)) {
+ MSFT_ImpInfo impinfo;
+
+ impinfo.flags = importinfo->flags;
+- impinfo.oImpFile = 0;
++ impinfo.oImpFile = importlib->offset;
+
+ if(importinfo->flags & MSFT_IMPINFO_OFFSET_IS_GUID) {
+ MSFT_GuidEntry guid;
+@@ -763,7 +763,7 @@ static void add_enum_typeinfo(msft_typelib_t *typelib, type_t *enumeration);
+ static void add_union_typeinfo(msft_typelib_t *typelib, type_t *tunion);
+ static void add_coclass_typeinfo(msft_typelib_t *typelib, type_t *cls);
+ static void add_dispinterface_typeinfo(msft_typelib_t *typelib, type_t *dispinterface);
+-
++static void add_typedef_typeinfo(msft_typelib_t *typelib, type_t *tdef);
+
+ /****************************************************************************
+ * encode_type
+@@ -862,8 +862,8 @@ static int encode_type(
+ case VT_PTR:
+ {
+ int next_vt;
+- for(next_vt = 0; is_ptr(type); type = type_pointer_get_ref(type)) {
+- next_vt = get_type_vt(type_pointer_get_ref(type));
++ for(next_vt = 0; is_ptr(type); type = type_pointer_get_ref_type(type)) {
++ next_vt = get_type_vt(type_pointer_get_ref_type(type));
+ if (next_vt != 0)
+ break;
+ }
+@@ -871,7 +871,7 @@ static int encode_type(
+ if (next_vt == 0)
+ next_vt = VT_VOID;
+
+- encode_type(typelib, next_vt, type_pointer_get_ref(type),
++ encode_type(typelib, next_vt, type_pointer_get_ref_type(type),
+ &target_type, &child_size);
+ /* these types already have an implicit pointer, so we don't need to
+ * add another */
+@@ -912,10 +912,10 @@ static int encode_type(
+
+ case VT_SAFEARRAY:
+ {
+- type_t *element_type = type_alias_get_aliasee(type_array_get_element(type));
++ type_t *element_type = type_alias_get_aliasee_type(type_array_get_element_type(type));
+ int next_vt = get_type_vt(element_type);
+
+- encode_type(typelib, next_vt, type_alias_get_aliasee(type_array_get_element(type)),
++ encode_type(typelib, next_vt, type_alias_get_aliasee_type(type_array_get_element_type(type)),
+ &target_type, &child_size);
+
+ for (typeoffset = 0; typeoffset < typelib->typelib_segdir[MSFT_SEG_TYPEDESC].length; typeoffset += 8) {
+@@ -966,33 +966,61 @@ static int encode_type(
+ }
+ else
+ {
+- /* typedef'd types without public attribute aren't included in the typelib */
+- while (type_is_alias(type) && !is_attr(type->attrs, ATTR_PUBLIC))
+- type = type_alias_get_aliasee(type);
++ /* typedef'd types without public attribute aren't included in the typelib
++ * typedef'd types with a wire_marshal attribute must be included
++ */
++ while (type_is_alias(type))
++ {
++ if (is_attr(type->attrs, ATTR_WIREMARSHAL))
++ {
++ type = get_attrp(type->attrs, ATTR_WIREMARSHAL);
++ break;
++ }
++ else if(!is_attr(type->attrs, ATTR_PUBLIC))
++ {
++ type = type_alias_get_aliasee_type(type);
++ }
++ else
++ {
++ break;
++ }
++ }
+
+ chat("encode_type: VT_USERDEFINED - adding new type %s, real type %d\n",
+ type->name, type_get_type(type));
+
+- switch (type_get_type(type))
++ /* we've either fully resolved the typedef down to an actual type or
++ * we must include the typedef because it's a wiremarshal (or public) type
++ */
++ if (type_is_alias(type))
+ {
+- case TYPE_STRUCT:
+- add_structure_typeinfo(typelib, type);
+- break;
+- case TYPE_INTERFACE:
+- add_interface_typeinfo(typelib, type);
+- break;
+- case TYPE_ENUM:
+- add_enum_typeinfo(typelib, type);
+- break;
+- case TYPE_UNION:
+- add_union_typeinfo(typelib, type);
+- break;
+- case TYPE_COCLASS:
+- add_coclass_typeinfo(typelib, type);
+- break;
+- default:
+- error("encode_type: VT_USERDEFINED - unhandled type %d\n",
+- type_get_type(type));
++ add_typedef_typeinfo(typelib, type);
++ }
++ else
++ {
++ switch (type_get_type(type))
++ {
++ case TYPE_STRUCT:
++ add_structure_typeinfo(typelib, type);
++ break;
++ case TYPE_INTERFACE:
++ add_interface_typeinfo(typelib, type);
++ break;
++ case TYPE_ENUM:
++ add_enum_typeinfo(typelib, type);
++ break;
++ /* fallthrough */
++ case TYPE_UNION:
++ case TYPE_ENCAPSULATED_UNION:
++ add_union_typeinfo(typelib, type);
++ break;
++ case TYPE_COCLASS:
++ add_coclass_typeinfo(typelib, type);
++ break;
++ default:
++ error("encode_type: VT_USERDEFINED - unhandled type %d\n",
++ type_get_type(type));
++ }
+ }
+
+ typeinfo_offset = typelib->typelib_typeinfo_offsets[type->typelib_idx];
+@@ -1056,7 +1084,7 @@ static int encode_var(
+ num_dims = 0;
+ for (atype = type;
+ is_array(atype) && !type_array_is_decl_as_ptr(atype);
+- atype = type_array_get_element(atype))
++ atype = type_array_get_element_type(atype))
+ ++num_dims;
+
+ chat("array with %d dimensions\n", num_dims);
+@@ -1071,7 +1099,7 @@ static int encode_var(
+ arraydata += 2;
+ for (atype = type;
+ is_array(atype) && !type_array_is_decl_as_ptr(atype);
+- atype = type_array_get_element(atype))
++ atype = type_array_get_element_type(atype))
+ {
+ arraydata[0] = type_array_get_dim(atype);
+ arraydata[1] = 0;
+@@ -1093,7 +1121,7 @@ static int encode_var(
+ vt = get_type_vt(type);
+ if (vt == VT_PTR) {
+ type_t *ref = is_ptr(type) ?
+- type_pointer_get_ref(type) : type_array_get_element(type);
++ type_pointer_get_ref_type(type) : type_array_get_element_type(type);
+ int skip_ptr = encode_var(typelib, ref, var, &target_type, &child_size);
+
+ if(skip_ptr == 2) {
+@@ -1114,7 +1142,7 @@ static int encode_var(
+ if (target_type & 0x80000000) {
+ mix_field = ((target_type >> 16) & 0x3fff) | VT_BYREF;
+ } else if (get_type_vt(ref) == VT_SAFEARRAY) {
+- type_t *element_type = type_alias_get_aliasee(type_array_get_element(ref));
++ type_t *element_type = type_alias_get_aliasee_type(type_array_get_element_type(ref));
+ mix_field = get_type_vt(element_type) | VT_ARRAY | VT_BYREF;
+ } else {
+ typedata = (void *)&typelib->typelib_segment_data[MSFT_SEG_TYPEDESC][target_type];
+@@ -1204,7 +1232,7 @@ static void write_default_value(msft_typelib_t *typelib, type_t *type, expr_t *e
+ if (type_get_type(type) == TYPE_ENUM) {
+ vt = VT_I4;
+ } else if (is_ptr(type)) {
+- vt = get_type_vt(type_pointer_get_ref(type));
++ vt = get_type_vt(type_pointer_get_ref_type(type));
+ if (vt == VT_USERDEFINED)
+ vt = VT_I4;
+ if (expr->cval)
+@@ -1301,8 +1329,8 @@ static HRESULT add_func_desc(msft_typeinfo_t* typeinfo, var_t *func, int index)
+ return S_FALSE;
+ }
+
+- if (type_get_function_args(func->type))
+- LIST_FOR_EACH_ENTRY( arg, type_get_function_args(func->type), var_t, entry )
++ if (type_function_get_args(func->declspec.type))
++ LIST_FOR_EACH_ENTRY( arg, type_function_get_args(func->declspec.type), var_t, entry )
+ {
+ num_params++;
+ if (arg->attrs) LIST_FOR_EACH_ENTRY( attr, arg->attrs, const attr_t, entry ) {
+@@ -1444,7 +1472,7 @@ static HRESULT add_func_desc(msft_typeinfo_t* typeinfo, var_t *func, int index)
+
+ /* fill out the basic type information */
+ typedata[0] = typedata_size | (index << 16);
+- encode_var(typeinfo->typelib, type_function_get_rettype(func->type), func,
++ encode_var(typeinfo->typelib, type_function_get_rettype(func->declspec.type), func,
+ &typedata[1], &decoded_size);
+ typedata[2] = funcflags;
+ typedata[3] = ((52 /*sizeof(FUNCDESC)*/ + decoded_size) << 16) | typeinfo->typeinfo->cbSizeVft;
+@@ -1471,10 +1499,10 @@ static HRESULT add_func_desc(msft_typeinfo_t* typeinfo, var_t *func, int index)
+ warning("unknown number of optional attrs\n");
+ }
+
+- if (type_get_function_args(func->type))
++ if (type_function_get_args(func->declspec.type))
+ {
+ i = 0;
+- LIST_FOR_EACH_ENTRY( arg, type_get_function_args(func->type), var_t, entry )
++ LIST_FOR_EACH_ENTRY( arg, type_function_get_args(func->declspec.type), var_t, entry )
+ {
+ int paramflags = 0;
+ int *paramdata = typedata + 6 + extra_attr + (num_defaults ? num_params : 0) + i * 3;
+@@ -1482,13 +1510,13 @@ static HRESULT add_func_desc(msft_typeinfo_t* typeinfo, var_t *func, int index)
+
+ if(defaultdata) *defaultdata = -1;
+
+- encode_var(typeinfo->typelib, arg->type, arg, paramdata, &decoded_size);
++ encode_var(typeinfo->typelib, arg->declspec.type, arg, paramdata, &decoded_size);
+ if (arg->attrs) LIST_FOR_EACH_ENTRY( attr, arg->attrs, const attr_t, entry ) {
+ switch(attr->type) {
+ case ATTR_DEFAULTVALUE:
+ {
+ paramflags |= 0x30; /* PARAMFLAG_FHASDEFAULT | PARAMFLAG_FOPT */
+- write_default_value(typeinfo->typelib, arg->type, (expr_t *)attr->u.pval, defaultdata);
++ write_default_value(typeinfo->typelib, arg->declspec.type, (expr_t *)attr->u.pval, defaultdata);
+ break;
+ }
+ case ATTR_IN:
+@@ -1572,10 +1600,10 @@ static HRESULT add_func_desc(msft_typeinfo_t* typeinfo, var_t *func, int index)
+ if(typeinfo->typekind == TKIND_MODULE)
+ namedata[9] |= 0x20;
+
+- if (type_get_function_args(func->type))
++ if (type_function_get_args(func->declspec.type))
+ {
+ i = 0;
+- LIST_FOR_EACH_ENTRY( arg, type_get_function_args(func->type), var_t, entry )
++ LIST_FOR_EACH_ENTRY( arg, type_function_get_args(func->declspec.type), var_t, entry )
+ {
+ /* don't give the last arg of a [propput*] func a name */
+ if(i != num_params - 1 || (invokekind != 0x4 /* INVOKE_PROPERTYPUT */ && invokekind != 0x8 /* INVOKE_PROPERTYPUTREF */))
+@@ -1697,8 +1725,8 @@ static HRESULT add_var_desc(msft_typeinfo_t *typeinfo, UINT index, var_t* var)
+ typeinfo->var_offsets[var_num] = offset;
+
+ /* figure out type widths and whatnot */
+- var_datawidth = type_memsize_and_alignment(var->type, &var_alignment);
+- encode_var(typeinfo->typelib, var->type, var, &typedata[1], &var_type_size);
++ var_datawidth = type_memsize_and_alignment(var->declspec.type, &var_alignment);
++ encode_var(typeinfo->typelib, var->declspec.type, var, &typedata[1], &var_type_size);
+
+ /* pad out starting position to data width */
+ typeinfo->datawidth += var_alignment - 1;
+@@ -1977,6 +2005,7 @@ static void add_dispinterface_typeinfo(msft_typelib_t *typelib, type_t *dispinte
+ var_t *var;
+ msft_typeinfo_t *msft_typeinfo;
+
++ assert(type_get_type_detect_alias(dispinterface) == TYPE_INTERFACE);
+ if (-1 < dispinterface->typelib_idx)
+ return;
+
+@@ -2181,7 +2210,7 @@ static void add_typedef_typeinfo(msft_typelib_t *typelib, type_t *tdef)
+ if (-1 < tdef->typelib_idx)
+ return;
+
+- type = type_alias_get_aliasee(tdef);
++ type = type_alias_get_aliasee_type(tdef);
+
+ if (!type->name || strcmp(tdef->name, type->name) != 0)
+ {
+@@ -2297,6 +2326,7 @@ static void add_module_typeinfo(msft_typelib_t *typelib, type_t *module)
+ const statement_t *stmt;
+ msft_typeinfo_t *msft_typeinfo;
+
++ assert(type_get_type_detect_alias(module) == TYPE_MODULE);
+ if (-1 < module->typelib_idx)
+ return;
+
+@@ -2364,7 +2394,7 @@ static void add_entry(msft_typelib_t *typelib, const statement_t *stmt)
+ if (is_attr(type_entry->type->attrs, ATTR_PUBLIC))
+ add_typedef_typeinfo(typelib, type_entry->type);
+ else
+- add_type_typeinfo(typelib, type_alias_get_aliasee(type_entry->type));
++ add_type_typeinfo(typelib, type_alias_get_aliasee_type(type_entry->type));
+ }
+ break;
+ }
+@@ -2653,8 +2683,6 @@ int create_msft_typelib(typelib_t *typelib)
+ GUID midl_info_guid = {0xde77ba65,0x517c,0x11d1,{0xa2,0xda,0x00,0x00,0xf8,0x77,0x3c,0xe9}};
+ char info_string[128];
+
+- pointer_size = (typelib_kind == SYS_WIN64) ? 8 : 4;
+-
+ msft = xmalloc(sizeof(*msft));
+ memset(msft, 0, sizeof(*msft));
+ msft->typelib = typelib;
+@@ -2662,7 +2690,7 @@ int create_msft_typelib(typelib_t *typelib)
+ ctl2_init_header(msft);
+ ctl2_init_segdir(msft);
+
+- msft->typelib_header.varflags |= typelib_kind;
++ msft->typelib_header.varflags |= (pointer_size == 8) ? SYS_WIN64 : SYS_WIN32;
+
+ /*
+ * The following two calls return an offset or -1 if out of memory. We
diff --git a/projects/mingw-w64/build b/projects/mingw-w64/build
index 4be660d..faa5997 100644
--- a/projects/mingw-w64/build
+++ b/projects/mingw-w64/build
@@ -52,6 +52,9 @@ cd /var/tmp/build/builddir/mingw-w64/mingw-w64-pthread
make -j[% c("buildconf/num_procs") %]
make install
+# patch mingw with widl fixes for #27503 ( https://trac.torproject.org/projects/tor/ticket/27503 )
+patch -p1 -d /var/tmp/build/[% project %]-[% c("version") %] < $rootdir/27503.patch
+
mkdir -p /var/tmp/build/builddir/mingw-w64/widl32
cd /var/tmp/build/builddir/mingw-w64/widl32
/var/tmp/build/[% project %]-[% c("version") %]/mingw-w64-tools/widl/configure \
diff --git a/projects/mingw-w64/config b/projects/mingw-w64/config
index d0268cb..a2f0701 100644
--- a/projects/mingw-w64/config
+++ b/projects/mingw-w64/config
@@ -35,3 +35,4 @@ input_files:
- name: binutils
project: binutils
- filename: libtool-sort.patch
+ - filename: 27503.patch
1
0

[tor-browser-build/master] Bug 29430: Use obfs4proxy's meek_lite with utls instead of meek.
by gk@torproject.org 28 Aug '19
by gk@torproject.org 28 Aug '19
28 Aug '19
commit f022ea694df867a6bd06c44cb50c78d674bea9ed
Author: Kathy Brade <brade(a)pearlcrescent.com>
Date: Fri Aug 23 09:50:26 2019 -0400
Bug 29430: Use obfs4proxy's meek_lite with utls instead of meek.
---
projects/goutls/config | 2 ++
projects/goutls/sessionid.patch | 25 +++++++++++++
projects/meek/build | 42 ----------------------
projects/meek/config | 17 ---------
projects/obfs4/build | 6 ++--
projects/obfs4/config | 2 +-
.../Docs/Licenses/PluggableTransports/LICENSE | 9 -----
.../Bundle-Data/PTConfigs/bridge_prefs.js | 2 +-
.../PTConfigs/linux/torrc-defaults-appendix | 5 +--
.../mac/TorBrowser.app.meek-http-helper/README | 13 -------
.../PTConfigs/mac/torrc-defaults-appendix | 5 +--
.../Bundle-Data/PTConfigs/meek-http-helper-user.js | 38 --------------------
.../PTConfigs/windows/torrc-defaults-appendix | 5 +--
projects/tor-browser/build | 23 ------------
projects/tor-browser/config | 3 --
15 files changed, 35 insertions(+), 162 deletions(-)
diff --git a/projects/goutls/config b/projects/goutls/config
index 0a1e416..d738305 100644
--- a/projects/goutls/config
+++ b/projects/goutls/config
@@ -27,3 +27,5 @@ input_files:
project: gocompress
- name: gobsaes
project: gobsaes
+ - filename: sessionid.patch
+ enable: '[% c("var/nightly") || c("var/alpha") %]'
diff --git a/projects/goutls/sessionid.patch b/projects/goutls/sessionid.patch
new file mode 100644
index 0000000..fd3636d
--- /dev/null
+++ b/projects/goutls/sessionid.patch
@@ -0,0 +1,25 @@
+From 4da67951864128358459681399dd208c49d5d001 Mon Sep 17 00:00:00 2001
+From: Rod Hynes <rod-hynes(a)users.noreply.github.com>
+Date: Mon, 12 Aug 2019 17:06:06 -0400
+Subject: [PATCH] Fix all-zeroes SessionID (#31)
+
+---
+ u_conn.go | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/u_conn.go b/u_conn.go
+index 9079460..2706373 100644
+--- a/u_conn.go
++++ b/u_conn.go
+@@ -121,7 +121,7 @@ func (uconn *UConn) SetSessionState(session *ClientSessionState) error {
+ }
+ }
+ var sessionID [32]byte
+- _, err := io.ReadFull(uconn.config.rand(), uconn.HandshakeState.Hello.SessionId)
++ _, err := io.ReadFull(uconn.config.rand(), sessionID[:])
+ if err != nil {
+ return err
+ }
+--
+2.22.0
+
diff --git a/projects/meek/build b/projects/meek/build
deleted file mode 100644
index 57185b3..0000000
--- a/projects/meek/build
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/bin/bash
-[% c("var/set_default_env") -%]
-[% pc('go', 'var/setup', { go_tarfile => c('input_files_by_name/go') }) %]
-distdir=/var/tmp/dist/[% project %]
-[% c("var/set_PTDIR_DOCSDIR") -%]
-mkdir -p $PTDIR $DOCSDIR
-
-tar -C /var/tmp/dist -xf [% c('input_files_by_name/goptlib') %]
-
-mkdir -p /var/tmp/build
-tar -C /var/tmp/build -xf [% project %]-[% c('version') %].tar.gz
-cd /var/tmp/build/[% project %]-[% c('version') %]
-
-cd meek-client
-go build -ldflags '-s'
-cp -a meek-client[% IF c("var/windows") %].exe[% END %] $PTDIR
-
-cd ../meek-client-torbrowser
-go build -ldflags '-s'
-cp -a meek-client-torbrowser[% IF c("var/windows") %].exe[% END %] $PTDIR
-
-
-[% IF c("var/windows") %]
- cd ../terminateprocess-buffer
- go build -ldflags '-s'
- cp -a terminateprocess-buffer.exe $PTDIR
-[% END %]
-
-cd ..
-cp -a README doc/*.1[% IF c("var/windows") %].txt[% END %] $DOCSDIR
-
-cd firefox
-[% c('zip', {
- zip_src => [ '.' ],
- zip_args => '$distdir/meek-http-helper(a)bamsoftware.com.xpi',
- }) %]
-
-cd $distdir
-[% c('tar', {
- tar_src => [ '.' ],
- tar_args => '-czf ' _ dest_dir _ '/' _ c('filename'),
- }) %]
diff --git a/projects/meek/config b/projects/meek/config
deleted file mode 100644
index 7d0fd2d..0000000
--- a/projects/meek/config
+++ /dev/null
@@ -1,17 +0,0 @@
-# vim: filetype=yaml sw=2
-version: 0.31
-git_url: https://git.torproject.org/pluggable-transports/meek.git
-git_hash: '[% c("version") %]'
-tag_gpg_id: 1
-gpg_keyring: meek.gpg
-filename: '[% project %]-[% c("version") %]-[% c("var/osname") %]-[% c("var/build_id") %].tar.gz'
-var:
- container:
- use_container: 1
-
-input_files:
- - project: container-image
- - name: go
- project: go
- - name: goptlib
- project: goptlib
diff --git a/projects/obfs4/build b/projects/obfs4/build
index dedd1ef..3f650c4 100644
--- a/projects/obfs4/build
+++ b/projects/obfs4/build
@@ -11,7 +11,7 @@ tar -C /var/tmp/dist -xf [% c('input_files_by_name/siphash') %]
tar -C /var/tmp/dist -xf [% c('input_files_by_name/uniuri') %]
tar -C /var/tmp/dist -xf [% c('input_files_by_name/goxcrypto') %]
tar -C /var/tmp/dist -xf [% c('input_files_by_name/goxnet') %]
-[% IF c("var/nightly") -%]
+[% IF c("var/nightly") || c("var/alpha") -%]
tar -C /var/tmp/dist -xf [% c('input_files_by_name/goutls') %]
tar -C /var/tmp/dist -xf [% c('input_files_by_name/goxtext') %]
[% END -%]
@@ -20,14 +20,14 @@ mkdir -p /var/tmp/build
tar -C /var/tmp/build -xf [% project %]-[% c('version') %].tar.gz
cd /var/tmp/build/[% project %]-[% c('version') %]
-[% IF c("var/nightly") -%]
+[% IF c("var/nightly") || c("var/alpha") -%]
# Remove go.mod and go.sum files until we can build using Go module
# versioning (see bug 28325).
rm -f go.mod go.sum
[% END -%]
# Commit 70d0e90c861be34ce3c5425ef1366a0b2ceb3026 changed the canonical obfs4
# upstream repo to gitlab.com/yawning/obfs4.git.
-[% IF c("var/nightly") %]
+[% IF c("var/nightly") || c("var/alpha") %]
mkdir -p "$GOPATH/src/gitlab.com/yawning"
ln -sf "$PWD" "$GOPATH/src/gitlab.com/yawning/obfs4.git"
[% ELSE %]
diff --git a/projects/obfs4/config b/projects/obfs4/config
index 32d3435..48afc2f 100644
--- a/projects/obfs4/config
+++ b/projects/obfs4/config
@@ -1,5 +1,5 @@
# vim: filetype=yaml sw=2
-version: 0.0.7
+version: 0.0.11
git_url: https://git.torproject.org/pluggable-transports/obfs4.git
git_hash: 'obfs4proxy-[% c("version") %]'
tag_gpg_id: 1
diff --git a/projects/tor-browser/Bundle-Data/Docs/Licenses/PluggableTransports/LICENSE b/projects/tor-browser/Bundle-Data/Docs/Licenses/PluggableTransports/LICENSE
index 8bf0661..25d930e 100644
--- a/projects/tor-browser/Bundle-Data/Docs/Licenses/PluggableTransports/LICENSE
+++ b/projects/tor-browser/Bundle-Data/Docs/Licenses/PluggableTransports/LICENSE
@@ -154,15 +154,6 @@ warranty. See LICENSE.CC0.
===============================================================================
-meek
-
-To the extent possible under law, the authors have dedicated all
-copyright and related and neighboring rights to this software to the
-public domain worldwide. This software is distributed without any
-warranty. See LICENSE.CC0.
-
-===============================================================================
-
obfs4
Copyright (c) 2014, Yawning Angel <yawning at torproject dot org>
diff --git a/projects/tor-browser/Bundle-Data/PTConfigs/bridge_prefs.js b/projects/tor-browser/Bundle-Data/PTConfigs/bridge_prefs.js
index 4eb4644..566de2e 100644
--- a/projects/tor-browser/Bundle-Data/PTConfigs/bridge_prefs.js
+++ b/projects/tor-browser/Bundle-Data/PTConfigs/bridge_prefs.js
@@ -14,6 +14,6 @@ pref("extensions.torlauncher.default_bridge.obfs4.9", "obfs4 85.31.186.26:443 91
pref("extensions.torlauncher.default_bridge.obfs4.10", "obfs4 216.252.162.21:46089 0DB8799466902192B6C7576D58D4F7F714EC87C1 cert=XPUwcQPxEXExHfJYX58gZXN7mYpos7VNAHbkgERNFg+FCVNzuYo1Wp+uMscl3aR9hO2DRQ iat-mode=0");
pref("extensions.torlauncher.default_bridge.obfs4.11", "obfs4 144.217.20.138:80 FB70B257C162BF1038CA669D568D76F5B7F0BABB cert=vYIV5MgrghGQvZPIi1tJwnzorMgqgmlKaB77Y3Z9Q/v94wZBOAXkW+fdx4aSxLVnKO+xNw iat-mode=0");
-pref("extensions.torlauncher.default_bridge.meek-azure.1", "meek 0.0.2.0:2 97700DFE9F483596DDA6264C4D7DF7641E1E39CE url=https://meek.azureedge.net/ front=ajax.aspnetcdn.com");
+pref("extensions.torlauncher.default_bridge.meek-azure.1", "meek_lite 0.0.2.0:2 97700DFE9F483596DDA6264C4D7DF7641E1E39CE url=https://meek.azureedge.net/ front=ajax.aspnetcdn.com");
pref("extensions.torlauncher.default_bridge.snowflake.1", "snowflake 0.0.3.0:1 2B280B23E1107BB62ABFC40DDCC8824814F80A72");
diff --git a/projects/tor-browser/Bundle-Data/PTConfigs/linux/torrc-defaults-appendix b/projects/tor-browser/Bundle-Data/PTConfigs/linux/torrc-defaults-appendix
index 75d5c5e..ac89698 100644
--- a/projects/tor-browser/Bundle-Data/PTConfigs/linux/torrc-defaults-appendix
+++ b/projects/tor-browser/Bundle-Data/PTConfigs/linux/torrc-defaults-appendix
@@ -1,8 +1,5 @@
## obfs4proxy configuration
-ClientTransportPlugin obfs2,obfs3,obfs4,scramblesuit exec ./TorBrowser/Tor/PluggableTransports/obfs4proxy
-
-## meek configuration
-ClientTransportPlugin meek exec ./TorBrowser/Tor/PluggableTransports/meek-client-torbrowser -- ./TorBrowser/Tor/PluggableTransports/meek-client
+ClientTransportPlugin meek_lite,obfs2,obfs3,obfs4,scramblesuit exec ./TorBrowser/Tor/PluggableTransports/obfs4proxy
## snowflake configuration
ClientTransportPlugin snowflake exec ./TorBrowser/Tor/PluggableTransports/snowflake-client -url https://snowflake-broker.azureedge.net/ -front ajax.aspnetcdn.com -ice stun:stun.l.google.com:19302
diff --git a/projects/tor-browser/Bundle-Data/PTConfigs/mac/TorBrowser.app.meek-http-helper/README b/projects/tor-browser/Bundle-Data/PTConfigs/mac/TorBrowser.app.meek-http-helper/README
deleted file mode 100644
index f158eec..0000000
--- a/projects/tor-browser/Bundle-Data/PTConfigs/mac/TorBrowser.app.meek-http-helper/README
+++ /dev/null
@@ -1,13 +0,0 @@
-This directory contains a special headless configuration of the Tor
-Browser app, intended for use by meek-client-torbrowser and the
-meek-http-helper extension. It should not be run directly.
-
-All files in the Contents directory, other than Info.plist, are simply
-symlinked to their counterparts in ../../../../../Contents. Info.plist
-contains an additional configuration directive that prevents the
-headless browser from opening a useless second dock icon:
- <key>LSBackgroundOnly</key><true/>
-
-For background on this matter, see the ticket:
- meek-http-helper opens up a second dock icon
- https://trac.torproject.org/projects/tor/ticket/11429
diff --git a/projects/tor-browser/Bundle-Data/PTConfigs/mac/torrc-defaults-appendix b/projects/tor-browser/Bundle-Data/PTConfigs/mac/torrc-defaults-appendix
index cf7cc2a..154bda4 100644
--- a/projects/tor-browser/Bundle-Data/PTConfigs/mac/torrc-defaults-appendix
+++ b/projects/tor-browser/Bundle-Data/PTConfigs/mac/torrc-defaults-appendix
@@ -1,8 +1,5 @@
## obfs4proxy configuration
-ClientTransportPlugin obfs2,obfs3,obfs4,scramblesuit exec PluggableTransports/obfs4proxy
-
-## meek configuration
-ClientTransportPlugin meek exec PluggableTransports/meek-client-torbrowser -- PluggableTransports/meek-client
+ClientTransportPlugin meek_lite,obfs2,obfs3,obfs4,scramblesuit exec PluggableTransports/obfs4proxy
## snowflake configuration
ClientTransportPlugin snowflake exec PluggableTransports/snowflake-client -url https://snowflake-broker.azureedge.net/ -front ajax.aspnetcdn.com -ice stun:stun.l.google.com:19302
diff --git a/projects/tor-browser/Bundle-Data/PTConfigs/meek-http-helper-user.js b/projects/tor-browser/Bundle-Data/PTConfigs/meek-http-helper-user.js
deleted file mode 100644
index c62b066..0000000
--- a/projects/tor-browser/Bundle-Data/PTConfigs/meek-http-helper-user.js
+++ /dev/null
@@ -1,38 +0,0 @@
-// http://kb.mozillazine.org/User.js_file
-
-// The meek-http-helper extension uses dump to write its listening port number
-// to stdout.
-user_pref("browser.dom.window.dump.enabled", true);
-
-// Enable TLS session tickets (disabled by default in Tor Browser). Otherwise
-// there is a missing TLS extension.
-// https://trac.torproject.org/projects/tor/ticket/13442#comment:1
-user_pref("security.ssl.disable_session_identifiers", false);
-
-// Disable safe mode. In case of a crash, we don't want to prompt for a
-// safe-mode browser that has extensions disabled.
-// https://support.mozilla.org/en-US/questions/951221#answer-410562
-user_pref("toolkit.startup.max_resumed_crashes", -1);
-
-// Don't raise software update windows in this browser instance.
-// https://trac.torproject.org/projects/tor/ticket/14203
-user_pref("app.update.enabled", false);
-
-// Set a failsafe blackhole proxy of 127.0.0.1:9, to prevent network interaction
-// in case the user manages to open this profile with a normal browser UI (i.e.,
-// not headless with the meek-http-helper extension running). Port 9 is
-// "discard", so it should work as a blackhole whether the port is open or
-// closed. network.proxy.type=1 means "Manual proxy configuration".
-// http://kb.mozillazine.org/Network.proxy.type
-user_pref("network.proxy.type", 1);
-user_pref("network.proxy.socks", "127.0.0.1");
-user_pref("network.proxy.socks_port", 9);
-// Make sure DNS is also blackholed. network.proxy.socks_remote_dns is
-// overridden by meek-http-helper at startup.
-user_pref("network.proxy.socks_remote_dns", true);
-
-user_pref("extensions.enabledAddons", "meek-http-helper@bamsoftware.com:1.0");
-
-// Ensure that distribution extensions (e.g., Tor Launcher) are not copied
-// into the meek-http-helper profile.
-user_pref("extensions.installDistroAddons", false);
diff --git a/projects/tor-browser/Bundle-Data/PTConfigs/windows/torrc-defaults-appendix b/projects/tor-browser/Bundle-Data/PTConfigs/windows/torrc-defaults-appendix
index 7192231..18b8460 100644
--- a/projects/tor-browser/Bundle-Data/PTConfigs/windows/torrc-defaults-appendix
+++ b/projects/tor-browser/Bundle-Data/PTConfigs/windows/torrc-defaults-appendix
@@ -1,5 +1,2 @@
## obfs4proxy configuration
-ClientTransportPlugin obfs2,obfs3,obfs4,scramblesuit exec TorBrowser\Tor\PluggableTransports\obfs4proxy.exe
-
-## meek configuration
-ClientTransportPlugin meek exec TorBrowser\Tor\PluggableTransports\terminateprocess-buffer.exe TorBrowser\Tor\PluggableTransports\meek-client-torbrowser.exe -- TorBrowser\Tor\PluggableTransports\meek-client.exe
+ClientTransportPlugin meek_lite,obfs2,obfs3,obfs4,scramblesuit exec TorBrowser\Tor\PluggableTransports\obfs4proxy.exe
diff --git a/projects/tor-browser/build b/projects/tor-browser/build
index f728612..aeb77de 100644
--- a/projects/tor-browser/build
+++ b/projects/tor-browser/build
@@ -26,7 +26,6 @@ touch "$GENERATEDPREFSPATH"
EXTSPATH=Contents/Resources/distribution/extensions
TORBINPATH=Contents/MacOS/Tor
TORCONFIGPATH=Contents/Resources/TorBrowser/Tor
- MEEKPROFILEPATH=Contents/Resources/TorBrowser/Tor/PluggableTransports/template-profile.meek-http-helper
tar -C /var/tmp/dist -xf $rootdir/[% c('input_files_by_name/libdmg') %]
export PATH=/var/tmp/dist/libdmg-hfsplus:$PATH
@@ -36,14 +35,11 @@ touch "$GENERATEDPREFSPATH"
DOCSPATH=TorBrowser/Docs
EXTSPATH=TorBrowser/Data/Browser/profile.default/extensions
TORCONFIGPATH=TorBrowser/Data/Tor
- MEEKPROFILEPATH=TorBrowser/Data/Browser/profile.meek-http-helper
- MOATPROFILEPATH=TorBrowser/Data/Browser/profile.moat-http-helper
mkdir -p "$TBDIR/TorBrowser/Data/Browser/Caches"
[% END %]
mkdir -p "$TBDIR/$EXTSPATH"
-mkdir -p "$TBDIR/$MEEKPROFILEPATH/extensions"
# Extract the MAR tools.
unzip -d $rootdir $rootdir/[% c('input_files_by_name/firefox') %]/mar-tools-*.zip
@@ -53,8 +49,6 @@ mv [% c('input_files_by_name/https-everywhere') %] "$TBDIR/$EXTSPATH/https-every
mv [% c('input_files_by_name/noscript') %] "$TBDIR/$EXTSPATH/{73a6fe31-595d-460b-a920-fcc0f8843232}.xpi"
tar -C "$TBDIR" -xf [% c('input_files_by_name/obfs4') %]
-tar -C "$TBDIR" -xf [% c('input_files_by_name/meek') %]
-mv "$TBDIR/meek-http-helper(a)bamsoftware.com.xpi" "$TBDIR/$MEEKPROFILEPATH/extensions/"
[% IF c("var/snowflake") %]
tar -C "$TBDIR" -xf [% c('input_files_by_name/snowflake') -%]
[% END -%]
@@ -127,23 +121,6 @@ cat Bundle-Data/PTConfigs/[% bundledata_osname %]/torrc-defaults-appendix >> "$T
grep -v 'default_bridge\.snowflake' Bundle-Data/PTConfigs/bridge_prefs.js \
>> "$GENERATEDPREFSPATH"
[% END -%]
-cat Bundle-Data/PTConfigs/meek-http-helper-user.js >> "$TBDIR/$MEEKPROFILEPATH/user.js"
-
-[% IF c("var/osx") %]
- pushd "$TBDIR"
- # Create the meek-template-sha256sum.txt file by generating a list
- # of hashes (one for each file within the meek-http-helper profile) and
- # and then generating one final hash from the contents of the list.
- sha256sum `find $MEEKPROFILEPATH -type f | sort` | sha256sum | sed -e 's/ *-$//' > $MEEKPROFILEPATH/meek-template-sha256sum.txt
- popd
-[% END %]
-
-# For platforms for which we need to ship a Moat helper profile in addition
-# to a meek one, create it by duplicating the meek one that we just finished
-# creating.
-if [ ! -z "$MOATPROFILEPATH" ]; then
- cp -pR $TBDIR/$MEEKPROFILEPATH $TBDIR/$MOATPROFILEPATH
-fi
[% IF ! c("var/multi_lingual") %]
echo 'pref("extensions.torlauncher.prompt_for_locale", false);' >> "$GENERATEDPREFSPATH"
diff --git a/projects/tor-browser/config b/projects/tor-browser/config
index cf8fcb3..e207626 100644
--- a/projects/tor-browser/config
+++ b/projects/tor-browser/config
@@ -65,9 +65,6 @@ input_files:
- project: fonts
name: fonts
enable: '[% ! c("var/android") %]'
- - project: meek
- name: meek
- enable: '[% ! c("var/android") %]'
- project: obfs4
name: obfs4
enable: '[% ! c("var/android") %]'
1
0

[tor-browser-build/master] Merge remote-tracking branch 'pc/bug29430-02'
by gk@torproject.org 28 Aug '19
by gk@torproject.org 28 Aug '19
28 Aug '19
commit 0a7bef243d182fb3df3d9f6ebfd74ce632ad95d1
Merge: 89e6eed f022ea6
Author: Georg Koppen <gk(a)torproject.org>
Date: Wed Aug 28 07:10:41 2019 +0000
Merge remote-tracking branch 'pc/bug29430-02'
projects/goutls/config | 2 ++
projects/goutls/sessionid.patch | 25 +++++++++++++
projects/meek/build | 42 ----------------------
projects/meek/config | 17 ---------
projects/obfs4/build | 6 ++--
projects/obfs4/config | 2 +-
.../Docs/Licenses/PluggableTransports/LICENSE | 9 -----
.../Bundle-Data/PTConfigs/bridge_prefs.js | 2 +-
.../PTConfigs/linux/torrc-defaults-appendix | 5 +--
.../mac/TorBrowser.app.meek-http-helper/README | 13 -------
.../PTConfigs/mac/torrc-defaults-appendix | 5 +--
.../Bundle-Data/PTConfigs/meek-http-helper-user.js | 38 --------------------
.../PTConfigs/windows/torrc-defaults-appendix | 5 +--
projects/tor-browser/build | 23 ------------
projects/tor-browser/config | 3 --
15 files changed, 35 insertions(+), 162 deletions(-)
diff --cc projects/tor-browser/Bundle-Data/PTConfigs/bridge_prefs.js
index 3405a53,566de2e..de9f98b
--- a/projects/tor-browser/Bundle-Data/PTConfigs/bridge_prefs.js
+++ b/projects/tor-browser/Bundle-Data/PTConfigs/bridge_prefs.js
@@@ -3,16 -3,17 +3,16 @@@ pref("extensions.torlauncher.default_br
// Default bridges.
pref("extensions.torlauncher.default_bridge.obfs4.1", "obfs4 192.95.36.142:443 CDF2E852BF539B82BD10E27E9115A31734E378C2 cert=qUVQ0srL1JI/vO6V6m/24anYXiJD3QP2HgzUKQtQ7GRqqUvs7P+tG43RtAqdhLOALP7DJQ iat-mode=1");
-pref("extensions.torlauncher.default_bridge.obfs4.2", "obfs4 85.17.30.79:443 FC259A04A328A07FED1413E9FC6526530D9FD87A cert=RutxZlu8BtyP+y0NX7bAVD41+J/qXNhHUrKjFkRSdiBAhIHIQLhKQ2HxESAKZprn/lR3KA iat-mode=0");
-pref("extensions.torlauncher.default_bridge.obfs4.3", "obfs4 38.229.1.78:80 C8CBDB2464FC9804A69531437BCF2BE31FDD2EE4 cert=Hmyfd2ev46gGY7NoVxA9ngrPF2zCZtzskRTzoWXbxNkzeVnGFPWmrTtILRyqCTjHR+s9dg iat-mode=1");
-/**/pref/**/(/**/"extensions.torlauncher.default_bridge.obfs4.4"/**/, /**/"obfs4 38.229.33.83:80 0BAC39417268B96B9F514E7F63FA6FBA1A788955 cert=VwEFpk9F/UN9JED7XpG1XOjm/O8ZCXK80oPecgWnNDZDv5pdkhq1OpbAH0wNqOT6H6BmRQ iat-mode=1");
-pref("extensions.torlauncher.default_bridge.obfs4.5", "obfs4 [2001:470:b381:bfff:216:3eff:fe23:d6c3]:443 CDF2E852BF539B82BD10E27E9115A31734E378C2 cert=qUVQ0srL1JI/vO6V6m/24anYXiJD3QP2HgzUKQtQ7GRqqUvs7P+tG43RtAqdhLOALP7DJQ iat-mode=1");
-pref("extensions.torlauncher.default_bridge.obfs4.6", "obfs4 37.218.240.34:40035 88CD36D45A35271963EF82E511C8827A24730913 cert=eGXYfWODcgqIdPJ+rRupg4GGvVGfh25FWaIXZkit206OSngsp7GAIiGIXOJJROMxEqFKJg iat-mode=1");
-pref("extensions.torlauncher.default_bridge.obfs4.7", "obfs4 37.218.245.14:38224 D9A82D2F9C2F65A18407B1D2B764F130847F8B5D cert=bjRaMrr1BRiAW8IE9U5z27fQaYgOhX1UCmOpg2pFpoMvo6ZgQMzLsaTzzQNTlm7hNcb+Sg iat-mode=0");
-pref("extensions.torlauncher.default_bridge.obfs4.8", "obfs4 85.31.186.98:443 011F2599C0E9B27EE74B353155E244813763C3E5 cert=ayq0XzCwhpdysn5o0EyDUbmSOx3X/oTEbzDMvczHOdBJKlvIdHHLJGkZARtT4dcBFArPPg iat-mode=0");
-pref("extensions.torlauncher.default_bridge.obfs4.9", "obfs4 85.31.186.26:443 91A6354697E6B02A386312F68D82CF86824D3606 cert=PBwr+S8JTVZo6MPdHnkTwXJPILWADLqfMGoVvhZClMq/Urndyd42BwX9YFJHZnBB3H0XCw iat-mode=0");
-pref("extensions.torlauncher.default_bridge.obfs4.10", "obfs4 216.252.162.21:46089 0DB8799466902192B6C7576D58D4F7F714EC87C1 cert=XPUwcQPxEXExHfJYX58gZXN7mYpos7VNAHbkgERNFg+FCVNzuYo1Wp+uMscl3aR9hO2DRQ iat-mode=0");
-pref("extensions.torlauncher.default_bridge.obfs4.11", "obfs4 144.217.20.138:80 FB70B257C162BF1038CA669D568D76F5B7F0BABB cert=vYIV5MgrghGQvZPIi1tJwnzorMgqgmlKaB77Y3Z9Q/v94wZBOAXkW+fdx4aSxLVnKO+xNw iat-mode=0");
+pref("extensions.torlauncher.default_bridge.obfs4.2", "obfs4 38.229.1.78:80 C8CBDB2464FC9804A69531437BCF2BE31FDD2EE4 cert=Hmyfd2ev46gGY7NoVxA9ngrPF2zCZtzskRTzoWXbxNkzeVnGFPWmrTtILRyqCTjHR+s9dg iat-mode=1");
+/**/pref/**/(/**/"extensions.torlauncher.default_bridge.obfs4.3"/**/, /**/"obfs4 38.229.33.83:80 0BAC39417268B96B9F514E7F63FA6FBA1A788955 cert=VwEFpk9F/UN9JED7XpG1XOjm/O8ZCXK80oPecgWnNDZDv5pdkhq1OpbAH0wNqOT6H6BmRQ iat-mode=1");
+pref("extensions.torlauncher.default_bridge.obfs4.4", "obfs4 [2001:470:b381:bfff:216:3eff:fe23:d6c3]:443 CDF2E852BF539B82BD10E27E9115A31734E378C2 cert=qUVQ0srL1JI/vO6V6m/24anYXiJD3QP2HgzUKQtQ7GRqqUvs7P+tG43RtAqdhLOALP7DJQ iat-mode=1");
+pref("extensions.torlauncher.default_bridge.obfs4.5", "obfs4 37.218.240.34:40035 88CD36D45A35271963EF82E511C8827A24730913 cert=eGXYfWODcgqIdPJ+rRupg4GGvVGfh25FWaIXZkit206OSngsp7GAIiGIXOJJROMxEqFKJg iat-mode=1");
+pref("extensions.torlauncher.default_bridge.obfs4.6", "obfs4 37.218.245.14:38224 D9A82D2F9C2F65A18407B1D2B764F130847F8B5D cert=bjRaMrr1BRiAW8IE9U5z27fQaYgOhX1UCmOpg2pFpoMvo6ZgQMzLsaTzzQNTlm7hNcb+Sg iat-mode=0");
+pref("extensions.torlauncher.default_bridge.obfs4.7", "obfs4 85.31.186.98:443 011F2599C0E9B27EE74B353155E244813763C3E5 cert=ayq0XzCwhpdysn5o0EyDUbmSOx3X/oTEbzDMvczHOdBJKlvIdHHLJGkZARtT4dcBFArPPg iat-mode=0");
+pref("extensions.torlauncher.default_bridge.obfs4.8", "obfs4 85.31.186.26:443 91A6354697E6B02A386312F68D82CF86824D3606 cert=PBwr+S8JTVZo6MPdHnkTwXJPILWADLqfMGoVvhZClMq/Urndyd42BwX9YFJHZnBB3H0XCw iat-mode=0");
+pref("extensions.torlauncher.default_bridge.obfs4.9", "obfs4 216.252.162.21:46089 0DB8799466902192B6C7576D58D4F7F714EC87C1 cert=XPUwcQPxEXExHfJYX58gZXN7mYpos7VNAHbkgERNFg+FCVNzuYo1Wp+uMscl3aR9hO2DRQ iat-mode=0");
+pref("extensions.torlauncher.default_bridge.obfs4.10", "obfs4 144.217.20.138:80 FB70B257C162BF1038CA669D568D76F5B7F0BABB cert=vYIV5MgrghGQvZPIi1tJwnzorMgqgmlKaB77Y3Z9Q/v94wZBOAXkW+fdx4aSxLVnKO+xNw iat-mode=0");
- pref("extensions.torlauncher.default_bridge.meek-azure.1", "meek 0.0.2.0:2 97700DFE9F483596DDA6264C4D7DF7641E1E39CE url=https://meek.azureedge.net/ front=ajax.aspnetcdn.com");
+ pref("extensions.torlauncher.default_bridge.meek-azure.1", "meek_lite 0.0.2.0:2 97700DFE9F483596DDA6264C4D7DF7641E1E39CE url=https://meek.azureedge.net/ front=ajax.aspnetcdn.com");
pref("extensions.torlauncher.default_bridge.snowflake.1", "snowflake 0.0.3.0:1 2B280B23E1107BB62ABFC40DDCC8824814F80A72");
1
0

28 Aug '19
commit fce9dc2c0564dfc6bcd6d77f6ae17bac3d02f90d
Author: Georg Koppen <gk(a)torproject.org>
Date: Wed Aug 28 07:04:55 2019 +0000
Pick up new tor stable version
---
projects/tor/config | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/projects/tor/config b/projects/tor/config
index 3da5057..63a2da6 100644
--- a/projects/tor/config
+++ b/projects/tor/config
@@ -1,6 +1,6 @@
# vim: filetype=yaml sw=2
filename: '[% project %]-[% c("version") %]-[% c("var/osname") %]-[% c("var/build_id") %]'
-version: 0.4.0.5
+version: 0.4.1.5
git_hash: 'tor-[% c("version") %]'
git_url: https://git.torproject.org/tor.git
git_submodule: 1
1
0

28 Aug '19
commit 605decfd4ddc81eb37da17172f48f92fd7f7e451
Merge: f4530dc7 84469348
Author: Georg Koppen <gk(a)torproject.org>
Date: Wed Aug 28 06:40:19 2019 +0000
Merge remote-tracking branch 'pearl/bug29430-01'
modules/tor-control-port.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
1
0

[torbutton/master] Bug 29430: Use obfs4proxy's meek_lite with utls instead of meek
by gk@torproject.org 28 Aug '19
by gk@torproject.org 28 Aug '19
28 Aug '19
commit 844693481ce92bb34536113a318211cbaedde4bd
Author: Kathy Brade <brade(a)pearlcrescent.com>
Date: Tue Aug 27 16:28:16 2019 -0400
Bug 29430: Use obfs4proxy's meek_lite with utls instead of meek
Add support for meek_lite bridges to bridgeParser. This fixes a
problem where the circuit display broke when a meek_lite bridge
was used.
---
modules/tor-control-port.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/tor-control-port.js b/modules/tor-control-port.js
index afb3d606..6e310b52 100644
--- a/modules/tor-control-port.js
+++ b/modules/tor-control-port.js
@@ -472,7 +472,7 @@ info.bridgeParser = function(bridgeLine) {
// Several bridge types have a similar format:
} else {
result.type = tokens[0];
- if (["flashproxy", "fte", "meek", "obfs3", "obfs4", "scramblesuit",
+ if (["flashproxy", "fte", "meek", "meek_lite", "obfs3", "obfs4", "scramblesuit",
"snowflake"].indexOf(result.type) >= 0) {
[result.address, result.ID] = tokens.slice(1);
}
1
0

28 Aug '19
commit f4530dc77da1a2c204674be33797d399c2bf597c
Merge: 133eb64a 2e3a4b9d
Author: Georg Koppen <gk(a)torproject.org>
Date: Tue Aug 27 12:19:21 2019 +0000
Merge remote-tracking branch 'acat/31322'
chrome/content/aboutTor/aboutTor.xhtml | 1 +
1 file changed, 1 insertion(+)
1
0

[torbutton/master] Bug 31322: Fix about:tor assertion failure debug builds
by gk@torproject.org 28 Aug '19
by gk@torproject.org 28 Aug '19
28 Aug '19
commit 2e3a4b9d7b09dba2dede3aa5e89854b1029b73a5
Author: Alex Catarineu <acat(a)torproject.org>
Date: Tue Aug 6 15:47:59 2019 +0200
Bug 31322: Fix about:tor assertion failure debug builds
Adding a CSP policy to about:tor to address a failed assertion.
---
chrome/content/aboutTor/aboutTor.xhtml | 1 +
1 file changed, 1 insertion(+)
diff --git a/chrome/content/aboutTor/aboutTor.xhtml b/chrome/content/aboutTor/aboutTor.xhtml
index 0789f851..2b75debc 100644
--- a/chrome/content/aboutTor/aboutTor.xhtml
+++ b/chrome/content/aboutTor/aboutTor.xhtml
@@ -20,6 +20,7 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
+ <meta http-equiv="Content-Security-Policy" content="default-src chrome: resource:; script-src chrome: 'unsafe-inline';" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>&aboutTor.title;</title>
<link rel="stylesheet" type="text/css" media="all"
1
0

[tor-browser-build/master] Bug 31458: Revert patch for #27503 and update mingw-w64
by gk@torproject.org 28 Aug '19
by gk@torproject.org 28 Aug '19
28 Aug '19
commit 89e6eed8ce459dfeae17ce886f35df209760965c
Author: Richard Pospesel <richard(a)torproject.org>
Date: Thu Aug 22 15:40:07 2019 -0700
Bug 31458: Revert patch for #27503 and update mingw-w64
The WIDL fixes landed on mingw-w64 master and we can avoid shipping them
separately now.
---
projects/mingw-w64/27503.patch | 10582 ---------------------------------------
projects/mingw-w64/build | 3 -
projects/mingw-w64/config | 3 +-
3 files changed, 1 insertion(+), 10587 deletions(-)
diff --git a/projects/mingw-w64/27503.patch b/projects/mingw-w64/27503.patch
deleted file mode 100644
index ca542d0..0000000
--- a/projects/mingw-w64/27503.patch
+++ /dev/null
@@ -1,10582 +0,0 @@
-diff --git a/mingw-w64-tools/widl/src/client.c b/mingw-w64-tools/widl/src/client.c
-index a3b2bbb6..d27c6cad 100644
---- a/mingw-w64-tools/widl/src/client.c
-+++ b/mingw-w64-tools/widl/src/client.c
-@@ -20,7 +20,7 @@
-
- #include "config.h"
- #include "wine/port.h"
--
-+
- #include <stdio.h>
- #include <stdlib.h>
- #ifdef HAVE_UNISTD_H
-@@ -34,7 +34,7 @@
- #include "parser.h"
- #include "header.h"
-
--#include "widltypes.h"
-+#include "typetree.h"
- #include "typegen.h"
- #include "expr.h"
-
-@@ -52,12 +52,13 @@ static void print_client( const char *format, ... )
-
- static void write_client_func_decl( const type_t *iface, const var_t *func )
- {
-- const char *callconv = get_attrp(func->type->attrs, ATTR_CALLCONV);
-- const var_list_t *args = type_get_function_args(func->type);
-- type_t *rettype = type_function_get_rettype(func->type);
-+ const char *callconv = get_attrp(func->declspec.type->attrs, ATTR_CALLCONV);
-+ const var_list_t *args = type_function_get_args(func->declspec.type);
-+ const decl_spec_t *retdeclspec = type_function_get_retdeclspec(func->declspec.type);
-
- if (!callconv) callconv = "__cdecl";
-- write_type_decl_left(client, rettype);
-+ write_declspec_decl_left(client, retdeclspec);
-+ if (func->declspec.funcspecifier == FUNCTION_SPECIFIER_INLINE) fprintf(client, " inline");
- fprintf(client, " %s ", callconv);
- fprintf(client, "%s%s(\n", prefix_client, get_name(func));
- indent++;
-@@ -74,9 +75,9 @@ static void write_function_stub( const type_t *iface, const var_t *func,
- {
- unsigned char explicit_fc, implicit_fc;
- int has_full_pointer = is_full_pointer_function(func);
-- var_t *retval = type_function_get_retval(func->type);
-+ var_t *retval = type_function_get_retval(func->declspec.type);
- const var_t *handle_var = get_func_handle_var( iface, func, &explicit_fc, &implicit_fc );
-- int has_ret = !is_void(retval->type);
-+ int has_ret = !is_void(retval->declspec.type);
-
- if (is_interpreted_func( iface, func ))
- {
-@@ -97,7 +98,7 @@ static void write_function_stub( const type_t *iface, const var_t *func,
- print_client("RPC_BINDING_HANDLE _Handle;\n");
- }
-
-- if (has_ret && decl_indirect(retval->type))
-+ if (has_ret && decl_indirect(retval->declspec.type))
- {
- print_client("void *_p_%s;\n", retval->name);
- }
-@@ -136,7 +137,7 @@ static void write_function_stub( const type_t *iface, const var_t *func,
- if (has_ret)
- {
- print_client("%s", "");
-- write_type_decl(client, retval->type, retval->name);
-+ write_declspec_decl(client, &retval->declspec, retval->name);
- fprintf(client, ";\n");
- }
- print_client("RPC_MESSAGE _RpcMessage;\n");
-@@ -147,7 +148,7 @@ static void write_function_stub( const type_t *iface, const var_t *func,
- if (explicit_fc == FC_BIND_GENERIC)
- print_client("__frame->%s = %s;\n", handle_var->name, handle_var->name );
- }
-- if (has_ret && decl_indirect(retval->type))
-+ if (has_ret && decl_indirect(retval->declspec.type))
- {
- print_client("__frame->_p_%s = &%s;\n", retval->name, retval->name);
- }
-@@ -194,7 +195,7 @@ static void write_function_stub( const type_t *iface, const var_t *func,
- /* if the context_handle attribute appears in the chain of types
- * without pointers being followed, then the context handle must
- * be direct, otherwise it is a pointer */
-- int is_ch_ptr = !is_aliaschain_attr(handle_var->type, ATTR_CONTEXTHANDLE);
-+ int is_ch_ptr = !is_aliaschain_attr(handle_var->declspec.type, ATTR_CONTEXTHANDLE);
- print_client("if (%s%s != 0)\n", is_ch_ptr ? "*" : "", handle_var->name);
- indent++;
- print_client("__frame->_Handle = NDRCContextBinding(%s%s);\n",
-@@ -257,9 +258,9 @@ static void write_function_stub( const type_t *iface, const var_t *func,
- /* unmarshal return value */
- if (has_ret)
- {
-- if (decl_indirect(retval->type))
-+ if (decl_indirect(retval->declspec.type))
- print_client("MIDL_memset(&%s, 0, sizeof(%s));\n", retval->name, retval->name);
-- else if (is_ptr(retval->type) || is_array(retval->type))
-+ else if (is_ptr(retval->declspec.type) || is_array(retval->declspec.type))
- print_client("%s = 0;\n", retval->name);
- write_remoting_arguments(client, indent, func, "", PASS_RETURN, PHASE_UNMARSHAL);
- }
-@@ -291,7 +292,7 @@ static void write_serialize_function(FILE *file, const type_t *type, const type_
- const char *func_name, const char *ret_type)
- {
- enum stub_mode mode = get_stub_mode();
-- static int emited_pickling_info;
-+ static int emitted_pickling_info;
-
- if (iface && !type->typestring_offset)
- {
-@@ -301,7 +302,7 @@ static void write_serialize_function(FILE *file, const type_t *type, const type_
- return;
- }
-
-- if (!emited_pickling_info && iface && mode != MODE_Os)
-+ if (!emitted_pickling_info && iface && mode != MODE_Os)
- {
- fprintf(file, "static const MIDL_TYPE_PICKLING_INFO __MIDL_TypePicklingInfo =\n");
- fprintf(file, "{\n");
-@@ -312,7 +313,7 @@ static void write_serialize_function(FILE *file, const type_t *type, const type_
- fprintf(file, " 0\n");
- fprintf(file, "};\n");
- fprintf(file, "\n");
-- emited_pickling_info = 1;
-+ emitted_pickling_info = 1;
- }
-
- /* FIXME: Assuming explicit handle */
-@@ -365,8 +366,8 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
- case STMT_DECLARATION:
- {
- const var_t *func = stmt->u.var;
-- if (stmt->u.var->stgclass != STG_NONE
-- || type_get_type_detect_alias(stmt->u.var->type) != TYPE_FUNCTION)
-+ if (stmt->u.var->declspec.stgclass != STG_NONE
-+ || type_get_type_detect_alias(stmt->u.var->declspec.type) != TYPE_FUNCTION)
- continue;
- write_function_stub( iface, func, method_count++, *proc_offset );
- *proc_offset += get_size_procformatstring_func( iface, func );
-@@ -425,7 +426,7 @@ static void write_stubdescriptor(type_t *iface, int expr_eval_routines)
- print_client("1, /* -error bounds_check flag */\n");
- print_client("0x%x, /* Ndr library version */\n", get_stub_mode() == MODE_Oif ? 0x50002 : 0x10001);
- print_client("0,\n");
-- print_client("0x50100a4, /* MIDL Version 5.1.164 */\n");
-+ print_client("0x50200ca, /* MIDL Version 5.2.202 */\n");
- print_client("0,\n");
- print_client("%s,\n", list_empty(&user_type_list) ? "0" : "UserMarshalRoutines");
- print_client("0, /* notify & notify_flag routine table */\n");
-@@ -488,7 +489,7 @@ static void write_implicithandledecl(type_t *iface)
-
- if (implicit_handle)
- {
-- write_type_decl( client, implicit_handle->type, implicit_handle->name );
-+ write_declspec_decl( client, &implicit_handle->declspec, implicit_handle->name );
- fprintf(client, ";\n\n");
- }
- }
-@@ -532,8 +533,8 @@ static void write_client_ifaces(const statement_list_t *stmts, int expr_eval_rou
-
- LIST_FOR_EACH_ENTRY(stmt2, type_iface_get_stmts(iface), const statement_t, entry)
- {
-- if (stmt2->type == STMT_DECLARATION && stmt2->u.var->stgclass == STG_NONE &&
-- type_get_type_detect_alias(stmt2->u.var->type) == TYPE_FUNCTION)
-+ if (stmt2->type == STMT_DECLARATION && stmt2->u.var->declspec.stgclass == STG_NONE &&
-+ type_get_type_detect_alias(stmt2->u.var->declspec.type) == TYPE_FUNCTION)
- {
- needs_stub = 1;
- break;
-@@ -627,26 +628,6 @@ void write_client(const statement_list_t *stmts)
- if (!client)
- return;
-
-- if (do_win32 && do_win64)
-- {
-- fprintf(client, "#ifndef _WIN64\n\n");
-- pointer_size = 4;
-- write_client_routines( stmts );
-- fprintf(client, "\n#else /* _WIN64 */\n\n");
-- pointer_size = 8;
-- write_client_routines( stmts );
-- fprintf(client, "\n#endif /* _WIN64 */\n");
-- }
-- else if (do_win32)
-- {
-- pointer_size = 4;
-- write_client_routines( stmts );
-- }
-- else if (do_win64)
-- {
-- pointer_size = 8;
-- write_client_routines( stmts );
-- }
--
-+ write_client_routines( stmts );
- fclose(client);
- }
-diff --git a/mingw-w64-tools/widl/src/expr.c b/mingw-w64-tools/widl/src/expr.c
-index 2ed4aff6..2f075816 100644
---- a/mingw-w64-tools/widl/src/expr.c
-+++ b/mingw-w64-tools/widl/src/expr.c
-@@ -194,10 +194,10 @@ expr_t *make_exprt(enum expr_type type, var_t *var, expr_t *expr)
- expr_t *e;
- type_t *tref;
-
-- if (var->stgclass != STG_NONE && var->stgclass != STG_REGISTER)
-+ if (var->declspec.stgclass != STG_NONE && var->declspec.stgclass != STG_REGISTER)
- error_loc("invalid storage class for type expression\n");
-
-- tref = var->type;
-+ tref = var->declspec.type;
-
- e = xmalloc(sizeof(expr_t));
- e->type = type;
-@@ -474,7 +474,7 @@ static type_t *find_identifier(const char *identifier, const type_t *cont_type,
- if (fields) LIST_FOR_EACH_ENTRY( field, fields, const var_t, entry )
- if (field->name && !strcmp(identifier, field->name))
- {
-- type = field->type;
-+ type = field->declspec.type;
- *found_in_cont_type = 1;
- break;
- }
-@@ -482,7 +482,7 @@ static type_t *find_identifier(const char *identifier, const type_t *cont_type,
- if (!type)
- {
- var_t *const_var = find_const(identifier, 0);
-- if (const_var) type = const_var->type;
-+ if (const_var) type = const_var->declspec.type;
- }
-
- return type;
-@@ -521,11 +521,11 @@ static struct expression_type resolve_expression(const struct expr_loc *expr_loc
- break;
- case EXPR_STRLIT:
- result.is_temporary = TRUE;
-- result.type = type_new_pointer(FC_UP, type_new_int(TYPE_BASIC_CHAR, 0), NULL);
-+ result.type = type_new_pointer(FC_UP, type_new_int(TYPE_BASIC_CHAR, 0));
- break;
- case EXPR_WSTRLIT:
- result.is_temporary = TRUE;
-- result.type = type_new_pointer(FC_UP, type_new_int(TYPE_BASIC_WCHAR, 0), NULL);
-+ result.type = type_new_pointer(FC_UP, type_new_int(TYPE_BASIC_WCHAR, 0));
- break;
- case EXPR_CHARCONST:
- result.is_temporary = TRUE;
-@@ -575,15 +575,15 @@ static struct expression_type resolve_expression(const struct expr_loc *expr_loc
- expr_loc->attr ? expr_loc->attr : "");
- result.is_variable = FALSE;
- result.is_temporary = TRUE;
-- result.type = type_new_pointer(FC_UP, result.type, NULL);
-+ result.type = type_new_pointer(FC_UP, result.type);
- break;
- case EXPR_PPTR:
- result = resolve_expression(expr_loc, cont_type, e->ref);
- if (result.type && is_ptr(result.type))
-- result.type = type_pointer_get_ref(result.type);
-+ result.type = type_pointer_get_ref_type(result.type);
- else if(result.type && is_array(result.type)
- && type_array_is_decl_as_ptr(result.type))
-- result.type = type_array_get_element(result.type);
-+ result.type = type_array_get_element_type(result.type);
- else
- error_loc_info(&expr_loc->v->loc_info, "dereference operator applied to non-pointer type in expression%s%s\n",
- expr_loc->attr ? " for attribute " : "",
-@@ -665,7 +665,7 @@ static struct expression_type resolve_expression(const struct expr_loc *expr_loc
- if (result.type && is_array(result.type))
- {
- struct expression_type index_result;
-- result.type = type_array_get_element(result.type);
-+ result.type = type_array_get_element_type(result.type);
- index_result = resolve_expression(expr_loc, cont_type /* FIXME */, e->u.ext);
- if (!index_result.type || !is_integer_type(index_result.type))
- error_loc_info(&expr_loc->v->loc_info, "array subscript not of integral type in expression%s%s\n",
-diff --git a/mingw-w64-tools/widl/src/header.c b/mingw-w64-tools/widl/src/header.c
-index defc7f85..d0d0dc4b 100644
---- a/mingw-w64-tools/widl/src/header.c
-+++ b/mingw-w64-tools/widl/src/header.c
-@@ -43,7 +43,7 @@ user_type_list_t user_type_list = LIST_INIT(user_type_list);
- context_handle_list_t context_handle_list = LIST_INIT(context_handle_list);
- generic_handle_list_t generic_handle_list = LIST_INIT(generic_handle_list);
-
--static void write_type_def_or_decl(FILE *f, type_t *t, int field, const char *name);
-+static void write_type_v(FILE *h, const decl_spec_t *ds, int is_field, int declonly, const char *name);
-
- static void indent(FILE *h, int delta)
- {
-@@ -69,15 +69,15 @@ int is_ptrchain_attr(const var_t *var, enum attr_type t)
- return 1;
- else
- {
-- type_t *type = var->type;
-+ type_t *type = var->declspec.type;
- for (;;)
- {
- if (is_attr(type->attrs, t))
- return 1;
- else if (type_is_alias(type))
-- type = type_alias_get_aliasee(type);
-+ type = type_alias_get_aliasee_type(type);
- else if (is_ptr(type))
-- type = type_pointer_get_ref(type);
-+ type = type_pointer_get_ref_type(type);
- else return 0;
- }
- }
-@@ -91,7 +91,7 @@ int is_aliaschain_attr(const type_t *type, enum attr_type attr)
- if (is_attr(t->attrs, attr))
- return 1;
- else if (type_is_alias(t))
-- t = type_alias_get_aliasee(t);
-+ t = type_alias_get_aliasee_type(t);
- else return 0;
- }
- }
-@@ -204,9 +204,9 @@ static void write_fields(FILE *h, var_list_t *fields)
- if (!fields) return;
-
- LIST_FOR_EACH_ENTRY( v, fields, var_t, entry ) {
-- if (!v || !v->type) continue;
-+ if (!v || !v->declspec.type) continue;
-
-- switch(type_get_type_detect_alias(v->type)) {
-+ switch(type_get_type_detect_alias(v->declspec.type)) {
- case TYPE_STRUCT:
- case TYPE_ENCAPSULATED_UNION:
- nameless_struct_cnt++;
-@@ -220,12 +220,12 @@ static void write_fields(FILE *h, var_list_t *fields)
- }
-
- LIST_FOR_EACH_ENTRY( v, fields, var_t, entry ) {
-- if (!v || !v->type) continue;
-+ if (!v || !v->declspec.type) continue;
-
- indent(h, 0);
- name = v->name;
-
-- switch(type_get_type_detect_alias(v->type)) {
-+ switch(type_get_type_detect_alias(v->declspec.type)) {
- case TYPE_STRUCT:
- case TYPE_ENCAPSULATED_UNION:
- if(!v->name) {
-@@ -252,7 +252,7 @@ static void write_fields(FILE *h, var_list_t *fields)
- default:
- ;
- }
-- write_type_def_or_decl(h, v->type, TRUE, name);
-+ write_type_v(h, &v->declspec, TRUE, v->declonly, name);
- fprintf(h, ";\n");
- }
- }
-@@ -295,14 +295,21 @@ static void write_pointer_left(FILE *h, type_t *ref)
- }
-
- void write_type_left(FILE *h, type_t *t, enum name_type name_type, int declonly)
-+{
-+ decl_spec_t ds;
-+ write_declspec_left(h, init_declspec(&ds, t), name_type, declonly);
-+}
-+
-+void write_declspec_left(FILE* h, const decl_spec_t *ds, enum name_type name_type, int declonly)
- {
- const char *name;
-+ type_t *t = ds->type;
-
- if (!h) return;
-
- name = type_get_name(t, name_type);
-
-- if (is_attr(t->attrs, ATTR_CONST) &&
-+ if ((ds->typequalifier == TYPE_QUALIFIER_CONST) &&
- (type_is_alias(t) || !is_ptr(t)))
- fprintf(h, "const ");
-
-@@ -310,7 +317,7 @@ void write_type_left(FILE *h, type_t *t, enum name_type name_type, int declonly)
- else {
- switch (type_get_type_detect_alias(t)) {
- case TYPE_ENUM:
-- if (!declonly && t->defined && !t->written) {
-+ if (!declonly && type_is_defined(t) && !t->written) {
- if (name) fprintf(h, "enum %s {\n", name);
- else fprintf(h, "enum {\n");
- t->written = TRUE;
-@@ -323,7 +330,7 @@ void write_type_left(FILE *h, type_t *t, enum name_type name_type, int declonly)
- break;
- case TYPE_STRUCT:
- case TYPE_ENCAPSULATED_UNION:
-- if (!declonly && t->defined && !t->written) {
-+ if (!declonly && type_is_defined(t) && !t->written) {
- if (name) fprintf(h, "struct %s {\n", name);
- else fprintf(h, "struct {\n");
- t->written = TRUE;
-@@ -338,7 +345,7 @@ void write_type_left(FILE *h, type_t *t, enum name_type name_type, int declonly)
- else fprintf(h, "struct %s", name ? name : "");
- break;
- case TYPE_UNION:
-- if (!declonly && t->defined && !t->written) {
-+ if (!declonly && type_is_defined(t) && !t->written) {
- if (t->name) fprintf(h, "union %s {\n", t->name);
- else fprintf(h, "union {\n");
- t->written = TRUE;
-@@ -351,9 +358,9 @@ void write_type_left(FILE *h, type_t *t, enum name_type name_type, int declonly)
- break;
- case TYPE_POINTER:
- {
-- write_type_left(h, type_pointer_get_ref(t), name_type, declonly);
-- write_pointer_left(h, type_pointer_get_ref(t));
-- if (is_attr(t->attrs, ATTR_CONST)) fprintf(h, "const ");
-+ write_declspec_left(h, type_pointer_get_ref(t), name_type, declonly);
-+ write_pointer_left(h, type_pointer_get_ref_type(t));
-+ if (ds->typequalifier == TYPE_QUALIFIER_CONST) fprintf(h, "const ");
- break;
- }
- case TYPE_ARRAY:
-@@ -361,9 +368,9 @@ void write_type_left(FILE *h, type_t *t, enum name_type name_type, int declonly)
- fprintf(h, "%s", t->name);
- else
- {
-- write_type_left(h, type_array_get_element(t), name_type, declonly);
-+ write_declspec_left(h, type_array_get_element(t), name_type, declonly);
- if (type_array_is_decl_as_ptr(t))
-- write_pointer_left(h, type_array_get_element(t));
-+ write_pointer_left(h, type_array_get_element_type(t));
- }
- break;
- case TYPE_BASIC:
-@@ -443,7 +450,7 @@ void write_type_right(FILE *h, type_t *t, int is_field)
- {
- case TYPE_ARRAY:
- {
-- type_t *elem = type_array_get_element(t);
-+ type_t *elem = type_array_get_element_type(t);
- if (type_array_is_decl_as_ptr(t))
- {
- if (!type_is_alias(elem) && is_array(elem) && !type_array_is_decl_as_ptr(elem))
-@@ -461,7 +468,7 @@ void write_type_right(FILE *h, type_t *t, int is_field)
- }
- case TYPE_POINTER:
- {
-- type_t *ref = type_pointer_get_ref(t);
-+ type_t *ref = type_pointer_get_ref_type(t);
- if (!type_is_alias(ref) && is_array(ref) && !type_array_is_decl_as_ptr(ref))
- fprintf(h, ")");
- write_type_right(h, ref, FALSE);
-@@ -485,30 +492,33 @@ void write_type_right(FILE *h, type_t *t, int is_field)
- }
- }
-
--static void write_type_v(FILE *h, type_t *t, int is_field, int declonly, const char *name)
-+static void write_type_v(FILE *h, const decl_spec_t *ds, int is_field, int declonly, const char *name)
- {
-+ type_t *t = ds->type;
- type_t *pt = NULL;
- int ptr_level = 0;
-
- if (!h) return;
-
- if (t) {
-- for (pt = t; is_ptr(pt); pt = type_pointer_get_ref(pt), ptr_level++)
-+ const decl_spec_t *dpt = NULL;
-+ for (dpt = ds; is_ptr(dpt->type); dpt = type_pointer_get_ref(dpt->type), ptr_level++)
- ;
-+ pt = dpt->type;
-
- if (type_get_type_detect_alias(pt) == TYPE_FUNCTION) {
- int i;
- const char *callconv = get_attrp(pt->attrs, ATTR_CALLCONV);
- if (!callconv && is_object_interface) callconv = "STDMETHODCALLTYPE";
-- if (is_attr(pt->attrs, ATTR_INLINE)) fprintf(h, "inline ");
-- write_type_left(h, type_function_get_rettype(pt), NAME_DEFAULT, declonly);
-+ if (!is_ptr(ds->type) && dpt->funcspecifier == FUNCTION_SPECIFIER_INLINE) fprintf(h, "inline ");
-+ write_declspec_left(h, type_function_get_retdeclspec(pt), NAME_DEFAULT, declonly);
- fputc(' ', h);
- if (ptr_level) fputc('(', h);
- if (callconv) fprintf(h, "%s ", callconv);
- for (i = 0; i < ptr_level; i++)
- fputc('*', h);
- } else
-- write_type_left(h, t, NAME_DEFAULT, declonly);
-+ write_declspec_left(h, ds, NAME_DEFAULT, declonly);
- }
-
- if (name) fprintf(h, "%s%s", !t || needs_space_after(t) ? " " : "", name );
-@@ -529,12 +539,7 @@ static void write_type_v(FILE *h, type_t *t, int is_field, int declonly, const c
- }
- }
-
--static void write_type_def_or_decl(FILE *f, type_t *t, int field, const char *name)
--{
-- write_type_v(f, t, field, FALSE, name);
--}
--
--static void write_type_definition(FILE *f, type_t *t)
-+static void write_type_definition(FILE *f, type_t *t, int declonly)
- {
- int in_namespace = t->namespace && !is_global_namespace(t->namespace);
- int save_written = t->written;
-@@ -545,14 +550,14 @@ static void write_type_definition(FILE *f, type_t *t)
- write_namespace_start(f, t->namespace);
- }
- indent(f, 0);
-- write_type_left(f, t, NAME_DEFAULT, FALSE);
-+ write_type_left(f, t, NAME_DEFAULT, declonly);
- fprintf(f, ";\n");
- if(in_namespace) {
- t->written = save_written;
- write_namespace_end(f, t->namespace);
- fprintf(f, "extern \"C\" {\n");
- fprintf(f, "#else\n");
-- write_type_left(f, t, NAME_C, FALSE);
-+ write_type_left(f, t, NAME_C, declonly);
- fprintf(f, ";\n");
- fprintf(f, "#endif\n\n");
- }
-@@ -560,12 +565,18 @@ static void write_type_definition(FILE *f, type_t *t)
-
- void write_type_decl(FILE *f, type_t *t, const char *name)
- {
-- write_type_v(f, t, FALSE, TRUE, name);
-+ decl_spec_t ds;
-+ write_declspec_decl(f, init_declspec(&ds, t), name);
-+}
-+
-+void write_declspec_decl(FILE *f, const decl_spec_t *ds, const char *name)
-+{
-+ write_type_v(f, ds, FALSE, TRUE, name);
- }
-
--void write_type_decl_left(FILE *f, type_t *t)
-+void write_declspec_decl_left(FILE *f, const decl_spec_t *ds)
- {
-- write_type_left(f, t, NAME_DEFAULT, TRUE);
-+ write_declspec_left(f, ds, NAME_DEFAULT, TRUE);
- }
-
- static int user_type_registered(const char *name)
-@@ -602,8 +613,8 @@ unsigned int get_context_handle_offset( const type_t *type )
-
- while (!is_attr( type->attrs, ATTR_CONTEXTHANDLE ))
- {
-- if (type_is_alias( type )) type = type_alias_get_aliasee( type );
-- else if (is_ptr( type )) type = type_pointer_get_ref( type );
-+ if (type_is_alias( type )) type = type_alias_get_aliasee_type( type );
-+ else if (is_ptr( type )) type = type_pointer_get_ref_type( type );
- else error( "internal error: %s is not a context handle\n", type->name );
- }
- LIST_FOR_EACH_ENTRY( ch, &context_handle_list, context_handle_t, entry )
-@@ -622,8 +633,8 @@ unsigned int get_generic_handle_offset( const type_t *type )
-
- while (!is_attr( type->attrs, ATTR_HANDLE ))
- {
-- if (type_is_alias( type )) type = type_alias_get_aliasee( type );
-- else if (is_ptr( type )) type = type_pointer_get_ref( type );
-+ if (type_is_alias( type )) type = type_alias_get_aliasee_type( type );
-+ else if (is_ptr( type )) type = type_pointer_get_ref_type( type );
- else error( "internal error: %s is not a generic handle\n", type->name );
- }
- LIST_FOR_EACH_ENTRY( gh, &generic_handle_list, generic_handle_t, entry )
-@@ -637,82 +648,77 @@ unsigned int get_generic_handle_offset( const type_t *type )
-
- /* check for types which require additional prototypes to be generated in the
- * header */
--void check_for_additional_prototype_types(const var_list_t *list)
--{
-- const var_t *v;
--
-- if (!list) return;
-- LIST_FOR_EACH_ENTRY( v, list, const var_t, entry )
-- {
-- type_t *type = v->type;
-- if (!type) continue;
-- for (;;) {
-- const char *name = type->name;
-- if (type->user_types_registered) break;
-- type->user_types_registered = 1;
-- if (is_attr(type->attrs, ATTR_CONTEXTHANDLE)) {
-- if (!context_handle_registered(name))
-- {
-- context_handle_t *ch = xmalloc(sizeof(*ch));
-- ch->name = xstrdup(name);
-- list_add_tail(&context_handle_list, &ch->entry);
-- }
-- /* don't carry on parsing fields within this type */
-- break;
-- }
-- if ((type_get_type(type) != TYPE_BASIC ||
-- type_basic_get_type(type) != TYPE_BASIC_HANDLE) &&
-- is_attr(type->attrs, ATTR_HANDLE)) {
-- if (!generic_handle_registered(name))
-- {
-- generic_handle_t *gh = xmalloc(sizeof(*gh));
-- gh->name = xstrdup(name);
-- list_add_tail(&generic_handle_list, &gh->entry);
-- }
-- /* don't carry on parsing fields within this type */
-- break;
-+void check_for_additional_prototype_types(type_t *type)
-+{
-+ if (!type) return;
-+ for (;;) {
-+ const char *name = type->name;
-+ if (type->user_types_registered) break;
-+ type->user_types_registered = 1;
-+ if (is_attr(type->attrs, ATTR_CONTEXTHANDLE)) {
-+ if (!context_handle_registered(name))
-+ {
-+ context_handle_t *ch = xmalloc(sizeof(*ch));
-+ ch->name = xstrdup(name);
-+ list_add_tail(&context_handle_list, &ch->entry);
- }
-- if (is_attr(type->attrs, ATTR_WIREMARSHAL)) {
-- if (!user_type_registered(name))
-- {
-- user_type_t *ut = xmalloc(sizeof *ut);
-- ut->name = xstrdup(name);
-- list_add_tail(&user_type_list, &ut->entry);
-- }
-- /* don't carry on parsing fields within this type as we are already
-- * using a wire marshaled type */
-- break;
-+ /* don't carry on parsing fields within this type */
-+ break;
-+ }
-+ if ((type_get_type(type) != TYPE_BASIC ||
-+ type_basic_get_type(type) != TYPE_BASIC_HANDLE) &&
-+ is_attr(type->attrs, ATTR_HANDLE)) {
-+ if (!generic_handle_registered(name))
-+ {
-+ generic_handle_t *gh = xmalloc(sizeof(*gh));
-+ gh->name = xstrdup(name);
-+ list_add_tail(&generic_handle_list, &gh->entry);
- }
-- else if (type_is_complete(type))
-+ /* don't carry on parsing fields within this type */
-+ break;
-+ }
-+ if (is_attr(type->attrs, ATTR_WIREMARSHAL)) {
-+ if (!user_type_registered(name))
- {
-- var_list_t *vars;
-- switch (type_get_type_detect_alias(type))
-- {
-- case TYPE_ENUM:
-- vars = type_enum_get_values(type);
-- break;
-- case TYPE_STRUCT:
-- vars = type_struct_get_fields(type);
-- break;
-- case TYPE_UNION:
-- vars = type_union_get_cases(type);
-- break;
-- default:
-- vars = NULL;
-- break;
-- }
-- check_for_additional_prototype_types(vars);
-+ user_type_t *ut = xmalloc(sizeof *ut);
-+ ut->name = xstrdup(name);
-+ list_add_tail(&user_type_list, &ut->entry);
- }
--
-- if (type_is_alias(type))
-- type = type_alias_get_aliasee(type);
-- else if (is_ptr(type))
-- type = type_pointer_get_ref(type);
-- else if (is_array(type))
-- type = type_array_get_element(type);
-- else
-+ /* don't carry on parsing fields within this type as we are already
-+ * using a wire marshaled type */
-+ break;
-+ }
-+ else if (type_is_complete(type))
-+ {
-+ var_list_t *vars;
-+ const var_t *v;
-+ switch (type_get_type_detect_alias(type))
-+ {
-+ case TYPE_ENUM:
-+ vars = type_enum_get_values(type);
-+ break;
-+ case TYPE_STRUCT:
-+ vars = type_struct_get_fields(type);
- break;
-+ case TYPE_UNION:
-+ vars = type_union_get_cases(type);
-+ break;
-+ default:
-+ vars = NULL;
-+ break;
-+ }
-+ if (vars) LIST_FOR_EACH_ENTRY( v, vars, const var_t, entry )
-+ check_for_additional_prototype_types(v->declspec.type);
- }
-+
-+ if (type_is_alias(type))
-+ type = type_alias_get_aliasee_type(type);
-+ else if (is_ptr(type))
-+ type = type_pointer_get_ref_type(type);
-+ else if (is_array(type))
-+ type = type_array_get_element_type(type);
-+ else
-+ break;
- }
- }
-
-@@ -791,26 +797,26 @@ static void write_generic_handle_routines(FILE *header)
- }
- }
-
--static void write_typedef(FILE *header, type_t *type)
-+static void write_typedef(FILE *header, type_t *type, int declonly)
- {
- fprintf(header, "typedef ");
-- write_type_def_or_decl(header, type_alias_get_aliasee(type), FALSE, type->name);
-+ write_type_v(header, type_alias_get_aliasee(type), FALSE, declonly, type->name);
- fprintf(header, ";\n");
- }
-
- int is_const_decl(const var_t *var)
- {
-- const type_t *t;
-+ const decl_spec_t *ds;
- /* strangely, MIDL accepts a const attribute on any pointer in the
- * declaration to mean that data isn't being instantiated. this appears
- * to be a bug, but there is no benefit to being incompatible with MIDL,
- * so we'll do the same thing */
-- for (t = var->type; ; )
-+ for (ds = &var->declspec; ;)
- {
-- if (is_attr(t->attrs, ATTR_CONST))
-+ if (ds->typequalifier == TYPE_QUALIFIER_CONST)
- return TRUE;
-- else if (is_ptr(t))
-- t = type_pointer_get_ref(t);
-+ else if (is_ptr(ds->type))
-+ ds = type_pointer_get_ref(ds->type);
- else break;
- }
- return FALSE;
-@@ -826,7 +832,7 @@ static void write_declaration(FILE *header, const var_t *v)
- }
- else
- {
-- switch (v->stgclass)
-+ switch (v->declspec.stgclass)
- {
- case STG_NONE:
- case STG_REGISTER: /* ignored */
-@@ -838,7 +844,7 @@ static void write_declaration(FILE *header, const var_t *v)
- fprintf(header, "extern ");
- break;
- }
-- write_type_def_or_decl(header, v->type, FALSE, v->name);
-+ write_type_v(header, &v->declspec, FALSE, FALSE, v->name);
- fprintf(header, ";\n\n");
- }
- }
-@@ -855,9 +861,9 @@ static void write_library(FILE *header, const typelib_t *typelib)
- const type_t* get_explicit_generic_handle_type(const var_t* var)
- {
- const type_t *t;
-- for (t = var->type;
-+ for (t = var->declspec.type;
- is_ptr(t) || type_is_alias(t);
-- t = type_is_alias(t) ? type_alias_get_aliasee(t) : type_pointer_get_ref(t))
-+ t = type_is_alias(t) ? type_alias_get_aliasee_type(t) : type_pointer_get_ref_type(t))
- if ((type_get_type_detect_alias(t) != TYPE_BASIC || type_basic_get_type(t) != TYPE_BASIC_HANDLE) &&
- is_attr(t->attrs, ATTR_HANDLE))
- return t;
-@@ -868,13 +874,13 @@ const var_t *get_func_handle_var( const type_t *iface, const var_t *func,
- unsigned char *explicit_fc, unsigned char *implicit_fc )
- {
- const var_t *var;
-- const var_list_t *args = type_get_function_args( func->type );
-+ const var_list_t *args = type_function_get_args( func->declspec.type );
-
- *explicit_fc = *implicit_fc = 0;
- if (args) LIST_FOR_EACH_ENTRY( var, args, const var_t, entry )
- {
- if (!is_attr( var->attrs, ATTR_IN ) && is_attr( var->attrs, ATTR_OUT )) continue;
-- if (type_get_type( var->type ) == TYPE_BASIC && type_basic_get_type( var->type ) == TYPE_BASIC_HANDLE)
-+ if (type_get_type( var->declspec.type ) == TYPE_BASIC && type_basic_get_type( var->declspec.type ) == TYPE_BASIC_HANDLE)
- {
- *explicit_fc = FC_BIND_PRIMITIVE;
- return var;
-@@ -884,7 +890,7 @@ const var_t *get_func_handle_var( const type_t *iface, const var_t *func,
- *explicit_fc = FC_BIND_GENERIC;
- return var;
- }
-- if (is_context_handle( var->type ))
-+ if (is_context_handle( var->declspec.type ))
- {
- *explicit_fc = FC_BIND_CONTEXT;
- return var;
-@@ -893,8 +899,8 @@ const var_t *get_func_handle_var( const type_t *iface, const var_t *func,
-
- if ((var = get_attrp( iface->attrs, ATTR_IMPLICIT_HANDLE )))
- {
-- if (type_get_type( var->type ) == TYPE_BASIC &&
-- type_basic_get_type( var->type ) == TYPE_BASIC_HANDLE)
-+ if (type_get_type( var->declspec.type ) == TYPE_BASIC &&
-+ type_basic_get_type( var->declspec.type ) == TYPE_BASIC_HANDLE)
- *implicit_fc = FC_BIND_PRIMITIVE;
- else
- *implicit_fc = FC_BIND_GENERIC;
-@@ -909,13 +915,13 @@ int has_out_arg_or_return(const var_t *func)
- {
- const var_t *var;
-
-- if (!is_void(type_function_get_rettype(func->type)))
-+ if (!is_void(type_function_get_rettype(func->declspec.type)))
- return 1;
-
-- if (!type_get_function_args(func->type))
-+ if (!type_function_get_args(func->declspec.type))
- return 0;
-
-- LIST_FOR_EACH_ENTRY( var, type_get_function_args(func->type), const var_t, entry )
-+ LIST_FOR_EACH_ENTRY( var, type_function_get_args(func->declspec.type), const var_t, entry )
- if (is_attr(var->attrs, ATTR_OUT))
- return 1;
-
-@@ -995,7 +1001,7 @@ static int is_override_method(const type_t *iface, const type_t *child, const va
-
- static int is_aggregate_return(const var_t *func)
- {
-- enum type_type type = type_get_type(type_function_get_rettype(func->type));
-+ enum type_type type = type_get_type(type_function_get_rettype(func->declspec.type));
- return type == TYPE_STRUCT || type == TYPE_UNION ||
- type == TYPE_COCLASS || type == TYPE_INTERFACE;
- }
-@@ -1035,8 +1041,8 @@ static void write_method_macro(FILE *header, const type_t *iface, const type_t *
- const var_t *arg;
-
- fprintf(header, "#define %s_%s(This", name, get_name(func));
-- if (type_get_function_args(func->type))
-- LIST_FOR_EACH_ENTRY( arg, type_get_function_args(func->type), const var_t, entry )
-+ if (type_function_get_args(func->declspec.type))
-+ LIST_FOR_EACH_ENTRY( arg, type_function_get_args(func->declspec.type), const var_t, entry )
- fprintf(header, ",%s", arg->name);
- fprintf(header, ") ");
-
-@@ -1047,8 +1053,8 @@ static void write_method_macro(FILE *header, const type_t *iface, const type_t *
- }
-
- fprintf(header, "(This)->lpVtbl->%s(This", get_vtbl_entry_name(iface, func));
-- if (type_get_function_args(func->type))
-- LIST_FOR_EACH_ENTRY( arg, type_get_function_args(func->type), const var_t, entry )
-+ if (type_function_get_args(func->declspec.type))
-+ LIST_FOR_EACH_ENTRY( arg, type_function_get_args(func->declspec.type), const var_t, entry )
- fprintf(header, ",%s", arg->name);
- fprintf(header, ")\n");
- }
-@@ -1078,7 +1084,7 @@ void write_args(FILE *h, const var_list_t *args, const char *name, int method, i
- }
- else fprintf(h, ",");
- }
-- write_type_decl(h, arg->type, arg->name);
-+ write_declspec_decl(h, &arg->declspec, arg->name);
- if (method == 2) {
- const expr_t *expr = get_attrp(arg->attrs, ATTR_DEFAULTVALUE);
- if (expr) {
-@@ -1090,7 +1096,7 @@ void write_args(FILE *h, const var_list_t *args, const char *name, int method, i
- expr_t bstr;
-
- /* Fixup the expression type for a BSTR like midl does. */
-- if (get_type_vt(arg->type) == VT_BSTR && expr->type == EXPR_STRLIT)
-+ if (get_type_vt(arg->declspec.type) == VT_BSTR && expr->type == EXPR_STRLIT)
- {
- bstr = *expr;
- bstr.type = EXPR_WSTRLIT;
-@@ -1119,8 +1125,8 @@ static void write_cpp_method_def(FILE *header, const type_t *iface)
- {
- const var_t *func = stmt->u.var;
- if (!is_callas(func->attrs)) {
-- const char *callconv = get_attrp(func->type->attrs, ATTR_CALLCONV);
-- const var_list_t *args = type_get_function_args(func->type);
-+ const char *callconv = get_attrp(func->declspec.type->attrs, ATTR_CALLCONV);
-+ const var_list_t *args = type_function_get_args(func->declspec.type);
- const var_t *arg;
-
- if (!callconv) callconv = "STDMETHODCALLTYPE";
-@@ -1130,11 +1136,11 @@ static void write_cpp_method_def(FILE *header, const type_t *iface)
-
- indent(header, 0);
- fprintf(header, "virtual ");
-- write_type_decl_left(header, type_function_get_rettype(func->type));
-+ write_declspec_decl_left(header, type_function_get_retdeclspec(func->declspec.type));
- fprintf(header, "* %s %s(\n", callconv, get_name(func));
- ++indentation;
- indent(header, 0);
-- write_type_decl_left(header, type_function_get_rettype(func->type));
-+ write_declspec_decl_left(header, type_function_get_retdeclspec(func->declspec.type));
- fprintf(header, " *__ret");
- --indentation;
- if (args) {
-@@ -1144,7 +1150,7 @@ static void write_cpp_method_def(FILE *header, const type_t *iface)
- fprintf(header, ") = 0;\n");
-
- indent(header, 0);
-- write_type_decl_left(header, type_function_get_rettype(func->type));
-+ write_declspec_decl_left(header, type_function_get_retdeclspec(func->declspec.type));
- fprintf(header, " %s %s(\n", callconv, get_name(func));
- write_args(header, args, iface->name, 2, TRUE);
- fprintf(header, ")\n");
-@@ -1152,7 +1158,7 @@ static void write_cpp_method_def(FILE *header, const type_t *iface)
- fprintf(header, "{\n");
- ++indentation;
- indent(header, 0);
-- write_type_decl_left(header, type_function_get_rettype(func->type));
-+ write_declspec_decl_left(header, type_function_get_retdeclspec(func->declspec.type));
- fprintf(header, " __ret;\n");
- indent(header, 0);
- fprintf(header, "return *%s(&__ret", get_name(func));
-@@ -1169,7 +1175,7 @@ static void write_cpp_method_def(FILE *header, const type_t *iface)
-
- indent(header, 0);
- fprintf(header, "virtual ");
-- write_type_decl_left(header, type_function_get_rettype(func->type));
-+ write_declspec_decl_left(header, type_function_get_retdeclspec(func->declspec.type));
- fprintf(header, " %s %s(\n", callconv, get_name(func));
- write_args(header, args, iface->name, 2, TRUE);
- fprintf(header, ") = 0;\n");
-@@ -1206,25 +1212,25 @@ static void write_inline_wrappers(FILE *header, const type_t *iface, const type_
- const var_t *arg;
-
- fprintf(header, "static FORCEINLINE ");
-- write_type_decl_left(header, type_function_get_rettype(func->type));
-+ write_declspec_decl_left(header, type_function_get_retdeclspec(func->declspec.type));
- fprintf(header, " %s_%s(", name, get_name(func));
-- write_args(header, type_get_function_args(func->type), name, 1, FALSE);
-+ write_args(header, type_function_get_args(func->declspec.type), name, 1, FALSE);
- fprintf(header, ") {\n");
- ++indentation;
- if (!is_aggregate_return(func)) {
- indent(header, 0);
- fprintf(header, "%sThis->lpVtbl->%s(This",
-- is_void(type_function_get_rettype(func->type)) ? "" : "return ",
-+ is_void(type_function_get_rettype(func->declspec.type)) ? "" : "return ",
- get_vtbl_entry_name(iface, func));
- } else {
- indent(header, 0);
-- write_type_decl_left(header, type_function_get_rettype(func->type));
-+ write_declspec_decl_left(header, type_function_get_retdeclspec(func->declspec.type));
- fprintf(header, " __ret;\n");
- indent(header, 0);
- fprintf(header, "return *This->lpVtbl->%s(This,&__ret", get_vtbl_entry_name(iface, func));
- }
-- if (type_get_function_args(func->type))
-- LIST_FOR_EACH_ENTRY( arg, type_get_function_args(func->type), const var_t, entry )
-+ if (type_function_get_args(func->declspec.type))
-+ LIST_FOR_EACH_ENTRY( arg, type_function_get_args(func->declspec.type), const var_t, entry )
- fprintf(header, ",%s", arg->name);
- fprintf(header, ");\n");
- --indentation;
-@@ -1250,10 +1256,10 @@ static void do_write_c_method_def(FILE *header, const type_t *iface, const char
- first_iface = 0;
- }
- if (!is_callas(func->attrs)) {
-- const char *callconv = get_attrp(func->type->attrs, ATTR_CALLCONV);
-+ const char *callconv = get_attrp(func->declspec.type->attrs, ATTR_CALLCONV);
- if (!callconv) callconv = "STDMETHODCALLTYPE";
- indent(header, 0);
-- write_type_decl_left(header, type_function_get_rettype(func->type));
-+ write_declspec_decl_left(header, type_function_get_retdeclspec(func->declspec.type));
- if (is_aggregate_return(func))
- fprintf(header, " *");
- if (is_inherited_method(iface, func))
-@@ -1266,13 +1272,13 @@ static void do_write_c_method_def(FILE *header, const type_t *iface, const char
- if (is_aggregate_return(func)) {
- fprintf(header, ",\n");
- indent(header, 0);
-- write_type_decl_left(header, type_function_get_rettype(func->type));
-+ write_declspec_decl_left(header, type_function_get_retdeclspec(func->declspec.type));
- fprintf(header, " *__ret");
- }
- --indentation;
-- if (type_get_function_args(func->type)) {
-+ if (type_function_get_args(func->declspec.type)) {
- fprintf(header, ",\n");
-- write_args(header, type_get_function_args(func->type), name, 0, TRUE);
-+ write_args(header, type_function_get_args(func->declspec.type), name, 0, TRUE);
- }
- fprintf(header, ");\n");
- fprintf(header, "\n");
-@@ -1299,12 +1305,12 @@ static void write_method_proto(FILE *header, const type_t *iface)
- const var_t *func = stmt->u.var;
-
- if (is_callas(func->attrs)) {
-- const char *callconv = get_attrp(func->type->attrs, ATTR_CALLCONV);
-+ const char *callconv = get_attrp(func->declspec.type->attrs, ATTR_CALLCONV);
- if (!callconv) callconv = "STDMETHODCALLTYPE";
- /* proxy prototype */
-- write_type_decl_left(header, type_function_get_rettype(func->type));
-+ write_declspec_decl_left(header, type_function_get_retdeclspec(func->declspec.type));
- fprintf(header, " %s %s_%s_Proxy(\n", callconv, iface->name, get_name(func));
-- write_args(header, type_get_function_args(func->type), iface->name, 1, TRUE);
-+ write_args(header, type_function_get_args(func->declspec.type), iface->name, 1, TRUE);
- fprintf(header, ");\n");
- /* stub prototype */
- fprintf(header, "void __RPC_STUB %s_%s_Stub(\n", iface->name, get_name(func));
-@@ -1337,12 +1343,12 @@ static void write_locals(FILE *fp, const type_t *iface, int body)
- if (&stmt2->entry != type_iface_get_stmts(iface)) {
- const var_t *m = stmt2->u.var;
- /* proxy prototype - use local prototype */
-- write_type_decl_left(fp, type_function_get_rettype(m->type));
-+ write_declspec_decl_left(fp, type_function_get_retdeclspec(m->declspec.type));
- fprintf(fp, " CALLBACK %s_%s_Proxy(\n", iface->name, get_name(m));
-- write_args(fp, type_get_function_args(m->type), iface->name, 1, TRUE);
-+ write_args(fp, type_function_get_args(m->declspec.type), iface->name, 1, TRUE);
- fprintf(fp, ")");
- if (body) {
-- type_t *rt = type_function_get_rettype(m->type);
-+ type_t *rt = type_function_get_rettype(m->declspec.type);
- fprintf(fp, "\n{\n");
- fprintf(fp, " %s\n", comment);
- if (rt->name && strcmp(rt->name, "HRESULT") == 0)
-@@ -1359,9 +1365,9 @@ static void write_locals(FILE *fp, const type_t *iface, int body)
- else
- fprintf(fp, ";\n");
- /* stub prototype - use remotable prototype */
-- write_type_decl_left(fp, type_function_get_rettype(func->type));
-+ write_declspec_decl_left(fp, type_function_get_retdeclspec(func->declspec.type));
- fprintf(fp, " __RPC_STUB %s_%s_Stub(\n", iface->name, get_name(m));
-- write_args(fp, type_get_function_args(func->type), iface->name, 1, TRUE);
-+ write_args(fp, type_function_get_args(func->declspec.type), iface->name, 1, TRUE);
- fprintf(fp, ")");
- if (body)
- /* Remotable methods must all return HRESULTs. */
-@@ -1407,15 +1413,16 @@ void write_local_stubs(const statement_list_t *stmts)
-
- static void write_function_proto(FILE *header, const type_t *iface, const var_t *fun, const char *prefix)
- {
-- const char *callconv = get_attrp(fun->type->attrs, ATTR_CALLCONV);
-+ const char *callconv = get_attrp(fun->declspec.type->attrs, ATTR_CALLCONV);
-
- if (!callconv) callconv = "__cdecl";
- /* FIXME: do we need to handle call_as? */
-- write_type_decl_left(header, type_function_get_rettype(fun->type));
-+ write_declspec_decl_left(header, type_function_get_retdeclspec(fun->declspec.type));
-+ if (fun->declspec.funcspecifier == FUNCTION_SPECIFIER_INLINE) fprintf(header, " inline");
- fprintf(header, " %s ", callconv);
- fprintf(header, "%s%s(\n", prefix, get_name(fun));
-- if (type_get_function_args(fun->type))
-- write_args(header, type_get_function_args(fun->type), iface->name, 0, TRUE);
-+ if (type_function_get_args(fun->declspec.type))
-+ write_args(header, type_function_get_args(fun->declspec.type), iface->name, 0, TRUE);
- else
- fprintf(header, " void");
- fprintf(header, ");\n\n");
-@@ -1541,7 +1548,7 @@ static void write_rpc_interface_start(FILE *header, const type_t *iface)
- if (var)
- {
- fprintf(header, "extern ");
-- write_type_decl( header, var->type, var->name );
-+ write_declspec_decl( header, &var->declspec, var->name );
- fprintf(header, ";\n");
- }
- if (old_names)
-@@ -1653,6 +1660,7 @@ static void write_forward_decls(FILE *header, const statement_list_t *stmts)
- if (type_get_type(stmt->u.type) == TYPE_INTERFACE)
- {
- type_t *iface = stmt->u.type;
-+ assert(type_get_type_detect_alias(iface) == TYPE_INTERFACE);
- if (is_object(iface) || is_attr(iface->attrs, ATTR_DISPINTERFACE))
- {
- write_forward(header, iface);
-@@ -1694,6 +1702,7 @@ static void write_header_stmts(FILE *header, const statement_list_t *stmts, cons
- {
- type_t *iface = stmt->u.type;
- type_t *async_iface = iface->details.iface->async_iface;
-+ assert(type_get_type_detect_alias(iface) == TYPE_INTERFACE);
- if (is_object(iface)) is_object_interface++;
- if (is_attr(stmt->u.type->attrs, ATTR_DISPINTERFACE) || is_object(stmt->u.type))
- {
-@@ -1718,7 +1727,7 @@ static void write_header_stmts(FILE *header, const statement_list_t *stmts, cons
- write_coclass(header, stmt->u.type);
- else
- {
-- write_type_definition(header, stmt->u.type);
-+ write_type_definition(header, stmt->u.type, stmt->declonly);
- }
- break;
- case STMT_TYPEREF:
-@@ -1739,7 +1748,7 @@ static void write_header_stmts(FILE *header, const statement_list_t *stmts, cons
- {
- const type_list_t *type_entry = stmt->u.type_list;
- for (; type_entry; type_entry = type_entry->next)
-- write_typedef(header, type_entry->type);
-+ write_typedef(header, type_entry->type, stmt->declonly);
- break;
- }
- case STMT_LIBRARY:
-@@ -1750,7 +1759,7 @@ static void write_header_stmts(FILE *header, const statement_list_t *stmts, cons
- fprintf(header, "%s\n", stmt->u.str);
- break;
- case STMT_DECLARATION:
-- if (iface && type_get_type(stmt->u.var->type) == TYPE_FUNCTION)
-+ if (iface && type_get_type(stmt->u.var->declspec.type) == TYPE_FUNCTION)
- {
- if (!ignore_funcs)
- {
-@@ -1784,15 +1793,15 @@ void write_header(const statement_list_t *stmts)
- }
- fprintf(header, "/*** Autogenerated by WIDL %s from %s - Do not edit ***/\n\n", PACKAGE_VERSION, input_name);
-
-+ fprintf(header, "#ifdef _WIN32\n");
- fprintf(header, "#ifndef __REQUIRED_RPCNDR_H_VERSION__\n");
- fprintf(header, "#define __REQUIRED_RPCNDR_H_VERSION__ 475\n");
-- fprintf(header, "#endif\n\n");
--
-+ fprintf(header, "#endif\n");
- fprintf(header, "#include <rpc.h>\n" );
- fprintf(header, "#include <rpcndr.h>\n" );
- if (!for_each_serializable(stmts, NULL, serializable_exists))
- fprintf(header, "#include <midles.h>\n" );
-- fprintf(header, "\n" );
-+ fprintf(header, "#endif\n\n");
-
- fprintf(header, "#ifndef COM_NO_WINDOWS_H\n");
- fprintf(header, "#include <windows.h>\n");
-diff --git a/mingw-w64-tools/widl/src/header.h b/mingw-w64-tools/widl/src/header.h
-index 0d44b403..0e62f77c 100644
---- a/mingw-w64-tools/widl/src/header.h
-+++ b/mingw-w64-tools/widl/src/header.h
-@@ -29,10 +29,12 @@ extern int is_attr(const attr_list_t *list, enum attr_type t);
- extern void *get_attrp(const attr_list_t *list, enum attr_type t);
- extern unsigned int get_attrv(const attr_list_t *list, enum attr_type t);
- extern const char* get_name(const var_t *v);
-+extern void write_declspec_left(FILE *h, const decl_spec_t *ds, enum name_type name_type, int declonly);
- extern void write_type_left(FILE *h, type_t *t, enum name_type name_type, int declonly);
- extern void write_type_right(FILE *h, type_t *t, int is_field);
- extern void write_type_decl(FILE *f, type_t *t, const char *name);
--extern void write_type_decl_left(FILE *f, type_t *t);
-+extern void write_declspec_decl(FILE *f, const decl_spec_t *ds, const char *name);
-+extern void write_declspec_decl_left(FILE *f, const decl_spec_t *ds);
- extern unsigned int get_context_handle_offset( const type_t *type );
- extern unsigned int get_generic_handle_offset( const type_t *type );
- extern int needs_space_after(type_t *t);
-@@ -83,12 +85,12 @@ static inline int is_conformant_array(const type_t *t)
-
- static inline int last_ptr(const type_t *type)
- {
-- return is_ptr(type) && !is_declptr(type_pointer_get_ref(type));
-+ return is_ptr(type) && !is_declptr(type_pointer_get_ref_type(type));
- }
-
- static inline int last_array(const type_t *type)
- {
-- return is_array(type) && !is_array(type_array_get_element(type));
-+ return is_array(type) && !is_array(type_array_get_element_type(type));
- }
-
- static inline int is_string_type(const attr_list_t *attrs, const type_t *type)
-@@ -102,7 +104,7 @@ static inline int is_context_handle(const type_t *type)
- const type_t *t;
- for (t = type;
- is_ptr(t) || type_is_alias(t);
-- t = type_is_alias(t) ? type_alias_get_aliasee(t) : type_pointer_get_ref(t))
-+ t = type_is_alias(t) ? type_alias_get_aliasee_type(t) : type_pointer_get_ref_type(t))
- if (is_attr(t->attrs, ATTR_CONTEXTHANDLE))
- return 1;
- return 0;
-diff --git a/mingw-w64-tools/widl/src/parser.tab.c b/mingw-w64-tools/widl/src/parser.tab.c
-index 6266e054..8cd1605a 100644
---- a/mingw-w64-tools/widl/src/parser.tab.c
-+++ b/mingw-w64-tools/widl/src/parser.tab.c
-@@ -1,8 +1,8 @@
--/* A Bison parser, made by GNU Bison 3.0.5. */
-+/* A Bison parser, made by GNU Bison 3.0.4. */
-
- /* Bison implementation for Yacc-like parsers in C
-
-- Copyright (C) 1984, 1989-1990, 2000-2015, 2018 Free Software Foundation, Inc.
-+ Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
-@@ -44,7 +44,7 @@
- #define YYBISON 1
-
- /* Bison version. */
--#define YYBISON_VERSION "3.0.5"
-+#define YYBISON_VERSION "3.0.4"
-
- /* Skeleton name. */
- #define YYSKELETON_NAME "yacc.c"
-@@ -125,13 +125,6 @@ struct _import_t
- int import_performed;
- };
-
--typedef struct _decl_spec_t
--{
-- type_t *type;
-- attr_list_t *attrs;
-- enum storage_class stgclass;
--} decl_spec_t;
--
- typelist_t incomplete_types = LIST_INIT(incomplete_types);
-
- static void fix_incomplete(void);
-@@ -140,7 +133,7 @@ static void fix_incomplete_types(type_t *complete_type);
- static str_list_t *append_str(str_list_t *list, char *str);
- static attr_list_t *append_attr(attr_list_t *list, attr_t *attr);
- static attr_list_t *append_attr_list(attr_list_t *new_list, attr_list_t *old_list);
--static decl_spec_t *make_decl_spec(type_t *type, decl_spec_t *left, decl_spec_t *right, attr_t *attr, enum storage_class stgclass);
-+static decl_spec_t *make_decl_spec(type_t *type, decl_spec_t *left, decl_spec_t *right, enum storage_class stgclass, enum type_qualifier typequalifier, enum function_specifier funcspecifier);
- static attr_t *make_attr(enum attr_type type);
- static attr_t *make_attrv(enum attr_type type, unsigned int val);
- static attr_t *make_attrp(enum attr_type type, void *val);
-@@ -156,6 +149,7 @@ static declarator_t *make_declarator(var_t *var);
- static type_t *make_safearray(type_t *type);
- static typelib_t *make_library(const char *name, const attr_list_t *attrs);
- static type_t *append_chain_type(type_t *chain, type_t *type);
-+static decl_spec_t *append_chain_declspec(decl_spec_t *chain, type_t *type, enum type_qualifier typequalifier);
- static warning_list_t *append_warning(warning_list_t *, int);
-
- static type_t *reg_typedefs(decl_spec_t *decl_spec, var_list_t *names, attr_list_t *attrs);
-@@ -212,7 +206,7 @@ static struct namespace *current_namespace = &global_namespace;
- static typelib_t *current_typelib;
-
-
--#line 216 "parser.tab.c" /* yacc.c:339 */
-+#line 210 "parser.tab.c" /* yacc.c:339 */
-
- # ifndef YY_NULLPTR
- # if defined __cplusplus && 201103L <= __cplusplus
-@@ -438,7 +432,7 @@ extern int parser_debug;
-
- union YYSTYPE
- {
--#line 142 "parser.y" /* yacc.c:355 */
-+#line 136 "parser.y" /* yacc.c:355 */
-
- attr_t *attr;
- attr_list_t *attr_list;
-@@ -465,8 +459,10 @@ union YYSTYPE
- struct _import_t *import;
- struct _decl_spec_t *declspec;
- enum storage_class stgclass;
-+ enum type_qualifier typequalifier;
-+ enum function_specifier funcspecifier;
-
--#line 470 "parser.tab.c" /* yacc.c:355 */
-+#line 466 "parser.tab.c" /* yacc.c:355 */
- };
-
- typedef union YYSTYPE YYSTYPE;
-@@ -483,7 +479,7 @@ int parser_parse (void);
-
- /* Copy the second part of user declarations. */
-
--#line 487 "parser.tab.c" /* yacc.c:358 */
-+#line 483 "parser.tab.c" /* yacc.c:358 */
-
- #ifdef short
- # undef short
-@@ -799,48 +795,48 @@ static const yytype_uint8 yytranslate[] =
- /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
- static const yytype_uint16 yyrline[] =
- {
-- 0, 325, 325, 340, 340, 342, 343, 343, 345, 346,
-- 347, 350, 353, 354, 355, 358, 359, 360, 360, 362,
-- 363, 364, 367, 368, 369, 370, 373, 374, 377, 378,
-- 382, 383, 384, 385, 386, 387, 388, 391, 402, 403,
-- 407, 408, 409, 410, 411, 412, 413, 414, 415, 418,
-- 420, 428, 434, 438, 439, 441, 445, 449, 450, 453,
-- 454, 457, 458, 462, 467, 474, 478, 479, 482, 483,
-- 487, 490, 491, 492, 495, 496, 499, 500, 501, 502,
-- 503, 504, 505, 506, 507, 508, 509, 510, 511, 512,
-- 513, 514, 515, 516, 517, 518, 519, 520, 521, 522,
-- 523, 524, 525, 526, 527, 528, 529, 530, 531, 532,
-- 533, 534, 535, 536, 537, 538, 539, 540, 541, 542,
-- 543, 544, 545, 546, 547, 548, 549, 550, 551, 552,
-- 553, 554, 555, 556, 557, 558, 559, 560, 561, 562,
-- 563, 564, 565, 566, 567, 568, 569, 570, 571, 572,
-- 573, 574, 578, 579, 580, 581, 582, 583, 584, 585,
-- 586, 587, 588, 589, 590, 591, 592, 593, 594, 595,
-- 596, 597, 598, 599, 600, 601, 605, 606, 611, 612,
-- 613, 614, 617, 618, 621, 625, 631, 632, 633, 636,
-- 640, 652, 656, 661, 664, 665, 668, 669, 672, 673,
-- 674, 675, 676, 677, 678, 679, 680, 681, 682, 683,
-- 684, 685, 686, 687, 688, 689, 690, 691, 692, 693,
-- 694, 695, 696, 697, 698, 699, 700, 701, 702, 703,
-- 704, 705, 706, 707, 708, 709, 711, 713, 714, 717,
-- 718, 721, 727, 733, 734, 737, 742, 749, 750, 753,
-- 754, 758, 759, 762, 766, 772, 780, 784, 789, 790,
-- 793, 794, 795, 798, 800, 803, 804, 805, 806, 807,
-- 808, 809, 810, 811, 812, 813, 816, 817, 820, 821,
-- 822, 823, 824, 825, 826, 827, 828, 831, 832, 840,
-- 846, 850, 853, 854, 858, 861, 862, 865, 874, 875,
-- 878, 879, 882, 888, 894, 895, 898, 899, 902, 912,
-- 922, 928, 932, 933, 936, 937, 940, 945, 952, 953,
-- 954, 958, 962, 965, 966, 969, 970, 974, 975, 979,
-- 980, 981, 985, 987, 989, 993, 994, 995, 996, 1004,
-- 1006, 1008, 1013, 1015, 1020, 1021, 1026, 1027, 1028, 1029,
-- 1034, 1043, 1045, 1046, 1051, 1053, 1057, 1058, 1065, 1066,
-- 1067, 1068, 1069, 1074, 1082, 1083, 1086, 1087, 1090, 1097,
-- 1098, 1103, 1104, 1108, 1109, 1110, 1111, 1112, 1116, 1117,
-- 1118, 1121, 1124, 1125, 1126, 1127, 1128, 1129, 1130, 1131,
-- 1132, 1133, 1136, 1143, 1145, 1151, 1152, 1153, 1156, 1158,
-- 1160, 1162, 1165, 1170, 1178, 1179, 1182, 1183, 1186, 1187,
-- 1188
-+ 0, 323, 323, 338, 338, 340, 341, 341, 343, 344,
-+ 345, 348, 351, 352, 353, 356, 357, 358, 358, 360,
-+ 361, 362, 365, 366, 367, 368, 371, 372, 375, 376,
-+ 380, 381, 382, 383, 384, 385, 386, 389, 400, 401,
-+ 405, 406, 407, 408, 409, 410, 411, 412, 413, 416,
-+ 418, 426, 432, 436, 437, 439, 443, 447, 448, 451,
-+ 452, 455, 456, 460, 465, 472, 476, 477, 480, 481,
-+ 485, 488, 489, 490, 493, 494, 497, 498, 499, 500,
-+ 501, 502, 503, 504, 505, 506, 507, 508, 509, 510,
-+ 511, 512, 513, 514, 515, 516, 517, 518, 519, 520,
-+ 521, 522, 523, 524, 525, 526, 527, 528, 529, 530,
-+ 531, 532, 533, 534, 535, 536, 537, 538, 539, 540,
-+ 541, 542, 543, 544, 545, 546, 547, 548, 549, 550,
-+ 551, 552, 553, 554, 555, 556, 557, 558, 559, 560,
-+ 561, 562, 563, 564, 565, 566, 567, 568, 569, 570,
-+ 571, 572, 576, 577, 578, 579, 580, 581, 582, 583,
-+ 584, 585, 586, 587, 588, 589, 590, 591, 592, 593,
-+ 594, 595, 596, 597, 598, 599, 603, 604, 609, 610,
-+ 611, 612, 615, 616, 619, 623, 629, 630, 631, 634,
-+ 638, 650, 654, 659, 662, 663, 666, 667, 670, 671,
-+ 672, 673, 674, 675, 676, 677, 678, 679, 680, 681,
-+ 682, 683, 684, 685, 686, 687, 688, 689, 690, 691,
-+ 692, 693, 694, 695, 696, 697, 698, 699, 700, 701,
-+ 702, 703, 704, 705, 706, 707, 709, 711, 712, 715,
-+ 716, 719, 725, 731, 732, 735, 740, 747, 748, 751,
-+ 752, 756, 757, 760, 764, 770, 778, 782, 787, 788,
-+ 791, 792, 793, 796, 798, 801, 802, 803, 804, 805,
-+ 806, 807, 808, 809, 810, 811, 814, 815, 818, 819,
-+ 820, 821, 822, 823, 824, 825, 826, 829, 830, 838,
-+ 844, 848, 851, 852, 856, 859, 860, 863, 872, 873,
-+ 876, 877, 880, 886, 892, 893, 896, 897, 900, 910,
-+ 920, 926, 930, 931, 934, 935, 938, 943, 950, 951,
-+ 952, 956, 960, 963, 964, 967, 968, 972, 973, 977,
-+ 978, 979, 983, 985, 987, 991, 992, 993, 994, 1002,
-+ 1004, 1006, 1011, 1013, 1018, 1019, 1024, 1025, 1026, 1027,
-+ 1032, 1041, 1043, 1044, 1049, 1051, 1055, 1056, 1063, 1064,
-+ 1065, 1066, 1067, 1072, 1080, 1081, 1084, 1085, 1088, 1095,
-+ 1096, 1101, 1102, 1106, 1107, 1108, 1109, 1110, 1114, 1115,
-+ 1116, 1119, 1122, 1123, 1124, 1125, 1126, 1127, 1128, 1129,
-+ 1130, 1131, 1134, 1141, 1143, 1149, 1150, 1151, 1154, 1156,
-+ 1158, 1160, 1163, 1168, 1176, 1177, 1180, 1181, 1184, 1185,
-+ 1186
- };
- #endif
-
-@@ -903,7 +899,7 @@ static const char *const yytname[] =
- "dispinterfacedef", "inherit", "interface", "interfacehdr",
- "interfacedef", "interfacedec", "module", "modulehdr", "moduledef",
- "storage_cls_spec", "function_specifier", "type_qualifier",
-- "m_type_qual_list", "decl_spec", "m_decl_spec_no_type",
-+ "m_type_qual_bits", "decl_spec", "m_decl_spec_no_type",
- "decl_spec_no_type", "declarator", "direct_declarator",
- "abstract_declarator", "abstract_declarator_no_direct",
- "m_abstract_declarator", "abstract_direct_declarator", "any_declarator",
-@@ -2298,7 +2294,6 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
- case N: \
- yyformat = S; \
- break
-- default: /* Avoid compiler warnings. */
- YYCASE_(0, YY_("syntax error"));
- YYCASE_(1, YY_("syntax error, unexpected %s"));
- YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
-@@ -2615,7 +2610,7 @@ yyreduce:
- switch (yyn)
- {
- case 2:
--#line 325 "parser.y" /* yacc.c:1648 */
-+#line 323 "parser.y" /* yacc.c:1646 */
- { fix_incomplete();
- check_statements((yyvsp[-1].stmt_list), FALSE);
- check_all_user_types((yyvsp[-1].stmt_list));
-@@ -2629,197 +2624,197 @@ yyreduce:
- write_dlldata((yyvsp[-1].stmt_list));
- write_local_stubs((yyvsp[-1].stmt_list));
- }
--#line 2633 "parser.tab.c" /* yacc.c:1648 */
-+#line 2628 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 5:
--#line 342 "parser.y" /* yacc.c:1648 */
-+#line 340 "parser.y" /* yacc.c:1646 */
- { (yyval.stmt_list) = NULL; }
--#line 2639 "parser.tab.c" /* yacc.c:1648 */
-+#line 2634 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 6:
--#line 343 "parser.y" /* yacc.c:1648 */
-+#line 341 "parser.y" /* yacc.c:1646 */
- { push_namespace((yyvsp[-1].str)); }
--#line 2645 "parser.tab.c" /* yacc.c:1648 */
-+#line 2640 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 7:
--#line 344 "parser.y" /* yacc.c:1648 */
-+#line 342 "parser.y" /* yacc.c:1646 */
- { pop_namespace((yyvsp[-4].str)); (yyval.stmt_list) = append_statements((yyvsp[-5].stmt_list), (yyvsp[-1].stmt_list)); }
--#line 2651 "parser.tab.c" /* yacc.c:1648 */
-+#line 2646 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 8:
--#line 345 "parser.y" /* yacc.c:1648 */
-+#line 343 "parser.y" /* yacc.c:1646 */
- { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_reference((yyvsp[0].type))); }
--#line 2657 "parser.tab.c" /* yacc.c:1648 */
-+#line 2652 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 9:
--#line 346 "parser.y" /* yacc.c:1648 */
-+#line 344 "parser.y" /* yacc.c:1646 */
- { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_type_decl((yyvsp[0].type))); }
--#line 2663 "parser.tab.c" /* yacc.c:1648 */
-+#line 2658 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 10:
--#line 347 "parser.y" /* yacc.c:1648 */
-+#line 345 "parser.y" /* yacc.c:1646 */
- { (yyval.stmt_list) = (yyvsp[-2].stmt_list);
- reg_type((yyvsp[-1].type), (yyvsp[-1].type)->name, current_namespace, 0);
- }
--#line 2671 "parser.tab.c" /* yacc.c:1648 */
-+#line 2666 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 11:
--#line 350 "parser.y" /* yacc.c:1648 */
-+#line 348 "parser.y" /* yacc.c:1646 */
- { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_type_decl((yyvsp[0].type)));
- reg_type((yyvsp[0].type), (yyvsp[0].type)->name, current_namespace, 0);
- }
--#line 2679 "parser.tab.c" /* yacc.c:1648 */
-+#line 2674 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 12:
--#line 353 "parser.y" /* yacc.c:1648 */
-+#line 351 "parser.y" /* yacc.c:1646 */
- { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_module((yyvsp[0].type))); }
--#line 2685 "parser.tab.c" /* yacc.c:1648 */
-+#line 2680 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 13:
--#line 354 "parser.y" /* yacc.c:1648 */
-+#line 352 "parser.y" /* yacc.c:1646 */
- { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_library((yyvsp[0].typelib))); }
--#line 2691 "parser.tab.c" /* yacc.c:1648 */
-+#line 2686 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 14:
--#line 355 "parser.y" /* yacc.c:1648 */
-+#line 353 "parser.y" /* yacc.c:1646 */
- { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), (yyvsp[0].statement)); }
--#line 2697 "parser.tab.c" /* yacc.c:1648 */
-+#line 2692 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 15:
--#line 358 "parser.y" /* yacc.c:1648 */
-+#line 356 "parser.y" /* yacc.c:1646 */
- { (yyval.stmt_list) = NULL; }
--#line 2703 "parser.tab.c" /* yacc.c:1648 */
-+#line 2698 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 16:
--#line 359 "parser.y" /* yacc.c:1648 */
-+#line 357 "parser.y" /* yacc.c:1646 */
- { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_reference((yyvsp[0].type))); }
--#line 2709 "parser.tab.c" /* yacc.c:1648 */
-+#line 2704 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 17:
--#line 360 "parser.y" /* yacc.c:1648 */
-+#line 358 "parser.y" /* yacc.c:1646 */
- { push_namespace((yyvsp[-1].str)); }
--#line 2715 "parser.tab.c" /* yacc.c:1648 */
-+#line 2710 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 18:
--#line 361 "parser.y" /* yacc.c:1648 */
-+#line 359 "parser.y" /* yacc.c:1646 */
- { pop_namespace((yyvsp[-4].str)); (yyval.stmt_list) = append_statements((yyvsp[-5].stmt_list), (yyvsp[-1].stmt_list)); }
--#line 2721 "parser.tab.c" /* yacc.c:1648 */
-+#line 2716 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 19:
--#line 362 "parser.y" /* yacc.c:1648 */
-+#line 360 "parser.y" /* yacc.c:1646 */
- { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_type_decl((yyvsp[0].type))); }
--#line 2727 "parser.tab.c" /* yacc.c:1648 */
-+#line 2722 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 20:
--#line 363 "parser.y" /* yacc.c:1648 */
-+#line 361 "parser.y" /* yacc.c:1646 */
- { (yyval.stmt_list) = (yyvsp[-2].stmt_list); reg_type((yyvsp[-1].type), (yyvsp[-1].type)->name, current_namespace, 0); }
--#line 2733 "parser.tab.c" /* yacc.c:1648 */
-+#line 2728 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 21:
--#line 364 "parser.y" /* yacc.c:1648 */
-+#line 362 "parser.y" /* yacc.c:1646 */
- { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_type_decl((yyvsp[0].type)));
- reg_type((yyvsp[0].type), (yyvsp[0].type)->name, current_namespace, 0);
- }
--#line 2741 "parser.tab.c" /* yacc.c:1648 */
-+#line 2736 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 22:
--#line 367 "parser.y" /* yacc.c:1648 */
-+#line 365 "parser.y" /* yacc.c:1646 */
- { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_module((yyvsp[0].type))); }
--#line 2747 "parser.tab.c" /* yacc.c:1648 */
-+#line 2742 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 23:
--#line 368 "parser.y" /* yacc.c:1648 */
-+#line 366 "parser.y" /* yacc.c:1646 */
- { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), (yyvsp[0].statement)); }
--#line 2753 "parser.tab.c" /* yacc.c:1648 */
-+#line 2748 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 24:
--#line 369 "parser.y" /* yacc.c:1648 */
-+#line 367 "parser.y" /* yacc.c:1646 */
- { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_importlib((yyvsp[0].str))); }
--#line 2759 "parser.tab.c" /* yacc.c:1648 */
-+#line 2754 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 25:
--#line 370 "parser.y" /* yacc.c:1648 */
-+#line 368 "parser.y" /* yacc.c:1646 */
- { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_library((yyvsp[0].typelib))); }
--#line 2765 "parser.tab.c" /* yacc.c:1648 */
-+#line 2760 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 26:
--#line 373 "parser.y" /* yacc.c:1648 */
-+#line 371 "parser.y" /* yacc.c:1646 */
- { (yyval.stmt_list) = NULL; }
--#line 2771 "parser.tab.c" /* yacc.c:1648 */
-+#line 2766 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 27:
--#line 374 "parser.y" /* yacc.c:1648 */
-+#line 372 "parser.y" /* yacc.c:1646 */
- { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), (yyvsp[0].statement)); }
--#line 2777 "parser.tab.c" /* yacc.c:1648 */
-+#line 2772 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 30:
--#line 382 "parser.y" /* yacc.c:1648 */
-+#line 380 "parser.y" /* yacc.c:1646 */
- { (yyval.statement) = make_statement_cppquote((yyvsp[0].str)); }
--#line 2783 "parser.tab.c" /* yacc.c:1648 */
-+#line 2778 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 31:
--#line 383 "parser.y" /* yacc.c:1648 */
-+#line 381 "parser.y" /* yacc.c:1646 */
- { (yyval.statement) = make_statement_type_decl((yyvsp[-1].type)); }
--#line 2789 "parser.tab.c" /* yacc.c:1648 */
-+#line 2784 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 32:
--#line 384 "parser.y" /* yacc.c:1648 */
-+#line 382 "parser.y" /* yacc.c:1646 */
- { (yyval.statement) = make_statement_declaration((yyvsp[-1].var)); }
--#line 2795 "parser.tab.c" /* yacc.c:1648 */
-+#line 2790 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 33:
--#line 385 "parser.y" /* yacc.c:1648 */
-+#line 383 "parser.y" /* yacc.c:1646 */
- { (yyval.statement) = make_statement_import((yyvsp[0].str)); }
--#line 2801 "parser.tab.c" /* yacc.c:1648 */
-+#line 2796 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 34:
--#line 386 "parser.y" /* yacc.c:1648 */
-+#line 384 "parser.y" /* yacc.c:1646 */
- { (yyval.statement) = (yyvsp[-1].statement); }
--#line 2807 "parser.tab.c" /* yacc.c:1648 */
-+#line 2802 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 35:
--#line 387 "parser.y" /* yacc.c:1648 */
-+#line 385 "parser.y" /* yacc.c:1646 */
- { (yyval.statement) = make_statement_pragma((yyvsp[0].str)); }
--#line 2813 "parser.tab.c" /* yacc.c:1648 */
-+#line 2808 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 36:
--#line 388 "parser.y" /* yacc.c:1648 */
-+#line 386 "parser.y" /* yacc.c:1646 */
- { (yyval.statement) = NULL; }
--#line 2819 "parser.tab.c" /* yacc.c:1648 */
-+#line 2814 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 37:
--#line 392 "parser.y" /* yacc.c:1648 */
-+#line 390 "parser.y" /* yacc.c:1646 */
- {
- int result;
- (yyval.statement) = NULL;
-@@ -2827,909 +2822,909 @@ yyreduce:
- if(!result)
- error_loc("expected \"disable\" or \"enable\"\n");
- }
--#line 2831 "parser.tab.c" /* yacc.c:1648 */
-+#line 2826 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 38:
--#line 402 "parser.y" /* yacc.c:1648 */
-+#line 400 "parser.y" /* yacc.c:1646 */
- { (yyval.warning_list) = append_warning(NULL, (yyvsp[0].num)); }
--#line 2837 "parser.tab.c" /* yacc.c:1648 */
-+#line 2832 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 39:
--#line 403 "parser.y" /* yacc.c:1648 */
-+#line 401 "parser.y" /* yacc.c:1646 */
- { (yyval.warning_list) = append_warning((yyvsp[-1].warning_list), (yyvsp[0].num)); }
--#line 2843 "parser.tab.c" /* yacc.c:1648 */
-+#line 2838 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 41:
--#line 408 "parser.y" /* yacc.c:1648 */
-+#line 406 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = type_new_enum((yyvsp[0].str), current_namespace, FALSE, NULL); }
--#line 2849 "parser.tab.c" /* yacc.c:1648 */
-+#line 2844 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 43:
--#line 410 "parser.y" /* yacc.c:1648 */
-+#line 408 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = type_new_struct((yyvsp[0].str), current_namespace, FALSE, NULL); }
--#line 2855 "parser.tab.c" /* yacc.c:1648 */
-+#line 2850 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 45:
--#line 412 "parser.y" /* yacc.c:1648 */
-+#line 410 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = type_new_nonencapsulated_union((yyvsp[0].str), FALSE, NULL); }
--#line 2861 "parser.tab.c" /* yacc.c:1648 */
-+#line 2856 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 46:
--#line 413 "parser.y" /* yacc.c:1648 */
-+#line 411 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = (yyvsp[0].type); (yyval.type)->attrs = check_enum_attrs((yyvsp[-1].attr_list)); }
--#line 2867 "parser.tab.c" /* yacc.c:1648 */
-+#line 2862 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 47:
--#line 414 "parser.y" /* yacc.c:1648 */
-+#line 412 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = (yyvsp[0].type); (yyval.type)->attrs = check_struct_attrs((yyvsp[-1].attr_list)); }
--#line 2873 "parser.tab.c" /* yacc.c:1648 */
-+#line 2868 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 48:
--#line 415 "parser.y" /* yacc.c:1648 */
-+#line 413 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = (yyvsp[0].type); (yyval.type)->attrs = check_union_attrs((yyvsp[-1].attr_list)); }
--#line 2879 "parser.tab.c" /* yacc.c:1648 */
-+#line 2874 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 49:
--#line 418 "parser.y" /* yacc.c:1648 */
-+#line 416 "parser.y" /* yacc.c:1646 */
- { (yyval.str) = (yyvsp[-1].str); }
--#line 2885 "parser.tab.c" /* yacc.c:1648 */
-+#line 2880 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 50:
--#line 420 "parser.y" /* yacc.c:1648 */
-+#line 418 "parser.y" /* yacc.c:1646 */
- { assert(yychar == YYEMPTY);
- (yyval.import) = xmalloc(sizeof(struct _import_t));
- (yyval.import)->name = (yyvsp[-1].str);
- (yyval.import)->import_performed = do_import((yyvsp[-1].str));
- if (!(yyval.import)->import_performed) yychar = aEOF;
- }
--#line 2896 "parser.tab.c" /* yacc.c:1648 */
-+#line 2891 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 51:
--#line 428 "parser.y" /* yacc.c:1648 */
-+#line 426 "parser.y" /* yacc.c:1646 */
- { (yyval.str) = (yyvsp[-2].import)->name;
- if ((yyvsp[-2].import)->import_performed) pop_import();
- free((yyvsp[-2].import));
- }
--#line 2905 "parser.tab.c" /* yacc.c:1648 */
-+#line 2900 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 52:
--#line 435 "parser.y" /* yacc.c:1648 */
-+#line 433 "parser.y" /* yacc.c:1646 */
- { (yyval.str) = (yyvsp[-2].str); if(!parse_only) add_importlib((yyvsp[-2].str), current_typelib); }
--#line 2911 "parser.tab.c" /* yacc.c:1648 */
-+#line 2906 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 53:
--#line 438 "parser.y" /* yacc.c:1648 */
-+#line 436 "parser.y" /* yacc.c:1646 */
- { (yyval.str) = (yyvsp[0].str); }
--#line 2917 "parser.tab.c" /* yacc.c:1648 */
-+#line 2912 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 54:
--#line 439 "parser.y" /* yacc.c:1648 */
-+#line 437 "parser.y" /* yacc.c:1646 */
- { (yyval.str) = (yyvsp[0].str); }
--#line 2923 "parser.tab.c" /* yacc.c:1648 */
-+#line 2918 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 55:
--#line 441 "parser.y" /* yacc.c:1648 */
-+#line 439 "parser.y" /* yacc.c:1646 */
- { (yyval.typelib) = make_library((yyvsp[-1].str), check_library_attrs((yyvsp[-1].str), (yyvsp[-2].attr_list)));
- if (!parse_only && do_typelib) current_typelib = (yyval.typelib);
- }
--#line 2931 "parser.tab.c" /* yacc.c:1648 */
-+#line 2926 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 56:
--#line 446 "parser.y" /* yacc.c:1648 */
-+#line 444 "parser.y" /* yacc.c:1646 */
- { (yyval.typelib) = (yyvsp[-3].typelib); (yyval.typelib)->stmts = (yyvsp[-2].stmt_list); }
--#line 2937 "parser.tab.c" /* yacc.c:1648 */
-+#line 2932 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 57:
--#line 449 "parser.y" /* yacc.c:1648 */
-+#line 447 "parser.y" /* yacc.c:1646 */
- { (yyval.var_list) = NULL; }
--#line 2943 "parser.tab.c" /* yacc.c:1648 */
-+#line 2938 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 59:
--#line 453 "parser.y" /* yacc.c:1648 */
-+#line 451 "parser.y" /* yacc.c:1646 */
- { check_arg_attrs((yyvsp[0].var)); (yyval.var_list) = append_var( NULL, (yyvsp[0].var) ); }
--#line 2949 "parser.tab.c" /* yacc.c:1648 */
-+#line 2944 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 60:
--#line 454 "parser.y" /* yacc.c:1648 */
-+#line 452 "parser.y" /* yacc.c:1646 */
- { check_arg_attrs((yyvsp[0].var)); (yyval.var_list) = append_var( (yyvsp[-2].var_list), (yyvsp[0].var) ); }
--#line 2955 "parser.tab.c" /* yacc.c:1648 */
-+#line 2950 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 62:
--#line 458 "parser.y" /* yacc.c:1648 */
-+#line 456 "parser.y" /* yacc.c:1646 */
- { (yyval.var_list) = append_var( (yyvsp[-2].var_list), make_var(strdup("...")) ); }
--#line 2961 "parser.tab.c" /* yacc.c:1648 */
-+#line 2956 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 63:
--#line 462 "parser.y" /* yacc.c:1648 */
-+#line 460 "parser.y" /* yacc.c:1646 */
- { if ((yyvsp[-1].declspec)->stgclass != STG_NONE && (yyvsp[-1].declspec)->stgclass != STG_REGISTER)
- error_loc("invalid storage class for function parameter\n");
- (yyval.var) = declare_var((yyvsp[-2].attr_list), (yyvsp[-1].declspec), (yyvsp[0].declarator), TRUE);
- free((yyvsp[-1].declspec)); free((yyvsp[0].declarator));
- }
--#line 2971 "parser.tab.c" /* yacc.c:1648 */
-+#line 2966 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 64:
--#line 467 "parser.y" /* yacc.c:1648 */
-+#line 465 "parser.y" /* yacc.c:1646 */
- { if ((yyvsp[-1].declspec)->stgclass != STG_NONE && (yyvsp[-1].declspec)->stgclass != STG_REGISTER)
- error_loc("invalid storage class for function parameter\n");
- (yyval.var) = declare_var(NULL, (yyvsp[-1].declspec), (yyvsp[0].declarator), TRUE);
- free((yyvsp[-1].declspec)); free((yyvsp[0].declarator));
- }
--#line 2981 "parser.tab.c" /* yacc.c:1648 */
-+#line 2976 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 65:
--#line 474 "parser.y" /* yacc.c:1648 */
-+#line 472 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = (yyvsp[-1].expr);
- if (!(yyval.expr)->is_const || (yyval.expr)->cval <= 0)
- error_loc("array dimension is not a positive integer constant\n");
- }
--#line 2990 "parser.tab.c" /* yacc.c:1648 */
-+#line 2985 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 66:
--#line 478 "parser.y" /* yacc.c:1648 */
-+#line 476 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = make_expr(EXPR_VOID); }
--#line 2996 "parser.tab.c" /* yacc.c:1648 */
-+#line 2991 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 67:
--#line 479 "parser.y" /* yacc.c:1648 */
-+#line 477 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = make_expr(EXPR_VOID); }
--#line 3002 "parser.tab.c" /* yacc.c:1648 */
-+#line 2997 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 68:
--#line 482 "parser.y" /* yacc.c:1648 */
-+#line 480 "parser.y" /* yacc.c:1646 */
- { (yyval.attr_list) = NULL; }
--#line 3008 "parser.tab.c" /* yacc.c:1648 */
-+#line 3003 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 70:
--#line 487 "parser.y" /* yacc.c:1648 */
-+#line 485 "parser.y" /* yacc.c:1646 */
- { (yyval.attr_list) = (yyvsp[-1].attr_list); }
--#line 3014 "parser.tab.c" /* yacc.c:1648 */
-+#line 3009 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 71:
--#line 490 "parser.y" /* yacc.c:1648 */
-+#line 488 "parser.y" /* yacc.c:1646 */
- { (yyval.attr_list) = append_attr( NULL, (yyvsp[0].attr) ); }
--#line 3020 "parser.tab.c" /* yacc.c:1648 */
-+#line 3015 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 72:
--#line 491 "parser.y" /* yacc.c:1648 */
-+#line 489 "parser.y" /* yacc.c:1646 */
- { (yyval.attr_list) = append_attr( (yyvsp[-2].attr_list), (yyvsp[0].attr) ); }
--#line 3026 "parser.tab.c" /* yacc.c:1648 */
-+#line 3021 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 73:
--#line 492 "parser.y" /* yacc.c:1648 */
-+#line 490 "parser.y" /* yacc.c:1646 */
- { (yyval.attr_list) = append_attr( (yyvsp[-3].attr_list), (yyvsp[0].attr) ); }
--#line 3032 "parser.tab.c" /* yacc.c:1648 */
-+#line 3027 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 74:
--#line 495 "parser.y" /* yacc.c:1648 */
-+#line 493 "parser.y" /* yacc.c:1646 */
- { (yyval.str_list) = append_str( NULL, (yyvsp[0].str) ); }
--#line 3038 "parser.tab.c" /* yacc.c:1648 */
-+#line 3033 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 75:
--#line 496 "parser.y" /* yacc.c:1648 */
-+#line 494 "parser.y" /* yacc.c:1646 */
- { (yyval.str_list) = append_str( (yyvsp[-2].str_list), (yyvsp[0].str) ); }
--#line 3044 "parser.tab.c" /* yacc.c:1648 */
-+#line 3039 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 76:
--#line 499 "parser.y" /* yacc.c:1648 */
-+#line 497 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = NULL; }
--#line 3050 "parser.tab.c" /* yacc.c:1648 */
-+#line 3045 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 77:
--#line 500 "parser.y" /* yacc.c:1648 */
-+#line 498 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_AGGREGATABLE); }
--#line 3056 "parser.tab.c" /* yacc.c:1648 */
-+#line 3051 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 78:
--#line 501 "parser.y" /* yacc.c:1648 */
-+#line 499 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attrp(ATTR_ANNOTATION, (yyvsp[-1].str)); }
--#line 3062 "parser.tab.c" /* yacc.c:1648 */
-+#line 3057 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 79:
--#line 502 "parser.y" /* yacc.c:1648 */
-+#line 500 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_APPOBJECT); }
--#line 3068 "parser.tab.c" /* yacc.c:1648 */
-+#line 3063 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 80:
--#line 503 "parser.y" /* yacc.c:1648 */
-+#line 501 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_ASYNC); }
--#line 3074 "parser.tab.c" /* yacc.c:1648 */
-+#line 3069 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 81:
--#line 504 "parser.y" /* yacc.c:1648 */
-+#line 502 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_AUTO_HANDLE); }
--#line 3080 "parser.tab.c" /* yacc.c:1648 */
-+#line 3075 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 82:
--#line 505 "parser.y" /* yacc.c:1648 */
-+#line 503 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_BINDABLE); }
--#line 3086 "parser.tab.c" /* yacc.c:1648 */
-+#line 3081 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 83:
--#line 506 "parser.y" /* yacc.c:1648 */
-+#line 504 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_BROADCAST); }
--#line 3092 "parser.tab.c" /* yacc.c:1648 */
-+#line 3087 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 84:
--#line 507 "parser.y" /* yacc.c:1648 */
-+#line 505 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attrp(ATTR_CALLAS, (yyvsp[-1].var)); }
--#line 3098 "parser.tab.c" /* yacc.c:1648 */
-+#line 3093 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 85:
--#line 508 "parser.y" /* yacc.c:1648 */
-+#line 506 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attrp(ATTR_CASE, (yyvsp[-1].expr_list)); }
--#line 3104 "parser.tab.c" /* yacc.c:1648 */
-+#line 3099 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 86:
--#line 509 "parser.y" /* yacc.c:1648 */
-+#line 507 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_CODE); }
--#line 3110 "parser.tab.c" /* yacc.c:1648 */
-+#line 3105 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 87:
--#line 510 "parser.y" /* yacc.c:1648 */
-+#line 508 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_COMMSTATUS); }
--#line 3116 "parser.tab.c" /* yacc.c:1648 */
-+#line 3111 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 88:
--#line 511 "parser.y" /* yacc.c:1648 */
-+#line 509 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attrv(ATTR_CONTEXTHANDLE, 0); }
--#line 3122 "parser.tab.c" /* yacc.c:1648 */
-+#line 3117 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 89:
--#line 512 "parser.y" /* yacc.c:1648 */
-+#line 510 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attrv(ATTR_CONTEXTHANDLE, 0); /* RPC_CONTEXT_HANDLE_DONT_SERIALIZE */ }
--#line 3128 "parser.tab.c" /* yacc.c:1648 */
-+#line 3123 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 90:
--#line 513 "parser.y" /* yacc.c:1648 */
-+#line 511 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attrv(ATTR_CONTEXTHANDLE, 0); /* RPC_CONTEXT_HANDLE_SERIALIZE */ }
--#line 3134 "parser.tab.c" /* yacc.c:1648 */
-+#line 3129 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 91:
--#line 514 "parser.y" /* yacc.c:1648 */
-+#line 512 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_CONTROL); }
--#line 3140 "parser.tab.c" /* yacc.c:1648 */
-+#line 3135 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 92:
--#line 515 "parser.y" /* yacc.c:1648 */
-+#line 513 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_DECODE); }
--#line 3146 "parser.tab.c" /* yacc.c:1648 */
-+#line 3141 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 93:
--#line 516 "parser.y" /* yacc.c:1648 */
-+#line 514 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_DEFAULT); }
--#line 3152 "parser.tab.c" /* yacc.c:1648 */
-+#line 3147 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 94:
--#line 517 "parser.y" /* yacc.c:1648 */
-+#line 515 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_DEFAULTBIND); }
--#line 3158 "parser.tab.c" /* yacc.c:1648 */
-+#line 3153 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 95:
--#line 518 "parser.y" /* yacc.c:1648 */
-+#line 516 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_DEFAULTCOLLELEM); }
--#line 3164 "parser.tab.c" /* yacc.c:1648 */
-+#line 3159 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 96:
--#line 519 "parser.y" /* yacc.c:1648 */
-+#line 517 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attrp(ATTR_DEFAULTVALUE, (yyvsp[-1].expr)); }
--#line 3170 "parser.tab.c" /* yacc.c:1648 */
-+#line 3165 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 97:
--#line 520 "parser.y" /* yacc.c:1648 */
-+#line 518 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_DEFAULTVTABLE); }
--#line 3176 "parser.tab.c" /* yacc.c:1648 */
-+#line 3171 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 98:
--#line 521 "parser.y" /* yacc.c:1648 */
-+#line 519 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_DISABLECONSISTENCYCHECK); }
--#line 3182 "parser.tab.c" /* yacc.c:1648 */
-+#line 3177 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 99:
--#line 522 "parser.y" /* yacc.c:1648 */
-+#line 520 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_DISPLAYBIND); }
--#line 3188 "parser.tab.c" /* yacc.c:1648 */
-+#line 3183 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 100:
--#line 523 "parser.y" /* yacc.c:1648 */
-+#line 521 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attrp(ATTR_DLLNAME, (yyvsp[-1].str)); }
--#line 3194 "parser.tab.c" /* yacc.c:1648 */
-+#line 3189 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 101:
--#line 524 "parser.y" /* yacc.c:1648 */
-+#line 522 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_DUAL); }
--#line 3200 "parser.tab.c" /* yacc.c:1648 */
-+#line 3195 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 102:
--#line 525 "parser.y" /* yacc.c:1648 */
-+#line 523 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_ENABLEALLOCATE); }
--#line 3206 "parser.tab.c" /* yacc.c:1648 */
-+#line 3201 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 103:
--#line 526 "parser.y" /* yacc.c:1648 */
-+#line 524 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_ENCODE); }
--#line 3212 "parser.tab.c" /* yacc.c:1648 */
-+#line 3207 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 104:
--#line 527 "parser.y" /* yacc.c:1648 */
-+#line 525 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attrp(ATTR_ENDPOINT, (yyvsp[-1].str_list)); }
--#line 3218 "parser.tab.c" /* yacc.c:1648 */
-+#line 3213 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 105:
--#line 528 "parser.y" /* yacc.c:1648 */
-+#line 526 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attrp(ATTR_ENTRY, (yyvsp[-1].expr)); }
--#line 3224 "parser.tab.c" /* yacc.c:1648 */
-+#line 3219 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 106:
--#line 529 "parser.y" /* yacc.c:1648 */
-+#line 527 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_EXPLICIT_HANDLE); }
--#line 3230 "parser.tab.c" /* yacc.c:1648 */
-+#line 3225 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 107:
--#line 530 "parser.y" /* yacc.c:1648 */
-+#line 528 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_FAULTSTATUS); }
--#line 3236 "parser.tab.c" /* yacc.c:1648 */
-+#line 3231 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 108:
--#line 531 "parser.y" /* yacc.c:1648 */
-+#line 529 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_FORCEALLOCATE); }
--#line 3242 "parser.tab.c" /* yacc.c:1648 */
-+#line 3237 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 109:
--#line 532 "parser.y" /* yacc.c:1648 */
-+#line 530 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_HANDLE); }
--#line 3248 "parser.tab.c" /* yacc.c:1648 */
-+#line 3243 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 110:
--#line 533 "parser.y" /* yacc.c:1648 */
-+#line 531 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attrp(ATTR_HELPCONTEXT, (yyvsp[-1].expr)); }
--#line 3254 "parser.tab.c" /* yacc.c:1648 */
-+#line 3249 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 111:
--#line 534 "parser.y" /* yacc.c:1648 */
-+#line 532 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attrp(ATTR_HELPFILE, (yyvsp[-1].str)); }
--#line 3260 "parser.tab.c" /* yacc.c:1648 */
-+#line 3255 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 112:
--#line 535 "parser.y" /* yacc.c:1648 */
-+#line 533 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attrp(ATTR_HELPSTRING, (yyvsp[-1].str)); }
--#line 3266 "parser.tab.c" /* yacc.c:1648 */
-+#line 3261 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 113:
--#line 536 "parser.y" /* yacc.c:1648 */
-+#line 534 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attrp(ATTR_HELPSTRINGCONTEXT, (yyvsp[-1].expr)); }
--#line 3272 "parser.tab.c" /* yacc.c:1648 */
-+#line 3267 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 114:
--#line 537 "parser.y" /* yacc.c:1648 */
-+#line 535 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attrp(ATTR_HELPSTRINGDLL, (yyvsp[-1].str)); }
--#line 3278 "parser.tab.c" /* yacc.c:1648 */
-+#line 3273 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 115:
--#line 538 "parser.y" /* yacc.c:1648 */
-+#line 536 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_HIDDEN); }
--#line 3284 "parser.tab.c" /* yacc.c:1648 */
-+#line 3279 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 116:
--#line 539 "parser.y" /* yacc.c:1648 */
-+#line 537 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attrp(ATTR_ID, (yyvsp[-1].expr)); }
--#line 3290 "parser.tab.c" /* yacc.c:1648 */
-+#line 3285 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 117:
--#line 540 "parser.y" /* yacc.c:1648 */
-+#line 538 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_IDEMPOTENT); }
--#line 3296 "parser.tab.c" /* yacc.c:1648 */
-+#line 3291 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 118:
--#line 541 "parser.y" /* yacc.c:1648 */
-+#line 539 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_IGNORE); }
--#line 3302 "parser.tab.c" /* yacc.c:1648 */
-+#line 3297 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 119:
--#line 542 "parser.y" /* yacc.c:1648 */
-+#line 540 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attrp(ATTR_IIDIS, (yyvsp[-1].expr)); }
--#line 3308 "parser.tab.c" /* yacc.c:1648 */
-+#line 3303 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 120:
--#line 543 "parser.y" /* yacc.c:1648 */
-+#line 541 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_IMMEDIATEBIND); }
--#line 3314 "parser.tab.c" /* yacc.c:1648 */
-+#line 3309 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 121:
--#line 544 "parser.y" /* yacc.c:1648 */
-+#line 542 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attrp(ATTR_IMPLICIT_HANDLE, (yyvsp[-1].var)); }
--#line 3320 "parser.tab.c" /* yacc.c:1648 */
-+#line 3315 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 122:
--#line 545 "parser.y" /* yacc.c:1648 */
-+#line 543 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_IN); }
--#line 3326 "parser.tab.c" /* yacc.c:1648 */
-+#line 3321 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 123:
--#line 546 "parser.y" /* yacc.c:1648 */
-+#line 544 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_INPUTSYNC); }
--#line 3332 "parser.tab.c" /* yacc.c:1648 */
-+#line 3327 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 124:
--#line 547 "parser.y" /* yacc.c:1648 */
-+#line 545 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attrp(ATTR_LENGTHIS, (yyvsp[-1].expr_list)); }
--#line 3338 "parser.tab.c" /* yacc.c:1648 */
-+#line 3333 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 125:
--#line 548 "parser.y" /* yacc.c:1648 */
-+#line 546 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attrp(ATTR_LIBLCID, (yyvsp[-1].expr)); }
--#line 3344 "parser.tab.c" /* yacc.c:1648 */
-+#line 3339 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 126:
--#line 549 "parser.y" /* yacc.c:1648 */
-+#line 547 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_PARAMLCID); }
--#line 3350 "parser.tab.c" /* yacc.c:1648 */
-+#line 3345 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 127:
--#line 550 "parser.y" /* yacc.c:1648 */
-+#line 548 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_LICENSED); }
--#line 3356 "parser.tab.c" /* yacc.c:1648 */
-+#line 3351 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 128:
--#line 551 "parser.y" /* yacc.c:1648 */
-+#line 549 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_LOCAL); }
--#line 3362 "parser.tab.c" /* yacc.c:1648 */
-+#line 3357 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 129:
--#line 552 "parser.y" /* yacc.c:1648 */
-+#line 550 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_MAYBE); }
--#line 3368 "parser.tab.c" /* yacc.c:1648 */
-+#line 3363 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 130:
--#line 553 "parser.y" /* yacc.c:1648 */
-+#line 551 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_MESSAGE); }
--#line 3374 "parser.tab.c" /* yacc.c:1648 */
-+#line 3369 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 131:
--#line 554 "parser.y" /* yacc.c:1648 */
-+#line 552 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_NOCODE); }
--#line 3380 "parser.tab.c" /* yacc.c:1648 */
-+#line 3375 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 132:
--#line 555 "parser.y" /* yacc.c:1648 */
-+#line 553 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_NONBROWSABLE); }
--#line 3386 "parser.tab.c" /* yacc.c:1648 */
-+#line 3381 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 133:
--#line 556 "parser.y" /* yacc.c:1648 */
-+#line 554 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_NONCREATABLE); }
--#line 3392 "parser.tab.c" /* yacc.c:1648 */
-+#line 3387 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 134:
--#line 557 "parser.y" /* yacc.c:1648 */
-+#line 555 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_NONEXTENSIBLE); }
--#line 3398 "parser.tab.c" /* yacc.c:1648 */
-+#line 3393 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 135:
--#line 558 "parser.y" /* yacc.c:1648 */
-+#line 556 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_NOTIFY); }
--#line 3404 "parser.tab.c" /* yacc.c:1648 */
-+#line 3399 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 136:
--#line 559 "parser.y" /* yacc.c:1648 */
-+#line 557 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_NOTIFYFLAG); }
--#line 3410 "parser.tab.c" /* yacc.c:1648 */
-+#line 3405 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 137:
--#line 560 "parser.y" /* yacc.c:1648 */
-+#line 558 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_OBJECT); }
--#line 3416 "parser.tab.c" /* yacc.c:1648 */
-+#line 3411 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 138:
--#line 561 "parser.y" /* yacc.c:1648 */
-+#line 559 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_ODL); }
--#line 3422 "parser.tab.c" /* yacc.c:1648 */
-+#line 3417 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 139:
--#line 562 "parser.y" /* yacc.c:1648 */
-+#line 560 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_OLEAUTOMATION); }
--#line 3428 "parser.tab.c" /* yacc.c:1648 */
-+#line 3423 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 140:
--#line 563 "parser.y" /* yacc.c:1648 */
-+#line 561 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attrp(ATTR_OPTIMIZE, (yyvsp[-1].str)); }
--#line 3434 "parser.tab.c" /* yacc.c:1648 */
-+#line 3429 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 141:
--#line 564 "parser.y" /* yacc.c:1648 */
-+#line 562 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_OPTIONAL); }
--#line 3440 "parser.tab.c" /* yacc.c:1648 */
-+#line 3435 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 142:
--#line 565 "parser.y" /* yacc.c:1648 */
-+#line 563 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_OUT); }
--#line 3446 "parser.tab.c" /* yacc.c:1648 */
-+#line 3441 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 143:
--#line 566 "parser.y" /* yacc.c:1648 */
-+#line 564 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_PARTIALIGNORE); }
--#line 3452 "parser.tab.c" /* yacc.c:1648 */
-+#line 3447 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 144:
--#line 567 "parser.y" /* yacc.c:1648 */
-+#line 565 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attrv(ATTR_POINTERDEFAULT, (yyvsp[-1].num)); }
--#line 3458 "parser.tab.c" /* yacc.c:1648 */
-+#line 3453 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 145:
--#line 568 "parser.y" /* yacc.c:1648 */
-+#line 566 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attrp(ATTR_PROGID, (yyvsp[-1].str)); }
--#line 3464 "parser.tab.c" /* yacc.c:1648 */
-+#line 3459 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 146:
--#line 569 "parser.y" /* yacc.c:1648 */
-+#line 567 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_PROPGET); }
--#line 3470 "parser.tab.c" /* yacc.c:1648 */
-+#line 3465 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 147:
--#line 570 "parser.y" /* yacc.c:1648 */
-+#line 568 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_PROPPUT); }
--#line 3476 "parser.tab.c" /* yacc.c:1648 */
-+#line 3471 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 148:
--#line 571 "parser.y" /* yacc.c:1648 */
-+#line 569 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_PROPPUTREF); }
--#line 3482 "parser.tab.c" /* yacc.c:1648 */
-+#line 3477 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 149:
--#line 572 "parser.y" /* yacc.c:1648 */
-+#line 570 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_PROXY); }
--#line 3488 "parser.tab.c" /* yacc.c:1648 */
-+#line 3483 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 150:
--#line 573 "parser.y" /* yacc.c:1648 */
-+#line 571 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_PUBLIC); }
--#line 3494 "parser.tab.c" /* yacc.c:1648 */
-+#line 3489 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 151:
--#line 575 "parser.y" /* yacc.c:1648 */
-+#line 573 "parser.y" /* yacc.c:1646 */
- { expr_list_t *list = append_expr( NULL, (yyvsp[-3].expr) );
- list = append_expr( list, (yyvsp[-1].expr) );
- (yyval.attr) = make_attrp(ATTR_RANGE, list); }
--#line 3502 "parser.tab.c" /* yacc.c:1648 */
-+#line 3497 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 152:
--#line 578 "parser.y" /* yacc.c:1648 */
-+#line 576 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_READONLY); }
--#line 3508 "parser.tab.c" /* yacc.c:1648 */
-+#line 3503 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 153:
--#line 579 "parser.y" /* yacc.c:1648 */
-+#line 577 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attrp(ATTR_REPRESENTAS, (yyvsp[-1].type)); }
--#line 3514 "parser.tab.c" /* yacc.c:1648 */
-+#line 3509 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 154:
--#line 580 "parser.y" /* yacc.c:1648 */
-+#line 578 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_REQUESTEDIT); }
--#line 3520 "parser.tab.c" /* yacc.c:1648 */
-+#line 3515 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 155:
--#line 581 "parser.y" /* yacc.c:1648 */
-+#line 579 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_RESTRICTED); }
--#line 3526 "parser.tab.c" /* yacc.c:1648 */
-+#line 3521 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 156:
--#line 582 "parser.y" /* yacc.c:1648 */
-+#line 580 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_RETVAL); }
--#line 3532 "parser.tab.c" /* yacc.c:1648 */
-+#line 3527 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 157:
--#line 583 "parser.y" /* yacc.c:1648 */
-+#line 581 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attrp(ATTR_SIZEIS, (yyvsp[-1].expr_list)); }
--#line 3538 "parser.tab.c" /* yacc.c:1648 */
-+#line 3533 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 158:
--#line 584 "parser.y" /* yacc.c:1648 */
-+#line 582 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_SOURCE); }
--#line 3544 "parser.tab.c" /* yacc.c:1648 */
-+#line 3539 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 159:
--#line 585 "parser.y" /* yacc.c:1648 */
-+#line 583 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_STRICTCONTEXTHANDLE); }
--#line 3550 "parser.tab.c" /* yacc.c:1648 */
-+#line 3545 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 160:
--#line 586 "parser.y" /* yacc.c:1648 */
-+#line 584 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_STRING); }
--#line 3556 "parser.tab.c" /* yacc.c:1648 */
-+#line 3551 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 161:
--#line 587 "parser.y" /* yacc.c:1648 */
-+#line 585 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attrp(ATTR_SWITCHIS, (yyvsp[-1].expr)); }
--#line 3562 "parser.tab.c" /* yacc.c:1648 */
-+#line 3557 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 162:
--#line 588 "parser.y" /* yacc.c:1648 */
-+#line 586 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attrp(ATTR_SWITCHTYPE, (yyvsp[-1].type)); }
--#line 3568 "parser.tab.c" /* yacc.c:1648 */
-+#line 3563 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 163:
--#line 589 "parser.y" /* yacc.c:1648 */
-+#line 587 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attrp(ATTR_TRANSMITAS, (yyvsp[-1].type)); }
--#line 3574 "parser.tab.c" /* yacc.c:1648 */
-+#line 3569 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 164:
--#line 590 "parser.y" /* yacc.c:1648 */
-+#line 588 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attrv(ATTR_THREADING, (yyvsp[-1].num)); }
--#line 3580 "parser.tab.c" /* yacc.c:1648 */
-+#line 3575 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 165:
--#line 591 "parser.y" /* yacc.c:1648 */
-+#line 589 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_UIDEFAULT); }
--#line 3586 "parser.tab.c" /* yacc.c:1648 */
-+#line 3581 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 166:
--#line 592 "parser.y" /* yacc.c:1648 */
-+#line 590 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_USESGETLASTERROR); }
--#line 3592 "parser.tab.c" /* yacc.c:1648 */
-+#line 3587 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 167:
--#line 593 "parser.y" /* yacc.c:1648 */
-+#line 591 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attrp(ATTR_USERMARSHAL, (yyvsp[-1].type)); }
--#line 3598 "parser.tab.c" /* yacc.c:1648 */
-+#line 3593 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 168:
--#line 594 "parser.y" /* yacc.c:1648 */
-+#line 592 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attrp(ATTR_UUID, (yyvsp[-1].uuid)); }
--#line 3604 "parser.tab.c" /* yacc.c:1648 */
-+#line 3599 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 169:
--#line 595 "parser.y" /* yacc.c:1648 */
-+#line 593 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attrp(ATTR_ASYNCUUID, (yyvsp[-1].uuid)); }
--#line 3610 "parser.tab.c" /* yacc.c:1648 */
-+#line 3605 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 170:
--#line 596 "parser.y" /* yacc.c:1648 */
-+#line 594 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_V1ENUM); }
--#line 3616 "parser.tab.c" /* yacc.c:1648 */
-+#line 3611 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 171:
--#line 597 "parser.y" /* yacc.c:1648 */
-+#line 595 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_VARARG); }
--#line 3622 "parser.tab.c" /* yacc.c:1648 */
-+#line 3617 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 172:
--#line 598 "parser.y" /* yacc.c:1648 */
-+#line 596 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attrv(ATTR_VERSION, (yyvsp[-1].num)); }
--#line 3628 "parser.tab.c" /* yacc.c:1648 */
-+#line 3623 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 173:
--#line 599 "parser.y" /* yacc.c:1648 */
-+#line 597 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attrp(ATTR_VIPROGID, (yyvsp[-1].str)); }
--#line 3634 "parser.tab.c" /* yacc.c:1648 */
-+#line 3629 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 174:
--#line 600 "parser.y" /* yacc.c:1648 */
-+#line 598 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attrp(ATTR_WIREMARSHAL, (yyvsp[-1].type)); }
--#line 3640 "parser.tab.c" /* yacc.c:1648 */
-+#line 3635 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 175:
--#line 601 "parser.y" /* yacc.c:1648 */
-+#line 599 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attrv(ATTR_POINTERTYPE, (yyvsp[0].num)); }
--#line 3646 "parser.tab.c" /* yacc.c:1648 */
-+#line 3641 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 177:
--#line 606 "parser.y" /* yacc.c:1648 */
-+#line 604 "parser.y" /* yacc.c:1646 */
- { if (!is_valid_uuid((yyvsp[0].str)))
- error_loc("invalid UUID: %s\n", (yyvsp[0].str));
- (yyval.uuid) = parse_uuid((yyvsp[0].str)); }
--#line 3654 "parser.tab.c" /* yacc.c:1648 */
-+#line 3649 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 178:
--#line 611 "parser.y" /* yacc.c:1648 */
-+#line 609 "parser.y" /* yacc.c:1646 */
- { (yyval.str) = xstrdup("__cdecl"); }
--#line 3660 "parser.tab.c" /* yacc.c:1648 */
-+#line 3655 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 179:
--#line 612 "parser.y" /* yacc.c:1648 */
-+#line 610 "parser.y" /* yacc.c:1646 */
- { (yyval.str) = xstrdup("__fastcall"); }
--#line 3666 "parser.tab.c" /* yacc.c:1648 */
-+#line 3661 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 180:
--#line 613 "parser.y" /* yacc.c:1648 */
-+#line 611 "parser.y" /* yacc.c:1646 */
- { (yyval.str) = xstrdup("__pascal"); }
--#line 3672 "parser.tab.c" /* yacc.c:1648 */
-+#line 3667 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 181:
--#line 614 "parser.y" /* yacc.c:1648 */
-+#line 612 "parser.y" /* yacc.c:1646 */
- { (yyval.str) = xstrdup("__stdcall"); }
--#line 3678 "parser.tab.c" /* yacc.c:1648 */
-+#line 3673 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 182:
--#line 617 "parser.y" /* yacc.c:1648 */
-+#line 615 "parser.y" /* yacc.c:1646 */
- { (yyval.var_list) = NULL; }
--#line 3684 "parser.tab.c" /* yacc.c:1648 */
-+#line 3679 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 183:
--#line 618 "parser.y" /* yacc.c:1648 */
-+#line 616 "parser.y" /* yacc.c:1646 */
- { (yyval.var_list) = append_var( (yyvsp[-1].var_list), (yyvsp[0].var) ); }
--#line 3690 "parser.tab.c" /* yacc.c:1648 */
-+#line 3685 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 184:
--#line 621 "parser.y" /* yacc.c:1648 */
-+#line 619 "parser.y" /* yacc.c:1646 */
- { attr_t *a = make_attrp(ATTR_CASE, append_expr( NULL, (yyvsp[-2].expr) ));
- (yyval.var) = (yyvsp[0].var); if (!(yyval.var)) (yyval.var) = make_var(NULL);
- (yyval.var)->attrs = append_attr( (yyval.var)->attrs, a );
- }
--#line 3699 "parser.tab.c" /* yacc.c:1648 */
-+#line 3694 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 185:
--#line 625 "parser.y" /* yacc.c:1648 */
-+#line 623 "parser.y" /* yacc.c:1646 */
- { attr_t *a = make_attr(ATTR_DEFAULT);
- (yyval.var) = (yyvsp[0].var); if (!(yyval.var)) (yyval.var) = make_var(NULL);
- (yyval.var)->attrs = append_attr( (yyval.var)->attrs, a );
- }
--#line 3708 "parser.tab.c" /* yacc.c:1648 */
-+#line 3703 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 186:
--#line 631 "parser.y" /* yacc.c:1648 */
-+#line 629 "parser.y" /* yacc.c:1646 */
- { (yyval.var_list) = NULL; }
--#line 3714 "parser.tab.c" /* yacc.c:1648 */
-+#line 3709 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 187:
--#line 632 "parser.y" /* yacc.c:1648 */
-+#line 630 "parser.y" /* yacc.c:1646 */
- { (yyval.var_list) = (yyvsp[-1].var_list); }
--#line 3720 "parser.tab.c" /* yacc.c:1648 */
-+#line 3715 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 189:
--#line 636 "parser.y" /* yacc.c:1648 */
-+#line 634 "parser.y" /* yacc.c:1646 */
- { if (!(yyvsp[0].var)->eval)
- (yyvsp[0].var)->eval = make_exprl(EXPR_NUM, 0 /* default for first enum entry */);
- (yyval.var_list) = append_var( NULL, (yyvsp[0].var) );
- }
--#line 3729 "parser.tab.c" /* yacc.c:1648 */
-+#line 3724 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 190:
--#line 640 "parser.y" /* yacc.c:1648 */
-+#line 638 "parser.y" /* yacc.c:1646 */
- { if (!(yyvsp[0].var)->eval)
- {
- var_t *last = LIST_ENTRY( list_tail((yyval.var_list)), var_t, entry );
-@@ -3740,656 +3735,656 @@ yyreduce:
- }
- (yyval.var_list) = append_var( (yyvsp[-2].var_list), (yyvsp[0].var) );
- }
--#line 3744 "parser.tab.c" /* yacc.c:1648 */
-+#line 3739 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 191:
--#line 652 "parser.y" /* yacc.c:1648 */
-+#line 650 "parser.y" /* yacc.c:1646 */
- { (yyval.var) = reg_const((yyvsp[-2].var));
- (yyval.var)->eval = (yyvsp[0].expr);
-- (yyval.var)->type = type_new_int(TYPE_BASIC_INT, 0);
-+ (yyval.var)->declspec.type = type_new_int(TYPE_BASIC_INT, 0);
- }
--#line 3753 "parser.tab.c" /* yacc.c:1648 */
-+#line 3748 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 192:
--#line 656 "parser.y" /* yacc.c:1648 */
-+#line 654 "parser.y" /* yacc.c:1646 */
- { (yyval.var) = reg_const((yyvsp[0].var));
-- (yyval.var)->type = type_new_int(TYPE_BASIC_INT, 0);
-+ (yyval.var)->declspec.type = type_new_int(TYPE_BASIC_INT, 0);
- }
--#line 3761 "parser.tab.c" /* yacc.c:1648 */
-+#line 3756 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 193:
--#line 661 "parser.y" /* yacc.c:1648 */
-+#line 659 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = type_new_enum((yyvsp[-3].str), current_namespace, TRUE, (yyvsp[-1].var_list)); }
--#line 3767 "parser.tab.c" /* yacc.c:1648 */
-+#line 3762 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 194:
--#line 664 "parser.y" /* yacc.c:1648 */
-+#line 662 "parser.y" /* yacc.c:1646 */
- { (yyval.expr_list) = append_expr( NULL, (yyvsp[0].expr) ); }
--#line 3773 "parser.tab.c" /* yacc.c:1648 */
-+#line 3768 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 195:
--#line 665 "parser.y" /* yacc.c:1648 */
-+#line 663 "parser.y" /* yacc.c:1646 */
- { (yyval.expr_list) = append_expr( (yyvsp[-2].expr_list), (yyvsp[0].expr) ); }
--#line 3779 "parser.tab.c" /* yacc.c:1648 */
-+#line 3774 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 196:
--#line 668 "parser.y" /* yacc.c:1648 */
-+#line 666 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = make_expr(EXPR_VOID); }
--#line 3785 "parser.tab.c" /* yacc.c:1648 */
-+#line 3780 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 198:
--#line 672 "parser.y" /* yacc.c:1648 */
-+#line 670 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = make_exprl(EXPR_NUM, (yyvsp[0].num)); }
--#line 3791 "parser.tab.c" /* yacc.c:1648 */
-+#line 3786 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 199:
--#line 673 "parser.y" /* yacc.c:1648 */
-+#line 671 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = make_exprl(EXPR_HEXNUM, (yyvsp[0].num)); }
--#line 3797 "parser.tab.c" /* yacc.c:1648 */
-+#line 3792 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 200:
--#line 674 "parser.y" /* yacc.c:1648 */
-+#line 672 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = make_exprd(EXPR_DOUBLE, (yyvsp[0].dbl)); }
--#line 3803 "parser.tab.c" /* yacc.c:1648 */
-+#line 3798 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 201:
--#line 675 "parser.y" /* yacc.c:1648 */
-+#line 673 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = make_exprl(EXPR_TRUEFALSE, 0); }
--#line 3809 "parser.tab.c" /* yacc.c:1648 */
-+#line 3804 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 202:
--#line 676 "parser.y" /* yacc.c:1648 */
-+#line 674 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = make_exprl(EXPR_NUM, 0); }
--#line 3815 "parser.tab.c" /* yacc.c:1648 */
-+#line 3810 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 203:
--#line 677 "parser.y" /* yacc.c:1648 */
-+#line 675 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = make_exprl(EXPR_TRUEFALSE, 1); }
--#line 3821 "parser.tab.c" /* yacc.c:1648 */
-+#line 3816 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 204:
--#line 678 "parser.y" /* yacc.c:1648 */
-+#line 676 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = make_exprs(EXPR_STRLIT, (yyvsp[0].str)); }
--#line 3827 "parser.tab.c" /* yacc.c:1648 */
-+#line 3822 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 205:
--#line 679 "parser.y" /* yacc.c:1648 */
-+#line 677 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = make_exprs(EXPR_WSTRLIT, (yyvsp[0].str)); }
--#line 3833 "parser.tab.c" /* yacc.c:1648 */
-+#line 3828 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 206:
--#line 680 "parser.y" /* yacc.c:1648 */
-+#line 678 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = make_exprs(EXPR_CHARCONST, (yyvsp[0].str)); }
--#line 3839 "parser.tab.c" /* yacc.c:1648 */
-+#line 3834 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 207:
--#line 681 "parser.y" /* yacc.c:1648 */
-+#line 679 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = make_exprs(EXPR_IDENTIFIER, (yyvsp[0].str)); }
--#line 3845 "parser.tab.c" /* yacc.c:1648 */
-+#line 3840 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 208:
--#line 682 "parser.y" /* yacc.c:1648 */
-+#line 680 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = make_expr3(EXPR_COND, (yyvsp[-4].expr), (yyvsp[-2].expr), (yyvsp[0].expr)); }
--#line 3851 "parser.tab.c" /* yacc.c:1648 */
-+#line 3846 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 209:
--#line 683 "parser.y" /* yacc.c:1648 */
-+#line 681 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = make_expr2(EXPR_LOGOR, (yyvsp[-2].expr), (yyvsp[0].expr)); }
--#line 3857 "parser.tab.c" /* yacc.c:1648 */
-+#line 3852 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 210:
--#line 684 "parser.y" /* yacc.c:1648 */
-+#line 682 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = make_expr2(EXPR_LOGAND, (yyvsp[-2].expr), (yyvsp[0].expr)); }
--#line 3863 "parser.tab.c" /* yacc.c:1648 */
-+#line 3858 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 211:
--#line 685 "parser.y" /* yacc.c:1648 */
-+#line 683 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = make_expr2(EXPR_OR , (yyvsp[-2].expr), (yyvsp[0].expr)); }
--#line 3869 "parser.tab.c" /* yacc.c:1648 */
-+#line 3864 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 212:
--#line 686 "parser.y" /* yacc.c:1648 */
-+#line 684 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = make_expr2(EXPR_XOR, (yyvsp[-2].expr), (yyvsp[0].expr)); }
--#line 3875 "parser.tab.c" /* yacc.c:1648 */
-+#line 3870 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 213:
--#line 687 "parser.y" /* yacc.c:1648 */
-+#line 685 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = make_expr2(EXPR_AND, (yyvsp[-2].expr), (yyvsp[0].expr)); }
--#line 3881 "parser.tab.c" /* yacc.c:1648 */
-+#line 3876 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 214:
--#line 688 "parser.y" /* yacc.c:1648 */
-+#line 686 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = make_expr2(EXPR_EQUALITY, (yyvsp[-2].expr), (yyvsp[0].expr)); }
--#line 3887 "parser.tab.c" /* yacc.c:1648 */
-+#line 3882 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 215:
--#line 689 "parser.y" /* yacc.c:1648 */
-+#line 687 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = make_expr2(EXPR_INEQUALITY, (yyvsp[-2].expr), (yyvsp[0].expr)); }
--#line 3893 "parser.tab.c" /* yacc.c:1648 */
-+#line 3888 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 216:
--#line 690 "parser.y" /* yacc.c:1648 */
-+#line 688 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = make_expr2(EXPR_GTR, (yyvsp[-2].expr), (yyvsp[0].expr)); }
--#line 3899 "parser.tab.c" /* yacc.c:1648 */
-+#line 3894 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 217:
--#line 691 "parser.y" /* yacc.c:1648 */
-+#line 689 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = make_expr2(EXPR_LESS, (yyvsp[-2].expr), (yyvsp[0].expr)); }
--#line 3905 "parser.tab.c" /* yacc.c:1648 */
-+#line 3900 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 218:
--#line 692 "parser.y" /* yacc.c:1648 */
-+#line 690 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = make_expr2(EXPR_GTREQL, (yyvsp[-2].expr), (yyvsp[0].expr)); }
--#line 3911 "parser.tab.c" /* yacc.c:1648 */
-+#line 3906 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 219:
--#line 693 "parser.y" /* yacc.c:1648 */
-+#line 691 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = make_expr2(EXPR_LESSEQL, (yyvsp[-2].expr), (yyvsp[0].expr)); }
--#line 3917 "parser.tab.c" /* yacc.c:1648 */
-+#line 3912 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 220:
--#line 694 "parser.y" /* yacc.c:1648 */
-+#line 692 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = make_expr2(EXPR_SHL, (yyvsp[-2].expr), (yyvsp[0].expr)); }
--#line 3923 "parser.tab.c" /* yacc.c:1648 */
-+#line 3918 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 221:
--#line 695 "parser.y" /* yacc.c:1648 */
-+#line 693 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = make_expr2(EXPR_SHR, (yyvsp[-2].expr), (yyvsp[0].expr)); }
--#line 3929 "parser.tab.c" /* yacc.c:1648 */
-+#line 3924 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 222:
--#line 696 "parser.y" /* yacc.c:1648 */
-+#line 694 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = make_expr2(EXPR_ADD, (yyvsp[-2].expr), (yyvsp[0].expr)); }
--#line 3935 "parser.tab.c" /* yacc.c:1648 */
-+#line 3930 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 223:
--#line 697 "parser.y" /* yacc.c:1648 */
-+#line 695 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = make_expr2(EXPR_SUB, (yyvsp[-2].expr), (yyvsp[0].expr)); }
--#line 3941 "parser.tab.c" /* yacc.c:1648 */
-+#line 3936 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 224:
--#line 698 "parser.y" /* yacc.c:1648 */
-+#line 696 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = make_expr2(EXPR_MOD, (yyvsp[-2].expr), (yyvsp[0].expr)); }
--#line 3947 "parser.tab.c" /* yacc.c:1648 */
-+#line 3942 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 225:
--#line 699 "parser.y" /* yacc.c:1648 */
-+#line 697 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = make_expr2(EXPR_MUL, (yyvsp[-2].expr), (yyvsp[0].expr)); }
--#line 3953 "parser.tab.c" /* yacc.c:1648 */
-+#line 3948 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 226:
--#line 700 "parser.y" /* yacc.c:1648 */
-+#line 698 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = make_expr2(EXPR_DIV, (yyvsp[-2].expr), (yyvsp[0].expr)); }
--#line 3959 "parser.tab.c" /* yacc.c:1648 */
-+#line 3954 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 227:
--#line 701 "parser.y" /* yacc.c:1648 */
-+#line 699 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = make_expr1(EXPR_LOGNOT, (yyvsp[0].expr)); }
--#line 3965 "parser.tab.c" /* yacc.c:1648 */
-+#line 3960 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 228:
--#line 702 "parser.y" /* yacc.c:1648 */
-+#line 700 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = make_expr1(EXPR_NOT, (yyvsp[0].expr)); }
--#line 3971 "parser.tab.c" /* yacc.c:1648 */
-+#line 3966 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 229:
--#line 703 "parser.y" /* yacc.c:1648 */
-+#line 701 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = make_expr1(EXPR_POS, (yyvsp[0].expr)); }
--#line 3977 "parser.tab.c" /* yacc.c:1648 */
-+#line 3972 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 230:
--#line 704 "parser.y" /* yacc.c:1648 */
-+#line 702 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = make_expr1(EXPR_NEG, (yyvsp[0].expr)); }
--#line 3983 "parser.tab.c" /* yacc.c:1648 */
-+#line 3978 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 231:
--#line 705 "parser.y" /* yacc.c:1648 */
-+#line 703 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = make_expr1(EXPR_ADDRESSOF, (yyvsp[0].expr)); }
--#line 3989 "parser.tab.c" /* yacc.c:1648 */
-+#line 3984 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 232:
--#line 706 "parser.y" /* yacc.c:1648 */
-+#line 704 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = make_expr1(EXPR_PPTR, (yyvsp[0].expr)); }
--#line 3995 "parser.tab.c" /* yacc.c:1648 */
-+#line 3990 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 233:
--#line 707 "parser.y" /* yacc.c:1648 */
-+#line 705 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = make_expr2(EXPR_MEMBER, make_expr1(EXPR_PPTR, (yyvsp[-2].expr)), make_exprs(EXPR_IDENTIFIER, (yyvsp[0].str))); }
--#line 4001 "parser.tab.c" /* yacc.c:1648 */
-+#line 3996 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 234:
--#line 708 "parser.y" /* yacc.c:1648 */
-+#line 706 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = make_expr2(EXPR_MEMBER, (yyvsp[-2].expr), make_exprs(EXPR_IDENTIFIER, (yyvsp[0].str))); }
--#line 4007 "parser.tab.c" /* yacc.c:1648 */
-+#line 4002 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 235:
--#line 710 "parser.y" /* yacc.c:1648 */
-+#line 708 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = make_exprt(EXPR_CAST, declare_var(NULL, (yyvsp[-3].declspec), (yyvsp[-2].declarator), 0), (yyvsp[0].expr)); free((yyvsp[-3].declspec)); free((yyvsp[-2].declarator)); }
--#line 4013 "parser.tab.c" /* yacc.c:1648 */
-+#line 4008 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 236:
--#line 712 "parser.y" /* yacc.c:1648 */
-+#line 710 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = make_exprt(EXPR_SIZEOF, declare_var(NULL, (yyvsp[-2].declspec), (yyvsp[-1].declarator), 0), NULL); free((yyvsp[-2].declspec)); free((yyvsp[-1].declarator)); }
--#line 4019 "parser.tab.c" /* yacc.c:1648 */
-+#line 4014 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 237:
--#line 713 "parser.y" /* yacc.c:1648 */
-+#line 711 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = make_expr2(EXPR_ARRAY, (yyvsp[-3].expr), (yyvsp[-1].expr)); }
--#line 4025 "parser.tab.c" /* yacc.c:1648 */
-+#line 4020 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 238:
--#line 714 "parser.y" /* yacc.c:1648 */
-+#line 712 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = (yyvsp[-1].expr); }
--#line 4031 "parser.tab.c" /* yacc.c:1648 */
-+#line 4026 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 239:
--#line 717 "parser.y" /* yacc.c:1648 */
-+#line 715 "parser.y" /* yacc.c:1646 */
- { (yyval.expr_list) = append_expr( NULL, (yyvsp[0].expr) ); }
--#line 4037 "parser.tab.c" /* yacc.c:1648 */
-+#line 4032 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 240:
--#line 718 "parser.y" /* yacc.c:1648 */
-+#line 716 "parser.y" /* yacc.c:1646 */
- { (yyval.expr_list) = append_expr( (yyvsp[-2].expr_list), (yyvsp[0].expr) ); }
--#line 4043 "parser.tab.c" /* yacc.c:1648 */
-+#line 4038 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 241:
--#line 721 "parser.y" /* yacc.c:1648 */
-+#line 719 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = (yyvsp[0].expr);
- if (!(yyval.expr)->is_const)
- error_loc("expression is not an integer constant\n");
- }
--#line 4052 "parser.tab.c" /* yacc.c:1648 */
-+#line 4047 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 242:
--#line 727 "parser.y" /* yacc.c:1648 */
-+#line 725 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = (yyvsp[0].expr);
- if (!(yyval.expr)->is_const && (yyval.expr)->type != EXPR_STRLIT && (yyval.expr)->type != EXPR_WSTRLIT)
- error_loc("expression is not constant\n");
- }
--#line 4061 "parser.tab.c" /* yacc.c:1648 */
-+#line 4056 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 243:
--#line 733 "parser.y" /* yacc.c:1648 */
-+#line 731 "parser.y" /* yacc.c:1646 */
- { (yyval.var_list) = NULL; }
--#line 4067 "parser.tab.c" /* yacc.c:1648 */
-+#line 4062 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 244:
--#line 734 "parser.y" /* yacc.c:1648 */
-+#line 732 "parser.y" /* yacc.c:1646 */
- { (yyval.var_list) = append_var_list((yyvsp[-1].var_list), (yyvsp[0].var_list)); }
--#line 4073 "parser.tab.c" /* yacc.c:1648 */
-+#line 4068 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 245:
--#line 738 "parser.y" /* yacc.c:1648 */
-+#line 736 "parser.y" /* yacc.c:1646 */
- { const char *first = LIST_ENTRY(list_head((yyvsp[-1].declarator_list)), declarator_t, entry)->var->name;
- check_field_attrs(first, (yyvsp[-3].attr_list));
- (yyval.var_list) = set_var_types((yyvsp[-3].attr_list), (yyvsp[-2].declspec), (yyvsp[-1].declarator_list));
- }
--#line 4082 "parser.tab.c" /* yacc.c:1648 */
-+#line 4077 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 246:
--#line 742 "parser.y" /* yacc.c:1648 */
-+#line 740 "parser.y" /* yacc.c:1646 */
- { var_t *v = make_var(NULL);
-- v->type = (yyvsp[-1].type); v->attrs = (yyvsp[-2].attr_list);
-+ v->declspec.type = (yyvsp[-1].type); v->attrs = (yyvsp[-2].attr_list);
- (yyval.var_list) = append_var(NULL, v);
- }
--#line 4091 "parser.tab.c" /* yacc.c:1648 */
-+#line 4086 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 247:
--#line 749 "parser.y" /* yacc.c:1648 */
-+#line 747 "parser.y" /* yacc.c:1646 */
- { (yyval.var) = (yyvsp[-1].var); }
--#line 4097 "parser.tab.c" /* yacc.c:1648 */
-+#line 4092 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 248:
--#line 750 "parser.y" /* yacc.c:1648 */
-+#line 748 "parser.y" /* yacc.c:1646 */
- { (yyval.var) = make_var(NULL); (yyval.var)->attrs = (yyvsp[-1].attr_list); }
--#line 4103 "parser.tab.c" /* yacc.c:1648 */
-+#line 4098 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 249:
--#line 753 "parser.y" /* yacc.c:1648 */
-+#line 751 "parser.y" /* yacc.c:1646 */
- { (yyval.var_list) = NULL; }
--#line 4109 "parser.tab.c" /* yacc.c:1648 */
-+#line 4104 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 250:
--#line 754 "parser.y" /* yacc.c:1648 */
-+#line 752 "parser.y" /* yacc.c:1646 */
- { (yyval.var_list) = append_var( (yyvsp[-1].var_list), (yyvsp[0].var) ); }
--#line 4115 "parser.tab.c" /* yacc.c:1648 */
-+#line 4110 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 251:
--#line 758 "parser.y" /* yacc.c:1648 */
-+#line 756 "parser.y" /* yacc.c:1646 */
- { (yyval.var) = (yyvsp[-1].var); }
--#line 4121 "parser.tab.c" /* yacc.c:1648 */
-+#line 4116 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 252:
--#line 759 "parser.y" /* yacc.c:1648 */
-+#line 757 "parser.y" /* yacc.c:1646 */
- { (yyval.var) = NULL; }
--#line 4127 "parser.tab.c" /* yacc.c:1648 */
-+#line 4122 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 253:
--#line 762 "parser.y" /* yacc.c:1648 */
-+#line 760 "parser.y" /* yacc.c:1646 */
- { (yyval.var) = declare_var(check_field_attrs((yyvsp[0].declarator)->var->name, (yyvsp[-2].attr_list)),
- (yyvsp[-1].declspec), (yyvsp[0].declarator), FALSE);
- free((yyvsp[0].declarator));
- }
--#line 4136 "parser.tab.c" /* yacc.c:1648 */
-+#line 4131 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 254:
--#line 766 "parser.y" /* yacc.c:1648 */
-+#line 764 "parser.y" /* yacc.c:1646 */
- { var_t *v = make_var(NULL);
-- v->type = (yyvsp[0].type); v->attrs = (yyvsp[-1].attr_list);
-+ v->declspec.type = (yyvsp[0].type); v->attrs = (yyvsp[-1].attr_list);
- (yyval.var) = v;
- }
--#line 4145 "parser.tab.c" /* yacc.c:1648 */
-+#line 4140 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 255:
--#line 772 "parser.y" /* yacc.c:1648 */
-+#line 770 "parser.y" /* yacc.c:1646 */
- { (yyval.var) = (yyvsp[0].var);
-- if (type_get_type((yyval.var)->type) != TYPE_FUNCTION)
-+ if (type_get_type((yyval.var)->declspec.type) != TYPE_FUNCTION)
- error_loc("only methods may be declared inside the methods section of a dispinterface\n");
- check_function_attrs((yyval.var)->name, (yyval.var)->attrs);
- }
--#line 4155 "parser.tab.c" /* yacc.c:1648 */
-+#line 4150 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 256:
--#line 781 "parser.y" /* yacc.c:1648 */
-+#line 779 "parser.y" /* yacc.c:1646 */
- { (yyval.var) = declare_var((yyvsp[-2].attr_list), (yyvsp[-1].declspec), (yyvsp[0].declarator), FALSE);
- free((yyvsp[0].declarator));
- }
--#line 4163 "parser.tab.c" /* yacc.c:1648 */
-+#line 4158 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 257:
--#line 784 "parser.y" /* yacc.c:1648 */
-+#line 782 "parser.y" /* yacc.c:1646 */
- { (yyval.var) = declare_var(NULL, (yyvsp[-1].declspec), (yyvsp[0].declarator), FALSE);
- free((yyvsp[0].declarator));
- }
--#line 4171 "parser.tab.c" /* yacc.c:1648 */
-+#line 4166 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 258:
--#line 789 "parser.y" /* yacc.c:1648 */
-+#line 787 "parser.y" /* yacc.c:1646 */
- { (yyval.var) = NULL; }
--#line 4177 "parser.tab.c" /* yacc.c:1648 */
-+#line 4172 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 260:
--#line 793 "parser.y" /* yacc.c:1648 */
-+#line 791 "parser.y" /* yacc.c:1646 */
- { (yyval.str) = NULL; }
--#line 4183 "parser.tab.c" /* yacc.c:1648 */
-+#line 4178 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 261:
--#line 794 "parser.y" /* yacc.c:1648 */
-+#line 792 "parser.y" /* yacc.c:1646 */
- { (yyval.str) = (yyvsp[0].str); }
--#line 4189 "parser.tab.c" /* yacc.c:1648 */
-+#line 4184 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 262:
--#line 795 "parser.y" /* yacc.c:1648 */
-+#line 793 "parser.y" /* yacc.c:1646 */
- { (yyval.str) = (yyvsp[0].str); }
--#line 4195 "parser.tab.c" /* yacc.c:1648 */
-+#line 4190 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 263:
--#line 798 "parser.y" /* yacc.c:1648 */
-+#line 796 "parser.y" /* yacc.c:1646 */
- { (yyval.var) = make_var((yyvsp[0].str)); }
--#line 4201 "parser.tab.c" /* yacc.c:1648 */
-+#line 4196 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 264:
--#line 800 "parser.y" /* yacc.c:1648 */
-+#line 798 "parser.y" /* yacc.c:1646 */
- { (yyval.var) = make_var((yyvsp[0].str)); }
--#line 4207 "parser.tab.c" /* yacc.c:1648 */
-+#line 4202 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 265:
--#line 803 "parser.y" /* yacc.c:1648 */
-+#line 801 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = find_type_or_error((yyvsp[0].str), 0); }
--#line 4213 "parser.tab.c" /* yacc.c:1648 */
-+#line 4208 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 266:
--#line 804 "parser.y" /* yacc.c:1648 */
-+#line 802 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = find_type_or_error((yyvsp[0].str), 0); }
--#line 4219 "parser.tab.c" /* yacc.c:1648 */
-+#line 4214 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 268:
--#line 806 "parser.y" /* yacc.c:1648 */
-+#line 804 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = type_new_int(type_basic_get_type((yyvsp[0].type)), -1); }
--#line 4225 "parser.tab.c" /* yacc.c:1648 */
-+#line 4220 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 269:
--#line 807 "parser.y" /* yacc.c:1648 */
-+#line 805 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = type_new_int(type_basic_get_type((yyvsp[0].type)), 1); }
--#line 4231 "parser.tab.c" /* yacc.c:1648 */
-+#line 4226 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 270:
--#line 808 "parser.y" /* yacc.c:1648 */
-+#line 806 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = type_new_int(TYPE_BASIC_INT, 1); }
--#line 4237 "parser.tab.c" /* yacc.c:1648 */
-+#line 4232 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 271:
--#line 809 "parser.y" /* yacc.c:1648 */
-+#line 807 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = find_type_or_error((yyvsp[0].str), 0); }
--#line 4243 "parser.tab.c" /* yacc.c:1648 */
-+#line 4238 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 272:
--#line 810 "parser.y" /* yacc.c:1648 */
-+#line 808 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = find_type_or_error((yyvsp[0].str), 0); }
--#line 4249 "parser.tab.c" /* yacc.c:1648 */
-+#line 4244 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 273:
--#line 811 "parser.y" /* yacc.c:1648 */
-+#line 809 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = find_type_or_error((yyvsp[0].str), 0); }
--#line 4255 "parser.tab.c" /* yacc.c:1648 */
-+#line 4250 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 274:
--#line 812 "parser.y" /* yacc.c:1648 */
-+#line 810 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = find_type_or_error((yyvsp[0].str), 0); }
--#line 4261 "parser.tab.c" /* yacc.c:1648 */
-+#line 4256 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 275:
--#line 813 "parser.y" /* yacc.c:1648 */
-+#line 811 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = find_type_or_error((yyvsp[0].str), 0); }
--#line 4267 "parser.tab.c" /* yacc.c:1648 */
-+#line 4262 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 278:
--#line 820 "parser.y" /* yacc.c:1648 */
-+#line 818 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = type_new_int(TYPE_BASIC_INT, 0); }
--#line 4273 "parser.tab.c" /* yacc.c:1648 */
-+#line 4268 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 279:
--#line 821 "parser.y" /* yacc.c:1648 */
-+#line 819 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = type_new_int(TYPE_BASIC_INT16, 0); }
--#line 4279 "parser.tab.c" /* yacc.c:1648 */
-+#line 4274 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 280:
--#line 822 "parser.y" /* yacc.c:1648 */
-+#line 820 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = type_new_int(TYPE_BASIC_INT8, 0); }
--#line 4285 "parser.tab.c" /* yacc.c:1648 */
-+#line 4280 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 281:
--#line 823 "parser.y" /* yacc.c:1648 */
-+#line 821 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = type_new_int(TYPE_BASIC_LONG, 0); }
--#line 4291 "parser.tab.c" /* yacc.c:1648 */
-+#line 4286 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 282:
--#line 824 "parser.y" /* yacc.c:1648 */
-+#line 822 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = type_new_int(TYPE_BASIC_HYPER, 0); }
--#line 4297 "parser.tab.c" /* yacc.c:1648 */
-+#line 4292 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 283:
--#line 825 "parser.y" /* yacc.c:1648 */
-+#line 823 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = type_new_int(TYPE_BASIC_INT64, 0); }
--#line 4303 "parser.tab.c" /* yacc.c:1648 */
-+#line 4298 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 284:
--#line 826 "parser.y" /* yacc.c:1648 */
-+#line 824 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = type_new_int(TYPE_BASIC_CHAR, 0); }
--#line 4309 "parser.tab.c" /* yacc.c:1648 */
-+#line 4304 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 285:
--#line 827 "parser.y" /* yacc.c:1648 */
-+#line 825 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = type_new_int(TYPE_BASIC_INT32, 0); }
--#line 4315 "parser.tab.c" /* yacc.c:1648 */
-+#line 4310 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 286:
--#line 828 "parser.y" /* yacc.c:1648 */
-+#line 826 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = type_new_int(TYPE_BASIC_INT3264, 0); }
--#line 4321 "parser.tab.c" /* yacc.c:1648 */
-+#line 4316 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 287:
--#line 831 "parser.y" /* yacc.c:1648 */
-+#line 829 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = type_new_coclass((yyvsp[0].str)); }
--#line 4327 "parser.tab.c" /* yacc.c:1648 */
-+#line 4322 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 288:
--#line 832 "parser.y" /* yacc.c:1648 */
-+#line 830 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = find_type((yyvsp[0].str), NULL, 0);
- if (type_get_type_detect_alias((yyval.type)) != TYPE_COCLASS)
- error_loc("%s was not declared a coclass at %s:%d\n",
- (yyvsp[0].str), (yyval.type)->loc_info.input_name,
- (yyval.type)->loc_info.line_number);
- }
--#line 4338 "parser.tab.c" /* yacc.c:1648 */
-+#line 4333 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 289:
--#line 840 "parser.y" /* yacc.c:1648 */
-+#line 838 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = (yyvsp[0].type);
- check_def((yyval.type));
- (yyval.type)->attrs = check_coclass_attrs((yyvsp[0].type)->name, (yyvsp[-1].attr_list));
- }
--#line 4347 "parser.tab.c" /* yacc.c:1648 */
-+#line 4342 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 290:
--#line 847 "parser.y" /* yacc.c:1648 */
-+#line 845 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = type_coclass_define((yyvsp[-4].type), (yyvsp[-2].ifref_list)); }
--#line 4353 "parser.tab.c" /* yacc.c:1648 */
-+#line 4348 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 291:
--#line 850 "parser.y" /* yacc.c:1648 */
-+#line 848 "parser.y" /* yacc.c:1646 */
- { (yyval.str) = (yyvsp[0].str); }
--#line 4359 "parser.tab.c" /* yacc.c:1648 */
-+#line 4354 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 292:
--#line 853 "parser.y" /* yacc.c:1648 */
-+#line 851 "parser.y" /* yacc.c:1646 */
- { (yyval.ifref_list) = NULL; }
--#line 4365 "parser.tab.c" /* yacc.c:1648 */
-+#line 4360 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 293:
--#line 854 "parser.y" /* yacc.c:1648 */
-+#line 852 "parser.y" /* yacc.c:1646 */
- { (yyval.ifref_list) = append_ifref( (yyvsp[-1].ifref_list), (yyvsp[0].ifref) ); }
--#line 4371 "parser.tab.c" /* yacc.c:1648 */
-+#line 4366 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 294:
--#line 858 "parser.y" /* yacc.c:1648 */
-+#line 856 "parser.y" /* yacc.c:1646 */
- { (yyval.ifref) = make_ifref((yyvsp[0].type)); (yyval.ifref)->attrs = (yyvsp[-1].attr_list); }
--#line 4377 "parser.tab.c" /* yacc.c:1648 */
-+#line 4372 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 295:
--#line 861 "parser.y" /* yacc.c:1648 */
-+#line 859 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = get_type(TYPE_INTERFACE, (yyvsp[0].str), current_namespace, 0); }
--#line 4383 "parser.tab.c" /* yacc.c:1648 */
-+#line 4378 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 296:
--#line 862 "parser.y" /* yacc.c:1648 */
-+#line 860 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = get_type(TYPE_INTERFACE, (yyvsp[0].str), current_namespace, 0); }
--#line 4389 "parser.tab.c" /* yacc.c:1648 */
-+#line 4384 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 297:
--#line 865 "parser.y" /* yacc.c:1648 */
-+#line 863 "parser.y" /* yacc.c:1646 */
- { attr_t *attrs;
- (yyval.type) = (yyvsp[0].type);
- check_def((yyval.type));
-@@ -4397,75 +4392,75 @@ yyreduce:
- (yyval.type)->attrs = append_attr( check_dispiface_attrs((yyvsp[0].type)->name, (yyvsp[-1].attr_list)), attrs );
- (yyval.type)->defined = TRUE;
- }
--#line 4401 "parser.tab.c" /* yacc.c:1648 */
-+#line 4396 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 298:
--#line 874 "parser.y" /* yacc.c:1648 */
-+#line 872 "parser.y" /* yacc.c:1646 */
- { (yyval.var_list) = NULL; }
--#line 4407 "parser.tab.c" /* yacc.c:1648 */
-+#line 4402 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 299:
--#line 875 "parser.y" /* yacc.c:1648 */
-+#line 873 "parser.y" /* yacc.c:1646 */
- { (yyval.var_list) = append_var( (yyvsp[-2].var_list), (yyvsp[-1].var) ); }
--#line 4413 "parser.tab.c" /* yacc.c:1648 */
-+#line 4408 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 300:
--#line 878 "parser.y" /* yacc.c:1648 */
-+#line 876 "parser.y" /* yacc.c:1646 */
- { (yyval.var_list) = NULL; }
--#line 4419 "parser.tab.c" /* yacc.c:1648 */
-+#line 4414 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 301:
--#line 879 "parser.y" /* yacc.c:1648 */
-+#line 877 "parser.y" /* yacc.c:1646 */
- { (yyval.var_list) = append_var( (yyvsp[-2].var_list), (yyvsp[-1].var) ); }
--#line 4425 "parser.tab.c" /* yacc.c:1648 */
-+#line 4420 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 302:
--#line 885 "parser.y" /* yacc.c:1648 */
-+#line 883 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = (yyvsp[-4].type);
- type_dispinterface_define((yyval.type), (yyvsp[-2].var_list), (yyvsp[-1].var_list));
- }
--#line 4433 "parser.tab.c" /* yacc.c:1648 */
-+#line 4428 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 303:
--#line 889 "parser.y" /* yacc.c:1648 */
-+#line 887 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = (yyvsp[-4].type);
- type_dispinterface_define_from_iface((yyval.type), (yyvsp[-2].type));
- }
--#line 4441 "parser.tab.c" /* yacc.c:1648 */
-+#line 4436 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 304:
--#line 894 "parser.y" /* yacc.c:1648 */
-+#line 892 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = NULL; }
--#line 4447 "parser.tab.c" /* yacc.c:1648 */
-+#line 4442 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 305:
--#line 895 "parser.y" /* yacc.c:1648 */
-+#line 893 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = find_type_or_error2((yyvsp[0].str), 0); }
--#line 4453 "parser.tab.c" /* yacc.c:1648 */
-+#line 4448 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 306:
--#line 898 "parser.y" /* yacc.c:1648 */
-+#line 896 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = get_type(TYPE_INTERFACE, (yyvsp[0].str), current_namespace, 0); }
--#line 4459 "parser.tab.c" /* yacc.c:1648 */
-+#line 4454 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 307:
--#line 899 "parser.y" /* yacc.c:1648 */
-+#line 897 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = get_type(TYPE_INTERFACE, (yyvsp[0].str), current_namespace, 0); }
--#line 4465 "parser.tab.c" /* yacc.c:1648 */
-+#line 4460 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 308:
--#line 902 "parser.y" /* yacc.c:1648 */
-+#line 900 "parser.y" /* yacc.c:1646 */
- { (yyval.ifinfo).interface = (yyvsp[0].type);
- (yyval.ifinfo).old_pointer_default = pointer_default;
- if (is_attr((yyvsp[-1].attr_list), ATTR_POINTERDEFAULT))
-@@ -4474,11 +4469,11 @@ yyreduce:
- (yyvsp[0].type)->attrs = check_iface_attrs((yyvsp[0].type)->name, (yyvsp[-1].attr_list));
- (yyvsp[0].type)->defined = TRUE;
- }
--#line 4478 "parser.tab.c" /* yacc.c:1648 */
-+#line 4473 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 309:
--#line 913 "parser.y" /* yacc.c:1648 */
-+#line 911 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = (yyvsp[-5].ifinfo).interface;
- if((yyval.type) == (yyvsp[-4].type))
- error_loc("Interface can't inherit from itself\n");
-@@ -4486,594 +4481,594 @@ yyreduce:
- check_async_uuid((yyval.type));
- pointer_default = (yyvsp[-5].ifinfo).old_pointer_default;
- }
--#line 4490 "parser.tab.c" /* yacc.c:1648 */
-+#line 4485 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 310:
--#line 924 "parser.y" /* yacc.c:1648 */
-+#line 922 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = (yyvsp[-7].ifinfo).interface;
- type_interface_define((yyval.type), find_type_or_error2((yyvsp[-5].str), 0), (yyvsp[-2].stmt_list));
- pointer_default = (yyvsp[-7].ifinfo).old_pointer_default;
- }
--#line 4499 "parser.tab.c" /* yacc.c:1648 */
-+#line 4494 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 311:
--#line 928 "parser.y" /* yacc.c:1648 */
-+#line 926 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = (yyvsp[-1].type); }
--#line 4505 "parser.tab.c" /* yacc.c:1648 */
-+#line 4500 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 312:
--#line 932 "parser.y" /* yacc.c:1648 */
-+#line 930 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = (yyvsp[-1].type); }
--#line 4511 "parser.tab.c" /* yacc.c:1648 */
-+#line 4506 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 313:
--#line 933 "parser.y" /* yacc.c:1648 */
-+#line 931 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = (yyvsp[-1].type); }
--#line 4517 "parser.tab.c" /* yacc.c:1648 */
-+#line 4512 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 314:
--#line 936 "parser.y" /* yacc.c:1648 */
-+#line 934 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = type_new_module((yyvsp[0].str)); }
--#line 4523 "parser.tab.c" /* yacc.c:1648 */
-+#line 4518 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 315:
--#line 937 "parser.y" /* yacc.c:1648 */
-+#line 935 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = type_new_module((yyvsp[0].str)); }
--#line 4529 "parser.tab.c" /* yacc.c:1648 */
-+#line 4524 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 316:
--#line 940 "parser.y" /* yacc.c:1648 */
-+#line 938 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = (yyvsp[0].type);
- (yyval.type)->attrs = check_module_attrs((yyvsp[0].type)->name, (yyvsp[-1].attr_list));
- }
--#line 4537 "parser.tab.c" /* yacc.c:1648 */
-+#line 4532 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 317:
--#line 946 "parser.y" /* yacc.c:1648 */
-+#line 944 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = (yyvsp[-4].type);
- type_module_define((yyval.type), (yyvsp[-2].stmt_list));
- }
--#line 4545 "parser.tab.c" /* yacc.c:1648 */
-+#line 4540 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 318:
--#line 952 "parser.y" /* yacc.c:1648 */
-+#line 950 "parser.y" /* yacc.c:1646 */
- { (yyval.stgclass) = STG_EXTERN; }
--#line 4551 "parser.tab.c" /* yacc.c:1648 */
-+#line 4546 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 319:
--#line 953 "parser.y" /* yacc.c:1648 */
-+#line 951 "parser.y" /* yacc.c:1646 */
- { (yyval.stgclass) = STG_STATIC; }
--#line 4557 "parser.tab.c" /* yacc.c:1648 */
-+#line 4552 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 320:
--#line 954 "parser.y" /* yacc.c:1648 */
-+#line 952 "parser.y" /* yacc.c:1646 */
- { (yyval.stgclass) = STG_REGISTER; }
--#line 4563 "parser.tab.c" /* yacc.c:1648 */
-+#line 4558 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 321:
--#line 958 "parser.y" /* yacc.c:1648 */
-- { (yyval.attr) = make_attr(ATTR_INLINE); }
--#line 4569 "parser.tab.c" /* yacc.c:1648 */
-+#line 956 "parser.y" /* yacc.c:1646 */
-+ { (yyval.funcspecifier) = FUNCTION_SPECIFIER_INLINE; }
-+#line 4564 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 322:
--#line 962 "parser.y" /* yacc.c:1648 */
-- { (yyval.attr) = make_attr(ATTR_CONST); }
--#line 4575 "parser.tab.c" /* yacc.c:1648 */
-+#line 960 "parser.y" /* yacc.c:1646 */
-+ { (yyval.typequalifier) = TYPE_QUALIFIER_CONST; }
-+#line 4570 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 323:
--#line 965 "parser.y" /* yacc.c:1648 */
-- { (yyval.attr_list) = NULL; }
--#line 4581 "parser.tab.c" /* yacc.c:1648 */
-+#line 963 "parser.y" /* yacc.c:1646 */
-+ { (yyval.typequalifier) = TYPE_QUALIFIER_NONE; }
-+#line 4576 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 324:
--#line 966 "parser.y" /* yacc.c:1648 */
-- { (yyval.attr_list) = append_attr((yyvsp[-1].attr_list), (yyvsp[0].attr)); }
--#line 4587 "parser.tab.c" /* yacc.c:1648 */
-+#line 964 "parser.y" /* yacc.c:1646 */
-+ { (yyval.typequalifier) = (yyvsp[-1].typequalifier) | (yyvsp[0].typequalifier); }
-+#line 4582 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 325:
--#line 969 "parser.y" /* yacc.c:1648 */
-- { (yyval.declspec) = make_decl_spec((yyvsp[-1].type), (yyvsp[0].declspec), NULL, NULL, STG_NONE); }
--#line 4593 "parser.tab.c" /* yacc.c:1648 */
-+#line 967 "parser.y" /* yacc.c:1646 */
-+ { (yyval.declspec) = make_decl_spec((yyvsp[-1].type), (yyvsp[0].declspec), NULL, STG_NONE, TYPE_QUALIFIER_NONE, FUNCTION_SPECIFIER_NONE); }
-+#line 4588 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 326:
--#line 971 "parser.y" /* yacc.c:1648 */
-- { (yyval.declspec) = make_decl_spec((yyvsp[-1].type), (yyvsp[-2].declspec), (yyvsp[0].declspec), NULL, STG_NONE); }
--#line 4599 "parser.tab.c" /* yacc.c:1648 */
-+#line 969 "parser.y" /* yacc.c:1646 */
-+ { (yyval.declspec) = make_decl_spec((yyvsp[-1].type), (yyvsp[-2].declspec), (yyvsp[0].declspec), STG_NONE, TYPE_QUALIFIER_NONE, FUNCTION_SPECIFIER_NONE); }
-+#line 4594 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 327:
--#line 974 "parser.y" /* yacc.c:1648 */
-+#line 972 "parser.y" /* yacc.c:1646 */
- { (yyval.declspec) = NULL; }
--#line 4605 "parser.tab.c" /* yacc.c:1648 */
-+#line 4600 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 329:
--#line 979 "parser.y" /* yacc.c:1648 */
-- { (yyval.declspec) = make_decl_spec(NULL, (yyvsp[0].declspec), NULL, (yyvsp[-1].attr), STG_NONE); }
--#line 4611 "parser.tab.c" /* yacc.c:1648 */
-+#line 977 "parser.y" /* yacc.c:1646 */
-+ { (yyval.declspec) = make_decl_spec(NULL, (yyvsp[0].declspec), NULL, STG_NONE, (yyvsp[-1].typequalifier), FUNCTION_SPECIFIER_NONE); }
-+#line 4606 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 330:
--#line 980 "parser.y" /* yacc.c:1648 */
-- { (yyval.declspec) = make_decl_spec(NULL, (yyvsp[0].declspec), NULL, (yyvsp[-1].attr), STG_NONE); }
--#line 4617 "parser.tab.c" /* yacc.c:1648 */
-+#line 978 "parser.y" /* yacc.c:1646 */
-+ { (yyval.declspec) = make_decl_spec(NULL, (yyvsp[0].declspec), NULL, STG_NONE, TYPE_QUALIFIER_NONE, (yyvsp[-1].funcspecifier)); }
-+#line 4612 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 331:
--#line 981 "parser.y" /* yacc.c:1648 */
-- { (yyval.declspec) = make_decl_spec(NULL, (yyvsp[0].declspec), NULL, NULL, (yyvsp[-1].stgclass)); }
--#line 4623 "parser.tab.c" /* yacc.c:1648 */
-+#line 979 "parser.y" /* yacc.c:1646 */
-+ { (yyval.declspec) = make_decl_spec(NULL, (yyvsp[0].declspec), NULL, (yyvsp[-1].stgclass), TYPE_QUALIFIER_NONE, FUNCTION_SPECIFIER_NONE); }
-+#line 4618 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 332:
--#line 986 "parser.y" /* yacc.c:1648 */
-- { (yyval.declarator) = (yyvsp[0].declarator); (yyval.declarator)->type = append_chain_type((yyval.declarator)->type, type_new_pointer(pointer_default, NULL, (yyvsp[-1].attr_list))); }
--#line 4629 "parser.tab.c" /* yacc.c:1648 */
-+#line 984 "parser.y" /* yacc.c:1646 */
-+ { (yyval.declarator) = (yyvsp[0].declarator); append_chain_declspec(&(yyval.declarator)->declspec, type_new_pointer(pointer_default, NULL), (yyvsp[-1].typequalifier)); }
-+#line 4624 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 333:
--#line 987 "parser.y" /* yacc.c:1648 */
-+#line 985 "parser.y" /* yacc.c:1646 */
- { (yyval.declarator) = (yyvsp[0].declarator); if ((yyval.declarator)->func_type) (yyval.declarator)->func_type->attrs = append_attr((yyval.declarator)->func_type->attrs, make_attrp(ATTR_CALLCONV, (yyvsp[-1].str)));
-- else if ((yyval.declarator)->type) (yyval.declarator)->type->attrs = append_attr((yyval.declarator)->type->attrs, make_attrp(ATTR_CALLCONV, (yyvsp[-1].str))); }
--#line 4636 "parser.tab.c" /* yacc.c:1648 */
-+ else if ((yyval.declarator)->declspec.type) (yyval.declarator)->declspec.type->attrs = append_attr((yyval.declarator)->declspec.type->attrs, make_attrp(ATTR_CALLCONV, (yyvsp[-1].str))); }
-+#line 4631 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 335:
--#line 993 "parser.y" /* yacc.c:1648 */
-+#line 991 "parser.y" /* yacc.c:1646 */
- { (yyval.declarator) = make_declarator((yyvsp[0].var)); }
--#line 4642 "parser.tab.c" /* yacc.c:1648 */
-+#line 4637 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 336:
--#line 994 "parser.y" /* yacc.c:1648 */
-+#line 992 "parser.y" /* yacc.c:1646 */
- { (yyval.declarator) = (yyvsp[-1].declarator); }
--#line 4648 "parser.tab.c" /* yacc.c:1648 */
-+#line 4643 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 337:
--#line 995 "parser.y" /* yacc.c:1648 */
-- { (yyval.declarator) = (yyvsp[-1].declarator); (yyval.declarator)->type = append_array((yyval.declarator)->type, (yyvsp[0].expr)); }
--#line 4654 "parser.tab.c" /* yacc.c:1648 */
-+#line 993 "parser.y" /* yacc.c:1646 */
-+ { (yyval.declarator) = (yyvsp[-1].declarator); (yyval.declarator)->declspec.type = append_array((yyval.declarator)->declspec.type, (yyvsp[0].expr)); }
-+#line 4649 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 338:
--#line 996 "parser.y" /* yacc.c:1648 */
-+#line 994 "parser.y" /* yacc.c:1646 */
- { (yyval.declarator) = (yyvsp[-3].declarator);
-- (yyval.declarator)->func_type = append_chain_type((yyval.declarator)->type, type_new_function((yyvsp[-1].var_list)));
-- (yyval.declarator)->type = NULL;
-+ (yyval.declarator)->func_type = append_chain_type((yyval.declarator)->declspec.type, type_new_function((yyvsp[-1].var_list)));
-+ (yyval.declarator)->declspec.type = NULL;
- }
--#line 4663 "parser.tab.c" /* yacc.c:1648 */
-+#line 4658 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 339:
--#line 1005 "parser.y" /* yacc.c:1648 */
-- { (yyval.declarator) = (yyvsp[0].declarator); (yyval.declarator)->type = append_chain_type((yyval.declarator)->type, type_new_pointer(pointer_default, NULL, (yyvsp[-1].attr_list))); }
--#line 4669 "parser.tab.c" /* yacc.c:1648 */
-+#line 1003 "parser.y" /* yacc.c:1646 */
-+ { (yyval.declarator) = (yyvsp[0].declarator); append_chain_declspec(&(yyval.declarator)->declspec, type_new_pointer(pointer_default, NULL), (yyvsp[-1].typequalifier)); }
-+#line 4664 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 340:
--#line 1006 "parser.y" /* yacc.c:1648 */
-+#line 1004 "parser.y" /* yacc.c:1646 */
- { (yyval.declarator) = (yyvsp[0].declarator); if ((yyval.declarator)->func_type) (yyval.declarator)->func_type->attrs = append_attr((yyval.declarator)->func_type->attrs, make_attrp(ATTR_CALLCONV, (yyvsp[-1].str)));
-- else if ((yyval.declarator)->type) (yyval.declarator)->type->attrs = append_attr((yyval.declarator)->type->attrs, make_attrp(ATTR_CALLCONV, (yyvsp[-1].str))); }
--#line 4676 "parser.tab.c" /* yacc.c:1648 */
-+ else if ((yyval.declarator)->declspec.type) (yyval.declarator)->declspec.type->attrs = append_attr((yyval.declarator)->declspec.type->attrs, make_attrp(ATTR_CALLCONV, (yyvsp[-1].str))); }
-+#line 4671 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 342:
--#line 1014 "parser.y" /* yacc.c:1648 */
-- { (yyval.declarator) = (yyvsp[0].declarator); (yyval.declarator)->type = append_chain_type((yyval.declarator)->type, type_new_pointer(pointer_default, NULL, (yyvsp[-1].attr_list))); }
--#line 4682 "parser.tab.c" /* yacc.c:1648 */
-+#line 1012 "parser.y" /* yacc.c:1646 */
-+ { (yyval.declarator) = (yyvsp[0].declarator); append_chain_declspec(&(yyval.declarator)->declspec, type_new_pointer(pointer_default, NULL), (yyvsp[-1].typequalifier)); }
-+#line 4677 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 343:
--#line 1015 "parser.y" /* yacc.c:1648 */
-+#line 1013 "parser.y" /* yacc.c:1646 */
- { (yyval.declarator) = (yyvsp[0].declarator); if ((yyval.declarator)->func_type) (yyval.declarator)->func_type->attrs = append_attr((yyval.declarator)->func_type->attrs, make_attrp(ATTR_CALLCONV, (yyvsp[-1].str)));
-- else if ((yyval.declarator)->type) (yyval.declarator)->type->attrs = append_attr((yyval.declarator)->type->attrs, make_attrp(ATTR_CALLCONV, (yyvsp[-1].str))); }
--#line 4689 "parser.tab.c" /* yacc.c:1648 */
-+ else if ((yyval.declarator)->declspec.type) (yyval.declarator)->declspec.type->attrs = append_attr((yyval.declarator)->declspec.type->attrs, make_attrp(ATTR_CALLCONV, (yyvsp[-1].str))); }
-+#line 4684 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 344:
--#line 1020 "parser.y" /* yacc.c:1648 */
-+#line 1018 "parser.y" /* yacc.c:1646 */
- { (yyval.declarator) = make_declarator(NULL); }
--#line 4695 "parser.tab.c" /* yacc.c:1648 */
-+#line 4690 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 346:
--#line 1026 "parser.y" /* yacc.c:1648 */
-+#line 1024 "parser.y" /* yacc.c:1646 */
- { (yyval.declarator) = (yyvsp[-1].declarator); }
--#line 4701 "parser.tab.c" /* yacc.c:1648 */
-+#line 4696 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 347:
--#line 1027 "parser.y" /* yacc.c:1648 */
-- { (yyval.declarator) = (yyvsp[-1].declarator); (yyval.declarator)->type = append_array((yyval.declarator)->type, (yyvsp[0].expr)); }
--#line 4707 "parser.tab.c" /* yacc.c:1648 */
-+#line 1025 "parser.y" /* yacc.c:1646 */
-+ { (yyval.declarator) = (yyvsp[-1].declarator); (yyval.declarator)->declspec.type = append_array((yyval.declarator)->declspec.type, (yyvsp[0].expr)); }
-+#line 4702 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 348:
--#line 1028 "parser.y" /* yacc.c:1648 */
-- { (yyval.declarator) = make_declarator(NULL); (yyval.declarator)->type = append_array((yyval.declarator)->type, (yyvsp[0].expr)); }
--#line 4713 "parser.tab.c" /* yacc.c:1648 */
-+#line 1026 "parser.y" /* yacc.c:1646 */
-+ { (yyval.declarator) = make_declarator(NULL); (yyval.declarator)->declspec.type = append_array((yyval.declarator)->declspec.type, (yyvsp[0].expr)); }
-+#line 4708 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 349:
--#line 1030 "parser.y" /* yacc.c:1648 */
-+#line 1028 "parser.y" /* yacc.c:1646 */
- { (yyval.declarator) = make_declarator(NULL);
-- (yyval.declarator)->func_type = append_chain_type((yyval.declarator)->type, type_new_function((yyvsp[-1].var_list)));
-- (yyval.declarator)->type = NULL;
-+ (yyval.declarator)->func_type = append_chain_type((yyval.declarator)->declspec.type, type_new_function((yyvsp[-1].var_list)));
-+ (yyval.declarator)->declspec.type = NULL;
- }
--#line 4722 "parser.tab.c" /* yacc.c:1648 */
-+#line 4717 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 350:
--#line 1035 "parser.y" /* yacc.c:1648 */
-+#line 1033 "parser.y" /* yacc.c:1646 */
- { (yyval.declarator) = (yyvsp[-3].declarator);
-- (yyval.declarator)->func_type = append_chain_type((yyval.declarator)->type, type_new_function((yyvsp[-1].var_list)));
-- (yyval.declarator)->type = NULL;
-+ (yyval.declarator)->func_type = append_chain_type((yyval.declarator)->declspec.type, type_new_function((yyvsp[-1].var_list)));
-+ (yyval.declarator)->declspec.type = NULL;
- }
--#line 4731 "parser.tab.c" /* yacc.c:1648 */
-+#line 4726 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 351:
--#line 1044 "parser.y" /* yacc.c:1648 */
-- { (yyval.declarator) = (yyvsp[0].declarator); (yyval.declarator)->type = append_chain_type((yyval.declarator)->type, type_new_pointer(pointer_default, NULL, (yyvsp[-1].attr_list))); }
--#line 4737 "parser.tab.c" /* yacc.c:1648 */
-+#line 1042 "parser.y" /* yacc.c:1646 */
-+ { (yyval.declarator) = (yyvsp[0].declarator); append_chain_declspec(&(yyval.declarator)->declspec, type_new_pointer(pointer_default, NULL), (yyvsp[-1].typequalifier)); }
-+#line 4732 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 352:
--#line 1045 "parser.y" /* yacc.c:1648 */
-- { (yyval.declarator) = (yyvsp[0].declarator); (yyval.declarator)->type->attrs = append_attr((yyval.declarator)->type->attrs, make_attrp(ATTR_CALLCONV, (yyvsp[-1].str))); }
--#line 4743 "parser.tab.c" /* yacc.c:1648 */
-+#line 1043 "parser.y" /* yacc.c:1646 */
-+ { (yyval.declarator) = (yyvsp[0].declarator); (yyval.declarator)->declspec.type->attrs = append_attr((yyval.declarator)->declspec.type->attrs, make_attrp(ATTR_CALLCONV, (yyvsp[-1].str))); }
-+#line 4738 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 354:
--#line 1052 "parser.y" /* yacc.c:1648 */
-- { (yyval.declarator) = (yyvsp[0].declarator); (yyval.declarator)->type = append_chain_type((yyval.declarator)->type, type_new_pointer(pointer_default, NULL, (yyvsp[-1].attr_list))); }
--#line 4749 "parser.tab.c" /* yacc.c:1648 */
-+#line 1050 "parser.y" /* yacc.c:1646 */
-+ { (yyval.declarator) = (yyvsp[0].declarator); append_chain_declspec(&(yyval.declarator)->declspec, type_new_pointer(pointer_default, NULL), (yyvsp[-1].typequalifier)); }
-+#line 4744 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 355:
--#line 1053 "parser.y" /* yacc.c:1648 */
-- { (yyval.declarator) = (yyvsp[0].declarator); (yyval.declarator)->type->attrs = append_attr((yyval.declarator)->type->attrs, make_attrp(ATTR_CALLCONV, (yyvsp[-1].str))); }
--#line 4755 "parser.tab.c" /* yacc.c:1648 */
-+#line 1051 "parser.y" /* yacc.c:1646 */
-+ { (yyval.declarator) = (yyvsp[0].declarator); (yyval.declarator)->declspec.type->attrs = append_attr((yyval.declarator)->declspec.type->attrs, make_attrp(ATTR_CALLCONV, (yyvsp[-1].str))); }
-+#line 4750 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 356:
--#line 1057 "parser.y" /* yacc.c:1648 */
-+#line 1055 "parser.y" /* yacc.c:1646 */
- { (yyval.declarator) = make_declarator(NULL); }
--#line 4761 "parser.tab.c" /* yacc.c:1648 */
-+#line 4756 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 358:
--#line 1065 "parser.y" /* yacc.c:1648 */
-+#line 1063 "parser.y" /* yacc.c:1646 */
- { (yyval.declarator) = make_declarator((yyvsp[0].var)); }
--#line 4767 "parser.tab.c" /* yacc.c:1648 */
-+#line 4762 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 359:
--#line 1066 "parser.y" /* yacc.c:1648 */
-+#line 1064 "parser.y" /* yacc.c:1646 */
- { (yyval.declarator) = (yyvsp[-1].declarator); }
--#line 4773 "parser.tab.c" /* yacc.c:1648 */
-+#line 4768 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 360:
--#line 1067 "parser.y" /* yacc.c:1648 */
-- { (yyval.declarator) = (yyvsp[-1].declarator); (yyval.declarator)->type = append_array((yyval.declarator)->type, (yyvsp[0].expr)); }
--#line 4779 "parser.tab.c" /* yacc.c:1648 */
-+#line 1065 "parser.y" /* yacc.c:1646 */
-+ { (yyval.declarator) = (yyvsp[-1].declarator); (yyval.declarator)->declspec.type = append_array((yyval.declarator)->declspec.type, (yyvsp[0].expr)); }
-+#line 4774 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 361:
--#line 1068 "parser.y" /* yacc.c:1648 */
-- { (yyval.declarator) = make_declarator(NULL); (yyval.declarator)->type = append_array((yyval.declarator)->type, (yyvsp[0].expr)); }
--#line 4785 "parser.tab.c" /* yacc.c:1648 */
-+#line 1066 "parser.y" /* yacc.c:1646 */
-+ { (yyval.declarator) = make_declarator(NULL); (yyval.declarator)->declspec.type = append_array((yyval.declarator)->declspec.type, (yyvsp[0].expr)); }
-+#line 4780 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 362:
--#line 1070 "parser.y" /* yacc.c:1648 */
-+#line 1068 "parser.y" /* yacc.c:1646 */
- { (yyval.declarator) = make_declarator(NULL);
-- (yyval.declarator)->func_type = append_chain_type((yyval.declarator)->type, type_new_function((yyvsp[-1].var_list)));
-- (yyval.declarator)->type = NULL;
-+ (yyval.declarator)->func_type = append_chain_type((yyval.declarator)->declspec.type, type_new_function((yyvsp[-1].var_list)));
-+ (yyval.declarator)->declspec.type = NULL;
- }
--#line 4794 "parser.tab.c" /* yacc.c:1648 */
-+#line 4789 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 363:
--#line 1075 "parser.y" /* yacc.c:1648 */
-+#line 1073 "parser.y" /* yacc.c:1646 */
- { (yyval.declarator) = (yyvsp[-3].declarator);
-- (yyval.declarator)->func_type = append_chain_type((yyval.declarator)->type, type_new_function((yyvsp[-1].var_list)));
-- (yyval.declarator)->type = NULL;
-+ (yyval.declarator)->func_type = append_chain_type((yyval.declarator)->declspec.type, type_new_function((yyvsp[-1].var_list)));
-+ (yyval.declarator)->declspec.type = NULL;
- }
--#line 4803 "parser.tab.c" /* yacc.c:1648 */
-+#line 4798 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 364:
--#line 1082 "parser.y" /* yacc.c:1648 */
-+#line 1080 "parser.y" /* yacc.c:1646 */
- { (yyval.declarator_list) = append_declarator( NULL, (yyvsp[0].declarator) ); }
--#line 4809 "parser.tab.c" /* yacc.c:1648 */
-+#line 4804 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 365:
--#line 1083 "parser.y" /* yacc.c:1648 */
-+#line 1081 "parser.y" /* yacc.c:1646 */
- { (yyval.declarator_list) = append_declarator( (yyvsp[-2].declarator_list), (yyvsp[0].declarator) ); }
--#line 4815 "parser.tab.c" /* yacc.c:1648 */
-+#line 4810 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 366:
--#line 1086 "parser.y" /* yacc.c:1648 */
-+#line 1084 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = NULL; }
--#line 4821 "parser.tab.c" /* yacc.c:1648 */
-+#line 4816 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 367:
--#line 1087 "parser.y" /* yacc.c:1648 */
-+#line 1085 "parser.y" /* yacc.c:1646 */
- { (yyval.expr) = (yyvsp[0].expr); }
--#line 4827 "parser.tab.c" /* yacc.c:1648 */
-+#line 4822 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 368:
--#line 1090 "parser.y" /* yacc.c:1648 */
-+#line 1088 "parser.y" /* yacc.c:1646 */
- { (yyval.declarator) = (yyvsp[-1].declarator); (yyval.declarator)->bits = (yyvsp[0].expr);
- if (!(yyval.declarator)->bits && !(yyval.declarator)->var->name)
- error_loc("unnamed fields are not allowed\n");
- }
--#line 4836 "parser.tab.c" /* yacc.c:1648 */
-+#line 4831 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 369:
--#line 1097 "parser.y" /* yacc.c:1648 */
-+#line 1095 "parser.y" /* yacc.c:1646 */
- { (yyval.declarator_list) = append_declarator( NULL, (yyvsp[0].declarator) ); }
--#line 4842 "parser.tab.c" /* yacc.c:1648 */
-+#line 4837 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 370:
--#line 1099 "parser.y" /* yacc.c:1648 */
-+#line 1097 "parser.y" /* yacc.c:1646 */
- { (yyval.declarator_list) = append_declarator( (yyvsp[-2].declarator_list), (yyvsp[0].declarator) ); }
--#line 4848 "parser.tab.c" /* yacc.c:1648 */
-+#line 4843 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 371:
--#line 1103 "parser.y" /* yacc.c:1648 */
-+#line 1101 "parser.y" /* yacc.c:1646 */
- { (yyval.declarator) = (yyvsp[0].declarator); }
--#line 4854 "parser.tab.c" /* yacc.c:1648 */
-+#line 4849 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 372:
--#line 1104 "parser.y" /* yacc.c:1648 */
-+#line 1102 "parser.y" /* yacc.c:1646 */
- { (yyval.declarator) = (yyvsp[-2].declarator); (yyvsp[-2].declarator)->var->eval = (yyvsp[0].expr); }
--#line 4860 "parser.tab.c" /* yacc.c:1648 */
-+#line 4855 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 373:
--#line 1108 "parser.y" /* yacc.c:1648 */
-+#line 1106 "parser.y" /* yacc.c:1646 */
- { (yyval.num) = THREADING_APARTMENT; }
--#line 4866 "parser.tab.c" /* yacc.c:1648 */
-+#line 4861 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 374:
--#line 1109 "parser.y" /* yacc.c:1648 */
-+#line 1107 "parser.y" /* yacc.c:1646 */
- { (yyval.num) = THREADING_NEUTRAL; }
--#line 4872 "parser.tab.c" /* yacc.c:1648 */
-+#line 4867 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 375:
--#line 1110 "parser.y" /* yacc.c:1648 */
-+#line 1108 "parser.y" /* yacc.c:1646 */
- { (yyval.num) = THREADING_SINGLE; }
--#line 4878 "parser.tab.c" /* yacc.c:1648 */
-+#line 4873 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 376:
--#line 1111 "parser.y" /* yacc.c:1648 */
-+#line 1109 "parser.y" /* yacc.c:1646 */
- { (yyval.num) = THREADING_FREE; }
--#line 4884 "parser.tab.c" /* yacc.c:1648 */
-+#line 4879 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 377:
--#line 1112 "parser.y" /* yacc.c:1648 */
-+#line 1110 "parser.y" /* yacc.c:1646 */
- { (yyval.num) = THREADING_BOTH; }
--#line 4890 "parser.tab.c" /* yacc.c:1648 */
-+#line 4885 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 378:
--#line 1116 "parser.y" /* yacc.c:1648 */
-+#line 1114 "parser.y" /* yacc.c:1646 */
- { (yyval.num) = FC_RP; }
--#line 4896 "parser.tab.c" /* yacc.c:1648 */
-+#line 4891 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 379:
--#line 1117 "parser.y" /* yacc.c:1648 */
-+#line 1115 "parser.y" /* yacc.c:1646 */
- { (yyval.num) = FC_UP; }
--#line 4902 "parser.tab.c" /* yacc.c:1648 */
-+#line 4897 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 380:
--#line 1118 "parser.y" /* yacc.c:1648 */
-+#line 1116 "parser.y" /* yacc.c:1646 */
- { (yyval.num) = FC_FP; }
--#line 4908 "parser.tab.c" /* yacc.c:1648 */
-+#line 4903 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 381:
--#line 1121 "parser.y" /* yacc.c:1648 */
-+#line 1119 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = type_new_struct((yyvsp[-3].str), current_namespace, TRUE, (yyvsp[-1].var_list)); }
--#line 4914 "parser.tab.c" /* yacc.c:1648 */
-+#line 4909 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 382:
--#line 1124 "parser.y" /* yacc.c:1648 */
-+#line 1122 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = type_new_void(); }
--#line 4920 "parser.tab.c" /* yacc.c:1648 */
-+#line 4915 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 383:
--#line 1125 "parser.y" /* yacc.c:1648 */
-+#line 1123 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = find_type_or_error((yyvsp[0].str), 0); }
--#line 4926 "parser.tab.c" /* yacc.c:1648 */
-+#line 4921 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 384:
--#line 1126 "parser.y" /* yacc.c:1648 */
-+#line 1124 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = (yyvsp[0].type); }
--#line 4932 "parser.tab.c" /* yacc.c:1648 */
-+#line 4927 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 385:
--#line 1127 "parser.y" /* yacc.c:1648 */
-+#line 1125 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = (yyvsp[0].type); }
--#line 4938 "parser.tab.c" /* yacc.c:1648 */
-+#line 4933 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 386:
--#line 1128 "parser.y" /* yacc.c:1648 */
-+#line 1126 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = type_new_enum((yyvsp[0].str), current_namespace, FALSE, NULL); }
--#line 4944 "parser.tab.c" /* yacc.c:1648 */
-+#line 4939 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 387:
--#line 1129 "parser.y" /* yacc.c:1648 */
-+#line 1127 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = (yyvsp[0].type); }
--#line 4950 "parser.tab.c" /* yacc.c:1648 */
-+#line 4945 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 388:
--#line 1130 "parser.y" /* yacc.c:1648 */
-+#line 1128 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = type_new_struct((yyvsp[0].str), current_namespace, FALSE, NULL); }
--#line 4956 "parser.tab.c" /* yacc.c:1648 */
-+#line 4951 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 389:
--#line 1131 "parser.y" /* yacc.c:1648 */
-+#line 1129 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = (yyvsp[0].type); }
--#line 4962 "parser.tab.c" /* yacc.c:1648 */
-+#line 4957 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 390:
--#line 1132 "parser.y" /* yacc.c:1648 */
-+#line 1130 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = type_new_nonencapsulated_union((yyvsp[0].str), FALSE, NULL); }
--#line 4968 "parser.tab.c" /* yacc.c:1648 */
-+#line 4963 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 391:
--#line 1133 "parser.y" /* yacc.c:1648 */
-+#line 1131 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = make_safearray((yyvsp[-1].type)); }
--#line 4974 "parser.tab.c" /* yacc.c:1648 */
-+#line 4969 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 392:
--#line 1137 "parser.y" /* yacc.c:1648 */
-+#line 1135 "parser.y" /* yacc.c:1646 */
- { (yyvsp[-4].attr_list) = append_attribs((yyvsp[-4].attr_list), (yyvsp[-2].attr_list));
- reg_typedefs((yyvsp[-1].declspec), (yyvsp[0].declarator_list), check_typedef_attrs((yyvsp[-4].attr_list)));
- (yyval.statement) = make_statement_typedef((yyvsp[0].declarator_list));
- }
--#line 4983 "parser.tab.c" /* yacc.c:1648 */
-+#line 4978 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 393:
--#line 1144 "parser.y" /* yacc.c:1648 */
-+#line 1142 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = type_new_nonencapsulated_union((yyvsp[-3].str), TRUE, (yyvsp[-1].var_list)); }
--#line 4989 "parser.tab.c" /* yacc.c:1648 */
-+#line 4984 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 394:
--#line 1147 "parser.y" /* yacc.c:1648 */
-+#line 1145 "parser.y" /* yacc.c:1646 */
- { (yyval.type) = type_new_encapsulated_union((yyvsp[-8].str), (yyvsp[-5].var), (yyvsp[-3].var), (yyvsp[-1].var_list)); }
--#line 4995 "parser.tab.c" /* yacc.c:1648 */
-+#line 4990 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 395:
--#line 1151 "parser.y" /* yacc.c:1648 */
-+#line 1149 "parser.y" /* yacc.c:1646 */
- { (yyval.num) = MAKEVERSION((yyvsp[0].num), 0); }
--#line 5001 "parser.tab.c" /* yacc.c:1648 */
-+#line 4996 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 396:
--#line 1152 "parser.y" /* yacc.c:1648 */
-+#line 1150 "parser.y" /* yacc.c:1646 */
- { (yyval.num) = MAKEVERSION((yyvsp[-2].num), (yyvsp[0].num)); }
--#line 5007 "parser.tab.c" /* yacc.c:1648 */
-+#line 5002 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 397:
--#line 1153 "parser.y" /* yacc.c:1648 */
-+#line 1151 "parser.y" /* yacc.c:1646 */
- { (yyval.num) = (yyvsp[0].num); }
--#line 5013 "parser.tab.c" /* yacc.c:1648 */
-+#line 5008 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 402:
--#line 1166 "parser.y" /* yacc.c:1648 */
-+#line 1164 "parser.y" /* yacc.c:1646 */
- { type_t *type = find_type_or_error((yyvsp[-1].str), 0);
- type->attrs = append_attr_list(type->attrs, (yyvsp[-2].attr_list));
- }
--#line 5021 "parser.tab.c" /* yacc.c:1648 */
-+#line 5016 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 403:
--#line 1171 "parser.y" /* yacc.c:1648 */
-+#line 1169 "parser.y" /* yacc.c:1646 */
- { type_t *iface = find_type_or_error2((yyvsp[-3].str), 0);
- if (type_get_type(iface) != TYPE_INTERFACE)
- error_loc("%s is not an interface\n", iface->name);
- iface->attrs = append_attr_list(iface->attrs, (yyvsp[-5].attr_list));
- }
--#line 5031 "parser.tab.c" /* yacc.c:1648 */
-+#line 5026 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 404:
--#line 1178 "parser.y" /* yacc.c:1648 */
-+#line 1176 "parser.y" /* yacc.c:1646 */
- { (yyval.attr_list) = NULL; }
--#line 5037 "parser.tab.c" /* yacc.c:1648 */
-+#line 5032 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 405:
--#line 1179 "parser.y" /* yacc.c:1648 */
-+#line 1177 "parser.y" /* yacc.c:1646 */
- { (yyval.attr_list) = (yyvsp[-1].attr_list); }
--#line 5043 "parser.tab.c" /* yacc.c:1648 */
-+#line 5038 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 406:
--#line 1182 "parser.y" /* yacc.c:1648 */
-+#line 1180 "parser.y" /* yacc.c:1646 */
- { (yyval.attr_list) = append_attr(NULL, (yyvsp[0].attr)); }
--#line 5049 "parser.tab.c" /* yacc.c:1648 */
-+#line 5044 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 407:
--#line 1183 "parser.y" /* yacc.c:1648 */
-+#line 1181 "parser.y" /* yacc.c:1646 */
- { (yyval.attr_list) = append_attr((yyvsp[-2].attr_list), (yyvsp[0].attr)); }
--#line 5055 "parser.tab.c" /* yacc.c:1648 */
-+#line 5050 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 408:
--#line 1186 "parser.y" /* yacc.c:1648 */
-+#line 1184 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_ENCODE); }
--#line 5061 "parser.tab.c" /* yacc.c:1648 */
-+#line 5056 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 409:
--#line 1187 "parser.y" /* yacc.c:1648 */
-+#line 1185 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_DECODE); }
--#line 5067 "parser.tab.c" /* yacc.c:1648 */
-+#line 5062 "parser.tab.c" /* yacc.c:1646 */
- break;
-
- case 410:
--#line 1188 "parser.y" /* yacc.c:1648 */
-+#line 1186 "parser.y" /* yacc.c:1646 */
- { (yyval.attr) = make_attr(ATTR_EXPLICIT_HANDLE); }
--#line 5073 "parser.tab.c" /* yacc.c:1648 */
-+#line 5068 "parser.tab.c" /* yacc.c:1646 */
- break;
-
-
--#line 5077 "parser.tab.c" /* yacc.c:1648 */
-+#line 5072 "parser.tab.c" /* yacc.c:1646 */
- default: break;
- }
- /* User semantic actions sometimes alter yychar, and that requires
-@@ -5301,7 +5296,7 @@ yyreturn:
- #endif
- return yyresult;
- }
--#line 1190 "parser.y" /* yacc.c:1907 */
-+#line 1188 "parser.y" /* yacc.c:1906 */
-
-
- static void decl_builtin_basic(const char *name, enum type_basic_type type)
-@@ -5312,7 +5307,8 @@ static void decl_builtin_basic(const char *name, enum type_basic_type type)
-
- static void decl_builtin_alias(const char *name, type_t *t)
- {
-- reg_type(type_new_alias(t, name), name, NULL, 0);
-+ decl_spec_t ds;
-+ reg_type(type_new_alias(init_declspec(&ds, t), name), name, &global_namespace, 0);
- }
-
- void init_types(void)
-@@ -5323,7 +5319,7 @@ void init_types(void)
- decl_builtin_basic("double", TYPE_BASIC_DOUBLE);
- decl_builtin_basic("error_status_t", TYPE_BASIC_ERROR_STATUS_T);
- decl_builtin_basic("handle_t", TYPE_BASIC_HANDLE);
-- decl_builtin_alias("boolean", type_new_basic(TYPE_BASIC_BYTE));
-+ decl_builtin_alias("boolean", type_new_basic(TYPE_BASIC_CHAR));
- }
-
- static str_list_t *append_str(str_list_t *list, char *str)
-@@ -5354,6 +5350,7 @@ static attr_list_t *append_attr(attr_list_t *list, attr_t *attr)
- LIST_FOR_EACH_ENTRY(attr_existing, list, attr_t, entry)
- if (attr_existing->type == attr->type)
- {
-+ __builtin_trap();
- parser_warning("duplicate attribute %s\n", get_attr_display_name(attr->type));
- /* use the last attribute, like MIDL does */
- list_remove(&attr_existing->entry);
-@@ -5413,53 +5410,73 @@ static attr_list_t *map_attrs(const attr_list_t *list, map_attrs_filter_t filter
- return new_list;
- }
-
--static decl_spec_t *make_decl_spec(type_t *type, decl_spec_t *left, decl_spec_t *right, attr_t *attr, enum storage_class stgclass)
-+static decl_spec_t *make_decl_spec(type_t *type, decl_spec_t *left, decl_spec_t *right, enum storage_class stgclass, enum type_qualifier typequalifier, enum function_specifier funcspecifier)
- {
- decl_spec_t *declspec = left ? left : right;
- if (!declspec)
- {
- declspec = xmalloc(sizeof(*declspec));
- declspec->type = NULL;
-- declspec->attrs = NULL;
- declspec->stgclass = STG_NONE;
-+ declspec->typequalifier = TYPE_QUALIFIER_NONE;
-+ declspec->funcspecifier = FUNCTION_SPECIFIER_NONE;
- }
- declspec->type = type;
- if (left && declspec != left)
- {
-- declspec->attrs = append_attr_list(declspec->attrs, left->attrs);
- if (declspec->stgclass == STG_NONE)
- declspec->stgclass = left->stgclass;
- else if (left->stgclass != STG_NONE)
- error_loc("only one storage class can be specified\n");
-+
-+ if (declspec->typequalifier == TYPE_QUALIFIER_NONE)
-+ declspec->typequalifier = left->typequalifier;
-+ else if (left->typequalifier != TYPE_QUALIFIER_NONE)
-+ error_loc("only one type qualifier can be specified\n");
-+
-+ if (declspec->funcspecifier == FUNCTION_SPECIFIER_NONE)
-+ declspec->funcspecifier = left->funcspecifier;
-+ else if (left->funcspecifier != FUNCTION_SPECIFIER_NONE)
-+ error_loc("only one function specifier can be specified\n");
-+
- assert(!left->type);
- free(left);
- }
- if (right && declspec != right)
- {
-- declspec->attrs = append_attr_list(declspec->attrs, right->attrs);
- if (declspec->stgclass == STG_NONE)
- declspec->stgclass = right->stgclass;
- else if (right->stgclass != STG_NONE)
- error_loc("only one storage class can be specified\n");
-+
-+ if (declspec->typequalifier == TYPE_QUALIFIER_NONE)
-+ declspec->typequalifier = right->typequalifier;
-+ else if (right->typequalifier != TYPE_QUALIFIER_NONE)
-+ error_loc("only one type qualifier can be specified\n");
-+
-+ if (declspec->funcspecifier == FUNCTION_SPECIFIER_NONE)
-+ declspec->funcspecifier = right->funcspecifier;
-+ else if (right->funcspecifier != FUNCTION_SPECIFIER_NONE)
-+ error_loc("only one function specifier can be specified\n");
-+
- assert(!right->type);
- free(right);
- }
-
-- declspec->attrs = append_attr(declspec->attrs, attr);
- if (declspec->stgclass == STG_NONE)
- declspec->stgclass = stgclass;
- else if (stgclass != STG_NONE)
- error_loc("only one storage class can be specified\n");
-
-- /* apply attributes to type */
-- if (type && declspec->attrs)
-- {
-- attr_list_t *attrs;
-- declspec->type = duptype(type, 1);
-- attrs = map_attrs(type->attrs, NULL);
-- declspec->type->attrs = append_attr_list(attrs, declspec->attrs);
-- declspec->attrs = NULL;
-- }
-+ if (declspec->typequalifier == TYPE_QUALIFIER_NONE)
-+ declspec->typequalifier = typequalifier;
-+ else if (typequalifier != TYPE_QUALIFIER_NONE)
-+ error_loc("only one type qualifier can be specified\n");
-+
-+ if (declspec->funcspecifier == FUNCTION_SPECIFIER_NONE)
-+ declspec->funcspecifier = funcspecifier;
-+ else if (funcspecifier != FUNCTION_SPECIFIER_NONE)
-+ error_loc("only one function specifier can be specified\n");
-
- return declspec;
- }
-@@ -5545,6 +5562,7 @@ void clear_all_offsets(void)
-
- static void type_function_add_head_arg(type_t *type, var_t *arg)
- {
-+ assert(type_get_type_detect_alias(type) == TYPE_FUNCTION);
- if (!type->details.function->args)
- {
- type->details.function->args = xmalloc( sizeof(*type->details.function->args) );
-@@ -5589,31 +5607,60 @@ static int is_allowed_range_type(const type_t *type)
- static type_t *get_array_or_ptr_ref(type_t *type)
- {
- if (is_ptr(type))
-- return type_pointer_get_ref(type);
-+ return type_pointer_get_ref_type(type);
- else if (is_array(type))
-- return type_array_get_element(type);
-+ return type_array_get_element_type(type);
- return NULL;
- }
-
- static type_t *append_chain_type(type_t *chain, type_t *type)
- {
-- type_t *chain_type;
-+ type_t *chain_type = NULL;
-
- if (!chain)
- return type;
- for (chain_type = chain; get_array_or_ptr_ref(chain_type); chain_type = get_array_or_ptr_ref(chain_type))
- ;
-
-+ assert(!type_is_alias(chain_type));
- if (is_ptr(chain_type))
-- chain_type->details.pointer.ref = type;
-+ chain_type->details.pointer.ref.type = type;
- else if (is_array(chain_type))
-- chain_type->details.array.elem = type;
-+ chain_type->details.array.elem.type = type;
- else
- assert(0);
-
- return chain;
- }
-
-+static decl_spec_t *append_chain_declspec(decl_spec_t *chain, type_t *type, enum type_qualifier typequalifier)
-+{
-+ type_t *chain_type = chain->type;
-+ decl_spec_t *chain_declspec = NULL;
-+
-+ if (!chain_type)
-+ {
-+ chain->type = type;
-+ chain->typequalifier = typequalifier;
-+ return chain;
-+ }
-+
-+ for(; get_array_or_ptr_ref(chain_type); chain_type = get_array_or_ptr_ref(chain_type))
-+ ;
-+
-+ if (is_ptr(chain_type))
-+ chain_declspec = &chain_type->details.pointer.ref;
-+ else if (is_array(chain_type))
-+ chain_declspec = &chain_type->details.array.elem;
-+ else
-+ assert(NULL);
-+
-+ chain_declspec->type = type;
-+ chain_declspec->typequalifier = typequalifier;
-+
-+ return chain;
-+}
-+
- static warning_list_t *append_warning(warning_list_t *list, int num)
- {
- warning_t *entry;
-@@ -5629,7 +5676,7 @@ static warning_list_t *append_warning(warning_list_t *list, int num)
- return list;
- }
-
--static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const declarator_t *decl,
-+static var_t *declare_var(attr_list_t *attrs, decl_spec_t *declspec, const declarator_t *decl,
- int top)
- {
- var_t *v = decl->var;
-@@ -5638,58 +5685,74 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
- expr_t *dim;
- type_t **ptype;
- type_t *func_type = decl ? decl->func_type : NULL;
-- type_t *type = decl_spec->type;
-+ type_t *type = declspec->type;
-
-- if (is_attr(type->attrs, ATTR_INLINE))
-- {
-+
-+ if (declspec->funcspecifier == FUNCTION_SPECIFIER_INLINE) {
- if (!func_type)
- error_loc("inline attribute applied to non-function type\n");
- else
- {
-- type_t *t;
-- /* move inline attribute from return type node to function node */
-- for (t = func_type; is_ptr(t); t = type_pointer_get_ref(t))
-- ;
-- t->attrs = move_attr(t->attrs, type->attrs, ATTR_INLINE);
-+ v->declspec.funcspecifier = declspec->funcspecifier;
- }
- }
-
-- /* add type onto the end of the pointers in pident->type */
-- v->type = append_chain_type(decl ? decl->type : NULL, type);
-- v->stgclass = decl_spec->stgclass;
-+ /* if the var type is a pointerish, we need to move the type qualifier to the pointee's declspec
-+ * unless the pointee already has const type qualifier*/
-+ if (!decl)
-+ {
-+ /* simplest case, no pointers to deal with here */
-+ v->declspec.typequalifier = declspec->typequalifier;
-+ } else if (decl->bits)
-+ {
-+ /* dealing with a bitfield, generate bitfield and copy over typequalifier*/
-+ v->declspec.type = type_new_bitfield(declspec->type, decl->bits);
-+ v->declspec.typequalifier = declspec->typequalifier;
-+ }
-+ else
-+ {
-+ /* here we're dealing with a pointerish type chain, so we need to pull
-+ * the typequalifier off of the declspec and stick them in the type's attr list
-+ */
-+ v->declspec.type = decl->declspec.type;
-+ v->declspec.typequalifier = decl->declspec.typequalifier;
-+ append_chain_declspec(&v->declspec, type, declspec->typequalifier);
-+ }
-+
-+ v->declspec.stgclass = declspec->stgclass;
- v->attrs = attrs;
-
- /* check for pointer attribute being applied to non-pointer, non-array
- * type */
-- if (!is_array(v->type))
-+ if (!is_array(v->declspec.type))
- {
- int ptr_attr = get_attrv(v->attrs, ATTR_POINTERTYPE);
- const type_t *ptr = NULL;
- /* pointer attributes on the left side of the type belong to the function
- * pointer, if one is being declared */
-- type_t **pt = func_type ? &func_type : &v->type;
-+ type_t **pt = func_type ? &func_type : &v->declspec.type;
- for (ptr = *pt; ptr && !ptr_attr; )
- {
- ptr_attr = get_attrv(ptr->attrs, ATTR_POINTERTYPE);
- if (!ptr_attr && type_is_alias(ptr))
-- ptr = type_alias_get_aliasee(ptr);
-+ ptr = type_alias_get_aliasee_type(ptr);
- else
- break;
- }
- if (is_ptr(ptr))
- {
- if (ptr_attr && ptr_attr != FC_UP &&
-- type_get_type(type_pointer_get_ref(ptr)) == TYPE_INTERFACE)
-+ type_get_type(type_pointer_get_ref_type(ptr)) == TYPE_INTERFACE)
- warning_loc_info(&v->loc_info,
- "%s: pointer attribute applied to interface "
- "pointer type has no effect\n", v->name);
-- if (!ptr_attr && top && (*pt)->details.pointer.def_fc != FC_RP)
-+ if (!ptr_attr && top && type_pointer_get_default_fc(*pt) != FC_RP)
- {
- /* FIXME: this is a horrible hack to cope with the issue that we
- * store an offset to the typeformat string in the type object, but
- * two typeformat strings may be written depending on whether the
- * pointer is a toplevel parameter or not */
-- *pt = duptype(*pt, 1);
-+ *pt = dup_pointer_type(*pt);
- }
- }
- else if (ptr_attr)
-@@ -5700,16 +5763,16 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
- {
- type_t *t = type;
-
-- if (!is_ptr(v->type) && !is_array(v->type))
-+ if (!is_ptr(v->declspec.type) && !is_array(v->declspec.type))
- error_loc("'%s': [string] attribute applied to non-pointer, non-array type\n",
- v->name);
-
- for (;;)
- {
- if (is_ptr(t))
-- t = type_pointer_get_ref(t);
-+ t = type_pointer_get_ref_type(t);
- else if (is_array(t))
-- t = type_array_get_element(t);
-+ t = type_array_get_element_type(t);
- else
- break;
- }
-@@ -5726,15 +5789,15 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
-
- if (is_attr(v->attrs, ATTR_V1ENUM))
- {
-- if (type_get_type_detect_alias(v->type) != TYPE_ENUM)
-+ if (type_get_type_detect_alias(v->declspec.type) != TYPE_ENUM)
- error_loc("'%s': [v1_enum] attribute applied to non-enum type\n", v->name);
- }
-
-- if (is_attr(v->attrs, ATTR_RANGE) && !is_allowed_range_type(v->type))
-+ if (is_attr(v->attrs, ATTR_RANGE) && !is_allowed_range_type(v->declspec.type))
- error_loc("'%s': [range] attribute applied to non-integer type\n",
- v->name);
-
-- ptype = &v->type;
-+ ptype = &v->declspec.type;
- if (sizes) LIST_FOR_EACH_ENTRY(dim, sizes, expr_t, entry)
- {
- if (dim->type != EXPR_VOID)
-@@ -5747,7 +5810,7 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
- else
- *ptype = type_new_array((*ptype)->name,
- type_array_get_element(*ptype), FALSE,
-- 0, dim, NULL, 0);
-+ 0, dim, NULL, FC_RP);
- }
- else if (is_ptr(*ptype))
- *ptype = type_new_array((*ptype)->name, type_pointer_get_ref(*ptype), TRUE,
-@@ -5756,15 +5819,16 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
- error_loc("%s: size_is attribute applied to illegal type\n", v->name);
- }
-
-+ assert(!type_is_alias(*ptype));
- if (is_ptr(*ptype))
-- ptype = &(*ptype)->details.pointer.ref;
-+ ptype = &(*ptype)->details.pointer.ref.type;
- else if (is_array(*ptype))
-- ptype = &(*ptype)->details.array.elem;
-+ ptype = &(*ptype)->details.array.elem.type;
- else
- error_loc("%s: too many expressions in size_is attribute\n", v->name);
- }
-
-- ptype = &v->type;
-+ ptype = &v->declspec.type;
- if (lengs) LIST_FOR_EACH_ENTRY(dim, lengs, expr_t, entry)
- {
- if (dim->type != EXPR_VOID)
-@@ -5782,10 +5846,11 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
- error_loc("%s: length_is attribute applied to illegal type\n", v->name);
- }
-
-+ assert(!type_is_alias(*ptype));
- if (is_ptr(*ptype))
-- ptype = &(*ptype)->details.pointer.ref;
-+ ptype = &(*ptype)->details.pointer.ref.type;
- else if (is_array(*ptype))
-- ptype = &(*ptype)->details.array.elem;
-+ ptype = &(*ptype)->details.array.elem.type;
- else
- error_loc("%s: too many expressions in length_is attribute\n", v->name);
- }
-@@ -5796,29 +5861,31 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
- if (func_type)
- {
- type_t *ft, *t;
-- type_t *return_type = v->type;
-- v->type = func_type;
-- for (ft = v->type; is_ptr(ft); ft = type_pointer_get_ref(ft))
-+ type_t *return_type = v->declspec.type;
-+ enum type_qualifier typequalifier = v->declspec.typequalifier;
-+
-+ v->declspec.type = func_type;
-+ v->declspec.typequalifier = TYPE_QUALIFIER_NONE;
-+ for (ft = v->declspec.type; is_ptr(ft); ft = type_pointer_get_ref_type(ft))
- ;
- assert(type_get_type_detect_alias(ft) == TYPE_FUNCTION);
- ft->details.function->retval = make_var(xstrdup("_RetVal"));
-- ft->details.function->retval->type = return_type;
-+ ft->details.function->retval->declspec.type = return_type;
-+ ft->details.function->retval->declspec.typequalifier = typequalifier;
-+
- /* move calling convention attribute, if present, from pointer nodes to
- * function node */
-- for (t = v->type; is_ptr(t); t = type_pointer_get_ref(t))
-+ for (t = v->declspec.type; is_ptr(t); t = type_pointer_get_ref_type(t))
- ft->attrs = move_attr(ft->attrs, t->attrs, ATTR_CALLCONV);
- }
- else
- {
- type_t *t;
-- for (t = v->type; is_ptr(t); t = type_pointer_get_ref(t))
-+ for (t = v->declspec.type; is_ptr(t); t = type_pointer_get_ref_type(t))
- if (is_attr(t->attrs, ATTR_CALLCONV))
- error_loc("calling convention applied to non-function-pointer type\n");
- }
-
-- if (decl->bits)
-- v->type = type_new_bitfield(v->type, decl->bits);
--
- return v;
- }
-
-@@ -5866,6 +5933,10 @@ var_list_t *append_var(var_list_t *list, var_t *var)
- list_init( list );
- }
- list_add_tail( list, &var->entry );
-+
-+ if (var->declspec.type)
-+ var->declonly = !type_is_defined(var->declspec.type);
-+
- return list;
- }
-
-@@ -5885,11 +5956,11 @@ var_t *make_var(char *name)
- {
- var_t *v = xmalloc(sizeof(var_t));
- v->name = name;
-- v->type = NULL;
-+ init_declspec(&v->declspec, NULL);
- v->attrs = NULL;
- v->eval = NULL;
-- v->stgclass = STG_NONE;
- init_loc_info(&v->loc_info);
-+ v->declonly = TRUE;
- return v;
- }
-
-@@ -5897,10 +5968,9 @@ static var_t *copy_var(var_t *src, char *name, map_attrs_filter_t attr_filter)
- {
- var_t *v = xmalloc(sizeof(var_t));
- v->name = name;
-- v->type = src->type;
-+ v->declspec = src->declspec;
- v->attrs = map_attrs(src->attrs, attr_filter);
- v->eval = src->eval;
-- v->stgclass = src->stgclass;
- v->loc_info = src->loc_info;
- return v;
- }
-@@ -5920,7 +5990,7 @@ static declarator_t *make_declarator(var_t *var)
- {
- declarator_t *d = xmalloc(sizeof(*d));
- d->var = var ? var : make_var(NULL);
-- d->type = NULL;
-+ init_declspec(&d->declspec, NULL);
- d->func_type = NULL;
- d->bits = NULL;
- return d;
-@@ -5928,7 +5998,15 @@ static declarator_t *make_declarator(var_t *var)
-
- static type_t *make_safearray(type_t *type)
- {
-- return type_new_array(NULL, type_new_alias(type, "SAFEARRAY"), TRUE, 0,
-+ decl_spec_t aliasee_ds;
-+ decl_spec_t element_ds;
-+
-+ init_declspec(&element_ds,
-+ type_new_alias(
-+ init_declspec(&aliasee_ds, type),
-+ "SAFEARRAY"));
-+
-+ return type_new_array(NULL, &element_ds, TRUE, 0,
- NULL, NULL, FC_RP);
- }
-
-@@ -6018,15 +6096,16 @@ type_t *reg_type(type_t *type, const char *name, struct namespace *namespace, in
- nt->t = t;
- nt->next = namespace->type_hash[hash];
- namespace->type_hash[hash] = nt;
-- if ((t == tsSTRUCT || t == tsUNION))
-+ if ((t == tsSTRUCT || t == tsUNION || t == tsENUM))
- fix_incomplete_types(type);
- return type;
- }
-
- static int is_incomplete(const type_t *t)
- {
-- return !t->defined &&
-- (type_get_type_detect_alias(t) == TYPE_STRUCT ||
-+ return !type_is_defined(t) &&
-+ (type_get_type_detect_alias(t) == TYPE_ENUM ||
-+ type_get_type_detect_alias(t) == TYPE_STRUCT ||
- type_get_type_detect_alias(t) == TYPE_UNION ||
- type_get_type_detect_alias(t) == TYPE_ENCAPSULATED_UNION);
- }
-@@ -6034,19 +6113,16 @@ static int is_incomplete(const type_t *t)
- void add_incomplete(type_t *t)
- {
- struct typenode *tn = xmalloc(sizeof *tn);
-+ assert(is_incomplete(t));
- tn->type = t;
- list_add_tail(&incomplete_types, &tn->entry);
- }
-
- static void fix_type(type_t *t)
- {
-- if (type_is_alias(t) && is_incomplete(t)) {
-- type_t *ot = type_alias_get_aliasee(t);
-- fix_type(ot);
-- if (type_get_type_detect_alias(ot) == TYPE_STRUCT ||
-- type_get_type_detect_alias(ot) == TYPE_UNION ||
-- type_get_type_detect_alias(ot) == TYPE_ENCAPSULATED_UNION)
-- t->details.structure = ot->details.structure;
-+ if (type_is_alias(t) && is_incomplete(t))
-+ {
-+ type_t *ot = type_alias_get_aliasee_type(t);
- t->defined = ot->defined;
- }
- }
-@@ -6070,7 +6146,7 @@ static void fix_incomplete_types(type_t *complete_type)
- {
- if (type_is_equal(complete_type, tn->type))
- {
-- tn->type->details.structure = complete_type->details.structure;
-+ tn->type->details = complete_type->details;
- list_remove(&tn->entry);
- free(tn);
- }
-@@ -6094,7 +6170,13 @@ static type_t *reg_typedefs(decl_spec_t *decl_spec, declarator_list_t *decls, at
- type_get_type_detect_alias(type) == TYPE_ENCAPSULATED_UNION)
- {
- if (!type->name)
-+ {
- type->name = gen_name();
-+ /* the generated name will be used and this typedef excluded from the
-+ * built typelib unless the typedef has the 'public' attribute, so add it here */
-+ if (do_typelib && !is_attr(attrs, ATTR_PUBLIC))
-+ attrs = append_attr(attrs, make_attr(ATTR_PUBLIC));
-+ }
-
- /* replace existing attributes when generating a typelib */
- if (do_typelib)
-@@ -6125,7 +6207,7 @@ static type_t *reg_typedefs(decl_spec_t *decl_spec, declarator_list_t *decls, at
- cur->loc_info.line_number);
-
- name = declare_var(attrs, decl_spec, decl, 0);
-- cur = type_new_alias(name->type, name->name);
-+ cur = type_new_alias(&name->declspec, name->name);
- cur->attrs = attrs;
-
- if (is_incomplete(cur))
-@@ -6293,7 +6375,6 @@ struct allowed_attr allowed_attr[] =
- /* ATTR_CASE */ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, "case" },
- /* ATTR_CODE */ { 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "code" },
- /* ATTR_COMMSTATUS */ { 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "comm_status" },
-- /* ATTR_CONST */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "const" },
- /* ATTR_CONTEXTHANDLE */ { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "context_handle" },
- /* ATTR_CONTROL */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, "control" },
- /* ATTR_DECODE */ { 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "decode" },
-@@ -6328,7 +6409,6 @@ struct allowed_attr allowed_attr[] =
- /* ATTR_IMMEDIATEBIND */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "immediatebind" },
- /* ATTR_IMPLICIT_HANDLE */ { 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "implicit_handle" },
- /* ATTR_IN */ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "in" },
-- /* ATTR_INLINE */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "inline" },
- /* ATTR_INPUTSYNC */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "inputsync" },
- /* ATTR_LENGTHIS */ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, "length_is" },
- /* ATTR_LIBLCID */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, "lcid" },
-@@ -6400,10 +6480,10 @@ static attr_list_t *check_iface_attrs(const char *name, attr_list_t *attrs)
- if (attr->type == ATTR_IMPLICIT_HANDLE)
- {
- const var_t *var = attr->u.pval;
-- if (type_get_type( var->type) == TYPE_BASIC &&
-- type_basic_get_type( var->type ) == TYPE_BASIC_HANDLE)
-+ if (type_get_type( var->declspec.type) == TYPE_BASIC &&
-+ type_basic_get_type( var->declspec.type ) == TYPE_BASIC_HANDLE)
- continue;
-- if (is_aliaschain_attr( var->type, ATTR_HANDLE ))
-+ if (is_aliaschain_attr( var->declspec.type, ATTR_HANDLE ))
- continue;
- error_loc("attribute %s requires a handle type in interface %s\n",
- allowed_attr[attr->type].display_name, name);
-@@ -6608,7 +6688,7 @@ static int is_ptr_guid_type(const type_t *type)
-
- /* second, make sure it is a pointer to something of size sizeof(GUID),
- * i.e. 16 bytes */
-- return (type_memsize(type_pointer_get_ref(type)) == 16);
-+ return (type_memsize(type_pointer_get_ref_type(type)) == 16);
- }
-
- static void check_conformance_expr_list(const char *attr_name, const var_t *arg, const type_t *container_type, expr_list_t *expr_list)
-@@ -6635,7 +6715,7 @@ static void check_remoting_fields(const var_t *var, type_t *type);
- static void check_field_common(const type_t *container_type,
- const char *container_name, const var_t *arg)
- {
-- type_t *type = arg->type;
-+ type_t *type = arg->declspec.type;
- int more_to_do;
- const char *container_type_name;
- const char *var_type;
-@@ -6665,7 +6745,7 @@ static void check_field_common(const type_t *container_type,
- }
-
- if (is_attr(arg->attrs, ATTR_LENGTHIS) &&
-- (is_attr(arg->attrs, ATTR_STRING) || is_aliaschain_attr(arg->type, ATTR_STRING)))
-+ (is_attr(arg->attrs, ATTR_STRING) || is_aliaschain_attr(arg->declspec.type, ATTR_STRING)))
- error_loc_info(&arg->loc_info,
- "string and length_is specified for argument %s are mutually exclusive attributes\n",
- arg->name);
-@@ -6762,23 +6842,28 @@ static void check_field_common(const type_t *container_type,
- {
- const type_t *t = type;
- while (is_ptr(t))
-- t = type_pointer_get_ref(t);
-+ t = type_pointer_get_ref_type(t);
- if (is_aliaschain_attr(t, ATTR_RANGE))
- warning_loc_info(&arg->loc_info, "%s: range not verified for a string of ranged types\n", arg->name);
- break;
- }
- case TGT_POINTER:
-- type = type_pointer_get_ref(type);
-+ type = type_pointer_get_ref_type(type);
- more_to_do = TRUE;
- break;
- case TGT_ARRAY:
-- type = type_array_get_element(type);
-+ type = type_array_get_element_type(type);
- more_to_do = TRUE;
- break;
-+ case TGT_ENUM:
-+ type = type_get_real_type(type);
-+ if(!type_is_complete(type))
-+ {
-+ error_loc_info(&arg->loc_info, "undefined type declaration enum %s\n", type->name);
-+ }
- case TGT_USER_TYPE:
- case TGT_IFACE_POINTER:
- case TGT_BASIC:
-- case TGT_ENUM:
- case TGT_RANGE:
- /* nothing to do */
- break;
-@@ -6803,13 +6888,18 @@ static void check_remoting_fields(const var_t *var, type_t *type)
- if (type_is_complete(type))
- fields = type_struct_get_fields(type);
- else
-- error_loc_info(&var->loc_info, "undefined type declaration %s\n", type->name);
-+ error_loc_info(&var->loc_info, "undefined type declaration struct %s\n", type->name);
- }
- else if (type_get_type(type) == TYPE_UNION || type_get_type(type) == TYPE_ENCAPSULATED_UNION)
-- fields = type_union_get_cases(type);
-+ {
-+ if (type_is_complete(type))
-+ fields = type_union_get_cases(type);
-+ else
-+ error_loc_info(&var->loc_info, "undefined type declaration union %s\n", type->name);
-+ }
-
- if (fields) LIST_FOR_EACH_ENTRY( field, fields, const var_t, entry )
-- if (field->type) check_field_common(type, type->name, field);
-+ if (field->declspec.type) check_field_common(type, type->name, field);
- }
-
- /* checks that arguments for a function make sense for marshalling and unmarshalling */
-@@ -6818,9 +6908,10 @@ static void check_remoting_args(const var_t *func)
- const char *funcname = func->name;
- const var_t *arg;
-
-- if (func->type->details.function->args) LIST_FOR_EACH_ENTRY( arg, func->type->details.function->args, const var_t, entry )
-+ assert(type_get_type_detect_alias(func->declspec.type) == TYPE_FUNCTION);
-+ if (func->declspec.type->details.function->args) LIST_FOR_EACH_ENTRY( arg, func->declspec.type->details.function->args, const var_t, entry )
- {
-- const type_t *type = arg->type;
-+ const type_t *type = arg->declspec.type;
-
- /* check that [out] parameters have enough pointer levels */
- if (is_attr(arg->attrs, ATTR_OUT))
-@@ -6860,16 +6951,16 @@ static void check_remoting_args(const var_t *func)
- }
- }
-
-- check_field_common(func->type, funcname, arg);
-+ check_field_common(func->declspec.type, funcname, arg);
- }
-
-- if (type_get_type(type_function_get_rettype(func->type)) != TYPE_VOID)
-+ if (type_get_type(type_function_get_rettype(func->declspec.type)) != TYPE_VOID)
- {
- var_t var;
- var = *func;
-- var.type = type_function_get_rettype(func->type);
-+ var.declspec.type = type_function_get_rettype(func->declspec.type);
- var.name = xstrdup("return value");
-- check_field_common(func->type, funcname, &var);
-+ check_field_common(func->declspec.type, funcname, &var);
- free(var.name);
- }
- }
-@@ -6886,8 +6977,8 @@ static void add_explicit_handle_if_necessary(const type_t *iface, var_t *func)
- * function */
- var_t *idl_handle = make_var(xstrdup("IDL_handle"));
- idl_handle->attrs = append_attr(NULL, make_attr(ATTR_IN));
-- idl_handle->type = find_type_or_error("handle_t", 0);
-- type_function_add_head_arg(func->type, idl_handle);
-+ idl_handle->declspec.type = find_type_or_error("handle_t", 0);
-+ type_function_add_head_arg(func->declspec.type, idl_handle);
- }
- }
-
-@@ -6952,6 +7043,7 @@ static void check_async_uuid(type_t *iface)
- type_t *async_iface;
- type_t *inherit;
-
-+ assert(type_get_type_detect_alias(iface) == TYPE_INTERFACE);
- if (!is_attr(iface->attrs, ATTR_ASYNCUUID)) return;
-
- inherit = iface->details.iface->inherit;
-@@ -6968,7 +7060,8 @@ static void check_async_uuid(type_t *iface)
- var_t *begin_func, *finish_func, *func = stmt->u.var, *arg;
- var_list_t *begin_args = NULL, *finish_args = NULL, *args;
-
-- args = func->type->details.function->args;
-+ assert(type_get_type_detect_alias(func->declspec.type) == TYPE_FUNCTION);
-+ args = func->declspec.type->details.function->args;
- if (args) LIST_FOR_EACH_ENTRY(arg, args, var_t, entry)
- {
- if (is_attr(arg->attrs, ATTR_IN) || !is_attr(arg->attrs, ATTR_OUT))
-@@ -6978,15 +7071,15 @@ static void check_async_uuid(type_t *iface)
- }
-
- begin_func = copy_var(func, concat_str("Begin_", func->name), NULL);
-- begin_func->type = type_new_function(begin_args);
-- begin_func->type->attrs = func->attrs;
-- begin_func->type->details.function->retval = func->type->details.function->retval;
-+ begin_func->declspec.type = type_new_function(begin_args);
-+ begin_func->declspec.type->attrs = func->attrs;
-+ begin_func->declspec.type->details.function->retval = func->declspec.type->details.function->retval;
- stmts = append_statement(stmts, make_statement_declaration(begin_func));
-
- finish_func = copy_var(func, concat_str("Finish_", func->name), NULL);
-- finish_func->type = type_new_function(finish_args);
-- finish_func->type->attrs = func->attrs;
-- finish_func->type->details.function->retval = func->type->details.function->retval;
-+ finish_func->declspec.type = type_new_function(finish_args);
-+ finish_func->declspec.type->attrs = func->attrs;
-+ finish_func->declspec.type->details.function->retval = func->declspec.type->details.function->retval;
- stmts = append_statement(stmts, make_statement_declaration(finish_func));
- }
-
-@@ -7026,6 +7119,7 @@ static void check_statements(const statement_list_t *stmts, int is_inside_librar
- static void check_all_user_types(const statement_list_t *stmts)
- {
- const statement_t *stmt;
-+ const var_t *v;
-
- if (stmts) LIST_FOR_EACH_ENTRY(stmt, stmts, const statement_t, entry)
- {
-@@ -7037,7 +7131,11 @@ static void check_all_user_types(const statement_list_t *stmts)
- const statement_t *stmt_func;
- STATEMENTS_FOR_EACH_FUNC(stmt_func, type_iface_get_stmts(stmt->u.type)) {
- const var_t *func = stmt_func->u.var;
-- check_for_additional_prototype_types(func->type->details.function->args);
-+ assert(type_get_type_detect_alias(func->declspec.type) == TYPE_FUNCTION);
-+ if (func->declspec.type->details.function->args)
-+ LIST_FOR_EACH_ENTRY( v, func->declspec.type->details.function->args, const var_t, entry )
-+ check_for_additional_prototype_types(v->declspec.type);
-+ check_for_additional_prototype_types(type_function_get_rettype(func->declspec.type));
- }
- }
- }
-@@ -7071,6 +7169,10 @@ static statement_t *make_statement_type_decl(type_t *type)
- {
- statement_t *stmt = make_statement(STMT_TYPE);
- stmt->u.type = type;
-+ if (type_is_defined(type))
-+ {
-+ stmt->declonly = FALSE;
-+ }
- return stmt;
- }
-
-@@ -7085,16 +7187,16 @@ static statement_t *make_statement_declaration(var_t *var)
- {
- statement_t *stmt = make_statement(STMT_DECLARATION);
- stmt->u.var = var;
-- if (var->stgclass == STG_EXTERN && var->eval)
-+ if (var->declspec.stgclass == STG_EXTERN && var->eval)
- warning("'%s' initialised and declared extern\n", var->name);
- if (is_const_decl(var))
- {
- if (var->eval)
- reg_const(var);
- }
-- else if (type_get_type(var->type) == TYPE_FUNCTION)
-+ else if (type_get_type(var->declspec.type) == TYPE_FUNCTION)
- check_function_attrs(var->name, var->attrs);
-- else if (var->stgclass == STG_NONE || var->stgclass == STG_REGISTER)
-+ else if (var->declspec.stgclass == STG_NONE || var->declspec.stgclass == STG_REGISTER)
- error_loc("instantiation of data is illegal\n");
- return stmt;
- }
-@@ -7146,6 +7248,7 @@ static statement_t *make_statement_typedef(declarator_list_t *decls)
- declarator_t *decl, *next;
- statement_t *stmt;
- type_list_t **type_list;
-+ int defined = TRUE;
-
- if (!decls) return NULL;
-
-@@ -7157,6 +7260,18 @@ static statement_t *make_statement_typedef(declarator_list_t *decls)
- {
- var_t *var = decl->var;
- type_t *type = find_type_or_error(var->name, 0);
-+
-+ /* ensure that all of the types in this typedef statement have been defined
-+ * before setting its declonly flag */
-+ if (type_is_pointerish(type))
-+ {
-+ defined = defined & type_is_defined(type_get_pointer_chain_tail(type));
-+ }
-+ else
-+ {
-+ defined = defined & type_is_defined(type_get_real_type(type));
-+ }
-+
- *type_list = xmalloc(sizeof(type_list_t));
- (*type_list)->type = type;
- (*type_list)->next = NULL;
-@@ -7166,6 +7281,7 @@ static statement_t *make_statement_typedef(declarator_list_t *decls)
- free(var);
- }
-
-+ stmt->declonly = !defined;
- return stmt;
- }
-
-@@ -7206,7 +7322,7 @@ void init_loc_info(loc_info_t *i)
-
- static void check_def(const type_t *t)
- {
-- if (t->defined)
-+ if (type_is_defined(t))
- error_loc("%s: redefinition error; original definition was at %s:%d\n",
- t->name, t->loc_info.input_name, t->loc_info.line_number);
- }
-diff --git a/mingw-w64-tools/widl/src/parser.tab.h b/mingw-w64-tools/widl/src/parser.tab.h
-index 09874726..fc7a8f4d 100644
---- a/mingw-w64-tools/widl/src/parser.tab.h
-+++ b/mingw-w64-tools/widl/src/parser.tab.h
-@@ -1,8 +1,8 @@
--/* A Bison parser, made by GNU Bison 3.0.5. */
-+/* A Bison parser, made by GNU Bison 3.0.4. */
-
- /* Bison interface for Yacc-like parsers in C
-
-- Copyright (C) 1984, 1989-1990, 2000-2015, 2018 Free Software Foundation, Inc.
-+ Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
-@@ -239,7 +239,7 @@ extern int parser_debug;
-
- union YYSTYPE
- {
--#line 142 "parser.y" /* yacc.c:1910 */
-+#line 136 "parser.y" /* yacc.c:1909 */
-
- attr_t *attr;
- attr_list_t *attr_list;
-@@ -266,8 +266,10 @@ union YYSTYPE
- struct _import_t *import;
- struct _decl_spec_t *declspec;
- enum storage_class stgclass;
-+ enum type_qualifier typequalifier;
-+ enum function_specifier funcspecifier;
-
--#line 271 "parser.tab.h" /* yacc.c:1910 */
-+#line 273 "parser.tab.h" /* yacc.c:1909 */
- };
-
- typedef union YYSTYPE YYSTYPE;
-diff --git a/mingw-w64-tools/widl/src/parser.y b/mingw-w64-tools/widl/src/parser.y
-index d9793941..64503ac1 100644
---- a/mingw-w64-tools/widl/src/parser.y
-+++ b/mingw-w64-tools/widl/src/parser.y
-@@ -52,13 +52,6 @@ struct _import_t
- int import_performed;
- };
-
--typedef struct _decl_spec_t
--{
-- type_t *type;
-- attr_list_t *attrs;
-- enum storage_class stgclass;
--} decl_spec_t;
--
- typelist_t incomplete_types = LIST_INIT(incomplete_types);
-
- static void fix_incomplete(void);
-@@ -67,7 +60,7 @@ static void fix_incomplete_types(type_t *complete_type);
- static str_list_t *append_str(str_list_t *list, char *str);
- static attr_list_t *append_attr(attr_list_t *list, attr_t *attr);
- static attr_list_t *append_attr_list(attr_list_t *new_list, attr_list_t *old_list);
--static decl_spec_t *make_decl_spec(type_t *type, decl_spec_t *left, decl_spec_t *right, attr_t *attr, enum storage_class stgclass);
-+static decl_spec_t *make_decl_spec(type_t *type, decl_spec_t *left, decl_spec_t *right, enum storage_class stgclass, enum type_qualifier typequalifier, enum function_specifier funcspecifier);
- static attr_t *make_attr(enum attr_type type);
- static attr_t *make_attrv(enum attr_type type, unsigned int val);
- static attr_t *make_attrp(enum attr_type type, void *val);
-@@ -83,6 +76,7 @@ static declarator_t *make_declarator(var_t *var);
- static type_t *make_safearray(type_t *type);
- static typelib_t *make_library(const char *name, const attr_list_t *attrs);
- static type_t *append_chain_type(type_t *chain, type_t *type);
-+static decl_spec_t *append_chain_declspec(decl_spec_t *chain, type_t *type, enum type_qualifier typequalifier);
- static warning_list_t *append_warning(warning_list_t *, int);
-
- static type_t *reg_typedefs(decl_spec_t *decl_spec, var_list_t *names, attr_list_t *attrs);
-@@ -165,6 +159,8 @@ static typelib_t *current_typelib;
- struct _import_t *import;
- struct _decl_spec_t *declspec;
- enum storage_class stgclass;
-+ enum type_qualifier typequalifier;
-+ enum function_specifier funcspecifier;
- }
-
- %token <str> aIDENTIFIER aPRAGMA
-@@ -266,14 +262,16 @@ static typelib_t *current_typelib;
- %token tWCHAR tWIREMARSHAL
- %token tAPARTMENT tNEUTRAL tSINGLE tFREE tBOTH
-
--%type <attr> attribute type_qualifier function_specifier acf_attribute
--%type <attr_list> m_attributes attributes attrib_list m_type_qual_list
-+%type <attr> attribute acf_attribute
-+%type <attr_list> m_attributes attributes attrib_list
- %type <attr_list> acf_attributes acf_attribute_list
- %type <str_list> str_list
- %type <expr> m_expr expr expr_const expr_int_const array m_bitfield
- %type <expr_list> m_exprs /* exprs expr_list */ expr_list_int_const
- %type <ifinfo> interfacehdr
- %type <stgclass> storage_cls_spec
-+%type <typequalifier> type_qualifier m_type_qual_bits
-+%type <funcspecifier> function_specifier
- %type <declspec> decl_spec decl_spec_no_type m_decl_spec_no_type
- %type <type> inherit interface interfacedef interfacedec
- %type <type> dispinterface dispinterfacehdr dispinterfacedef
-@@ -318,7 +316,7 @@ static typelib_t *current_typelib;
- %right '!' '~' CAST PPTR POS NEG ADDRESSOF tSIZEOF
- %left '.' MEMBERPTR '[' ']'
-
--%error-verbose
-+%define parse.error verbose
-
- %%
-
-@@ -651,10 +649,10 @@ enum_list: enum { if (!$1->eval)
-
- enum: ident '=' expr_int_const { $$ = reg_const($1);
- $$->eval = $3;
-- $$->type = type_new_int(TYPE_BASIC_INT, 0);
-+ $$->declspec.type = type_new_int(TYPE_BASIC_INT, 0);
- }
- | ident { $$ = reg_const($1);
-- $$->type = type_new_int(TYPE_BASIC_INT, 0);
-+ $$->declspec.type = type_new_int(TYPE_BASIC_INT, 0);
- }
- ;
-
-@@ -740,7 +738,7 @@ field: m_attributes decl_spec struct_declarator_list ';'
- $$ = set_var_types($1, $2, $3);
- }
- | m_attributes uniondef ';' { var_t *v = make_var(NULL);
-- v->type = $2; v->attrs = $1;
-+ v->declspec.type = $2; v->attrs = $1;
- $$ = append_var(NULL, v);
- }
- ;
-@@ -764,13 +762,13 @@ s_field: m_attributes decl_spec declarator { $$ = declare_var(check_field_attrs
- free($3);
- }
- | m_attributes structdef { var_t *v = make_var(NULL);
-- v->type = $2; v->attrs = $1;
-+ v->declspec.type = $2; v->attrs = $1;
- $$ = v;
- }
- ;
-
- funcdef: declaration { $$ = $1;
-- if (type_get_type($$->type) != TYPE_FUNCTION)
-+ if (type_get_type($$->declspec.type) != TYPE_FUNCTION)
- error_loc("only methods may be declared inside the methods section of a dispinterface\n");
- check_function_attrs($$->name, $$->attrs);
- }
-@@ -955,20 +953,20 @@ storage_cls_spec:
- ;
-
- function_specifier:
-- tINLINE { $$ = make_attr(ATTR_INLINE); }
-+ tINLINE { $$ = FUNCTION_SPECIFIER_INLINE; }
- ;
-
- type_qualifier:
-- tCONST { $$ = make_attr(ATTR_CONST); }
-+ tCONST { $$ = TYPE_QUALIFIER_CONST; }
- ;
-
--m_type_qual_list: { $$ = NULL; }
-- | m_type_qual_list type_qualifier { $$ = append_attr($1, $2); }
-+m_type_qual_bits: { $$ = TYPE_QUALIFIER_NONE; }
-+ | m_type_qual_bits type_qualifier { $$ = $1 | $2; }
- ;
-
--decl_spec: type m_decl_spec_no_type { $$ = make_decl_spec($1, $2, NULL, NULL, STG_NONE); }
-+decl_spec: type m_decl_spec_no_type { $$ = make_decl_spec($1, $2, NULL, STG_NONE, TYPE_QUALIFIER_NONE, FUNCTION_SPECIFIER_NONE); }
- | decl_spec_no_type type m_decl_spec_no_type
-- { $$ = make_decl_spec($2, $1, $3, NULL, STG_NONE); }
-+ { $$ = make_decl_spec($2, $1, $3, STG_NONE, TYPE_QUALIFIER_NONE, FUNCTION_SPECIFIER_NONE); }
- ;
-
- m_decl_spec_no_type: { $$ = NULL; }
-@@ -976,44 +974,44 @@ m_decl_spec_no_type: { $$ = NULL; }
- ;
-
- decl_spec_no_type:
-- type_qualifier m_decl_spec_no_type { $$ = make_decl_spec(NULL, $2, NULL, $1, STG_NONE); }
-- | function_specifier m_decl_spec_no_type { $$ = make_decl_spec(NULL, $2, NULL, $1, STG_NONE); }
-- | storage_cls_spec m_decl_spec_no_type { $$ = make_decl_spec(NULL, $2, NULL, NULL, $1); }
-+ type_qualifier m_decl_spec_no_type { $$ = make_decl_spec(NULL, $2, NULL, STG_NONE, $1, FUNCTION_SPECIFIER_NONE); }
-+ | function_specifier m_decl_spec_no_type { $$ = make_decl_spec(NULL, $2, NULL, STG_NONE, TYPE_QUALIFIER_NONE, $1); }
-+ | storage_cls_spec m_decl_spec_no_type { $$ = make_decl_spec(NULL, $2, NULL, $1, TYPE_QUALIFIER_NONE, FUNCTION_SPECIFIER_NONE); }
- ;
-
- declarator:
-- '*' m_type_qual_list declarator %prec PPTR
-- { $$ = $3; $$->type = append_chain_type($$->type, type_new_pointer(pointer_default, NULL, $2)); }
-+ '*' m_type_qual_bits declarator %prec PPTR
-+ { $$ = $3; append_chain_declspec(&$$->declspec, type_new_pointer(pointer_default, NULL), $2); }
- | callconv declarator { $$ = $2; if ($$->func_type) $$->func_type->attrs = append_attr($$->func_type->attrs, make_attrp(ATTR_CALLCONV, $1));
-- else if ($$->type) $$->type->attrs = append_attr($$->type->attrs, make_attrp(ATTR_CALLCONV, $1)); }
-+ else if ($$->declspec.type) $$->declspec.type->attrs = append_attr($$->declspec.type->attrs, make_attrp(ATTR_CALLCONV, $1)); }
- | direct_declarator
- ;
-
- direct_declarator:
- ident { $$ = make_declarator($1); }
- | '(' declarator ')' { $$ = $2; }
-- | direct_declarator array { $$ = $1; $$->type = append_array($$->type, $2); }
-+ | direct_declarator array { $$ = $1; $$->declspec.type = append_array($$->declspec.type, $2); }
- | direct_declarator '(' m_args ')' { $$ = $1;
-- $$->func_type = append_chain_type($$->type, type_new_function($3));
-- $$->type = NULL;
-+ $$->func_type = append_chain_type($$->declspec.type, type_new_function($3));
-+ $$->declspec.type = NULL;
- }
- ;
-
- /* abstract declarator */
- abstract_declarator:
-- '*' m_type_qual_list m_abstract_declarator %prec PPTR
-- { $$ = $3; $$->type = append_chain_type($$->type, type_new_pointer(pointer_default, NULL, $2)); }
-+ '*' m_type_qual_bits m_abstract_declarator %prec PPTR
-+ { $$ = $3; append_chain_declspec(&$$->declspec, type_new_pointer(pointer_default, NULL), $2); }
- | callconv m_abstract_declarator { $$ = $2; if ($$->func_type) $$->func_type->attrs = append_attr($$->func_type->attrs, make_attrp(ATTR_CALLCONV, $1));
-- else if ($$->type) $$->type->attrs = append_attr($$->type->attrs, make_attrp(ATTR_CALLCONV, $1)); }
-+ else if ($$->declspec.type) $$->declspec.type->attrs = append_attr($$->declspec.type->attrs, make_attrp(ATTR_CALLCONV, $1)); }
- | abstract_direct_declarator
- ;
-
- /* abstract declarator without accepting direct declarator */
- abstract_declarator_no_direct:
-- '*' m_type_qual_list m_any_declarator %prec PPTR
-- { $$ = $3; $$->type = append_chain_type($$->type, type_new_pointer(pointer_default, NULL, $2)); }
-+ '*' m_type_qual_bits m_any_declarator %prec PPTR
-+ { $$ = $3; append_chain_declspec(&$$->declspec, type_new_pointer(pointer_default, NULL), $2); }
- | callconv m_any_declarator { $$ = $2; if ($$->func_type) $$->func_type->attrs = append_attr($$->func_type->attrs, make_attrp(ATTR_CALLCONV, $1));
-- else if ($$->type) $$->type->attrs = append_attr($$->type->attrs, make_attrp(ATTR_CALLCONV, $1)); }
-+ else if ($$->declspec.type) $$->declspec.type->attrs = append_attr($$->declspec.type->attrs, make_attrp(ATTR_CALLCONV, $1)); }
- ;
-
- /* abstract declarator or empty */
-@@ -1024,33 +1022,33 @@ m_abstract_declarator: { $$ = make_declarator(NULL); }
- /* abstract direct declarator */
- abstract_direct_declarator:
- '(' abstract_declarator_no_direct ')' { $$ = $2; }
-- | abstract_direct_declarator array { $$ = $1; $$->type = append_array($$->type, $2); }
-- | array { $$ = make_declarator(NULL); $$->type = append_array($$->type, $1); }
-+ | abstract_direct_declarator array { $$ = $1; $$->declspec.type = append_array($$->declspec.type, $2); }
-+ | array { $$ = make_declarator(NULL); $$->declspec.type = append_array($$->declspec.type, $1); }
- | '(' m_args ')'
- { $$ = make_declarator(NULL);
-- $$->func_type = append_chain_type($$->type, type_new_function($2));
-- $$->type = NULL;
-+ $$->func_type = append_chain_type($$->declspec.type, type_new_function($2));
-+ $$->declspec.type = NULL;
- }
- | abstract_direct_declarator '(' m_args ')'
- { $$ = $1;
-- $$->func_type = append_chain_type($$->type, type_new_function($3));
-- $$->type = NULL;
-+ $$->func_type = append_chain_type($$->declspec.type, type_new_function($3));
-+ $$->declspec.type = NULL;
- }
- ;
-
- /* abstract or non-abstract declarator */
- any_declarator:
-- '*' m_type_qual_list m_any_declarator %prec PPTR
-- { $$ = $3; $$->type = append_chain_type($$->type, type_new_pointer(pointer_default, NULL, $2)); }
-- | callconv m_any_declarator { $$ = $2; $$->type->attrs = append_attr($$->type->attrs, make_attrp(ATTR_CALLCONV, $1)); }
-+ '*' m_type_qual_bits m_any_declarator %prec PPTR
-+ { $$ = $3; append_chain_declspec(&$$->declspec, type_new_pointer(pointer_default, NULL), $2); }
-+ | callconv m_any_declarator { $$ = $2; $$->declspec.type->attrs = append_attr($$->declspec.type->attrs, make_attrp(ATTR_CALLCONV, $1)); }
- | any_direct_declarator
- ;
-
- /* abstract or non-abstract declarator without accepting direct declarator */
- any_declarator_no_direct:
-- '*' m_type_qual_list m_any_declarator %prec PPTR
-- { $$ = $3; $$->type = append_chain_type($$->type, type_new_pointer(pointer_default, NULL, $2)); }
-- | callconv m_any_declarator { $$ = $2; $$->type->attrs = append_attr($$->type->attrs, make_attrp(ATTR_CALLCONV, $1)); }
-+ '*' m_type_qual_bits m_any_declarator %prec PPTR
-+ { $$ = $3; append_chain_declspec(&$$->declspec, type_new_pointer(pointer_default, NULL), $2); }
-+ | callconv m_any_declarator { $$ = $2; $$->declspec.type->attrs = append_attr($$->declspec.type->attrs, make_attrp(ATTR_CALLCONV, $1)); }
- ;
-
- /* abstract or non-abstract declarator or empty */
-@@ -1064,17 +1062,17 @@ m_any_declarator: { $$ = make_declarator(NULL); }
- any_direct_declarator:
- ident { $$ = make_declarator($1); }
- | '(' any_declarator_no_direct ')' { $$ = $2; }
-- | any_direct_declarator array { $$ = $1; $$->type = append_array($$->type, $2); }
-- | array { $$ = make_declarator(NULL); $$->type = append_array($$->type, $1); }
-+ | any_direct_declarator array { $$ = $1; $$->declspec.type = append_array($$->declspec.type, $2); }
-+ | array { $$ = make_declarator(NULL); $$->declspec.type = append_array($$->declspec.type, $1); }
- | '(' m_args ')'
- { $$ = make_declarator(NULL);
-- $$->func_type = append_chain_type($$->type, type_new_function($2));
-- $$->type = NULL;
-+ $$->func_type = append_chain_type($$->declspec.type, type_new_function($2));
-+ $$->declspec.type = NULL;
- }
- | any_direct_declarator '(' m_args ')'
- { $$ = $1;
-- $$->func_type = append_chain_type($$->type, type_new_function($3));
-- $$->type = NULL;
-+ $$->func_type = append_chain_type($$->declspec.type, type_new_function($3));
-+ $$->declspec.type = NULL;
- }
- ;
-
-@@ -1197,7 +1195,8 @@ static void decl_builtin_basic(const char *name, enum type_basic_type type)
-
- static void decl_builtin_alias(const char *name, type_t *t)
- {
-- reg_type(type_new_alias(t, name), name, NULL, 0);
-+ decl_spec_t ds;
-+ reg_type(type_new_alias(init_declspec(&ds, t), name), name, &global_namespace, 0);
- }
-
- void init_types(void)
-@@ -1208,7 +1207,7 @@ void init_types(void)
- decl_builtin_basic("double", TYPE_BASIC_DOUBLE);
- decl_builtin_basic("error_status_t", TYPE_BASIC_ERROR_STATUS_T);
- decl_builtin_basic("handle_t", TYPE_BASIC_HANDLE);
-- decl_builtin_alias("boolean", type_new_basic(TYPE_BASIC_BYTE));
-+ decl_builtin_alias("boolean", type_new_basic(TYPE_BASIC_CHAR));
- }
-
- static str_list_t *append_str(str_list_t *list, char *str)
-@@ -1239,6 +1238,7 @@ static attr_list_t *append_attr(attr_list_t *list, attr_t *attr)
- LIST_FOR_EACH_ENTRY(attr_existing, list, attr_t, entry)
- if (attr_existing->type == attr->type)
- {
-+ __builtin_trap();
- parser_warning("duplicate attribute %s\n", get_attr_display_name(attr->type));
- /* use the last attribute, like MIDL does */
- list_remove(&attr_existing->entry);
-@@ -1298,53 +1298,73 @@ static attr_list_t *map_attrs(const attr_list_t *list, map_attrs_filter_t filter
- return new_list;
- }
-
--static decl_spec_t *make_decl_spec(type_t *type, decl_spec_t *left, decl_spec_t *right, attr_t *attr, enum storage_class stgclass)
-+static decl_spec_t *make_decl_spec(type_t *type, decl_spec_t *left, decl_spec_t *right, enum storage_class stgclass, enum type_qualifier typequalifier, enum function_specifier funcspecifier)
- {
- decl_spec_t *declspec = left ? left : right;
- if (!declspec)
- {
- declspec = xmalloc(sizeof(*declspec));
- declspec->type = NULL;
-- declspec->attrs = NULL;
- declspec->stgclass = STG_NONE;
-+ declspec->typequalifier = TYPE_QUALIFIER_NONE;
-+ declspec->funcspecifier = FUNCTION_SPECIFIER_NONE;
- }
- declspec->type = type;
- if (left && declspec != left)
- {
-- declspec->attrs = append_attr_list(declspec->attrs, left->attrs);
- if (declspec->stgclass == STG_NONE)
- declspec->stgclass = left->stgclass;
- else if (left->stgclass != STG_NONE)
- error_loc("only one storage class can be specified\n");
-+
-+ if (declspec->typequalifier == TYPE_QUALIFIER_NONE)
-+ declspec->typequalifier = left->typequalifier;
-+ else if (left->typequalifier != TYPE_QUALIFIER_NONE)
-+ error_loc("only one type qualifier can be specified\n");
-+
-+ if (declspec->funcspecifier == FUNCTION_SPECIFIER_NONE)
-+ declspec->funcspecifier = left->funcspecifier;
-+ else if (left->funcspecifier != FUNCTION_SPECIFIER_NONE)
-+ error_loc("only one function specifier can be specified\n");
-+
- assert(!left->type);
- free(left);
- }
- if (right && declspec != right)
- {
-- declspec->attrs = append_attr_list(declspec->attrs, right->attrs);
- if (declspec->stgclass == STG_NONE)
- declspec->stgclass = right->stgclass;
- else if (right->stgclass != STG_NONE)
- error_loc("only one storage class can be specified\n");
-+
-+ if (declspec->typequalifier == TYPE_QUALIFIER_NONE)
-+ declspec->typequalifier = right->typequalifier;
-+ else if (right->typequalifier != TYPE_QUALIFIER_NONE)
-+ error_loc("only one type qualifier can be specified\n");
-+
-+ if (declspec->funcspecifier == FUNCTION_SPECIFIER_NONE)
-+ declspec->funcspecifier = right->funcspecifier;
-+ else if (right->funcspecifier != FUNCTION_SPECIFIER_NONE)
-+ error_loc("only one function specifier can be specified\n");
-+
- assert(!right->type);
- free(right);
- }
-
-- declspec->attrs = append_attr(declspec->attrs, attr);
- if (declspec->stgclass == STG_NONE)
- declspec->stgclass = stgclass;
- else if (stgclass != STG_NONE)
- error_loc("only one storage class can be specified\n");
-
-- /* apply attributes to type */
-- if (type && declspec->attrs)
-- {
-- attr_list_t *attrs;
-- declspec->type = duptype(type, 1);
-- attrs = map_attrs(type->attrs, NULL);
-- declspec->type->attrs = append_attr_list(attrs, declspec->attrs);
-- declspec->attrs = NULL;
-- }
-+ if (declspec->typequalifier == TYPE_QUALIFIER_NONE)
-+ declspec->typequalifier = typequalifier;
-+ else if (typequalifier != TYPE_QUALIFIER_NONE)
-+ error_loc("only one type qualifier can be specified\n");
-+
-+ if (declspec->funcspecifier == FUNCTION_SPECIFIER_NONE)
-+ declspec->funcspecifier = funcspecifier;
-+ else if (funcspecifier != FUNCTION_SPECIFIER_NONE)
-+ error_loc("only one function specifier can be specified\n");
-
- return declspec;
- }
-@@ -1430,6 +1450,7 @@ void clear_all_offsets(void)
-
- static void type_function_add_head_arg(type_t *type, var_t *arg)
- {
-+ assert(type_get_type_detect_alias(type) == TYPE_FUNCTION);
- if (!type->details.function->args)
- {
- type->details.function->args = xmalloc( sizeof(*type->details.function->args) );
-@@ -1474,31 +1495,60 @@ static int is_allowed_range_type(const type_t *type)
- static type_t *get_array_or_ptr_ref(type_t *type)
- {
- if (is_ptr(type))
-- return type_pointer_get_ref(type);
-+ return type_pointer_get_ref_type(type);
- else if (is_array(type))
-- return type_array_get_element(type);
-+ return type_array_get_element_type(type);
- return NULL;
- }
-
- static type_t *append_chain_type(type_t *chain, type_t *type)
- {
-- type_t *chain_type;
-+ type_t *chain_type = NULL;
-
- if (!chain)
- return type;
- for (chain_type = chain; get_array_or_ptr_ref(chain_type); chain_type = get_array_or_ptr_ref(chain_type))
- ;
-
-+ assert(!type_is_alias(chain_type));
- if (is_ptr(chain_type))
-- chain_type->details.pointer.ref = type;
-+ chain_type->details.pointer.ref.type = type;
- else if (is_array(chain_type))
-- chain_type->details.array.elem = type;
-+ chain_type->details.array.elem.type = type;
- else
- assert(0);
-
- return chain;
- }
-
-+static decl_spec_t *append_chain_declspec(decl_spec_t *chain, type_t *type, enum type_qualifier typequalifier)
-+{
-+ type_t *chain_type = chain->type;
-+ decl_spec_t *chain_declspec = NULL;
-+
-+ if (!chain_type)
-+ {
-+ chain->type = type;
-+ chain->typequalifier = typequalifier;
-+ return chain;
-+ }
-+
-+ for(; get_array_or_ptr_ref(chain_type); chain_type = get_array_or_ptr_ref(chain_type))
-+ ;
-+
-+ if (is_ptr(chain_type))
-+ chain_declspec = &chain_type->details.pointer.ref;
-+ else if (is_array(chain_type))
-+ chain_declspec = &chain_type->details.array.elem;
-+ else
-+ assert(NULL);
-+
-+ chain_declspec->type = type;
-+ chain_declspec->typequalifier = typequalifier;
-+
-+ return chain;
-+}
-+
- static warning_list_t *append_warning(warning_list_t *list, int num)
- {
- warning_t *entry;
-@@ -1514,7 +1564,7 @@ static warning_list_t *append_warning(warning_list_t *list, int num)
- return list;
- }
-
--static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const declarator_t *decl,
-+static var_t *declare_var(attr_list_t *attrs, decl_spec_t *declspec, const declarator_t *decl,
- int top)
- {
- var_t *v = decl->var;
-@@ -1523,58 +1573,74 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
- expr_t *dim;
- type_t **ptype;
- type_t *func_type = decl ? decl->func_type : NULL;
-- type_t *type = decl_spec->type;
-+ type_t *type = declspec->type;
-
-- if (is_attr(type->attrs, ATTR_INLINE))
-- {
-+
-+ if (declspec->funcspecifier == FUNCTION_SPECIFIER_INLINE) {
- if (!func_type)
- error_loc("inline attribute applied to non-function type\n");
- else
- {
-- type_t *t;
-- /* move inline attribute from return type node to function node */
-- for (t = func_type; is_ptr(t); t = type_pointer_get_ref(t))
-- ;
-- t->attrs = move_attr(t->attrs, type->attrs, ATTR_INLINE);
-+ v->declspec.funcspecifier = declspec->funcspecifier;
- }
- }
-
-- /* add type onto the end of the pointers in pident->type */
-- v->type = append_chain_type(decl ? decl->type : NULL, type);
-- v->stgclass = decl_spec->stgclass;
-+ /* if the var type is a pointerish, we need to move the type qualifier to the pointee's declspec
-+ * unless the pointee already has const type qualifier*/
-+ if (!decl)
-+ {
-+ /* simplest case, no pointers to deal with here */
-+ v->declspec.typequalifier = declspec->typequalifier;
-+ } else if (decl->bits)
-+ {
-+ /* dealing with a bitfield, generate bitfield and copy over typequalifier*/
-+ v->declspec.type = type_new_bitfield(declspec->type, decl->bits);
-+ v->declspec.typequalifier = declspec->typequalifier;
-+ }
-+ else
-+ {
-+ /* here we're dealing with a pointerish type chain, so we need to pull
-+ * the typequalifier off of the declspec and stick them in the type's attr list
-+ */
-+ v->declspec.type = decl->declspec.type;
-+ v->declspec.typequalifier = decl->declspec.typequalifier;
-+ append_chain_declspec(&v->declspec, type, declspec->typequalifier);
-+ }
-+
-+ v->declspec.stgclass = declspec->stgclass;
- v->attrs = attrs;
-
- /* check for pointer attribute being applied to non-pointer, non-array
- * type */
-- if (!is_array(v->type))
-+ if (!is_array(v->declspec.type))
- {
- int ptr_attr = get_attrv(v->attrs, ATTR_POINTERTYPE);
- const type_t *ptr = NULL;
- /* pointer attributes on the left side of the type belong to the function
- * pointer, if one is being declared */
-- type_t **pt = func_type ? &func_type : &v->type;
-+ type_t **pt = func_type ? &func_type : &v->declspec.type;
- for (ptr = *pt; ptr && !ptr_attr; )
- {
- ptr_attr = get_attrv(ptr->attrs, ATTR_POINTERTYPE);
- if (!ptr_attr && type_is_alias(ptr))
-- ptr = type_alias_get_aliasee(ptr);
-+ ptr = type_alias_get_aliasee_type(ptr);
- else
- break;
- }
- if (is_ptr(ptr))
- {
- if (ptr_attr && ptr_attr != FC_UP &&
-- type_get_type(type_pointer_get_ref(ptr)) == TYPE_INTERFACE)
-+ type_get_type(type_pointer_get_ref_type(ptr)) == TYPE_INTERFACE)
- warning_loc_info(&v->loc_info,
- "%s: pointer attribute applied to interface "
- "pointer type has no effect\n", v->name);
-- if (!ptr_attr && top && (*pt)->details.pointer.def_fc != FC_RP)
-+ if (!ptr_attr && top && type_pointer_get_default_fc(*pt) != FC_RP)
- {
- /* FIXME: this is a horrible hack to cope with the issue that we
- * store an offset to the typeformat string in the type object, but
- * two typeformat strings may be written depending on whether the
- * pointer is a toplevel parameter or not */
-- *pt = duptype(*pt, 1);
-+ *pt = dup_pointer_type(*pt);
- }
- }
- else if (ptr_attr)
-@@ -1585,16 +1651,16 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
- {
- type_t *t = type;
-
-- if (!is_ptr(v->type) && !is_array(v->type))
-+ if (!is_ptr(v->declspec.type) && !is_array(v->declspec.type))
- error_loc("'%s': [string] attribute applied to non-pointer, non-array type\n",
- v->name);
-
- for (;;)
- {
- if (is_ptr(t))
-- t = type_pointer_get_ref(t);
-+ t = type_pointer_get_ref_type(t);
- else if (is_array(t))
-- t = type_array_get_element(t);
-+ t = type_array_get_element_type(t);
- else
- break;
- }
-@@ -1611,15 +1677,15 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
-
- if (is_attr(v->attrs, ATTR_V1ENUM))
- {
-- if (type_get_type_detect_alias(v->type) != TYPE_ENUM)
-+ if (type_get_type_detect_alias(v->declspec.type) != TYPE_ENUM)
- error_loc("'%s': [v1_enum] attribute applied to non-enum type\n", v->name);
- }
-
-- if (is_attr(v->attrs, ATTR_RANGE) && !is_allowed_range_type(v->type))
-+ if (is_attr(v->attrs, ATTR_RANGE) && !is_allowed_range_type(v->declspec.type))
- error_loc("'%s': [range] attribute applied to non-integer type\n",
- v->name);
-
-- ptype = &v->type;
-+ ptype = &v->declspec.type;
- if (sizes) LIST_FOR_EACH_ENTRY(dim, sizes, expr_t, entry)
- {
- if (dim->type != EXPR_VOID)
-@@ -1632,7 +1698,7 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
- else
- *ptype = type_new_array((*ptype)->name,
- type_array_get_element(*ptype), FALSE,
-- 0, dim, NULL, 0);
-+ 0, dim, NULL, FC_RP);
- }
- else if (is_ptr(*ptype))
- *ptype = type_new_array((*ptype)->name, type_pointer_get_ref(*ptype), TRUE,
-@@ -1641,15 +1707,16 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
- error_loc("%s: size_is attribute applied to illegal type\n", v->name);
- }
-
-+ assert(!type_is_alias(*ptype));
- if (is_ptr(*ptype))
-- ptype = &(*ptype)->details.pointer.ref;
-+ ptype = &(*ptype)->details.pointer.ref.type;
- else if (is_array(*ptype))
-- ptype = &(*ptype)->details.array.elem;
-+ ptype = &(*ptype)->details.array.elem.type;
- else
- error_loc("%s: too many expressions in size_is attribute\n", v->name);
- }
-
-- ptype = &v->type;
-+ ptype = &v->declspec.type;
- if (lengs) LIST_FOR_EACH_ENTRY(dim, lengs, expr_t, entry)
- {
- if (dim->type != EXPR_VOID)
-@@ -1667,10 +1734,11 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
- error_loc("%s: length_is attribute applied to illegal type\n", v->name);
- }
-
-+ assert(!type_is_alias(*ptype));
- if (is_ptr(*ptype))
-- ptype = &(*ptype)->details.pointer.ref;
-+ ptype = &(*ptype)->details.pointer.ref.type;
- else if (is_array(*ptype))
-- ptype = &(*ptype)->details.array.elem;
-+ ptype = &(*ptype)->details.array.elem.type;
- else
- error_loc("%s: too many expressions in length_is attribute\n", v->name);
- }
-@@ -1681,29 +1749,31 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl
- if (func_type)
- {
- type_t *ft, *t;
-- type_t *return_type = v->type;
-- v->type = func_type;
-- for (ft = v->type; is_ptr(ft); ft = type_pointer_get_ref(ft))
-+ type_t *return_type = v->declspec.type;
-+ enum type_qualifier typequalifier = v->declspec.typequalifier;
-+
-+ v->declspec.type = func_type;
-+ v->declspec.typequalifier = TYPE_QUALIFIER_NONE;
-+ for (ft = v->declspec.type; is_ptr(ft); ft = type_pointer_get_ref_type(ft))
- ;
- assert(type_get_type_detect_alias(ft) == TYPE_FUNCTION);
- ft->details.function->retval = make_var(xstrdup("_RetVal"));
-- ft->details.function->retval->type = return_type;
-+ ft->details.function->retval->declspec.type = return_type;
-+ ft->details.function->retval->declspec.typequalifier = typequalifier;
-+
- /* move calling convention attribute, if present, from pointer nodes to
- * function node */
-- for (t = v->type; is_ptr(t); t = type_pointer_get_ref(t))
-+ for (t = v->declspec.type; is_ptr(t); t = type_pointer_get_ref_type(t))
- ft->attrs = move_attr(ft->attrs, t->attrs, ATTR_CALLCONV);
- }
- else
- {
- type_t *t;
-- for (t = v->type; is_ptr(t); t = type_pointer_get_ref(t))
-+ for (t = v->declspec.type; is_ptr(t); t = type_pointer_get_ref_type(t))
- if (is_attr(t->attrs, ATTR_CALLCONV))
- error_loc("calling convention applied to non-function-pointer type\n");
- }
-
-- if (decl->bits)
-- v->type = type_new_bitfield(v->type, decl->bits);
--
- return v;
- }
-
-@@ -1751,6 +1821,10 @@ var_list_t *append_var(var_list_t *list, var_t *var)
- list_init( list );
- }
- list_add_tail( list, &var->entry );
-+
-+ if (var->declspec.type)
-+ var->declonly = !type_is_defined(var->declspec.type);
-+
- return list;
- }
-
-@@ -1770,11 +1844,11 @@ var_t *make_var(char *name)
- {
- var_t *v = xmalloc(sizeof(var_t));
- v->name = name;
-- v->type = NULL;
-+ init_declspec(&v->declspec, NULL);
- v->attrs = NULL;
- v->eval = NULL;
-- v->stgclass = STG_NONE;
- init_loc_info(&v->loc_info);
-+ v->declonly = TRUE;
- return v;
- }
-
-@@ -1782,10 +1856,9 @@ static var_t *copy_var(var_t *src, char *name, map_attrs_filter_t attr_filter)
- {
- var_t *v = xmalloc(sizeof(var_t));
- v->name = name;
-- v->type = src->type;
-+ v->declspec = src->declspec;
- v->attrs = map_attrs(src->attrs, attr_filter);
- v->eval = src->eval;
-- v->stgclass = src->stgclass;
- v->loc_info = src->loc_info;
- return v;
- }
-@@ -1805,7 +1878,7 @@ static declarator_t *make_declarator(var_t *var)
- {
- declarator_t *d = xmalloc(sizeof(*d));
- d->var = var ? var : make_var(NULL);
-- d->type = NULL;
-+ init_declspec(&d->declspec, NULL);
- d->func_type = NULL;
- d->bits = NULL;
- return d;
-@@ -1813,7 +1886,15 @@ static declarator_t *make_declarator(var_t *var)
-
- static type_t *make_safearray(type_t *type)
- {
-- return type_new_array(NULL, type_new_alias(type, "SAFEARRAY"), TRUE, 0,
-+ decl_spec_t aliasee_ds;
-+ decl_spec_t element_ds;
-+
-+ init_declspec(&element_ds,
-+ type_new_alias(
-+ init_declspec(&aliasee_ds, type),
-+ "SAFEARRAY"));
-+
-+ return type_new_array(NULL, &element_ds, TRUE, 0,
- NULL, NULL, FC_RP);
- }
-
-@@ -1903,15 +1984,16 @@ type_t *reg_type(type_t *type, const char *name, struct namespace *namespace, in
- nt->t = t;
- nt->next = namespace->type_hash[hash];
- namespace->type_hash[hash] = nt;
-- if ((t == tsSTRUCT || t == tsUNION))
-+ if ((t == tsSTRUCT || t == tsUNION || t == tsENUM))
- fix_incomplete_types(type);
- return type;
- }
-
- static int is_incomplete(const type_t *t)
- {
-- return !t->defined &&
-- (type_get_type_detect_alias(t) == TYPE_STRUCT ||
-+ return !type_is_defined(t) &&
-+ (type_get_type_detect_alias(t) == TYPE_ENUM ||
-+ type_get_type_detect_alias(t) == TYPE_STRUCT ||
- type_get_type_detect_alias(t) == TYPE_UNION ||
- type_get_type_detect_alias(t) == TYPE_ENCAPSULATED_UNION);
- }
-@@ -1919,19 +2001,16 @@ static int is_incomplete(const type_t *t)
- void add_incomplete(type_t *t)
- {
- struct typenode *tn = xmalloc(sizeof *tn);
-+ assert(is_incomplete(t));
- tn->type = t;
- list_add_tail(&incomplete_types, &tn->entry);
- }
-
- static void fix_type(type_t *t)
- {
-- if (type_is_alias(t) && is_incomplete(t)) {
-- type_t *ot = type_alias_get_aliasee(t);
-- fix_type(ot);
-- if (type_get_type_detect_alias(ot) == TYPE_STRUCT ||
-- type_get_type_detect_alias(ot) == TYPE_UNION ||
-- type_get_type_detect_alias(ot) == TYPE_ENCAPSULATED_UNION)
-- t->details.structure = ot->details.structure;
-+ if (type_is_alias(t) && is_incomplete(t))
-+ {
-+ type_t *ot = type_alias_get_aliasee_type(t);
- t->defined = ot->defined;
- }
- }
-@@ -1955,7 +2034,7 @@ static void fix_incomplete_types(type_t *complete_type)
- {
- if (type_is_equal(complete_type, tn->type))
- {
-- tn->type->details.structure = complete_type->details.structure;
-+ tn->type->details = complete_type->details;
- list_remove(&tn->entry);
- free(tn);
- }
-@@ -1979,7 +2058,13 @@ static type_t *reg_typedefs(decl_spec_t *decl_spec, declarator_list_t *decls, at
- type_get_type_detect_alias(type) == TYPE_ENCAPSULATED_UNION)
- {
- if (!type->name)
-+ {
- type->name = gen_name();
-+ /* the generated name will be used and this typedef excluded from the
-+ * built typelib unless the typedef has the 'public' attribute, so add it here */
-+ if (do_typelib && !is_attr(attrs, ATTR_PUBLIC))
-+ attrs = append_attr(attrs, make_attr(ATTR_PUBLIC));
-+ }
-
- /* replace existing attributes when generating a typelib */
- if (do_typelib)
-@@ -2010,7 +2095,7 @@ static type_t *reg_typedefs(decl_spec_t *decl_spec, declarator_list_t *decls, at
- cur->loc_info.line_number);
-
- name = declare_var(attrs, decl_spec, decl, 0);
-- cur = type_new_alias(name->type, name->name);
-+ cur = type_new_alias(&name->declspec, name->name);
- cur->attrs = attrs;
-
- if (is_incomplete(cur))
-@@ -2178,7 +2263,6 @@ struct allowed_attr allowed_attr[] =
- /* ATTR_CASE */ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, "case" },
- /* ATTR_CODE */ { 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "code" },
- /* ATTR_COMMSTATUS */ { 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "comm_status" },
-- /* ATTR_CONST */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "const" },
- /* ATTR_CONTEXTHANDLE */ { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "context_handle" },
- /* ATTR_CONTROL */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, "control" },
- /* ATTR_DECODE */ { 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "decode" },
-@@ -2213,7 +2297,6 @@ struct allowed_attr allowed_attr[] =
- /* ATTR_IMMEDIATEBIND */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "immediatebind" },
- /* ATTR_IMPLICIT_HANDLE */ { 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "implicit_handle" },
- /* ATTR_IN */ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "in" },
-- /* ATTR_INLINE */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "inline" },
- /* ATTR_INPUTSYNC */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "inputsync" },
- /* ATTR_LENGTHIS */ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, "length_is" },
- /* ATTR_LIBLCID */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, "lcid" },
-@@ -2285,10 +2368,10 @@ static attr_list_t *check_iface_attrs(const char *name, attr_list_t *attrs)
- if (attr->type == ATTR_IMPLICIT_HANDLE)
- {
- const var_t *var = attr->u.pval;
-- if (type_get_type( var->type) == TYPE_BASIC &&
-- type_basic_get_type( var->type ) == TYPE_BASIC_HANDLE)
-+ if (type_get_type( var->declspec.type) == TYPE_BASIC &&
-+ type_basic_get_type( var->declspec.type ) == TYPE_BASIC_HANDLE)
- continue;
-- if (is_aliaschain_attr( var->type, ATTR_HANDLE ))
-+ if (is_aliaschain_attr( var->declspec.type, ATTR_HANDLE ))
- continue;
- error_loc("attribute %s requires a handle type in interface %s\n",
- allowed_attr[attr->type].display_name, name);
-@@ -2493,7 +2576,7 @@ static int is_ptr_guid_type(const type_t *type)
-
- /* second, make sure it is a pointer to something of size sizeof(GUID),
- * i.e. 16 bytes */
-- return (type_memsize(type_pointer_get_ref(type)) == 16);
-+ return (type_memsize(type_pointer_get_ref_type(type)) == 16);
- }
-
- static void check_conformance_expr_list(const char *attr_name, const var_t *arg, const type_t *container_type, expr_list_t *expr_list)
-@@ -2520,7 +2603,7 @@ static void check_remoting_fields(const var_t *var, type_t *type);
- static void check_field_common(const type_t *container_type,
- const char *container_name, const var_t *arg)
- {
-- type_t *type = arg->type;
-+ type_t *type = arg->declspec.type;
- int more_to_do;
- const char *container_type_name;
- const char *var_type;
-@@ -2550,7 +2633,7 @@ static void check_field_common(const type_t *container_type,
- }
-
- if (is_attr(arg->attrs, ATTR_LENGTHIS) &&
-- (is_attr(arg->attrs, ATTR_STRING) || is_aliaschain_attr(arg->type, ATTR_STRING)))
-+ (is_attr(arg->attrs, ATTR_STRING) || is_aliaschain_attr(arg->declspec.type, ATTR_STRING)))
- error_loc_info(&arg->loc_info,
- "string and length_is specified for argument %s are mutually exclusive attributes\n",
- arg->name);
-@@ -2647,23 +2730,28 @@ static void check_field_common(const type_t *container_type,
- {
- const type_t *t = type;
- while (is_ptr(t))
-- t = type_pointer_get_ref(t);
-+ t = type_pointer_get_ref_type(t);
- if (is_aliaschain_attr(t, ATTR_RANGE))
- warning_loc_info(&arg->loc_info, "%s: range not verified for a string of ranged types\n", arg->name);
- break;
- }
- case TGT_POINTER:
-- type = type_pointer_get_ref(type);
-+ type = type_pointer_get_ref_type(type);
- more_to_do = TRUE;
- break;
- case TGT_ARRAY:
-- type = type_array_get_element(type);
-+ type = type_array_get_element_type(type);
- more_to_do = TRUE;
- break;
-+ case TGT_ENUM:
-+ type = type_get_real_type(type);
-+ if(!type_is_complete(type))
-+ {
-+ error_loc_info(&arg->loc_info, "undefined type declaration enum %s\n", type->name);
-+ }
- case TGT_USER_TYPE:
- case TGT_IFACE_POINTER:
- case TGT_BASIC:
-- case TGT_ENUM:
- case TGT_RANGE:
- /* nothing to do */
- break;
-@@ -2688,13 +2776,18 @@ static void check_remoting_fields(const var_t *var, type_t *type)
- if (type_is_complete(type))
- fields = type_struct_get_fields(type);
- else
-- error_loc_info(&var->loc_info, "undefined type declaration %s\n", type->name);
-+ error_loc_info(&var->loc_info, "undefined type declaration struct %s\n", type->name);
- }
- else if (type_get_type(type) == TYPE_UNION || type_get_type(type) == TYPE_ENCAPSULATED_UNION)
-- fields = type_union_get_cases(type);
-+ {
-+ if (type_is_complete(type))
-+ fields = type_union_get_cases(type);
-+ else
-+ error_loc_info(&var->loc_info, "undefined type declaration union %s\n", type->name);
-+ }
-
- if (fields) LIST_FOR_EACH_ENTRY( field, fields, const var_t, entry )
-- if (field->type) check_field_common(type, type->name, field);
-+ if (field->declspec.type) check_field_common(type, type->name, field);
- }
-
- /* checks that arguments for a function make sense for marshalling and unmarshalling */
-@@ -2703,9 +2796,10 @@ static void check_remoting_args(const var_t *func)
- const char *funcname = func->name;
- const var_t *arg;
-
-- if (func->type->details.function->args) LIST_FOR_EACH_ENTRY( arg, func->type->details.function->args, const var_t, entry )
-+ assert(type_get_type_detect_alias(func->declspec.type) == TYPE_FUNCTION);
-+ if (func->declspec.type->details.function->args) LIST_FOR_EACH_ENTRY( arg, func->declspec.type->details.function->args, const var_t, entry )
- {
-- const type_t *type = arg->type;
-+ const type_t *type = arg->declspec.type;
-
- /* check that [out] parameters have enough pointer levels */
- if (is_attr(arg->attrs, ATTR_OUT))
-@@ -2745,16 +2839,16 @@ static void check_remoting_args(const var_t *func)
- }
- }
-
-- check_field_common(func->type, funcname, arg);
-+ check_field_common(func->declspec.type, funcname, arg);
- }
-
-- if (type_get_type(type_function_get_rettype(func->type)) != TYPE_VOID)
-+ if (type_get_type(type_function_get_rettype(func->declspec.type)) != TYPE_VOID)
- {
- var_t var;
- var = *func;
-- var.type = type_function_get_rettype(func->type);
-+ var.declspec.type = type_function_get_rettype(func->declspec.type);
- var.name = xstrdup("return value");
-- check_field_common(func->type, funcname, &var);
-+ check_field_common(func->declspec.type, funcname, &var);
- free(var.name);
- }
- }
-@@ -2771,8 +2865,8 @@ static void add_explicit_handle_if_necessary(const type_t *iface, var_t *func)
- * function */
- var_t *idl_handle = make_var(xstrdup("IDL_handle"));
- idl_handle->attrs = append_attr(NULL, make_attr(ATTR_IN));
-- idl_handle->type = find_type_or_error("handle_t", 0);
-- type_function_add_head_arg(func->type, idl_handle);
-+ idl_handle->declspec.type = find_type_or_error("handle_t", 0);
-+ type_function_add_head_arg(func->declspec.type, idl_handle);
- }
- }
-
-@@ -2837,6 +2931,7 @@ static void check_async_uuid(type_t *iface)
- type_t *async_iface;
- type_t *inherit;
-
-+ assert(type_get_type_detect_alias(iface) == TYPE_INTERFACE);
- if (!is_attr(iface->attrs, ATTR_ASYNCUUID)) return;
-
- inherit = iface->details.iface->inherit;
-@@ -2853,7 +2948,8 @@ static void check_async_uuid(type_t *iface)
- var_t *begin_func, *finish_func, *func = stmt->u.var, *arg;
- var_list_t *begin_args = NULL, *finish_args = NULL, *args;
-
-- args = func->type->details.function->args;
-+ assert(type_get_type_detect_alias(func->declspec.type) == TYPE_FUNCTION);
-+ args = func->declspec.type->details.function->args;
- if (args) LIST_FOR_EACH_ENTRY(arg, args, var_t, entry)
- {
- if (is_attr(arg->attrs, ATTR_IN) || !is_attr(arg->attrs, ATTR_OUT))
-@@ -2863,15 +2959,15 @@ static void check_async_uuid(type_t *iface)
- }
-
- begin_func = copy_var(func, concat_str("Begin_", func->name), NULL);
-- begin_func->type = type_new_function(begin_args);
-- begin_func->type->attrs = func->attrs;
-- begin_func->type->details.function->retval = func->type->details.function->retval;
-+ begin_func->declspec.type = type_new_function(begin_args);
-+ begin_func->declspec.type->attrs = func->attrs;
-+ begin_func->declspec.type->details.function->retval = func->declspec.type->details.function->retval;
- stmts = append_statement(stmts, make_statement_declaration(begin_func));
-
- finish_func = copy_var(func, concat_str("Finish_", func->name), NULL);
-- finish_func->type = type_new_function(finish_args);
-- finish_func->type->attrs = func->attrs;
-- finish_func->type->details.function->retval = func->type->details.function->retval;
-+ finish_func->declspec.type = type_new_function(finish_args);
-+ finish_func->declspec.type->attrs = func->attrs;
-+ finish_func->declspec.type->details.function->retval = func->declspec.type->details.function->retval;
- stmts = append_statement(stmts, make_statement_declaration(finish_func));
- }
-
-@@ -2911,6 +3007,7 @@ static void check_statements(const statement_list_t *stmts, int is_inside_librar
- static void check_all_user_types(const statement_list_t *stmts)
- {
- const statement_t *stmt;
-+ const var_t *v;
-
- if (stmts) LIST_FOR_EACH_ENTRY(stmt, stmts, const statement_t, entry)
- {
-@@ -2922,7 +3019,11 @@ static void check_all_user_types(const statement_list_t *stmts)
- const statement_t *stmt_func;
- STATEMENTS_FOR_EACH_FUNC(stmt_func, type_iface_get_stmts(stmt->u.type)) {
- const var_t *func = stmt_func->u.var;
-- check_for_additional_prototype_types(func->type->details.function->args);
-+ assert(type_get_type_detect_alias(func->declspec.type) == TYPE_FUNCTION);
-+ if (func->declspec.type->details.function->args)
-+ LIST_FOR_EACH_ENTRY( v, func->declspec.type->details.function->args, const var_t, entry )
-+ check_for_additional_prototype_types(v->declspec.type);
-+ check_for_additional_prototype_types(type_function_get_rettype(func->declspec.type));
- }
- }
- }
-@@ -2956,6 +3057,10 @@ static statement_t *make_statement_type_decl(type_t *type)
- {
- statement_t *stmt = make_statement(STMT_TYPE);
- stmt->u.type = type;
-+ if (type_is_defined(type))
-+ {
-+ stmt->declonly = FALSE;
-+ }
- return stmt;
- }
-
-@@ -2970,16 +3075,16 @@ static statement_t *make_statement_declaration(var_t *var)
- {
- statement_t *stmt = make_statement(STMT_DECLARATION);
- stmt->u.var = var;
-- if (var->stgclass == STG_EXTERN && var->eval)
-+ if (var->declspec.stgclass == STG_EXTERN && var->eval)
- warning("'%s' initialised and declared extern\n", var->name);
- if (is_const_decl(var))
- {
- if (var->eval)
- reg_const(var);
- }
-- else if (type_get_type(var->type) == TYPE_FUNCTION)
-+ else if (type_get_type(var->declspec.type) == TYPE_FUNCTION)
- check_function_attrs(var->name, var->attrs);
-- else if (var->stgclass == STG_NONE || var->stgclass == STG_REGISTER)
-+ else if (var->declspec.stgclass == STG_NONE || var->declspec.stgclass == STG_REGISTER)
- error_loc("instantiation of data is illegal\n");
- return stmt;
- }
-@@ -3031,6 +3136,7 @@ static statement_t *make_statement_typedef(declarator_list_t *decls)
- declarator_t *decl, *next;
- statement_t *stmt;
- type_list_t **type_list;
-+ int defined = TRUE;
-
- if (!decls) return NULL;
-
-@@ -3042,6 +3148,18 @@ static statement_t *make_statement_typedef(declarator_list_t *decls)
- {
- var_t *var = decl->var;
- type_t *type = find_type_or_error(var->name, 0);
-+
-+ /* ensure that all of the types in this typedef statement have been defined
-+ * before setting its declonly flag */
-+ if (type_is_pointerish(type))
-+ {
-+ defined = defined & type_is_defined(type_get_pointer_chain_tail(type));
-+ }
-+ else
-+ {
-+ defined = defined & type_is_defined(type_get_real_type(type));
-+ }
-+
- *type_list = xmalloc(sizeof(type_list_t));
- (*type_list)->type = type;
- (*type_list)->next = NULL;
-@@ -3051,6 +3169,7 @@ static statement_t *make_statement_typedef(declarator_list_t *decls)
- free(var);
- }
-
-+ stmt->declonly = !defined;
- return stmt;
- }
-
-@@ -3091,7 +3210,7 @@ void init_loc_info(loc_info_t *i)
-
- static void check_def(const type_t *t)
- {
-- if (t->defined)
-+ if (type_is_defined(t))
- error_loc("%s: redefinition error; original definition was at %s:%d\n",
- t->name, t->loc_info.input_name, t->loc_info.line_number);
- }
-diff --git a/mingw-w64-tools/widl/src/parser.yy.c b/mingw-w64-tools/widl/src/parser.yy.c
-index 2aaf3c27..0482aa7e 100644
---- a/mingw-w64-tools/widl/src/parser.yy.c
-+++ b/mingw-w64-tools/widl/src/parser.yy.c
-@@ -1,6 +1,6 @@
--#line 1 "parser.yy.c"
-+#line 2 "parser.yy.c"
-
--#line 3 "parser.yy.c"
-+#line 4 "parser.yy.c"
-
- #define YY_INT_ALIGNED short int
-
-@@ -1041,13 +1041,13 @@ UUID *parse_uuid(const char *u)
- return uuid;
- }
-
--#line 1044 "parser.yy.c"
-+#line 1045 "parser.yy.c"
- /*
- **************************************************************************
- * The flexer starts here
- **************************************************************************
- */
--#line 1050 "parser.yy.c"
-+#line 1051 "parser.yy.c"
-
- #define INITIAL 0
- #define QUOTE 1
-@@ -1281,7 +1281,7 @@ YY_DECL
- {
- #line 132 "parser.l"
-
--#line 1284 "parser.yy.c"
-+#line 1285 "parser.yy.c"
-
- while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */
- {
-@@ -1616,7 +1616,7 @@ YY_RULE_SETUP
- #line 239 "parser.l"
- ECHO;
- YY_BREAK
--#line 1619 "parser.yy.c"
-+#line 1620 "parser.yy.c"
-
- case YY_END_OF_BUFFER:
- {
-diff --git a/mingw-w64-tools/widl/src/proxy.c b/mingw-w64-tools/widl/src/proxy.c
-index 87c27be9..36b552be 100644
---- a/mingw-w64-tools/widl/src/proxy.c
-+++ b/mingw-w64-tools/widl/src/proxy.c
-@@ -67,7 +67,7 @@ static void write_stubdesc(int expr_eval_routines)
- print_proxy( "1, /* -error bounds_check flag */\n");
- print_proxy( "0x%x, /* Ndr library version */\n", get_stub_mode() == MODE_Oif ? 0x50002 : 0x10001);
- print_proxy( "0,\n");
-- print_proxy( "0x50100a4, /* MIDL Version 5.1.164 */\n");
-+ print_proxy( "0x50200ca, /* MIDL Version 5.2.202 */\n");
- print_proxy( "0,\n");
- print_proxy("%s,\n", list_empty(&user_type_list) ? "0" : "UserMarshalRoutines");
- print_proxy( "0, /* notify & notify_flag routine table */\n");
-@@ -105,15 +105,15 @@ static void clear_output_vars( const var_list_t *args )
- {
- if (is_attr(arg->attrs, ATTR_IN)) continue;
- if (!is_attr(arg->attrs, ATTR_OUT)) continue;
-- if (is_ptr(arg->type))
-+ if (is_ptr(arg->declspec.type))
- {
-- if (type_get_type(type_pointer_get_ref(arg->type)) == TYPE_BASIC) continue;
-- if (type_get_type(type_pointer_get_ref(arg->type)) == TYPE_ENUM) continue;
-+ if (type_get_type(type_pointer_get_ref_type(arg->declspec.type)) == TYPE_BASIC) continue;
-+ if (type_get_type(type_pointer_get_ref_type(arg->declspec.type)) == TYPE_ENUM) continue;
- }
- print_proxy( "if (%s) MIDL_memset( %s, 0, ", arg->name, arg->name );
-- if (is_array(arg->type) && type_array_has_conformance(arg->type))
-+ if (is_array(arg->declspec.type) && type_array_has_conformance(arg->declspec.type))
- {
-- write_expr( proxy, type_array_get_conformance(arg->type), 1, 1, NULL, NULL, "" );
-+ write_expr( proxy, type_array_get_conformance(arg->declspec.type), 1, 1, NULL, NULL, "" );
- fprintf( proxy, " * " );
- }
- fprintf( proxy, "sizeof( *%s ));\n", arg->name );
-@@ -147,7 +147,7 @@ static int need_delegation_indirect(const type_t *iface)
- static void free_variable( const var_t *arg, const char *local_var_prefix )
- {
- unsigned int type_offset = arg->typestring_offset;
-- type_t *type = arg->type;
-+ type_t *type = arg->declspec.type;
-
- write_parameter_conf_or_var_exprs(proxy, indent, local_var_prefix, PHASE_FREE, arg, FALSE);
-
-@@ -191,18 +191,18 @@ static void proxy_free_variables( var_list_t *args, const char *local_var_prefix
- static void gen_proxy(type_t *iface, const var_t *func, int idx,
- unsigned int proc_offset)
- {
-- var_t *retval = type_function_get_retval(func->type);
-- int has_ret = !is_void(retval->type);
-+ var_t *retval = type_function_get_retval(func->declspec.type);
-+ int has_ret = !is_void(retval->declspec.type);
- int has_full_pointer = is_full_pointer_function(func);
-- const char *callconv = get_attrp(func->type->attrs, ATTR_CALLCONV);
-- const var_list_t *args = type_get_function_args(func->type);
-+ const char *callconv = get_attrp(func->declspec.type->attrs, ATTR_CALLCONV);
-+ const var_list_t *args = type_function_get_args(func->declspec.type);
- if (!callconv) callconv = "STDMETHODCALLTYPE";
-
- indent = 0;
- if (is_interpreted_func( iface, func ))
- {
- if (get_stub_mode() == MODE_Oif && !is_callas( func->attrs )) return;
-- write_type_decl_left(proxy, retval->type);
-+ write_declspec_decl_left(proxy, &retval->declspec);
- print_proxy( " %s %s_%s_Proxy(\n", callconv, iface->name, get_name(func));
- write_args(proxy, args, iface->name, 1, TRUE);
- print_proxy( ")\n");
-@@ -219,7 +219,7 @@ static void gen_proxy(type_t *iface, const var_t *func, int idx,
- print_proxy( "}\n");
- print_proxy( "\n");
-
-- write_type_decl_left(proxy, retval->type);
-+ write_declspec_decl_left(proxy, &retval->declspec);
- print_proxy( " %s %s_%s_Proxy(\n", callconv, iface->name, get_name(func));
- write_args(proxy, args, iface->name, 1, TRUE);
- print_proxy( ")\n");
-@@ -229,12 +229,12 @@ static void gen_proxy(type_t *iface, const var_t *func, int idx,
- /* local variables */
- if (has_ret) {
- print_proxy( "%s", "" );
-- write_type_decl(proxy, retval->type, retval->name);
-+ write_declspec_decl(proxy, &retval->declspec, retval->name);
- fprintf( proxy, ";\n" );
- }
- print_proxy( "RPC_MESSAGE _RpcMessage;\n" );
- if (has_ret) {
-- if (decl_indirect(retval->type))
-+ if (decl_indirect(retval->declspec.type))
- print_proxy("void *_p_%s = &%s;\n", retval->name, retval->name);
- }
- print_proxy( "\n");
-@@ -246,7 +246,7 @@ static void gen_proxy(type_t *iface, const var_t *func, int idx,
- write_full_pointer_init(proxy, indent, func, FALSE);
-
- /* FIXME: trace */
-- clear_output_vars( type_get_function_args(func->type) );
-+ clear_output_vars( type_function_get_args(func->declspec.type) );
-
- print_proxy( "RpcTryExcept\n" );
- print_proxy( "{\n" );
-@@ -279,9 +279,9 @@ static void gen_proxy(type_t *iface, const var_t *func, int idx,
-
- if (has_ret)
- {
-- if (decl_indirect(retval->type))
-+ if (decl_indirect(retval->declspec.type))
- print_proxy("MIDL_memset(&%s, 0, sizeof(%s));\n", retval->name, retval->name);
-- else if (is_ptr(retval->type) || is_array(retval->type))
-+ else if (is_ptr(retval->declspec.type) || is_array(retval->declspec.type))
- print_proxy("%s = 0;\n", retval->name);
- write_remoting_arguments(proxy, indent, func, "", PASS_RETURN, PHASE_UNMARSHAL);
- }
-@@ -301,7 +301,7 @@ static void gen_proxy(type_t *iface, const var_t *func, int idx,
- print_proxy( "{\n" );
- if (has_ret) {
- indent++;
-- proxy_free_variables( type_get_function_args(func->type), "" );
-+ proxy_free_variables( type_function_get_args(func->declspec.type), "" );
- print_proxy( "_RetVal = NdrProxyErrorHandler(RpcExceptionCode());\n" );
- indent--;
- }
-@@ -320,7 +320,7 @@ static void gen_stub(type_t *iface, const var_t *func, const char *cas,
- unsigned int proc_offset)
- {
- const var_t *arg;
-- int has_ret = !is_void(type_function_get_rettype(func->type));
-+ int has_ret = !is_void(type_function_get_rettype(func->declspec.type));
- int has_full_pointer = is_full_pointer_function(func);
-
- if (is_interpreted_func( iface, func )) return;
-@@ -389,10 +389,10 @@ static void gen_stub(type_t *iface, const var_t *func, const char *cas,
- else fprintf(proxy, "__frame->_This->lpVtbl->%s", get_name(func));
- fprintf(proxy, "(__frame->_This");
-
-- if (type_get_function_args(func->type))
-+ if (type_function_get_args(func->declspec.type))
- {
-- LIST_FOR_EACH_ENTRY( arg, type_get_function_args(func->type), const var_t, entry )
-- fprintf(proxy, ", %s__frame->%s", is_array(arg->type) && !type_array_is_decl_as_ptr(arg->type) ? "*" :"" , arg->name);
-+ LIST_FOR_EACH_ENTRY( arg, type_function_get_args(func->declspec.type), const var_t, entry )
-+ fprintf(proxy, ", %s__frame->%s", is_array(arg->declspec.type) && !type_array_is_decl_as_ptr(arg->declspec.type) ? "*" :"" , arg->name);
- }
- fprintf(proxy, ");\n");
- fprintf(proxy, "\n");
-@@ -401,7 +401,7 @@ static void gen_stub(type_t *iface, const var_t *func, const char *cas,
-
- write_remoting_arguments(proxy, indent, func, "__frame->", PASS_OUT, PHASE_BUFFERSIZE);
-
-- if (!is_void(type_function_get_rettype(func->type)))
-+ if (!is_void(type_function_get_rettype(func->declspec.type)))
- write_remoting_arguments(proxy, indent, func, "__frame->", PASS_RETURN, PHASE_BUFFERSIZE);
-
- print_proxy("NdrStubGetBuffer(This, _pRpcChannelBuffer, &__frame->_StubMsg);\n");
-@@ -410,7 +410,7 @@ static void gen_stub(type_t *iface, const var_t *func, const char *cas,
- fprintf(proxy, "\n");
-
- /* marshall the return value */
-- if (!is_void(type_function_get_rettype(func->type)))
-+ if (!is_void(type_function_get_rettype(func->declspec.type)))
- write_remoting_arguments(proxy, indent, func, "__frame->", PASS_RETURN, PHASE_MARSHAL);
-
- indent--;
-@@ -432,16 +432,16 @@ static void gen_stub(type_t *iface, const var_t *func, const char *cas,
-
- static void gen_stub_thunk( type_t *iface, const var_t *func, unsigned int proc_offset )
- {
-- int has_ret = !is_void( type_function_get_rettype( func->type ));
-+ int has_ret = !is_void( type_function_get_rettype( func->declspec.type ));
- const var_t *arg, *callas = is_callas( func->attrs );
-- const var_list_t *args = type_get_function_args( func->type );
-+ const var_list_t *args = type_function_get_args( func->declspec.type );
-
- indent = 0;
- print_proxy( "void __RPC_API %s_%s_Thunk( PMIDL_STUB_MESSAGE pStubMsg )\n",
- iface->name, get_name(func) );
- print_proxy( "{\n");
- indent++;
-- write_func_param_struct( proxy, iface, func->type,
-+ write_func_param_struct( proxy, iface, func->declspec.type,
- "*pParamStruct = (struct _PARAM_STRUCT *)pStubMsg->StackTop", has_ret );
- print_proxy( "%s%s_%s_Stub( pParamStruct->This",
- has_ret ? "pParamStruct->_RetVal = " : "", iface->name, callas->name );
-@@ -526,6 +526,7 @@ static int write_proxy_methods(type_t *iface, int skip)
- if (skip || (is_local(func->attrs) && !get_callas_source(iface, func)))
- print_proxy( "0, /* %s::%s */\n", iface->name, get_name(func));
- else if (is_interpreted_func( iface, func ) &&
-+ get_stub_mode() == MODE_Oif &&
- !is_local( func->attrs ) &&
- type_iface_get_inherit(iface))
- print_proxy( "(void *)-1, /* %s::%s */\n", iface->name, get_name(func));
-@@ -613,14 +614,14 @@ static void write_proxy(type_t *iface, unsigned int *proc_offset)
- if (!is_local(func->attrs)) {
- const var_t *cas = is_callas(func->attrs);
- const char *cname = cas ? cas->name : NULL;
-- int idx = func->type->details.function->idx;
-+ int idx = type_get_details(func->declspec.type)->function->idx;
- if (cname) {
- const statement_t *stmt2;
- STATEMENTS_FOR_EACH_FUNC(stmt2, type_iface_get_stmts(iface)) {
- const var_t *m = stmt2->u.var;
- if (!strcmp(m->name, cname))
- {
-- idx = m->type->details.function->idx;
-+ idx = type_get_details(m->declspec.type)->function->idx;
- break;
- }
- }
-@@ -738,7 +739,7 @@ static void write_proxy(type_t *iface, unsigned int *proc_offset)
- print_proxy( "{\n");
- indent++;
- print_proxy( "%s_%s\n",
-- iface->details.iface->async_iface == iface ? "CStdAsyncStubBuffer" : "CStdStubBuffer",
-+ type_get_details(iface)->iface->async_iface == iface ? "CStdAsyncStubBuffer" : "CStdStubBuffer",
- need_delegation_indirect(iface) ? "DELEGATING_METHODS" : "METHODS");
- indent--;
- print_proxy( "}\n");
-@@ -839,8 +840,8 @@ static void write_proxy_stmts(const statement_list_t *stmts, unsigned int *proc_
- if (need_proxy(iface))
- {
- write_proxy(iface, proc_offset);
-- if (iface->details.iface->async_iface)
-- write_proxy(iface->details.iface->async_iface, proc_offset);
-+ if (type_get_details(iface)->iface->async_iface)
-+ write_proxy(type_get_details(iface)->iface->async_iface, proc_offset);
- }
- }
- }
-@@ -869,9 +870,9 @@ static void build_iface_list( const statement_list_t *stmts, type_t **ifaces[],
- {
- *ifaces = xrealloc( *ifaces, (*count + 1) * sizeof(**ifaces) );
- (*ifaces)[(*count)++] = iface;
-- if (iface->details.iface->async_iface)
-+ if (type_get_details(iface)->iface->async_iface)
- {
-- iface = iface->details.iface->async_iface;
-+ iface = type_get_details(iface)->iface->async_iface;
- *ifaces = xrealloc( *ifaces, (*count + 1) * sizeof(**ifaces) );
- (*ifaces)[(*count)++] = iface;
- }
-@@ -942,7 +943,7 @@ static void write_proxy_routines(const statement_list_t *stmts)
- write_stubdesc(expr_eval_routines);
-
- print_proxy( "#if !defined(__RPC_WIN%u__)\n", pointer_size == 8 ? 64 : 32);
-- print_proxy( "#error Currently only Wine and WIN32 are supported.\n");
-+ print_proxy( "#error Invalid build platform for this proxy.\n");
- print_proxy( "#endif\n");
- print_proxy( "\n");
- write_procformatstring(proxy, stmts, need_proxy);
-@@ -1011,7 +1012,7 @@ static void write_proxy_routines(const statement_list_t *stmts)
- table_version = get_stub_mode() == MODE_Oif ? 2 : 1;
- for (i = 0; i < count; i++)
- {
-- if (interfaces[i]->details.iface->async_iface != interfaces[i]) continue;
-+ if (type_get_details(interfaces[i])->iface->async_iface != interfaces[i]) continue;
- if (table_version != 6)
- {
- fprintf(proxy, "static const IID *_AsyncInterfaceTable[] =\n");
-@@ -1053,26 +1054,6 @@ void write_proxies(const statement_list_t *stmts)
- init_proxy(stmts);
- if(!proxy) return;
-
-- if (do_win32 && do_win64)
-- {
-- fprintf(proxy, "\n#ifndef _WIN64\n\n");
-- pointer_size = 4;
-- write_proxy_routines( stmts );
-- fprintf(proxy, "\n#else /* _WIN64 */\n\n");
-- pointer_size = 8;
-- write_proxy_routines( stmts );
-- fprintf(proxy, "\n#endif /* _WIN64 */\n");
-- }
-- else if (do_win32)
-- {
-- pointer_size = 4;
-- write_proxy_routines( stmts );
-- }
-- else if (do_win64)
-- {
-- pointer_size = 8;
-- write_proxy_routines( stmts );
-- }
--
-+ write_proxy_routines( stmts );
- fclose(proxy);
- }
-diff --git a/mingw-w64-tools/widl/src/register.c b/mingw-w64-tools/widl/src/register.c
-index 210fb747..1c369e7c 100644
---- a/mingw-w64-tools/widl/src/register.c
-+++ b/mingw-w64-tools/widl/src/register.c
-@@ -325,7 +325,7 @@ void output_typelib_regscript( const typelib_t *typelib )
- sprintf(resname, "%s\\%d", typelib_name, expr->cval);
- }
- put_str( indent, "'%x' { %s = s '%%MODULE%%%s' }\n",
-- lcid_expr ? lcid_expr->cval : 0, typelib_kind == SYS_WIN64 ? "win64" : "win32", id_part );
-+ lcid_expr ? lcid_expr->cval : 0, pointer_size == 8 ? "win64" : "win32", id_part );
- put_str( indent, "FLAGS = s '%u'\n", flags );
- put_str( --indent, "}\n" );
- put_str( --indent, "}\n" );
-diff --git a/mingw-w64-tools/widl/src/server.c b/mingw-w64-tools/widl/src/server.c
-index 783ff900..dbed870a 100644
---- a/mingw-w64-tools/widl/src/server.c
-+++ b/mingw-w64-tools/widl/src/server.c
-@@ -55,6 +55,8 @@ static void write_function_stub(const type_t *iface, const var_t *func, unsigned
- unsigned char explicit_fc, implicit_fc;
- int has_full_pointer = is_full_pointer_function(func);
- const var_t *handle_var = get_func_handle_var( iface, func, &explicit_fc, &implicit_fc );
-+ const decl_spec_t *ret_declspec = type_function_get_retdeclspec(func->declspec.type);
-+ type_t *ret_type = ret_declspec->type;
-
- if (is_interpreted_func( iface, func )) return;
-
-@@ -75,7 +77,7 @@ static void write_function_stub(const type_t *iface, const var_t *func, unsigned
- indent++;
- write_remoting_arguments(server, indent, func, "__frame->", PASS_OUT, PHASE_FREE);
-
-- if (!is_void(type_function_get_rettype(func->type)))
-+ if (!is_void(ret_type))
- write_remoting_arguments(server, indent, func, "__frame->", PASS_RETURN, PHASE_FREE);
-
- if (has_full_pointer)
-@@ -120,7 +122,7 @@ static void write_function_stub(const type_t *iface, const var_t *func, unsigned
- if (has_full_pointer)
- write_full_pointer_init(server, indent, func, TRUE);
-
-- if (type_get_function_args(func->type))
-+ if (type_function_get_args(func->declspec.type))
- {
- print_server("if ((_pRpcMessage->DataRepresentation & 0x0000FFFFUL) != NDR_LOCAL_DATA_REPRESENTATION)\n");
- indent++;
-@@ -154,35 +156,42 @@ static void write_function_stub(const type_t *iface, const var_t *func, unsigned
- assign_stub_out_args(server, indent, func, "__frame->");
-
- /* Call the real server function */
-- print_server("%s%s%s",
-- is_void(type_function_get_rettype(func->type)) ? "" : "__frame->_RetVal = ",
-- prefix_server, get_name(func));
-+ if (is_context_handle(ret_type))
-+ {
-+ print_server("__frame->_RetVal = NDRSContextUnmarshall((char*)0, _pRpcMessage->DataRepresentation);\n");
-+ print_server("*((");
-+ write_declspec_decl(server, ret_declspec, NULL);
-+ fprintf(server, "*)NDRSContextValue(__frame->_RetVal)) = ");
-+ }
-+ else
-+ print_server("%s", is_void(ret_type) ? "" : "__frame->_RetVal = ");
-+ fprintf(server, "%s%s", prefix_server, get_name(func));
-
-- if (type_get_function_args(func->type))
-+ if (type_function_get_args(func->declspec.type))
- {
- int first_arg = 1;
-
- fprintf(server, "(\n");
- indent++;
-- LIST_FOR_EACH_ENTRY( var, type_get_function_args(func->type), const var_t, entry )
-+ LIST_FOR_EACH_ENTRY( var, type_function_get_args(func->declspec.type), const var_t, entry )
- {
- if (first_arg)
- first_arg = 0;
- else
- fprintf(server, ",\n");
-- if (is_context_handle(var->type))
-+ if (is_context_handle(var->declspec.type))
- {
- /* if the context_handle attribute appears in the chain of types
- * without pointers being followed, then the context handle must
- * be direct, otherwise it is a pointer */
-- const char *ch_ptr = is_aliaschain_attr(var->type, ATTR_CONTEXTHANDLE) ? "*" : "";
-+ const char *ch_ptr = is_aliaschain_attr(var->declspec.type, ATTR_CONTEXTHANDLE) ? "*" : "";
- print_server("(");
-- write_type_decl_left(server, var->type);
-+ write_declspec_decl_left(server, &var->declspec);
- fprintf(server, ")%sNDRSContextValue(__frame->%s)", ch_ptr, var->name);
- }
- else
- {
-- print_server("%s__frame->%s", is_array(var->type) && !type_array_is_decl_as_ptr(var->type) ? "*" : "", var->name);
-+ print_server("%s__frame->%s", is_array(var->declspec.type) && !type_array_is_decl_as_ptr(var->declspec.type) ? "*" : "", var->name);
- }
- }
- fprintf(server, ");\n");
-@@ -197,7 +206,7 @@ static void write_function_stub(const type_t *iface, const var_t *func, unsigned
- {
- write_remoting_arguments(server, indent, func, "__frame->", PASS_OUT, PHASE_BUFFERSIZE);
-
-- if (!is_void(type_function_get_rettype(func->type)))
-+ if (!is_void(ret_type))
- write_remoting_arguments(server, indent, func, "__frame->", PASS_RETURN, PHASE_BUFFERSIZE);
-
- print_server("_pRpcMessage->BufferLength = __frame->_StubMsg.BufferLength;\n");
-@@ -216,7 +225,7 @@ static void write_function_stub(const type_t *iface, const var_t *func, unsigned
- write_remoting_arguments(server, indent, func, "__frame->", PASS_OUT, PHASE_MARSHAL);
-
- /* marshall the return value */
-- if (!is_void(type_function_get_rettype(func->type)))
-+ if (!is_void(ret_type))
- write_remoting_arguments(server, indent, func, "__frame->", PASS_RETURN, PHASE_MARSHAL);
-
- indent--;
-@@ -378,7 +387,7 @@ static void write_stubdescriptor(type_t *iface, int expr_eval_routines)
- print_server("1, /* -error bounds_check flag */\n");
- print_server("0x%x, /* Ndr library version */\n", get_stub_mode() == MODE_Oif ? 0x50002 : 0x10001);
- print_server("0,\n");
-- print_server("0x50100a4, /* MIDL Version 5.1.164 */\n");
-+ print_server("0x50200ca, /* MIDL Version 5.2.202 */\n");
- print_server("0,\n");
- print_server("%s,\n", list_empty(&user_type_list) ? "0" : "UserMarshalRoutines");
- print_server("0, /* notify & notify_flag routine table */\n");
-@@ -544,26 +553,6 @@ void write_server(const statement_list_t *stmts)
- if (!server)
- return;
-
-- if (do_win32 && do_win64)
-- {
-- fprintf(server, "#ifndef _WIN64\n\n");
-- pointer_size = 4;
-- write_server_routines( stmts );
-- fprintf(server, "\n#else /* _WIN64 */\n\n");
-- pointer_size = 8;
-- write_server_routines( stmts );
-- fprintf(server, "\n#endif /* _WIN64 */\n");
-- }
-- else if (do_win32)
-- {
-- pointer_size = 4;
-- write_server_routines( stmts );
-- }
-- else if (do_win64)
-- {
-- pointer_size = 8;
-- write_server_routines( stmts );
-- }
--
-+ write_server_routines( stmts );
- fclose(server);
- }
-diff --git a/mingw-w64-tools/widl/src/typegen.c b/mingw-w64-tools/widl/src/typegen.c
-index 27ba60fc..eebb99f0 100644
---- a/mingw-w64-tools/widl/src/typegen.c
-+++ b/mingw-w64-tools/widl/src/typegen.c
-@@ -67,6 +67,7 @@ enum type_context
- TYPE_CONTEXT_PARAM,
- TYPE_CONTEXT_CONTAINER,
- TYPE_CONTEXT_CONTAINER_NO_POINTERS,
-+ TYPE_CONTEXT_RETVAL,
- };
-
- /* parameter flags in Oif mode */
-@@ -84,14 +85,14 @@ static const unsigned short IsSimpleRef = 0x0100;
-
- static unsigned int field_memsize(const type_t *type, unsigned int *offset);
- static unsigned int fields_memsize(const var_list_t *fields, unsigned int *align);
--static unsigned int write_array_tfs(FILE *file, const attr_list_t *attrs, type_t *type,
-+static unsigned int write_array_tfs(FILE *file, const attr_list_t *attrs, const decl_spec_t *declspec,
- const char *name, unsigned int *typestring_offset);
--static unsigned int write_struct_tfs(FILE *file, type_t *type, const char *name, unsigned int *tfsoff);
--static int write_embedded_types(FILE *file, const attr_list_t *attrs, type_t *type,
-+static unsigned int write_struct_tfs(FILE *file, const decl_spec_t *declspec, const char *name, unsigned int *tfsoff);
-+static int write_embedded_types(FILE *file, const attr_list_t *attrs, const decl_spec_t *declspec,
- const char *name, int write_ptr, unsigned int *tfsoff);
- static const var_t *find_array_or_string_in_struct(const type_t *type);
- static unsigned int write_string_tfs(FILE *file, const attr_list_t *attrs,
-- type_t *type, enum type_context context,
-+ const decl_spec_t *declspec, enum type_context context,
- const char *name, unsigned int *typestring_offset);
- static unsigned int get_required_buffer_size_type( const type_t *type, const char *name,
- const attr_list_t *attrs, int toplevel_param,
-@@ -196,7 +197,7 @@ static void *get_aliaschain_attrp(const type_t *type, enum attr_type attr)
- if (is_attr(t->attrs, attr))
- return get_attrp(t->attrs, attr);
- else if (type_is_alias(t))
-- t = type_alias_get_aliasee(t);
-+ t = type_alias_get_aliasee_type(t);
- else return NULL;
- }
- }
-@@ -266,7 +267,7 @@ unsigned char get_pointer_fc(const type_t *type, const attr_list_t *attrs, int t
- if (pointer_type)
- return pointer_type;
-
-- for (t = type; type_is_alias(t); t = type_alias_get_aliasee(t))
-+ for (t = type; type_is_alias(t); t = type_alias_get_aliasee_type(t))
- {
- pointer_type = get_attrv(t->attrs, ATTR_POINTERTYPE);
- if (pointer_type)
-@@ -287,7 +288,7 @@ static unsigned char get_pointer_fc_context( const type_t *type, const attr_list
- int pointer_fc = get_pointer_fc(type, attrs, context == TYPE_CONTEXT_TOPLEVELPARAM);
-
- if (pointer_fc == FC_UP && is_attr( attrs, ATTR_OUT ) &&
-- context == TYPE_CONTEXT_PARAM && is_object( current_iface ))
-+ (context == TYPE_CONTEXT_PARAM || context == TYPE_CONTEXT_RETVAL) && is_object( current_iface ))
- pointer_fc = FC_OP;
-
- return pointer_fc;
-@@ -315,7 +316,7 @@ static type_t *get_user_type(const type_t *t, const char **pname)
- }
-
- if (type_is_alias(t))
-- t = type_alias_get_aliasee(t);
-+ t = type_alias_get_aliasee_type(t);
- else
- return NULL;
- }
-@@ -350,10 +351,10 @@ enum typegen_type typegen_detect_type(const type_t *type, const attr_list_t *att
- return TGT_RANGE;
- return TGT_ENUM;
- case TYPE_POINTER:
-- if (type_get_type(type_pointer_get_ref(type)) == TYPE_INTERFACE ||
-- (type_get_type(type_pointer_get_ref(type)) == TYPE_VOID && is_attr(attrs, ATTR_IIDIS)))
-+ if (type_get_type(type_pointer_get_ref_type(type)) == TYPE_INTERFACE ||
-+ (type_get_type(type_pointer_get_ref_type(type)) == TYPE_VOID && is_attr(attrs, ATTR_IIDIS)))
- return TGT_IFACE_POINTER;
-- else if (is_aliaschain_attr(type_pointer_get_ref(type), ATTR_CONTEXTHANDLE))
-+ else if (is_aliaschain_attr(type_pointer_get_ref_type(type), ATTR_CONTEXTHANDLE))
- return TGT_CTXT_HANDLE_POINTER;
- else
- return TGT_POINTER;
-@@ -378,13 +379,13 @@ enum typegen_type typegen_detect_type(const type_t *type, const attr_list_t *att
-
- static int cant_be_null(const var_t *v)
- {
-- switch (typegen_detect_type(v->type, v->attrs, TDT_IGNORE_STRINGS))
-+ switch (typegen_detect_type(v->declspec.type, v->attrs, TDT_IGNORE_STRINGS))
- {
- case TGT_ARRAY:
-- if (!type_array_is_decl_as_ptr( v->type )) return 0;
-+ if (!type_array_is_decl_as_ptr( v->declspec.type )) return 0;
- /* fall through */
- case TGT_POINTER:
-- return (get_pointer_fc(v->type, v->attrs, TRUE) == FC_RP);
-+ return (get_pointer_fc(v->declspec.type, v->attrs, TRUE) == FC_RP);
- case TGT_CTXT_HANDLE_POINTER:
- return TRUE;
- default:
-@@ -404,7 +405,7 @@ static int get_padding(const var_list_t *fields)
-
- LIST_FOR_EACH_ENTRY(f, fields, const var_t, entry)
- {
-- type_t *ft = f->type;
-+ type_t *ft = f->declspec.type;
- unsigned int align = 0;
- unsigned int size = type_memsize_and_alignment(ft, &align);
- align = clamp_align(align);
-@@ -421,7 +422,7 @@ static unsigned int get_stack_size( const var_t *var, int *by_value )
- unsigned int stack_size;
- int by_val;
-
-- switch (typegen_detect_type( var->type, var->attrs, TDT_ALL_TYPES ))
-+ switch (typegen_detect_type( var->declspec.type, var->attrs, TDT_ALL_TYPES ))
- {
- case TGT_BASIC:
- case TGT_ENUM:
-@@ -429,7 +430,7 @@ static unsigned int get_stack_size( const var_t *var, int *by_value )
- case TGT_STRUCT:
- case TGT_UNION:
- case TGT_USER_TYPE:
-- stack_size = type_memsize( var->type );
-+ stack_size = type_memsize( var->declspec.type );
- by_val = (pointer_size < 8 || stack_size <= pointer_size); /* FIXME: should be platform-specific */
- break;
- default:
-@@ -442,23 +443,27 @@ static unsigned int get_stack_size( const var_t *var, int *by_value )
- }
-
- static unsigned char get_contexthandle_flags( const type_t *iface, const attr_list_t *attrs,
-- const type_t *type )
-+ const type_t *type, int is_return )
- {
- unsigned char flags = 0;
-+ int is_out;
-
- if (is_attr(iface->attrs, ATTR_STRICTCONTEXTHANDLE)) flags |= NDR_STRICT_CONTEXT_HANDLE;
-
- if (is_ptr(type) &&
- !is_attr( type->attrs, ATTR_CONTEXTHANDLE ) &&
- !is_attr( attrs, ATTR_CONTEXTHANDLE ))
-- flags |= 0x80;
-+ flags |= HANDLE_PARAM_IS_VIA_PTR;
-
-- if (is_attr(attrs, ATTR_IN))
-+ if (is_return) return flags | HANDLE_PARAM_IS_OUT | HANDLE_PARAM_IS_RETURN;
-+
-+ is_out = is_attr(attrs, ATTR_OUT);
-+ if (is_attr(attrs, ATTR_IN) || !is_out)
- {
-- flags |= 0x40;
-- if (!is_attr(attrs, ATTR_OUT)) flags |= NDR_CONTEXT_HANDLE_CANNOT_BE_NULL;
-+ flags |= HANDLE_PARAM_IS_IN;
-+ if (!is_out) flags |= NDR_CONTEXT_HANDLE_CANNOT_BE_NULL;
- }
-- if (is_attr(attrs, ATTR_OUT)) flags |= 0x20;
-+ if (is_out) flags |= HANDLE_PARAM_IS_OUT;
-
- return flags;
- }
-@@ -490,14 +495,14 @@ unsigned char get_struct_fc(const type_t *type)
-
- if (fields) LIST_FOR_EACH_ENTRY( field, fields, var_t, entry )
- {
-- type_t *t = field->type;
-+ type_t *t = field->declspec.type;
- enum typegen_type typegen_type;
-
- typegen_type = typegen_detect_type(t, field->attrs, TDT_IGNORE_STRINGS);
-
- if (typegen_type == TGT_ARRAY && !type_array_is_decl_as_ptr(t))
- {
-- if (is_string_type(field->attrs, field->type))
-+ if (is_string_type(field->attrs, field->declspec.type))
- {
- if (is_conformant_array(t))
- has_conformance = 1;
-@@ -505,10 +510,10 @@ unsigned char get_struct_fc(const type_t *type)
- continue;
- }
-
-- if (is_array(type_array_get_element(field->type)))
-+ if (is_array(type_array_get_element_type(field->declspec.type)))
- return FC_BOGUS_STRUCT;
-
-- if (type_array_has_conformance(field->type))
-+ if (type_array_has_conformance(field->declspec.type))
- {
- has_conformance = 1;
- if (list_next(fields, &field->entry))
-@@ -518,7 +523,7 @@ unsigned char get_struct_fc(const type_t *type)
- if (type_array_has_variance(t))
- has_variance = 1;
-
-- t = type_array_get_element(t);
-+ t = type_array_get_element_type(t);
- typegen_type = typegen_detect_type(t, field->attrs, TDT_IGNORE_STRINGS);
- }
-
-@@ -620,7 +625,7 @@ static unsigned char get_array_fc(const type_t *type)
- const expr_t *size_is;
- const type_t *elem_type;
-
-- elem_type = type_array_get_element(type);
-+ elem_type = type_array_get_element_type(type);
- size_is = type_array_get_conformance(type);
-
- if (!size_is)
-@@ -709,14 +714,14 @@ static int type_has_pointers(const type_t *type)
- case TGT_POINTER:
- return TRUE;
- case TGT_ARRAY:
-- return type_array_is_decl_as_ptr(type) || type_has_pointers(type_array_get_element(type));
-+ return type_array_is_decl_as_ptr(type) || type_has_pointers(type_array_get_element_type(type));
- case TGT_STRUCT:
- {
- var_list_t *fields = type_struct_get_fields(type);
- const var_t *field;
- if (fields) LIST_FOR_EACH_ENTRY( field, fields, const var_t, entry )
- {
-- if (type_has_pointers(field->type))
-+ if (type_has_pointers(field->declspec.type))
- return TRUE;
- }
- break;
-@@ -728,7 +733,7 @@ static int type_has_pointers(const type_t *type)
- fields = type_union_get_cases(type);
- if (fields) LIST_FOR_EACH_ENTRY( field, fields, const var_t, entry )
- {
-- if (field->type && type_has_pointers(field->type))
-+ if (field->declspec.type && type_has_pointers(field->declspec.type))
- return TRUE;
- }
- break;
-@@ -763,14 +768,14 @@ static int type_has_full_pointer(const type_t *type, const attr_list_t *attrs,
- if (get_pointer_fc(type, attrs, toplevel_param) == FC_FP)
- return TRUE;
- else
-- return type_has_full_pointer(type_array_get_element(type), NULL, FALSE);
-+ return type_has_full_pointer(type_array_get_element_type(type), NULL, FALSE);
- case TGT_STRUCT:
- {
- var_list_t *fields = type_struct_get_fields(type);
- const var_t *field;
- if (fields) LIST_FOR_EACH_ENTRY( field, fields, const var_t, entry )
- {
-- if (type_has_full_pointer(field->type, field->attrs, FALSE))
-+ if (type_has_full_pointer(field->declspec.type, field->attrs, FALSE))
- return TRUE;
- }
- break;
-@@ -782,7 +787,7 @@ static int type_has_full_pointer(const type_t *type, const attr_list_t *attrs,
- fields = type_union_get_cases(type);
- if (fields) LIST_FOR_EACH_ENTRY( field, fields, const var_t, entry )
- {
-- if (field->type && type_has_full_pointer(field->type, field->attrs, FALSE))
-+ if (field->declspec.type && type_has_full_pointer(field->declspec.type, field->attrs, FALSE))
- return TRUE;
- }
- break;
-@@ -852,7 +857,7 @@ static const char *get_context_handle_type_name(const type_t *type)
- const type_t *t;
- for (t = type;
- is_ptr(t) || type_is_alias(t);
-- t = type_is_alias(t) ? type_alias_get_aliasee(t) : type_pointer_get_ref(t))
-+ t = type_is_alias(t) ? type_alias_get_aliasee_type(t) : type_pointer_get_ref_type(t))
- if (is_attr(t->attrs, ATTR_CONTEXTHANDLE))
- return t->name;
- assert(0);
-@@ -902,16 +907,16 @@ static void write_var_init(FILE *file, int indent, const type_t *t, const char *
-
- void write_parameters_init(FILE *file, int indent, const var_t *func, const char *local_var_prefix)
- {
-- const var_t *var = type_function_get_retval(func->type);
-+ const var_t *var = type_function_get_retval(func->declspec.type);
-
-- if (!is_void(var->type))
-- write_var_init(file, indent, var->type, var->name, local_var_prefix);
-+ if (!is_void(var->declspec.type))
-+ write_var_init(file, indent, var->declspec.type, var->name, local_var_prefix);
-
-- if (!type_get_function_args(func->type))
-+ if (!type_function_get_args(func->declspec.type))
- return;
-
-- LIST_FOR_EACH_ENTRY( var, type_get_function_args(func->type), const var_t, entry )
-- write_var_init(file, indent, var->type, var->name, local_var_prefix);
-+ LIST_FOR_EACH_ENTRY( var, type_function_get_args(func->declspec.type), const var_t, entry )
-+ write_var_init(file, indent, var->declspec.type, var->name, local_var_prefix);
-
- fprintf(file, "\n");
- }
-@@ -975,14 +980,14 @@ static unsigned char get_parameter_fc( const var_t *var, int is_return, unsigned
- if (is_out) *flags |= IsOut;
- if (is_return) *flags |= IsReturn;
-
-- if (!is_string_type( var->attrs, var->type ))
-- buffer_size = get_required_buffer_size_type( var->type, NULL, var->attrs, TRUE, &alignment );
-+ if (!is_string_type( var->attrs, var->declspec.type ))
-+ buffer_size = get_required_buffer_size_type( var->declspec.type, NULL, var->attrs, TRUE, &alignment );
-
-- switch (typegen_detect_type( var->type, var->attrs, TDT_ALL_TYPES ))
-+ switch (typegen_detect_type( var->declspec.type, var->attrs, TDT_ALL_TYPES ))
- {
- case TGT_BASIC:
- *flags |= IsBasetype;
-- fc = get_basic_fc_signed( var->type );
-+ fc = get_basic_fc_signed( var->declspec.type );
- if (fc == FC_BIND_PRIMITIVE)
- {
- buffer_size = 4; /* actually 0 but avoids setting MustSize */
-@@ -991,7 +996,7 @@ static unsigned char get_parameter_fc( const var_t *var, int is_return, unsigned
- break;
- case TGT_ENUM:
- *flags |= IsBasetype;
-- fc = get_enum_fc( var->type );
-+ fc = get_enum_fc( var->declspec.type );
- break;
- case TGT_RANGE:
- *flags |= IsByValue;
-@@ -1006,19 +1011,19 @@ static unsigned char get_parameter_fc( const var_t *var, int is_return, unsigned
- break;
- case TGT_ARRAY:
- *flags |= MustFree;
-- if (type_array_is_decl_as_ptr(var->type) && var->type->details.array.ptr_tfsoff &&
-- get_pointer_fc( var->type, var->attrs, !is_return ) == FC_RP)
-+ if (type_array_is_decl_as_ptr(var->declspec.type) && type_get_details(var->declspec.type)->array.ptr_tfsoff &&
-+ get_pointer_fc( var->declspec.type, var->attrs, !is_return ) == FC_RP)
- {
-- *typestring_offset = var->type->typestring_offset;
-+ *typestring_offset = var->declspec.type->typestring_offset;
- *flags |= IsSimpleRef;
- }
- break;
- case TGT_STRING:
- *flags |= MustFree;
-- if (is_declptr( var->type ) && get_pointer_fc( var->type, var->attrs, !is_return ) == FC_RP)
-+ if (is_declptr( var->declspec.type ) && get_pointer_fc( var->declspec.type, var->attrs, !is_return ) == FC_RP)
- {
- /* skip over pointer description straight to string description */
-- if (is_conformant_array( var->type )) *typestring_offset += 4;
-+ if (is_conformant_array( var->declspec.type )) *typestring_offset += 4;
- else *typestring_offset += 2;
- *flags |= IsSimpleRef;
- }
-@@ -1031,9 +1036,9 @@ static unsigned char get_parameter_fc( const var_t *var, int is_return, unsigned
- buffer_size = 20;
- break;
- case TGT_POINTER:
-- if (get_pointer_fc( var->type, var->attrs, !is_return ) == FC_RP)
-+ if (get_pointer_fc( var->declspec.type, var->attrs, !is_return ) == FC_RP)
- {
-- const type_t *ref = type_pointer_get_ref( var->type );
-+ const type_t *ref = type_pointer_get_ref_type( var->declspec.type );
-
- if (!is_string_type( var->attrs, ref ))
- buffer_size = get_required_buffer_size_type( ref, NULL, NULL, TRUE, &alignment );
-@@ -1059,11 +1064,19 @@ static unsigned char get_parameter_fc( const var_t *var, int is_return, unsigned
- case TGT_UNION:
- case TGT_USER_TYPE:
- case TGT_RANGE:
-- case TGT_ARRAY:
-- *flags |= IsSimpleRef | MustFree;
-+ *flags |= MustFree | IsSimpleRef;
- *typestring_offset = ref->typestring_offset;
- if (!is_in && is_out) server_size = type_memsize( ref );
- break;
-+ case TGT_ARRAY:
-+ *flags |= MustFree;
-+ if (!type_array_is_decl_as_ptr(ref))
-+ {
-+ *flags |= IsSimpleRef;
-+ *typestring_offset = ref->typestring_offset;
-+ }
-+ if (!is_in && is_out) server_size = type_memsize( ref );
-+ break;
- case TGT_STRING:
- case TGT_POINTER:
- case TGT_CTXT_HANDLE:
-@@ -1115,8 +1128,8 @@ static unsigned char get_parameter_fc( const var_t *var, int is_return, unsigned
- static unsigned char get_func_oi2_flags( const var_t *func )
- {
- const var_t *var;
-- var_list_t *args = type_get_function_args( func->type );
-- var_t *retval = type_function_get_retval( func->type );
-+ var_list_t *args = type_function_get_args( func->declspec.type );
-+ var_t *retval = type_function_get_retval( func->declspec.type );
- unsigned char oi2_flags = 0x40; /* HasExtensions */
- unsigned short flags;
- unsigned int stack_size, typestring_offset;
-@@ -1131,7 +1144,7 @@ static unsigned char get_func_oi2_flags( const var_t *func )
- }
- }
-
-- if (!is_void( retval->type ))
-+ if (!is_void( retval->declspec.type ))
- {
- oi2_flags |= 0x04; /* HasRet */
- get_parameter_fc( retval, 1, &flags, &stack_size, &typestring_offset );
-@@ -1185,8 +1198,8 @@ static unsigned int write_old_procformatstring_type(FILE *file, int indent, cons
-
- if (!is_in && !is_out) is_in = TRUE;
-
-- if (type_get_type(var->type) == TYPE_BASIC ||
-- type_get_type(var->type) == TYPE_ENUM)
-+ if (type_get_type(var->declspec.type) == TYPE_BASIC ||
-+ type_get_type(var->declspec.type) == TYPE_ENUM)
- {
- unsigned char fc;
-
-@@ -1195,13 +1208,13 @@ static unsigned int write_old_procformatstring_type(FILE *file, int indent, cons
- else
- print_file(file, indent, "0x4e, /* FC_IN_PARAM_BASETYPE */\n");
-
-- if (type_get_type(var->type) == TYPE_ENUM)
-+ if (type_get_type(var->declspec.type) == TYPE_ENUM)
- {
-- fc = get_enum_fc(var->type);
-+ fc = get_enum_fc(var->declspec.type);
- }
- else
- {
-- fc = get_basic_fc_signed(var->type);
-+ fc = get_basic_fc_signed(var->declspec.type);
-
- if (fc == FC_BIND_PRIMITIVE)
- fc = FC_IGNORE;
-@@ -1215,10 +1228,12 @@ static unsigned int write_old_procformatstring_type(FILE *file, int indent, cons
- {
- unsigned short offset = var->typestring_offset;
-
-- if (!is_interpreted && is_array(var->type) &&
-- type_array_is_decl_as_ptr(var->type) &&
-- var->type->details.array.ptr_tfsoff)
-- offset = var->type->typestring_offset;
-+ if (!is_interpreted && is_array(var->declspec.type) &&
-+ type_array_is_decl_as_ptr(var->declspec.type) &&
-+ type_get_details(var->declspec.type)->array.ptr_tfsoff)
-+ {
-+ offset = var->declspec.type->typestring_offset;
-+ }
-
- if (is_return)
- print_file(file, indent, "0x52, /* FC_RETURN_PARAM */\n");
-@@ -1241,8 +1256,8 @@ int is_interpreted_func( const type_t *iface, const var_t *func )
- {
- const char *str;
- const var_t *var;
-- const var_list_t *args = type_get_function_args( func->type );
-- const type_t *ret_type = type_function_get_rettype( func->type );
-+ const var_list_t *args = type_function_get_args( func->declspec.type );
-+ const type_t *ret_type = type_function_get_rettype( func->declspec.type );
-
- if (type_get_type( ret_type ) == TYPE_BASIC)
- {
-@@ -1264,10 +1279,10 @@ int is_interpreted_func( const type_t *iface, const var_t *func )
- if (get_stub_mode() != MODE_Oif && args)
- {
- LIST_FOR_EACH_ENTRY( var, args, const var_t, entry )
-- switch (type_get_type( var->type ))
-+ switch (type_get_type( var->declspec.type ))
- {
- case TYPE_BASIC:
-- switch (type_basic_get_type( var->type ))
-+ switch (type_basic_get_type( var->declspec.type ))
- {
- /* floating point arguments are not supported in Oi mode */
- case TYPE_BASIC_FLOAT: return 0;
-@@ -1292,7 +1307,7 @@ static void write_proc_func_header( FILE *file, int indent, const type_t *iface,
- unsigned short num_proc )
- {
- var_t *var;
-- var_list_t *args = type_get_function_args( func->type );
-+ var_list_t *args = type_function_get_args( func->declspec.type );
- unsigned char explicit_fc, implicit_fc;
- unsigned char handle_flags;
- const var_t *handle_var = get_func_handle_var( iface, func, &explicit_fc, &implicit_fc );
-@@ -1323,7 +1338,7 @@ static void write_proc_func_header( FILE *file, int indent, const type_t *iface,
- param_num++;
- nb_args++;
- }
-- if (!is_void( type_function_get_rettype( func->type )))
-+ if (!is_void( type_function_get_rettype( func->declspec.type )))
- {
- stack_size += pointer_size;
- nb_args++;
-@@ -1351,22 +1366,22 @@ static void write_proc_func_header( FILE *file, int indent, const type_t *iface,
- *offset += 4;
- break;
- case FC_BIND_GENERIC:
-- handle_flags = type_memsize( handle_var->type );
-+ handle_flags = type_memsize( handle_var->declspec.type );
- print_file( file, indent, "0x%02x,\t/* %s */\n", explicit_fc, string_of_type(explicit_fc) );
- print_file( file, indent, "0x%02x,\n", handle_flags );
- print_file( file, indent, "NdrFcShort(0x%hx),\t/* stack offset = %hu */\n",
- handle_stack_offset, handle_stack_offset );
-- print_file( file, indent, "0x%02x,\n", get_generic_handle_offset( handle_var->type ) );
-+ print_file( file, indent, "0x%02x,\n", get_generic_handle_offset( handle_var->declspec.type ) );
- print_file( file, indent, "0x%x,\t/* FC_PAD */\n", FC_PAD);
- *offset += 6;
- break;
- case FC_BIND_CONTEXT:
-- handle_flags = get_contexthandle_flags( iface, handle_var->attrs, handle_var->type );
-+ handle_flags = get_contexthandle_flags( iface, handle_var->attrs, handle_var->declspec.type, 0 );
- print_file( file, indent, "0x%02x,\t/* %s */\n", explicit_fc, string_of_type(explicit_fc) );
- print_file( file, indent, "0x%02x,\n", handle_flags );
- print_file( file, indent, "NdrFcShort(0x%hx),\t/* stack offset = %hu */\n",
- handle_stack_offset, handle_stack_offset );
-- print_file( file, indent, "0x%02x,\n", get_context_handle_offset( handle_var->type ) );
-+ print_file( file, indent, "0x%02x,\n", get_context_handle_offset( handle_var->declspec.type ) );
- print_file( file, indent, "0x%02x,\t/* param %hu */\n", handle_param_num, handle_param_num );
- *offset += 6;
- break;
-@@ -1381,7 +1396,7 @@ static void write_proc_func_header( FILE *file, int indent, const type_t *iface,
-
- if (is_attr( func->attrs, ATTR_NOTIFY )) ext_flags |= 0x08; /* HasNotify */
- if (is_attr( func->attrs, ATTR_NOTIFYFLAG )) ext_flags |= 0x10; /* HasNotify2 */
-- if (iface == iface->details.iface->async_iface) oi2_flags |= 0x20;
-+ if (iface == type_get_const_details(iface)->iface->async_iface) oi2_flags |= 0x20;
-
- size = get_function_buffer_size( func, PASS_IN );
- print_file( file, indent, "NdrFcShort(0x%x),\t/* client buffer = %u */\n", size, size );
-@@ -1402,9 +1417,9 @@ static void write_proc_func_header( FILE *file, int indent, const type_t *iface,
- if (is_object( iface )) pos += 2;
- if (args) LIST_FOR_EACH_ENTRY( var, args, var_t, entry )
- {
-- if (type_get_type( var->type ) == TYPE_BASIC)
-+ if (type_get_type( var->declspec.type ) == TYPE_BASIC)
- {
-- switch (type_basic_get_type( var->type ))
-+ switch (type_basic_get_type( var->declspec.type ))
- {
- case TYPE_BASIC_FLOAT: fpu_mask |= 1 << pos; break;
- case TYPE_BASIC_DOUBLE: fpu_mask |= 2 << pos; break;
-@@ -1427,15 +1442,15 @@ static void write_procformatstring_func( FILE *file, int indent, const type_t *i
- unsigned int stack_offset = is_object( iface ) ? pointer_size : 0;
- int is_interpreted = is_interpreted_func( iface, func );
- int is_new_style = is_interpreted && (get_stub_mode() == MODE_Oif);
-- var_t *retval = type_function_get_retval( func->type );
-+ var_t *retval = type_function_get_retval( func->declspec.type );
-
- if (is_interpreted) write_proc_func_header( file, indent, iface, func, offset, num_proc );
-
- /* emit argument data */
-- if (type_get_function_args(func->type))
-+ if (type_function_get_args(func->declspec.type))
- {
- const var_t *var;
-- LIST_FOR_EACH_ENTRY( var, type_get_function_args(func->type), const var_t, entry )
-+ LIST_FOR_EACH_ENTRY( var, type_function_get_args(func->declspec.type), const var_t, entry )
- {
- print_file( file, 0, "/* %u (parameter %s) */\n", *offset, var->name );
- if (is_new_style)
-@@ -1446,7 +1461,7 @@ static void write_procformatstring_func( FILE *file, int indent, const type_t *i
- }
-
- /* emit return value data */
-- if (is_void(retval->type))
-+ if (is_void(retval->declspec.type))
- {
- if (!is_new_style)
- {
-@@ -1475,13 +1490,13 @@ static void for_each_iface(const statement_list_t *stmts,
-
- if (stmts) LIST_FOR_EACH_ENTRY( stmt, stmts, const statement_t, entry )
- {
-- if (stmt->type != STMT_TYPE || type_get_type(stmt->u.type) != TYPE_INTERFACE)
-+ if (stmt->type != STMT_TYPE || type_get_type_detect_alias(stmt->u.type) != TYPE_INTERFACE)
- continue;
- iface = stmt->u.type;
- if (!pred(iface)) continue;
- proc(iface, file, indent, offset);
-- if (iface->details.iface->async_iface)
-- proc(iface->details.iface->async_iface, file, indent, offset);
-+ if (type_get_const_details(iface)->iface->async_iface)
-+ proc(type_get_const_details(iface)->iface->async_iface, file, indent, offset);
- }
- }
-
-@@ -1593,7 +1608,7 @@ static unsigned int write_conf_or_var_desc(FILE *file, const type_t *cont_type,
- {
- conftype = FC_TOP_LEVEL_CONFORMANCE;
- conftype_string = "parameter";
-- cont_type = current_func->type;
-+ cont_type = current_func->declspec.type;
- name = current_func->name;
- iface = current_iface;
- }
-@@ -1656,7 +1671,7 @@ static unsigned int write_conf_or_var_desc(FILE *file, const type_t *cont_type,
-
- if (type_get_type(cont_type) == TYPE_FUNCTION)
- {
-- var_list_t *args = type_get_function_args( cont_type );
-+ var_list_t *args = type_function_get_args( cont_type );
-
- if (is_object( iface )) offset += pointer_size;
- if (args) LIST_FOR_EACH_ENTRY( var, args, const var_t, entry )
-@@ -1664,7 +1679,7 @@ static unsigned int write_conf_or_var_desc(FILE *file, const type_t *cont_type,
- if (var->name && !strcmp(var->name, subexpr->u.sval))
- {
- expr_loc.v = var;
-- correlation_variable = var->type;
-+ correlation_variable = var->declspec.type;
- break;
- }
- offset += get_stack_size( var, NULL );
-@@ -1676,11 +1691,11 @@ static unsigned int write_conf_or_var_desc(FILE *file, const type_t *cont_type,
-
- if (fields) LIST_FOR_EACH_ENTRY( var, fields, const var_t, entry )
- {
-- unsigned int size = field_memsize( var->type, &offset );
-+ unsigned int size = field_memsize( var->declspec.type, &offset );
- if (var->name && !strcmp(var->name, subexpr->u.sval))
- {
- expr_loc.v = var;
-- correlation_variable = var->type;
-+ correlation_variable = var->declspec.type;
- break;
- }
- offset += size;
-@@ -1819,7 +1834,7 @@ static unsigned int fields_memsize(const var_list_t *fields, unsigned int *align
- LIST_FOR_EACH_ENTRY( v, fields, const var_t, entry )
- {
- unsigned int falign = 0;
-- unsigned int fsize = type_memsize_and_alignment(v->type, &falign);
-+ unsigned int fsize = type_memsize_and_alignment(v->declspec.type, &falign);
- if (*align < falign) *align = falign;
- falign = clamp_align(falign);
- size = ROUND_SIZE(size, falign);
-@@ -1841,9 +1856,9 @@ static unsigned int union_memsize(const var_list_t *fields, unsigned int *pmaxa)
- if (fields) LIST_FOR_EACH_ENTRY( v, fields, const var_t, entry )
- {
- /* we could have an empty default field with NULL type */
-- if (v->type)
-+ if (v->declspec.type)
- {
-- size = type_memsize_and_alignment(v->type, &align);
-+ size = type_memsize_and_alignment(v->declspec.type, &align);
- if (maxs < size) maxs = size;
- if (*pmaxa < align) *pmaxa = align;
- }
-@@ -1931,12 +1946,12 @@ unsigned int type_memsize_and_alignment(const type_t *t, unsigned int *align)
- {
- if (is_conformant_array(t))
- {
-- type_memsize_and_alignment(type_array_get_element(t), align);
-+ type_memsize_and_alignment(type_array_get_element_type(t), align);
- size = 0;
- }
- else
- size = type_array_get_dim(t) *
-- type_memsize_and_alignment(type_array_get_element(t), align);
-+ type_memsize_and_alignment(type_array_get_element_type(t), align);
- }
- else /* declared as a pointer */
- {
-@@ -2016,8 +2031,8 @@ static unsigned int type_buffer_alignment(const type_t *t)
- if (!(fields = type_struct_get_fields(t))) break;
- LIST_FOR_EACH_ENTRY( var, fields, const var_t, entry )
- {
-- if (!var->type) continue;
-- align = type_buffer_alignment( var->type );
-+ if (!var->declspec.type) continue;
-+ align = type_buffer_alignment( var->declspec.type );
- if (max < align) max = align;
- }
- break;
-@@ -2025,8 +2040,8 @@ static unsigned int type_buffer_alignment(const type_t *t)
- if (!(fields = type_encapsulated_union_get_fields(t))) break;
- LIST_FOR_EACH_ENTRY( var, fields, const var_t, entry )
- {
-- if (!var->type) continue;
-- align = type_buffer_alignment( var->type );
-+ if (!var->declspec.type) continue;
-+ align = type_buffer_alignment( var->declspec.type );
- if (max < align) max = align;
- }
- break;
-@@ -2034,14 +2049,14 @@ static unsigned int type_buffer_alignment(const type_t *t)
- if (!(fields = type_union_get_cases(t))) break;
- LIST_FOR_EACH_ENTRY( var, fields, const var_t, entry )
- {
-- if (!var->type) continue;
-- align = type_buffer_alignment( var->type );
-+ if (!var->declspec.type) continue;
-+ align = type_buffer_alignment( var->declspec.type );
- if (max < align) max = align;
- }
- break;
- case TYPE_ARRAY:
- if (!type_array_is_decl_as_ptr(t))
-- return type_buffer_alignment( type_array_get_element(t) );
-+ return type_buffer_alignment( type_array_get_element_type(t) );
- /* else fall through */
- case TYPE_POINTER:
- return 4;
-@@ -2064,12 +2079,12 @@ static unsigned int type_buffer_alignment(const type_t *t)
- int is_full_pointer_function(const var_t *func)
- {
- const var_t *var;
-- if (type_has_full_pointer(type_function_get_rettype(func->type), func->attrs, TRUE))
-+ if (type_has_full_pointer(type_function_get_rettype(func->declspec.type), func->attrs, TRUE))
- return TRUE;
-- if (!type_get_function_args(func->type))
-+ if (!type_function_get_args(func->declspec.type))
- return FALSE;
-- LIST_FOR_EACH_ENTRY( var, type_get_function_args(func->type), const var_t, entry )
-- if (type_has_full_pointer( var->type, var->attrs, TRUE ))
-+ LIST_FOR_EACH_ENTRY( var, type_function_get_args(func->declspec.type), const var_t, entry )
-+ if (type_has_full_pointer( var->declspec.type, var->attrs, TRUE ))
- return TRUE;
- return FALSE;
- }
-@@ -2114,12 +2129,13 @@ static unsigned int write_nonsimple_pointer(FILE *file, const attr_list_t *attrs
- {
- if (context == TYPE_CONTEXT_TOPLEVELPARAM && is_ptr(type) && pointer_type == FC_RP)
- {
-- switch (typegen_detect_type(type_pointer_get_ref(type), NULL, TDT_ALL_TYPES))
-+ switch (typegen_detect_type(type_pointer_get_ref_type(type), NULL, TDT_ALL_TYPES))
- {
- case TGT_STRING:
- case TGT_POINTER:
- case TGT_CTXT_HANDLE:
- case TGT_CTXT_HANDLE_POINTER:
-+ case TGT_ARRAY:
- flags |= FC_ALLOCED_ON_STACK;
- break;
- case TGT_IFACE_POINTER:
-@@ -2134,7 +2150,7 @@ static unsigned int write_nonsimple_pointer(FILE *file, const attr_list_t *attrs
-
- if (is_ptr(type))
- {
-- type_t *ref = type_pointer_get_ref(type);
-+ type_t *ref = type_pointer_get_ref_type(type);
- if(is_declptr(ref) && !is_user_type(ref))
- flags |= FC_POINTER_DEREF;
- }
-@@ -2175,7 +2191,7 @@ static unsigned int write_simple_pointer(FILE *file, const attr_list_t *attrs,
-
- pointer_fc = get_pointer_fc_context(type, attrs, context);
-
-- ref = type_pointer_get_ref(type);
-+ ref = type_pointer_get_ref_type(type);
- if (type_get_type(ref) == TYPE_ENUM)
- fc = get_enum_fc(ref);
- else
-@@ -2200,22 +2216,23 @@ static unsigned int write_simple_pointer(FILE *file, const attr_list_t *attrs,
- return 4;
- }
-
--static void print_start_tfs_comment(FILE *file, type_t *t, unsigned int tfsoff)
-+static void print_start_tfs_comment(FILE *file, const decl_spec_t *ds, unsigned int tfsoff)
- {
- print_file(file, 0, "/* %u (", tfsoff);
-- write_type_decl(file, t, NULL);
-+ write_declspec_decl(file, ds, NULL);
- print_file(file, 0, ") */\n");
- }
-
- static unsigned int write_pointer_tfs(FILE *file, const attr_list_t *attrs,
-- type_t *type, unsigned int ref_offset,
-+ const decl_spec_t *declspec, unsigned int ref_offset,
- enum type_context context,
- unsigned int *typestring_offset)
- {
- unsigned int offset = *typestring_offset;
-- type_t *ref = type_pointer_get_ref(type);
-+ type_t *type = declspec->type;
-+ type_t *ref = type_pointer_get_ref_type(type);
-
-- print_start_tfs_comment(file, type, offset);
-+ print_start_tfs_comment(file, declspec, offset);
- update_tfsoff(type, offset, file);
-
- switch (typegen_detect_type(ref, attrs, TDT_ALL_TYPES))
-@@ -2258,10 +2275,11 @@ static int user_type_has_variable_size(const type_t *t)
- return FALSE;
- }
-
--static unsigned int write_user_tfs(FILE *file, type_t *type, unsigned int *tfsoff)
-+static unsigned int write_user_tfs(FILE *file, const decl_spec_t *declspec, unsigned int *tfsoff)
- {
- unsigned int start, absoff, flags;
- const char *name = NULL;
-+ type_t *type = declspec->type;
- type_t *utype = get_user_type(type, &name);
- unsigned int usize = type_memsize(utype);
- unsigned int ualign = type_buffer_alignment(utype);
-@@ -2279,6 +2297,7 @@ static unsigned int write_user_tfs(FILE *file, type_t *type, unsigned int *tfsof
- type_get_type(utype) == TYPE_ENUM)
- {
- unsigned char fc;
-+ decl_spec_t ds;
-
- if (type_get_type(utype) == TYPE_ENUM)
- fc = get_enum_fc(utype);
-@@ -2286,7 +2305,7 @@ static unsigned int write_user_tfs(FILE *file, type_t *type, unsigned int *tfsof
- fc = get_basic_fc(utype);
-
- absoff = *tfsoff;
-- print_start_tfs_comment(file, utype, absoff);
-+ print_start_tfs_comment(file, init_declspec(&ds, utype), absoff);
- print_file(file, 2, "0x%x,\t/* %s */\n", fc, string_of_type(fc));
- print_file(file, 2, "0x5c,\t/* FC_PAD */\n");
- *tfsoff += 2;
-@@ -2294,7 +2313,10 @@ static unsigned int write_user_tfs(FILE *file, type_t *type, unsigned int *tfsof
- else
- {
- if (!processed(utype))
-- write_embedded_types(file, NULL, utype, utype->name, TRUE, tfsoff);
-+ {
-+ decl_spec_t ds;
-+ write_embedded_types(file, NULL, init_declspec(&ds, utype), utype->name, TRUE, tfsoff);
-+ }
- absoff = utype->typestring_offset;
- }
-
-@@ -2307,7 +2329,7 @@ static unsigned int write_user_tfs(FILE *file, type_t *type, unsigned int *tfsof
-
- start = *tfsoff;
- update_tfsoff(type, start, file);
-- print_start_tfs_comment(file, type, start);
-+ print_start_tfs_comment(file, declspec, start);
- print_file(file, 2, "0x%x,\t/* FC_USER_MARSHAL */\n", FC_USER_MARSHAL);
- print_file(file, 2, "0x%x,\t/* Alignment= %d, Flags= %02x */\n",
- flags | (ualign - 1), ualign - 1, flags);
-@@ -2364,11 +2386,12 @@ static void write_member_type(FILE *file, const type_t *cont,
- static void write_array_element_type(FILE *file, const attr_list_t *attrs, const type_t *type,
- int cont_is_complex, unsigned int *tfsoff)
- {
-- type_t *elem = type_array_get_element(type);
-+ const decl_spec_t *element = type_array_get_element(type);
-+ type_t *elem = element->type;
-
- if (!is_embedded_complex(elem) && is_ptr(elem))
- {
-- type_t *ref = type_pointer_get_ref(elem);
-+ type_t *ref = type_pointer_get_ref_type(elem);
-
- if (processed(ref))
- {
-@@ -2378,7 +2401,7 @@ static void write_array_element_type(FILE *file, const attr_list_t *attrs, const
- }
- if (cont_is_complex && is_string_type(attrs, elem))
- {
-- write_string_tfs(file, NULL, elem, TYPE_CONTEXT_CONTAINER, NULL, tfsoff);
-+ write_string_tfs(file, NULL, element, TYPE_CONTEXT_CONTAINER, NULL, tfsoff);
- return;
- }
- if (!is_string_type(NULL, elem) &&
-@@ -2410,7 +2433,7 @@ static void write_descriptors(FILE *file, type_t *type, unsigned int *tfsoff)
-
- if (fs) LIST_FOR_EACH_ENTRY(f, fs, var_t, entry)
- {
-- type_t *ft = f->type;
-+ type_t *ft = f->declspec.type;
- unsigned int size = field_memsize( ft, &offset );
- if (type_get_type(ft) == TYPE_UNION && is_attr(f->attrs, ATTR_SWITCHIS))
- {
-@@ -2433,13 +2456,14 @@ static void write_descriptors(FILE *file, type_t *type, unsigned int *tfsoff)
- }
-
- static int write_pointer_description_offsets(
-- FILE *file, const attr_list_t *attrs, type_t *type,
-+ FILE *file, const attr_list_t *attrs, const decl_spec_t *declspec,
- unsigned int *offset_in_memory, unsigned int *offset_in_buffer,
- unsigned int *typestring_offset)
- {
-+ type_t *type = declspec->type;
- int written = 0;
-
-- if ((is_ptr(type) && type_get_type(type_pointer_get_ref(type)) != TYPE_INTERFACE) ||
-+ if ((is_ptr(type) && type_get_type(type_pointer_get_ref_type(type)) != TYPE_INTERFACE) ||
- (is_array(type) && type_array_is_decl_as_ptr(type)))
- {
- if (offset_in_memory && offset_in_buffer)
-@@ -2464,10 +2488,10 @@ static int write_pointer_description_offsets(
-
- if (is_ptr(type))
- {
-- type_t *ref = type_pointer_get_ref(type);
-+ type_t *ref = type_pointer_get_ref_type(type);
-
- if (is_string_type(attrs, type))
-- write_string_tfs(file, attrs, type, TYPE_CONTEXT_CONTAINER, NULL, typestring_offset);
-+ write_string_tfs(file, attrs, declspec, TYPE_CONTEXT_CONTAINER, NULL, typestring_offset);
- else if (processed(ref))
- write_nonsimple_pointer(file, attrs, type, TYPE_CONTEXT_CONTAINER,
- ref->typestring_offset, typestring_offset);
-@@ -2505,13 +2529,13 @@ static int write_pointer_description_offsets(
- {
- unsigned int padding;
- unsigned int align = 0;
-- type_memsize_and_alignment(v->type, &align);
-+ type_memsize_and_alignment(v->declspec.type, &align);
- padding = ROUNDING(*offset_in_memory, align);
- *offset_in_memory += padding;
- *offset_in_buffer += padding;
- }
- written += write_pointer_description_offsets(
-- file, v->attrs, v->type, offset_in_memory, offset_in_buffer,
-+ file, v->attrs, &v->declspec, offset_in_memory, offset_in_buffer,
- typestring_offset);
- }
- }
-@@ -2531,10 +2555,11 @@ static int write_pointer_description_offsets(
- }
-
- static int write_no_repeat_pointer_descriptions(
-- FILE *file, const attr_list_t *attrs, type_t *type,
-+ FILE *file, const attr_list_t *attrs, const decl_spec_t *declspec,
- unsigned int *offset_in_memory, unsigned int *offset_in_buffer,
- unsigned int *typestring_offset)
- {
-+ type_t *type = declspec->type;
- int written = 0;
-
- if (is_ptr(type) ||
-@@ -2544,7 +2569,7 @@ static int write_no_repeat_pointer_descriptions(
- print_file(file, 2, "0x%02x, /* FC_PAD */\n", FC_PAD);
- *typestring_offset += 2;
-
-- return write_pointer_description_offsets(file, attrs, type,
-+ return write_pointer_description_offsets(file, attrs, declspec,
- offset_in_memory, offset_in_buffer, typestring_offset);
- }
-
-@@ -2557,13 +2582,13 @@ static int write_no_repeat_pointer_descriptions(
- {
- unsigned int padding;
- unsigned int align = 0;
-- type_memsize_and_alignment(v->type, &align);
-+ type_memsize_and_alignment(v->declspec.type, &align);
- padding = ROUNDING(*offset_in_memory, align);
- *offset_in_memory += padding;
- *offset_in_buffer += padding;
- }
- written += write_no_repeat_pointer_descriptions(
-- file, v->attrs, v->type,
-+ file, v->attrs, &v->declspec,
- offset_in_memory, offset_in_buffer, typestring_offset);
- }
- }
-@@ -2582,10 +2607,11 @@ static int write_no_repeat_pointer_descriptions(
- /* Note: if file is NULL return value is number of pointers to write, else
- * it is the number of type format characters written */
- static int write_fixed_array_pointer_descriptions(
-- FILE *file, const attr_list_t *attrs, type_t *type,
-+ FILE *file, const attr_list_t *attrs, const decl_spec_t *declspec,
- unsigned int *offset_in_memory, unsigned int *offset_in_buffer,
- unsigned int *typestring_offset)
- {
-+ type_t *type = declspec->type;
- int pointer_count = 0;
-
- if (type_get_type(type) == TYPE_ARRAY &&
-@@ -2602,7 +2628,7 @@ static int write_fixed_array_pointer_descriptions(
- unsigned int offset_of_array_pointer_mem = 0;
- unsigned int offset_of_array_pointer_buf = 0;
-
-- increment_size = type_memsize(type_array_get_element(type));
-+ increment_size = type_memsize(type_array_get_element_type(type));
-
- print_file(file, 2, "0x%02x, /* FC_FIXED_REPEAT */\n", FC_FIXED_REPEAT);
- print_file(file, 2, "0x%02x, /* FC_PAD */\n", FC_PAD);
-@@ -2613,7 +2639,7 @@ static int write_fixed_array_pointer_descriptions(
- *typestring_offset += 10;
-
- pointer_count = write_pointer_description_offsets(
-- file, attrs, type, &offset_of_array_pointer_mem,
-+ file, attrs, declspec, &offset_of_array_pointer_mem,
- &offset_of_array_pointer_buf, typestring_offset);
- }
- }
-@@ -2626,13 +2652,13 @@ static int write_fixed_array_pointer_descriptions(
- {
- unsigned int padding;
- unsigned int align = 0;
-- type_memsize_and_alignment(v->type, &align);
-+ type_memsize_and_alignment(v->declspec.type, &align);
- padding = ROUNDING(*offset_in_memory, align);
- *offset_in_memory += padding;
- *offset_in_buffer += padding;
- }
- pointer_count += write_fixed_array_pointer_descriptions(
-- file, v->attrs, v->type, offset_in_memory, offset_in_buffer,
-+ file, v->attrs, &v->declspec, offset_in_memory, offset_in_buffer,
- typestring_offset);
- }
- }
-@@ -2673,7 +2699,7 @@ static int write_conformant_array_pointer_descriptions(
- unsigned int offset_of_array_pointer_mem = offset_in_memory;
- unsigned int offset_of_array_pointer_buf = offset_in_memory;
-
-- increment_size = type_memsize(type_array_get_element(type));
-+ increment_size = type_memsize(type_array_get_element_type(type));
-
- if (increment_size > USHRT_MAX)
- error("array size of %u bytes is too large\n", increment_size);
-@@ -2715,7 +2741,7 @@ static int write_varying_array_pointer_descriptions(
- {
- unsigned int increment_size;
-
-- increment_size = type_memsize(type_array_get_element(type));
-+ increment_size = type_memsize(type_array_get_element_type(type));
-
- if (increment_size > USHRT_MAX)
- error("array size of %u bytes is too large\n", increment_size);
-@@ -2741,20 +2767,20 @@ static int write_varying_array_pointer_descriptions(
- {
- unsigned int align = 0, padding;
-
-- if (is_array(v->type) && type_array_has_variance(v->type))
-+ if (is_array(v->declspec.type) && type_array_has_variance(v->declspec.type))
- {
- *offset_in_buffer = ROUND_SIZE(*offset_in_buffer, 4);
- /* skip over variance and offset in buffer */
- *offset_in_buffer += 8;
- }
-
-- type_memsize_and_alignment(v->type, &align);
-+ type_memsize_and_alignment(v->declspec.type, &align);
- padding = ROUNDING(*offset_in_memory, align);
- *offset_in_memory += padding;
- *offset_in_buffer += padding;
- }
- pointer_count += write_varying_array_pointer_descriptions(
-- file, v->attrs, v->type, offset_in_memory, offset_in_buffer,
-+ file, v->attrs, v->declspec.type, offset_in_memory, offset_in_buffer,
- typestring_offset);
- }
- }
-@@ -2773,9 +2799,10 @@ static int write_varying_array_pointer_descriptions(
- return pointer_count;
- }
-
--static void write_pointer_description(FILE *file, const attr_list_t *attrs, type_t *type,
-+static void write_pointer_description(FILE *file, const attr_list_t *attrs, const decl_spec_t *declspec,
- unsigned int *typestring_offset)
- {
-+ type_t *type = declspec->type;
- unsigned int offset_in_buffer;
- unsigned int offset_in_memory;
-
-@@ -2786,7 +2813,7 @@ static void write_pointer_description(FILE *file, const attr_list_t *attrs, type
- offset_in_memory = 0;
- offset_in_buffer = 0;
- write_no_repeat_pointer_descriptions(
-- file, NULL, type,
-+ file, NULL, declspec,
- &offset_in_memory, &offset_in_buffer, typestring_offset);
- }
-
-@@ -2794,7 +2821,7 @@ static void write_pointer_description(FILE *file, const attr_list_t *attrs, type
- offset_in_memory = 0;
- offset_in_buffer = 0;
- write_fixed_array_pointer_descriptions(
-- file, NULL, type,
-+ file, NULL, declspec,
- &offset_in_memory, &offset_in_buffer, typestring_offset);
-
- /* pass 3: search for pointers in conformant only arrays (but don't descend
-@@ -2806,7 +2833,7 @@ static void write_pointer_description(FILE *file, const attr_list_t *attrs, type
- else if (type_get_type(type) == TYPE_STRUCT &&
- get_struct_fc(type) == FC_CPSTRUCT)
- {
-- type_t *carray = find_array_or_string_in_struct(type)->type;
-+ type_t *carray = find_array_or_string_in_struct(type)->declspec.type;
- write_conformant_array_pointer_descriptions( file, NULL, carray,
- type_memsize(type), typestring_offset);
- }
-@@ -2820,9 +2847,10 @@ static void write_pointer_description(FILE *file, const attr_list_t *attrs, type
- }
-
- static unsigned int write_string_tfs(FILE *file, const attr_list_t *attrs,
-- type_t *type, enum type_context context,
-+ const decl_spec_t *declspec, enum type_context context,
- const char *name, unsigned int *typestring_offset)
- {
-+ type_t *type = declspec->type;
- unsigned int start_offset;
- unsigned char rtype;
- type_t *elem_type;
-@@ -2836,7 +2864,7 @@ static unsigned int write_string_tfs(FILE *file, const attr_list_t *attrs,
- int pointer_type = get_pointer_fc_context(type, attrs, context);
- if (!pointer_type)
- pointer_type = FC_RP;
-- print_start_tfs_comment(file, type, *typestring_offset);
-+ print_start_tfs_comment(file, declspec, *typestring_offset);
- print_file(file, 2,"0x%x, 0x%x,\t/* %s%s */\n",
- pointer_type, flag, string_of_type(pointer_type),
- flag ? " [simple_pointer]" : "");
-@@ -2850,12 +2878,12 @@ static unsigned int write_string_tfs(FILE *file, const attr_list_t *attrs,
- }
-
- if (is_array(type))
-- elem_type = type_array_get_element(type);
-+ elem_type = type_array_get_element_type(type);
- else
-- elem_type = type_pointer_get_ref(type);
-+ elem_type = type_pointer_get_ref_type(type);
-
- if (type_get_type(elem_type) == TYPE_POINTER && is_array(type))
-- return write_array_tfs(file, attrs, type, name, typestring_offset);
-+ return write_array_tfs(file, attrs, declspec, name, typestring_offset);
-
- if (type_get_type(elem_type) != TYPE_BASIC)
- {
-@@ -2929,34 +2957,31 @@ static unsigned int write_string_tfs(FILE *file, const attr_list_t *attrs,
- }
- }
-
--static unsigned int write_array_tfs(FILE *file, const attr_list_t *attrs, type_t *type,
-+static unsigned int write_array_tfs(FILE *file, const attr_list_t *attrs, const decl_spec_t *declspec,
- const char *name, unsigned int *typestring_offset)
- {
-+ type_t *type = declspec->type;
- const expr_t *length_is = type_array_get_variance(type);
- const expr_t *size_is = type_array_get_conformance(type);
- unsigned int align;
- unsigned int size;
- unsigned int start_offset;
- unsigned char fc;
-- int pointer_type = get_attrv(attrs, ATTR_POINTERTYPE);
- unsigned int baseoff
- = !type_array_is_decl_as_ptr(type) && current_structure
- ? type_memsize(current_structure)
- : 0;
-
-- if (!pointer_type)
-- pointer_type = FC_RP;
--
-- if (!is_string_type(attrs, type_array_get_element(type)))
-+ if (!is_string_type(attrs, type_array_get_element_type(type)))
- write_embedded_types(file, attrs, type_array_get_element(type), name, FALSE, typestring_offset);
-
-- size = type_memsize(is_conformant_array(type) ? type_array_get_element(type) : type);
-- align = type_buffer_alignment(is_conformant_array(type) ? type_array_get_element(type) : type);
-+ size = type_memsize(is_conformant_array(type) ? type_array_get_element_type(type) : type);
-+ align = type_buffer_alignment(is_conformant_array(type) ? type_array_get_element_type(type) : type);
- fc = get_array_fc(type);
-
- start_offset = *typestring_offset;
- update_tfsoff(type, start_offset, file);
-- print_start_tfs_comment(file, type, start_offset);
-+ print_start_tfs_comment(file, declspec, start_offset);
- print_file(file, 2, "0x%02x,\t/* %s */\n", fc, string_of_type(fc));
- print_file(file, 2, "0x%x,\t/* %d */\n", align - 1, align - 1);
- *typestring_offset += 2;
-@@ -2982,7 +3007,7 @@ static unsigned int write_array_tfs(FILE *file, const attr_list_t *attrs, type_t
-
- if (fc == FC_SMVARRAY || fc == FC_LGVARRAY)
- {
-- unsigned int elsize = type_memsize(type_array_get_element(type));
-+ unsigned int elsize = type_memsize(type_array_get_element_type(type));
- unsigned int dim = type_array_get_dim(type);
-
- if (fc == FC_LGVARRAY)
-@@ -3005,13 +3030,13 @@ static unsigned int write_array_tfs(FILE *file, const attr_list_t *attrs, type_t
- += write_conf_or_var_desc(file, current_structure, baseoff,
- type, length_is);
-
-- if (type_has_pointers(type_array_get_element(type)) &&
-+ if (type_has_pointers(type_array_get_element_type(type)) &&
- (type_array_is_decl_as_ptr(type) || !current_structure))
- {
- print_file(file, 2, "0x%x,\t/* FC_PP */\n", FC_PP);
- print_file(file, 2, "0x%x,\t/* FC_PAD */\n", FC_PAD);
- *typestring_offset += 2;
-- write_pointer_description(file, is_string_type(attrs, type) ? attrs : NULL, type, typestring_offset);
-+ write_pointer_description(file, is_string_type(attrs, type) ? attrs : NULL, declspec, typestring_offset);
- print_file(file, 2, "0x%x,\t/* FC_END */\n", FC_END);
- *typestring_offset += 1;
- }
-@@ -3048,7 +3073,7 @@ static const var_t *find_array_or_string_in_struct(const type_t *type)
- return NULL;
-
- last_field = LIST_ENTRY( list_tail(fields), const var_t, entry );
-- ft = last_field->type;
-+ ft = last_field->declspec.type;
-
- if (is_conformant_array(ft) && !type_array_is_decl_as_ptr(ft))
- return last_field;
-@@ -3071,7 +3096,7 @@ static void write_struct_members(FILE *file, const type_t *type,
-
- if (fields) LIST_FOR_EACH_ENTRY( field, fields, const var_t, entry )
- {
-- type_t *ft = field->type;
-+ type_t *ft = field->declspec.type;
- unsigned int align = 0;
- unsigned int size = type_memsize_and_alignment(ft, &align);
- align = clamp_align(align);
-@@ -3100,7 +3125,7 @@ static void write_struct_members(FILE *file, const type_t *type,
- offset = ROUND_SIZE(offset, align);
- *typestring_offset += 1;
- }
-- write_member_type(file, type, is_complex, field->attrs, field->type, corroff,
-+ write_member_type(file, type, is_complex, field->attrs, field->declspec.type, corroff,
- typestring_offset);
- offset += size;
- }
-@@ -3118,9 +3143,10 @@ static void write_struct_members(FILE *file, const type_t *type,
- write_end(file, typestring_offset);
- }
-
--static unsigned int write_struct_tfs(FILE *file, type_t *type,
-+static unsigned int write_struct_tfs(FILE *file, const decl_spec_t *declspec,
- const char *name, unsigned int *tfsoff)
- {
-+ type_t *type = declspec->type;
- const type_t *save_current_structure = current_structure;
- unsigned int total_size;
- const var_t *array;
-@@ -3143,15 +3169,15 @@ static unsigned int write_struct_tfs(FILE *file, type_t *type,
- name, USHRT_MAX, total_size - USHRT_MAX);
-
- if (fields) LIST_FOR_EACH_ENTRY(f, fields, var_t, entry)
-- write_embedded_types(file, f->attrs, f->type, f->name, FALSE, tfsoff);
-+ write_embedded_types(file, f->attrs, &f->declspec, f->name, FALSE, tfsoff);
-
- array = find_array_or_string_in_struct(type);
-- if (array && !processed(array->type))
-+ if (array && !processed(array->declspec.type))
- {
-- if(is_string_type(array->attrs, array->type))
-- write_string_tfs(file, array->attrs, array->type, TYPE_CONTEXT_CONTAINER, array->name, tfsoff);
-+ if(is_string_type(array->attrs, array->declspec.type))
-+ write_string_tfs(file, array->attrs, &array->declspec, TYPE_CONTEXT_CONTAINER, array->name, tfsoff);
- else
-- write_array_tfs(file, array->attrs, array->type, array->name, tfsoff);
-+ write_array_tfs(file, array->attrs, &array->declspec, array->name, tfsoff);
- }
-
- corroff = *tfsoff;
-@@ -3159,7 +3185,7 @@ static unsigned int write_struct_tfs(FILE *file, type_t *type,
-
- start_offset = *tfsoff;
- update_tfsoff(type, start_offset, file);
-- print_start_tfs_comment(file, type, start_offset);
-+ print_start_tfs_comment(file, declspec, start_offset);
- print_file(file, 2, "0x%x,\t/* %s */\n", fc, string_of_type(fc));
- print_file(file, 2, "0x%x,\t/* %d */\n", align - 1, align - 1);
- print_file(file, 2, "NdrFcShort(0x%hx),\t/* %d */\n", (unsigned short)total_size, total_size);
-@@ -3167,7 +3193,7 @@ static unsigned int write_struct_tfs(FILE *file, type_t *type,
-
- if (array)
- {
-- unsigned int absoff = array->type->typestring_offset;
-+ unsigned int absoff = array->declspec.type->typestring_offset;
- short reloff = absoff - *tfsoff;
- print_file(file, 2, "NdrFcShort(0x%hx),\t/* Offset= %hd (%u) */\n",
- reloff, reloff, absoff);
-@@ -3198,7 +3224,7 @@ static unsigned int write_struct_tfs(FILE *file, type_t *type,
- print_file(file, 2, "0x%x,\t/* FC_PP */\n", FC_PP);
- print_file(file, 2, "0x%x,\t/* FC_PAD */\n", FC_PAD);
- *tfsoff += 2;
-- write_pointer_description(file, NULL, type, tfsoff);
-+ write_pointer_description(file, NULL, declspec, tfsoff);
- print_file(file, 2, "0x%x,\t/* FC_END */\n", FC_END);
- *tfsoff += 1;
- }
-@@ -3213,15 +3239,16 @@ static unsigned int write_struct_tfs(FILE *file, type_t *type,
- type->ptrdesc = *tfsoff;
- if (fields) LIST_FOR_EACH_ENTRY(f, fields, const var_t, entry)
- {
-- type_t *ft = f->type;
-+ const decl_spec_t *fds = &f->declspec;
-+ type_t *ft = fds->type;
- switch (typegen_detect_type(ft, f->attrs, TDT_IGNORE_STRINGS))
- {
- case TGT_POINTER:
- if (is_string_type(f->attrs, ft))
-- write_string_tfs(file, f->attrs, ft, TYPE_CONTEXT_CONTAINER, f->name, tfsoff);
-+ write_string_tfs(file, f->attrs, fds, TYPE_CONTEXT_CONTAINER, f->name, tfsoff);
- else
-- write_pointer_tfs(file, f->attrs, ft,
-- type_pointer_get_ref(ft)->typestring_offset,
-+ write_pointer_tfs(file, f->attrs, fds,
-+ type_pointer_get_ref_type(ft)->typestring_offset,
- TYPE_CONTEXT_CONTAINER, tfsoff);
- break;
- case TGT_ARRAY:
-@@ -3283,8 +3310,9 @@ static void write_branch_type(FILE *file, const type_t *t, unsigned int *tfsoff)
- }
-
- static unsigned int write_union_tfs(FILE *file, const attr_list_t *attrs,
-- type_t *type, unsigned int *tfsoff)
-+ const decl_spec_t *declspec, unsigned int *tfsoff)
- {
-+ type_t* type = declspec->type;
- unsigned int start_offset;
- unsigned int size;
- var_list_t *fields;
-@@ -3309,17 +3337,17 @@ static unsigned int write_union_tfs(FILE *file, const attr_list_t *attrs,
- expr_list_t *cases = get_attrp(f->attrs, ATTR_CASE);
- if (cases)
- nbranch += list_count(cases);
-- if (f->type)
-- write_embedded_types(file, f->attrs, f->type, f->name, TRUE, tfsoff);
-+ if (f->declspec.type)
-+ write_embedded_types(file, f->attrs, &f->declspec, f->name, TRUE, tfsoff);
- }
-
- start_offset = *tfsoff;
- update_tfsoff(type, start_offset, file);
-- print_start_tfs_comment(file, type, start_offset);
-+ print_start_tfs_comment(file, declspec, start_offset);
- if (type_get_type(type) == TYPE_ENCAPSULATED_UNION)
- {
- const var_t *sv = type_union_get_switch_value(type);
-- const type_t *st = sv->type;
-+ const type_t *st = sv->declspec.type;
- unsigned int align = 0;
- unsigned char fc;
-
-@@ -3351,8 +3379,8 @@ static unsigned int write_union_tfs(FILE *file, const attr_list_t *attrs,
- type_memsize_and_alignment(st, &align);
- if (fields) LIST_FOR_EACH_ENTRY(f, fields, var_t, entry)
- {
-- if (f->type)
-- type_memsize_and_alignment(f->type, &align);
-+ if (f->declspec.type)
-+ type_memsize_and_alignment(f->declspec.type, &align);
- }
-
- print_file(file, 2, "0x%x,\t/* FC_ENCAPSULATED_UNION */\n", FC_ENCAPSULATED_UNION);
-@@ -3407,7 +3435,7 @@ static unsigned int write_union_tfs(FILE *file, const attr_list_t *attrs,
-
- if (fields) LIST_FOR_EACH_ENTRY(f, fields, var_t, entry)
- {
-- type_t *ft = f->type;
-+ type_t *ft = f->declspec.type;
- expr_list_t *cases = get_attrp(f->attrs, ATTR_CASE);
- int deflt = is_attr(f->attrs, ATTR_DEFAULT);
- expr_t *c;
-@@ -3448,16 +3476,17 @@ static unsigned int write_union_tfs(FILE *file, const attr_list_t *attrs,
- return start_offset;
- }
-
--static unsigned int write_ip_tfs(FILE *file, const attr_list_t *attrs, type_t *type,
-+static unsigned int write_ip_tfs(FILE *file, const attr_list_t *attrs, const decl_spec_t *declspec,
- unsigned int *typeformat_offset)
- {
- unsigned int i;
-+ type_t *type = declspec->type;
- unsigned int start_offset = *typeformat_offset;
- expr_t *iid = get_attrp(attrs, ATTR_IIDIS);
-
- if (!iid && processed(type)) return type->typestring_offset;
-
-- print_start_tfs_comment(file, type, start_offset);
-+ print_start_tfs_comment(file, declspec, start_offset);
- update_tfsoff(type, start_offset, file);
-
- if (iid)
-@@ -3469,7 +3498,7 @@ static unsigned int write_ip_tfs(FILE *file, const attr_list_t *attrs, type_t *t
- }
- else
- {
-- const type_t *base = is_ptr(type) ? type_pointer_get_ref(type) : type;
-+ const type_t *base = is_ptr(type) ? type_pointer_get_ref_type(type) : type;
- const UUID *uuid = get_attrp(base->attrs, ATTR_UUID);
-
- if (! uuid)
-@@ -3493,18 +3522,19 @@ static unsigned int write_ip_tfs(FILE *file, const attr_list_t *attrs, type_t *t
-
- static unsigned int write_contexthandle_tfs(FILE *file,
- const attr_list_t *attrs,
-- type_t *type,
-- int toplevel_param,
-+ const decl_spec_t *declspec,
-+ enum type_context context,
- unsigned int *typeformat_offset)
- {
-+ type_t *type = declspec->type;
- unsigned int start_offset = *typeformat_offset;
-- unsigned char flags = get_contexthandle_flags( current_iface, attrs, type );
-+ unsigned char flags = get_contexthandle_flags( current_iface, attrs, type, context == TYPE_CONTEXT_RETVAL );
-
-- print_start_tfs_comment(file, type, start_offset);
-+ print_start_tfs_comment(file, declspec, start_offset);
-
- if (flags & 0x80) /* via ptr */
- {
-- int pointer_type = get_pointer_fc( type, attrs, toplevel_param );
-+ int pointer_type = get_pointer_fc( type, attrs, context == TYPE_CONTEXT_TOPLEVELPARAM );
- if (!pointer_type) pointer_type = FC_RP;
- *typeformat_offset += 4;
- print_file(file, 2,"0x%x, 0x0,\t/* %s */\n", pointer_type, string_of_type(pointer_type) );
-@@ -3514,8 +3544,7 @@ static unsigned int write_contexthandle_tfs(FILE *file,
-
- print_file(file, 2, "0x%02x,\t/* FC_BIND_CONTEXT */\n", FC_BIND_CONTEXT);
- print_file(file, 2, "0x%x,\t/* Context flags: ", flags);
-- /* return and can't be null values overlap */
-- if (((flags & 0x21) != 0x21) && (flags & NDR_CONTEXT_HANDLE_CANNOT_BE_NULL))
-+ if (flags & NDR_CONTEXT_HANDLE_CANNOT_BE_NULL)
- print_file(file, 0, "can't be null, ");
- if (flags & NDR_CONTEXT_HANDLE_SERIALIZE)
- print_file(file, 0, "serialize, ");
-@@ -3523,13 +3552,13 @@ static unsigned int write_contexthandle_tfs(FILE *file,
- print_file(file, 0, "no serialize, ");
- if (flags & NDR_STRICT_CONTEXT_HANDLE)
- print_file(file, 0, "strict, ");
-- if ((flags & 0x21) == 0x20)
-- print_file(file, 0, "out, ");
-- if ((flags & 0x21) == 0x21)
-+ if (flags & HANDLE_PARAM_IS_RETURN)
- print_file(file, 0, "return, ");
-- if (flags & 0x40)
-+ if (flags & HANDLE_PARAM_IS_OUT)
-+ print_file(file, 0, "out, ");
-+ if (flags & HANDLE_PARAM_IS_IN)
- print_file(file, 0, "in, ");
-- if (flags & 0x80)
-+ if (flags & HANDLE_PARAM_IS_VIA_PTR)
- print_file(file, 0, "via ptr, ");
- print_file(file, 0, "*/\n");
- print_file(file, 2, "0x%x,\t/* rundown routine */\n", get_context_handle_offset( type ));
-@@ -3568,24 +3597,23 @@ static unsigned int write_range_tfs(FILE *file, const attr_list_t *attrs,
- return start_offset;
- }
-
--static unsigned int write_type_tfs(FILE *file, int indent,
-- const attr_list_t *attrs, type_t *type,
-- const char *name,
-+static unsigned int write_type_tfs(FILE *file, const attr_list_t *attrs,
-+ const decl_spec_t *declspec, const char *name,
- enum type_context context,
- unsigned int *typeformat_offset)
- {
- unsigned int offset;
-+ type_t *type = declspec->type;
-
- switch (typegen_detect_type(type, attrs, TDT_ALL_TYPES))
- {
- case TGT_CTXT_HANDLE:
- case TGT_CTXT_HANDLE_POINTER:
-- return write_contexthandle_tfs(file, attrs, type,
-- context == TYPE_CONTEXT_TOPLEVELPARAM, typeformat_offset);
-+ return write_contexthandle_tfs(file, attrs, declspec, context, typeformat_offset);
- case TGT_USER_TYPE:
-- return write_user_tfs(file, type, typeformat_offset);
-+ return write_user_tfs(file, declspec, typeformat_offset);
- case TGT_STRING:
-- return write_string_tfs(file, attrs, type, context, name, typeformat_offset);
-+ return write_string_tfs(file, attrs, declspec, context, name, typeformat_offset);
- case TGT_ARRAY:
- {
- unsigned int off;
-@@ -3593,15 +3621,14 @@ static unsigned int write_type_tfs(FILE *file, int indent,
- if ((context != TYPE_CONTEXT_CONTAINER &&
- context != TYPE_CONTEXT_CONTAINER_NO_POINTERS) ||
- !is_conformant_array(type) || type_array_is_decl_as_ptr(type))
-- off = write_array_tfs(file, attrs, type, name, typeformat_offset);
-+ off = write_array_tfs(file, attrs, declspec, name, typeformat_offset);
- else
- off = 0;
- if (context != TYPE_CONTEXT_CONTAINER &&
- context != TYPE_CONTEXT_CONTAINER_NO_POINTERS)
- {
- int ptr_type;
-- ptr_type = get_pointer_fc(type, attrs,
-- context == TYPE_CONTEXT_TOPLEVELPARAM);
-+ ptr_type = get_pointer_fc_context(type, attrs, context);
- if (ptr_type != FC_RP || type_array_is_decl_as_ptr(type))
- {
- unsigned int absoff = type->typestring_offset;
-@@ -3615,14 +3642,14 @@ static unsigned int write_type_tfs(FILE *file, int indent,
- if (ptr_type != FC_RP) update_tfsoff( type, off, file );
- *typeformat_offset += 4;
- }
-- type->details.array.ptr_tfsoff = off;
-+ type_get_details(type)->array.ptr_tfsoff = off;
- }
- return off;
- }
- case TGT_STRUCT:
-- return write_struct_tfs(file, type, name, typeformat_offset);
-+ return write_struct_tfs(file, declspec, name, typeformat_offset);
- case TGT_UNION:
-- return write_union_tfs(file, attrs, type, typeformat_offset);
-+ return write_union_tfs(file, attrs, declspec, typeformat_offset);
- case TGT_ENUM:
- case TGT_BASIC:
- /* nothing to do */
-@@ -3635,11 +3662,11 @@ static unsigned int write_type_tfs(FILE *file, int indent,
- return write_range_tfs(file, attrs, type, range_list, typeformat_offset);
- }
- case TGT_IFACE_POINTER:
-- return write_ip_tfs(file, attrs, type, typeformat_offset);
-+ return write_ip_tfs(file, attrs, declspec, typeformat_offset);
- case TGT_POINTER:
- {
- enum type_context ref_context;
-- type_t *ref = type_pointer_get_ref(type);
-+ const decl_spec_t *ref = type_pointer_get_ref(type);
-
- if (context == TYPE_CONTEXT_TOPLEVELPARAM)
- ref_context = TYPE_CONTEXT_PARAM;
-@@ -3648,22 +3675,22 @@ static unsigned int write_type_tfs(FILE *file, int indent,
- else
- ref_context = context;
-
-- if (is_string_type(attrs, ref))
-+ if (is_string_type(attrs, ref->type))
- {
- if (context != TYPE_CONTEXT_CONTAINER_NO_POINTERS)
-- write_pointer_tfs(file, attrs, type, *typeformat_offset + 4, context, typeformat_offset);
-+ write_pointer_tfs(file, attrs, declspec, *typeformat_offset + 4, context, typeformat_offset);
-
-- offset = write_type_tfs(file, indent, attrs, ref, name, ref_context, typeformat_offset);
-+ offset = write_type_tfs(file, attrs, ref, name, ref_context, typeformat_offset);
- if (context == TYPE_CONTEXT_CONTAINER_NO_POINTERS)
- return 0;
- return offset;
- }
-
-- offset = write_type_tfs( file, indent, attrs, type_pointer_get_ref(type), name,
-+ offset = write_type_tfs( file, attrs, type_pointer_get_ref(type), name,
- ref_context, typeformat_offset);
- if (context == TYPE_CONTEXT_CONTAINER_NO_POINTERS)
- return 0;
-- return write_pointer_tfs(file, attrs, type, offset, context, typeformat_offset);
-+ return write_pointer_tfs(file, attrs, declspec, offset, context, typeformat_offset);
- }
- case TGT_INVALID:
- break;
-@@ -3672,10 +3699,10 @@ static unsigned int write_type_tfs(FILE *file, int indent,
- return 0;
- }
-
--static int write_embedded_types(FILE *file, const attr_list_t *attrs, type_t *type,
-+static int write_embedded_types(FILE *file, const attr_list_t *attrs, const decl_spec_t *declspec,
- const char *name, int write_ptr, unsigned int *tfsoff)
- {
-- return write_type_tfs(file, 2, attrs, type, name, write_ptr ? TYPE_CONTEXT_CONTAINER : TYPE_CONTEXT_CONTAINER_NO_POINTERS, tfsoff);
-+ return write_type_tfs(file, attrs, declspec, name, write_ptr ? TYPE_CONTEXT_CONTAINER : TYPE_CONTEXT_CONTAINER_NO_POINTERS, tfsoff);
- }
-
- static void process_tfs_iface(type_t *iface, FILE *file, int indent, unsigned int *offset)
-@@ -3693,21 +3720,21 @@ static void process_tfs_iface(type_t *iface, FILE *file, int indent, unsigned in
- {
- const var_t *func = stmt->u.var;
-
-- if(stmt->u.var->stgclass != STG_NONE
-- || type_get_type_detect_alias(stmt->u.var->type) != TYPE_FUNCTION)
-+ if(stmt->u.var->declspec.stgclass != STG_NONE
-+ || type_get_type_detect_alias(stmt->u.var->declspec.type) != TYPE_FUNCTION)
- continue;
-
- current_func = func;
- if (is_local(func->attrs)) continue;
-
-- var = type_function_get_retval(func->type);
-- if (!is_void(var->type))
-- var->typestring_offset = write_type_tfs( file, 2, func->attrs, var->type, func->name,
-- TYPE_CONTEXT_PARAM, offset);
-+ var = type_function_get_retval(func->declspec.type);
-+ if (!is_void(var->declspec.type))
-+ var->typestring_offset = write_type_tfs( file, var->attrs, &var->declspec, func->name,
-+ TYPE_CONTEXT_RETVAL, offset);
-
-- if (type_get_function_args(func->type))
-- LIST_FOR_EACH_ENTRY( var, type_get_function_args(func->type), var_t, entry )
-- var->typestring_offset = write_type_tfs( file, 2, var->attrs, var->type, var->name,
-+ if (type_function_get_args(func->declspec.type))
-+ LIST_FOR_EACH_ENTRY( var, type_function_get_args(func->declspec.type), var_t, entry )
-+ var->typestring_offset = write_type_tfs( file, var->attrs, &var->declspec, var->name,
- TYPE_CONTEXT_TOPLEVELPARAM, offset );
- break;
-
-@@ -3719,9 +3746,12 @@ static void process_tfs_iface(type_t *iface, FILE *file, int indent, unsigned in
- {
- if (is_attr(type_entry->type->attrs, ATTR_ENCODE)
- || is_attr(type_entry->type->attrs, ATTR_DECODE))
-- type_entry->type->typestring_offset = write_type_tfs( file, 2,
-- type_entry->type->attrs, type_entry->type, type_entry->type->name,
-+ {
-+ decl_spec_t ds;
-+ type_entry->type->typestring_offset = write_type_tfs( file,
-+ type_entry->type->attrs, init_declspec(&ds, type_entry->type), type_entry->type->name,
- TYPE_CONTEXT_CONTAINER, offset);
-+ }
- }
- break;
- }
-@@ -3842,7 +3872,7 @@ static unsigned int get_required_buffer_size_type(
- case TGT_POINTER:
- {
- unsigned int size, align;
-- const type_t *ref = type_pointer_get_ref(type);
-+ const type_t *ref = type_pointer_get_ref_type(type);
- if (is_string_type( attrs, ref )) break;
- if (!(size = get_required_buffer_size_type( ref, name, NULL, FALSE, &align ))) break;
- if (get_pointer_fc(type, attrs, toplevel_param) != FC_RP)
-@@ -3862,7 +3892,7 @@ static unsigned int get_required_buffer_size_type(
- case FC_SMFARRAY:
- case FC_LGFARRAY:
- return type_array_get_dim(type) *
-- get_required_buffer_size_type(type_array_get_element(type), name,
-+ get_required_buffer_size_type(type_array_get_element_type(type), name,
- NULL, FALSE, alignment);
- }
- }
-@@ -3893,8 +3923,8 @@ static unsigned int get_required_buffer_size(const var_t *var, unsigned int *ali
- return 20;
- }
-
-- if (!is_string_type(var->attrs, var->type))
-- return get_required_buffer_size_type(var->type, var->name,
-+ if (!is_string_type(var->attrs, var->declspec.type))
-+ return get_required_buffer_size_type(var->declspec.type, var->name,
- var->attrs, TRUE, alignment);
- }
- return 0;
-@@ -3905,19 +3935,19 @@ static unsigned int get_function_buffer_size( const var_t *func, enum pass pass
- const var_t *var;
- unsigned int total_size = 0, alignment;
-
-- if (type_get_function_args(func->type))
-+ if (type_function_get_args(func->declspec.type))
- {
-- LIST_FOR_EACH_ENTRY( var, type_get_function_args(func->type), const var_t, entry )
-+ LIST_FOR_EACH_ENTRY( var, type_function_get_args(func->declspec.type), const var_t, entry )
- {
- total_size += get_required_buffer_size(var, &alignment, pass);
- total_size += alignment;
- }
- }
-
-- if (pass == PASS_OUT && !is_void(type_function_get_rettype(func->type)))
-+ if (pass == PASS_OUT && !is_void(type_function_get_rettype(func->declspec.type)))
- {
- var_t v = *func;
-- v.type = type_function_get_rettype(func->type);
-+ v.declspec.type = type_function_get_rettype(func->declspec.type);
- total_size += get_required_buffer_size(&v, &alignment, PASS_RETURN);
- total_size += alignment;
- }
-@@ -3953,9 +3983,9 @@ static void print_phase_function(FILE *file, int indent, const char *type,
- print_file(file, indent, "&__frame->_StubMsg,\n");
- print_file(file, indent, "%s%s%s%s%s,\n",
- (phase == PHASE_UNMARSHAL) ? "(unsigned char **)" : "(unsigned char *)",
-- (phase == PHASE_UNMARSHAL || decl_indirect(var->type)) ? "&" : "",
-+ (phase == PHASE_UNMARSHAL || decl_indirect(var->declspec.type)) ? "&" : "",
- local_var_prefix,
-- (phase == PHASE_UNMARSHAL && decl_indirect(var->type)) ? "_p_" : "",
-+ (phase == PHASE_UNMARSHAL && decl_indirect(var->declspec.type)) ? "_p_" : "",
- var->name);
- print_file(file, indent, "(PFORMAT_STRING)&__MIDL_TypeFormatString.Format[%d]%s\n",
- type_offset, (phase == PHASE_UNMARSHAL) ? "," : ");");
-@@ -3968,7 +3998,8 @@ void print_phase_basetype(FILE *file, int indent, const char *local_var_prefix,
- enum remoting_phase phase, enum pass pass, const var_t *var,
- const char *varname)
- {
-- type_t *type = var->type;
-+ const decl_spec_t *declspec = &var->declspec;
-+ type_t *type = declspec->type;
- unsigned int alignment = 0;
-
- /* no work to do for other phases, buffer sizing is done elsewhere */
-@@ -3999,8 +4030,8 @@ void print_phase_basetype(FILE *file, int indent, const char *local_var_prefix,
- }
- else
- {
-- const type_t *ref = is_ptr(type) ? type_pointer_get_ref(type) : type;
-- switch (get_basic_fc(ref))
-+ const decl_spec_t *ref = is_ptr(type) ? type_pointer_get_ref(type) : declspec;
-+ switch (get_basic_fc(ref->type))
- {
- case FC_BYTE:
- case FC_CHAR:
-@@ -4037,7 +4068,7 @@ void print_phase_basetype(FILE *file, int indent, const char *local_var_prefix,
-
- default:
- error("print_phase_basetype: Unsupported type: %s (0x%02x, ptr_level: 0)\n",
-- var->name, get_basic_fc(ref));
-+ var->name, get_basic_fc(ref->type));
- }
-
- if (phase == PHASE_MARSHAL && alignment > 1)
-@@ -4048,7 +4079,7 @@ void print_phase_basetype(FILE *file, int indent, const char *local_var_prefix,
- if (phase == PHASE_MARSHAL)
- {
- print_file(file, indent, "*(");
-- write_type_decl(file, is_ptr(type) ? type_pointer_get_ref(type) : type, NULL);
-+ write_declspec_decl(file, is_ptr(type) ? type_pointer_get_ref(type) : declspec, NULL);
- if (is_ptr(type))
- fprintf(file, " *)__frame->_StubMsg.Buffer = *");
- else
-@@ -4059,7 +4090,7 @@ void print_phase_basetype(FILE *file, int indent, const char *local_var_prefix,
- else if (phase == PHASE_UNMARSHAL)
- {
- print_file(file, indent, "if (__frame->_StubMsg.Buffer + sizeof(");
-- write_type_decl(file, is_ptr(type) ? type_pointer_get_ref(type) : type, NULL);
-+ write_declspec_decl(file, is_ptr(type) ? type_pointer_get_ref(type) : declspec, NULL);
- fprintf(file, ") > __frame->_StubMsg.BufferEnd)\n");
- print_file(file, indent, "{\n");
- print_file(file, indent + 1, "RpcRaiseException(RPC_X_BAD_STUB_DATA);\n");
-@@ -4071,12 +4102,12 @@ void print_phase_basetype(FILE *file, int indent, const char *local_var_prefix,
- fprintf(file, " = (");
- else
- fprintf(file, " = *(");
-- write_type_decl(file, is_ptr(type) ? type_pointer_get_ref(type) : type, NULL);
-+ write_declspec_decl(file, is_ptr(type) ? type_pointer_get_ref(type) : declspec, NULL);
- fprintf(file, " *)__frame->_StubMsg.Buffer;\n");
- }
-
- print_file(file, indent, "__frame->_StubMsg.Buffer += sizeof(");
-- write_type_decl(file, is_ptr(type) ? type_pointer_get_ref(type) : type, NULL);
-+ write_declspec_decl(file, is_ptr(type) ? type_pointer_get_ref(type) : declspec, NULL);
- fprintf(file, ");\n");
- }
- }
-@@ -4092,7 +4123,7 @@ expr_t *get_size_is_expr(const type_t *t, const char *name)
- {
- expr_t *x = NULL;
-
-- for ( ; is_array(t); t = type_array_get_element(t))
-+ for ( ; is_array(t); t = type_array_get_element_type(t))
- if (type_array_has_conformance(t) &&
- type_array_get_conformance(t)->type != EXPR_VOID)
- {
-@@ -4110,7 +4141,7 @@ expr_t *get_size_is_expr(const type_t *t, const char *name)
- void write_parameter_conf_or_var_exprs(FILE *file, int indent, const char *local_var_prefix,
- enum remoting_phase phase, const var_t *var, int valid_variance)
- {
-- const type_t *type = var->type;
-+ const type_t *type = var->declspec.type;
- /* get fundamental type for the argument */
- for (;;)
- {
-@@ -4162,7 +4193,7 @@ void write_parameter_conf_or_var_exprs(FILE *file, int indent, const char *local
- break;
- }
- case TGT_POINTER:
-- type = type_pointer_get_ref(type);
-+ type = type_pointer_get_ref_type(type);
- continue;
- case TGT_INVALID:
- case TGT_USER_TYPE:
-@@ -4184,7 +4215,7 @@ static void write_remoting_arg(FILE *file, int indent, const var_t *func, const
- {
- int in_attr, out_attr, pointer_type;
- const char *type_str = NULL;
-- const type_t *type = var->type;
-+ const type_t *type = var->declspec.type;
- unsigned int alignment, start_offset = type->typestring_offset;
-
- if (is_ptr(type) || is_array(type))
-@@ -4237,19 +4268,20 @@ static void write_remoting_arg(FILE *file, int indent, const var_t *func, const
- print_file(file, indent, "NdrServerContextNewMarshall(\n");
- print_file(file, indent + 1, "&__frame->_StubMsg,\n");
- print_file(file, indent + 1, "(NDR_SCONTEXT)%s%s,\n", local_var_prefix, var->name);
-- print_file(file, indent + 1, "(NDR_RUNDOWN)%s_rundown,\n", get_context_handle_type_name(var->type));
-+ print_file(file, indent + 1, "(NDR_RUNDOWN)%s_rundown,\n", get_context_handle_type_name(var->declspec.type));
- print_file(file, indent + 1, "(PFORMAT_STRING)&__MIDL_TypeFormatString.Format[%d]);\n", start_offset);
- }
- }
- else if (phase == PHASE_UNMARSHAL)
- {
-- if (pass == PASS_OUT)
-+ if (pass == PASS_OUT || pass == PASS_RETURN)
- {
- if (!in_attr)
- print_file(file, indent, "*%s%s = 0;\n", local_var_prefix, var->name);
- print_file(file, indent, "NdrClientContextUnmarshall(\n");
- print_file(file, indent + 1, "&__frame->_StubMsg,\n");
-- print_file(file, indent + 1, "(NDR_CCONTEXT *)%s%s,\n", local_var_prefix, var->name);
-+ print_file(file, indent + 1, "(NDR_CCONTEXT *)%s%s%s,\n",
-+ pass == PASS_RETURN ? "&" : "", local_var_prefix, var->name);
- print_file(file, indent + 1, "__frame->_Handle);\n");
- }
- else
-@@ -4343,10 +4375,10 @@ static void write_remoting_arg(FILE *file, int indent, const var_t *func, const
- ((tc == FC_SMVARRAY || tc == FC_LGVARRAY) && in_attr) ||
- (tc == FC_CARRAY && !in_attr))
- {
-- if (type_array_is_decl_as_ptr(type) && type->details.array.ptr_tfsoff)
-+ if (type_array_is_decl_as_ptr(type) && type_get_const_details(type)->array.ptr_tfsoff)
- {
- print_phase_function(file, indent, "Pointer", local_var_prefix, phase, var,
-- type->details.array.ptr_tfsoff);
-+ type_get_const_details(type)->array.ptr_tfsoff);
- break;
- }
- print_phase_function(file, indent, array_type, local_var_prefix, phase, var, start_offset);
-@@ -4380,9 +4412,9 @@ static void write_remoting_arg(FILE *file, int indent, const var_t *func, const
- range_max = LIST_ENTRY(list_next(range_list, list_head(range_list)), const expr_t, entry);
-
- print_file(file, indent, "if ((%s%s < (", local_var_prefix, var->name);
-- write_type_decl(file, var->type, NULL);
-+ write_declspec_decl(file, &var->declspec, NULL);
- fprintf(file, ")0x%x) || (%s%s > (", range_min->cval, local_var_prefix, var->name);
-- write_type_decl(file, var->type, NULL);
-+ write_declspec_decl(file, &var->declspec, NULL);
- fprintf(file, ")0x%x))\n", range_max->cval);
- print_file(file, indent, "{\n");
- print_file(file, indent+1, "RpcRaiseException(RPC_S_INVALID_BOUND);\n");
-@@ -4428,7 +4460,7 @@ static void write_remoting_arg(FILE *file, int indent, const var_t *func, const
- }
- case TGT_POINTER:
- {
-- const type_t *ref = type_pointer_get_ref(type);
-+ const type_t *ref = type_pointer_get_ref_type(type);
- if (pointer_type == FC_RP) switch (typegen_detect_type(ref, NULL, TDT_ALL_TYPES))
- {
- case TGT_BASIC:
-@@ -4549,14 +4581,14 @@ void write_remoting_arguments(FILE *file, int indent, const var_t *func, const c
- if (pass == PASS_RETURN)
- {
- write_remoting_arg( file, indent, func, local_var_prefix, pass, phase,
-- type_function_get_retval(func->type) );
-+ type_function_get_retval(func->declspec.type) );
- }
- else
- {
- const var_t *var;
-- if (!type_get_function_args(func->type))
-+ if (!type_function_get_args(func->declspec.type))
- return;
-- LIST_FOR_EACH_ENTRY( var, type_get_function_args(func->type), const var_t, entry )
-+ LIST_FOR_EACH_ENTRY( var, type_function_get_args(func->declspec.type), const var_t, entry )
- write_remoting_arg( file, indent, func, local_var_prefix, pass, phase, var );
- }
- }
-@@ -4597,57 +4629,62 @@ void declare_stub_args( FILE *file, int indent, const var_t *func )
- {
- int in_attr, out_attr;
- int i = 0;
-- const var_t *var = type_function_get_retval(func->type);
-+ const var_t *var = type_function_get_retval(func->declspec.type);
-
- /* declare return value */
-- if (!is_void(var->type))
-+ if (!is_void(var->declspec.type))
- {
-- print_file(file, indent, "%s", "");
-- write_type_decl(file, var->type, var->name);
-- fprintf(file, ";\n");
-+ if (is_context_handle(var->declspec.type))
-+ print_file(file, indent, "NDR_SCONTEXT %s;\n", var->name);
-+ else
-+ {
-+ print_file(file, indent, "%s", "");
-+ write_declspec_decl(file, &var->declspec, var->name);
-+ fprintf(file, ";\n");
-+ }
- }
-
-- if (!type_get_function_args(func->type))
-+ if (!type_function_get_args(func->declspec.type))
- return;
-
-- LIST_FOR_EACH_ENTRY( var, type_get_function_args(func->type), const var_t, entry )
-+ LIST_FOR_EACH_ENTRY( var, type_function_get_args(func->declspec.type), const var_t, entry )
- {
- in_attr = is_attr(var->attrs, ATTR_IN);
- out_attr = is_attr(var->attrs, ATTR_OUT);
- if (!out_attr && !in_attr)
- in_attr = 1;
-
-- if (is_context_handle(var->type))
-+ if (is_context_handle(var->declspec.type))
- print_file(file, indent, "NDR_SCONTEXT %s;\n", var->name);
- else
- {
-- if (!in_attr && !is_conformant_array(var->type))
-+ if (!in_attr && !is_conformant_array(var->declspec.type))
- {
-- type_t *type_to_print;
-+ const decl_spec_t *declspec_to_print;
- char name[16];
- print_file(file, indent, "%s", "");
-- if (type_get_type(var->type) == TYPE_ARRAY &&
-- !type_array_is_decl_as_ptr(var->type))
-- type_to_print = var->type;
-+ if (type_get_type(var->declspec.type) == TYPE_ARRAY &&
-+ !type_array_is_decl_as_ptr(var->declspec.type))
-+ declspec_to_print = &var->declspec;
- else
-- type_to_print = type_pointer_get_ref(var->type);
-+ declspec_to_print = type_pointer_get_ref(var->declspec.type);
- sprintf(name, "_W%u", i++);
-- write_type_decl(file, type_to_print, name);
-+ write_declspec_decl(file, declspec_to_print, name);
- fprintf(file, ";\n");
- }
-
- print_file(file, indent, "%s", "");
-- write_type_decl_left(file, var->type);
-+ write_declspec_decl_left(file, &var->declspec);
- fprintf(file, " ");
-- if (type_get_type(var->type) == TYPE_ARRAY &&
-- !type_array_is_decl_as_ptr(var->type)) {
-+ if (type_get_type(var->declspec.type) == TYPE_ARRAY &&
-+ !type_array_is_decl_as_ptr(var->declspec.type)) {
- fprintf(file, "(*%s)", var->name);
- } else
- fprintf(file, "%s", var->name);
-- write_type_right(file, var->type, FALSE);
-+ write_type_right(file, var->declspec.type, FALSE);
- fprintf(file, ";\n");
-
-- if (decl_indirect(var->type))
-+ if (decl_indirect(var->declspec.type))
- print_file(file, indent, "void *_p_%s;\n", var->name);
- }
- }
-@@ -4661,10 +4698,10 @@ void assign_stub_out_args( FILE *file, int indent, const var_t *func, const char
- const var_t *var;
- type_t *ref;
-
-- if (!type_get_function_args(func->type))
-+ if (!type_function_get_args(func->declspec.type))
- return;
-
-- LIST_FOR_EACH_ENTRY( var, type_get_function_args(func->type), const var_t, entry )
-+ LIST_FOR_EACH_ENTRY( var, type_function_get_args(func->declspec.type), const var_t, entry )
- {
- in_attr = is_attr(var->attrs, ATTR_IN);
- out_attr = is_attr(var->attrs, ATTR_OUT);
-@@ -4675,7 +4712,7 @@ void assign_stub_out_args( FILE *file, int indent, const var_t *func, const char
- {
- print_file(file, indent, "%s%s", local_var_prefix, var->name);
-
-- switch (typegen_detect_type(var->type, var->attrs, TDT_IGNORE_STRINGS))
-+ switch (typegen_detect_type(var->declspec.type, var->attrs, TDT_IGNORE_STRINGS))
- {
- case TGT_CTXT_HANDLE_POINTER:
- fprintf(file, " = NdrContextHandleInitialize(\n");
-@@ -4684,15 +4721,15 @@ void assign_stub_out_args( FILE *file, int indent, const var_t *func, const char
- var->typestring_offset);
- break;
- case TGT_ARRAY:
-- if (type_array_has_conformance(var->type))
-+ if (type_array_has_conformance(var->declspec.type))
- {
- unsigned int size;
- type_t *type;
-
- fprintf(file, " = NdrAllocate(&__frame->_StubMsg, ");
-- for (type = var->type;
-+ for (type = var->declspec.type;
- is_array(type) && type_array_has_conformance(type);
-- type = type_array_get_element(type))
-+ type = type_array_get_element_type(type))
- {
- write_expr(file, type_array_get_conformance(type), TRUE,
- TRUE, NULL, NULL, local_var_prefix);
-@@ -4702,9 +4739,9 @@ void assign_stub_out_args( FILE *file, int indent, const var_t *func, const char
- fprintf(file, "%u);\n", size);
-
- print_file(file, indent, "memset(%s%s, 0, ", local_var_prefix, var->name);
-- for (type = var->type;
-+ for (type = var->declspec.type;
- is_array(type) && type_array_has_conformance(type);
-- type = type_array_get_element(type))
-+ type = type_array_get_element_type(type))
- {
- write_expr(file, type_array_get_conformance(type), TRUE,
- TRUE, NULL, NULL, local_var_prefix);
-@@ -4718,7 +4755,7 @@ void assign_stub_out_args( FILE *file, int indent, const var_t *func, const char
- break;
- case TGT_POINTER:
- fprintf(file, " = &%s_W%u;\n", local_var_prefix, i);
-- ref = type_pointer_get_ref(var->type);
-+ ref = type_pointer_get_ref_type(var->declspec.type);
- switch (typegen_detect_type(ref, var->attrs, TDT_IGNORE_STRINGS))
- {
- case TGT_BASIC:
-@@ -4738,7 +4775,7 @@ void assign_stub_out_args( FILE *file, int indent, const var_t *func, const char
- print_file(file, indent, "%s_W%u = 0;\n", local_var_prefix, i);
- break;
- }
-- ref = type_array_get_element(ref);
-+ ref = type_array_get_element_type(ref);
- /* fall through */
- case TGT_STRUCT:
- case TGT_UNION:
-@@ -4771,14 +4808,14 @@ void write_func_param_struct( FILE *file, const type_t *iface, const type_t *fun
- const char *var_decl, int add_retval )
- {
- var_t *retval = type_function_get_retval( func );
-- const var_list_t *args = type_get_function_args( func );
-+ const var_list_t *args = type_function_get_args( func );
- const var_t *arg;
- int needs_packing;
- unsigned int align = 0;
-
- if (args)
- LIST_FOR_EACH_ENTRY( arg, args, const var_t, entry )
-- if (!is_array( arg->type )) type_memsize_and_alignment( arg->type, &align );
-+ if (!is_array( arg->declspec.type )) type_memsize_and_alignment( arg->declspec.type, &align );
-
- needs_packing = (align > pointer_size);
-
-@@ -4790,26 +4827,26 @@ void write_func_param_struct( FILE *file, const type_t *iface, const type_t *fun
- if (args) LIST_FOR_EACH_ENTRY( arg, args, const var_t, entry )
- {
- print_file(file, 2, "%s", "");
-- write_type_left( file, (type_t *)arg->type, NAME_DEFAULT, TRUE );
-- if (needs_space_after( arg->type )) fputc( ' ', file );
-- if (is_array( arg->type ) && !type_array_is_decl_as_ptr( arg->type )) fputc( '*', file );
-+ write_declspec_left( file, &arg->declspec, NAME_DEFAULT, TRUE );
-+ if (needs_space_after( arg->declspec.type )) fputc( ' ', file );
-+ if (is_array( arg->declspec.type ) && !type_array_is_decl_as_ptr( arg->declspec.type )) fputc( '*', file );
-
- /* FIXME: should check for large args being passed by pointer */
- align = 0;
-- if (is_array( arg->type ) || is_ptr( arg->type )) align = pointer_size;
-- else type_memsize_and_alignment( arg->type, &align );
-+ if (is_array( arg->declspec.type ) || is_ptr( arg->declspec.type )) align = pointer_size;
-+ else type_memsize_and_alignment( arg->declspec.type, &align );
-
- if (align >= pointer_size)
- fprintf( file, "%s;\n", arg->name );
- else
- fprintf( file, "%s DECLSPEC_ALIGN(%u);\n", arg->name, pointer_size );
- }
-- if (add_retval && !is_void( retval->type ))
-+ if (add_retval && !is_void( retval->declspec.type ))
- {
- print_file(file, 2, "%s", "");
-- write_type_decl( file, retval->type, retval->name );
-- if (is_array( retval->type ) || is_ptr( retval->type ) ||
-- type_memsize( retval->type ) == pointer_size)
-+ write_declspec_decl( file, &retval->declspec, retval->name );
-+ if (is_array( retval->declspec.type ) || is_ptr( retval->declspec.type ) ||
-+ type_memsize( retval->declspec.type ) == pointer_size)
- fprintf( file, ";\n" );
- else
- fprintf( file, " DECLSPEC_ALIGN(%u);\n", pointer_size );
-@@ -4821,7 +4858,7 @@ void write_func_param_struct( FILE *file, const type_t *iface, const type_t *fun
-
- void write_pointer_checks( FILE *file, int indent, const var_t *func )
- {
-- const var_list_t *args = type_get_function_args( func->type );
-+ const var_list_t *args = type_function_get_args( func->declspec.type );
- const var_t *var;
-
- if (!args) return;
-@@ -4854,10 +4891,11 @@ int write_expr_eval_routines(FILE *file, const char *iface)
- }
- else
- {
-+ decl_spec_t declspec;
- print_file(file, 1, "%s", "");
-- write_type_left(file, (type_t *)eval->cont_type, NAME_DEFAULT, TRUE);
-+ write_declspec_left(file, init_declspec(&declspec, (type_t*)eval->cont_type), NAME_DEFAULT, TRUE);
- fprintf(file, " *%s = (", var_name);
-- write_type_left(file, (type_t *)eval->cont_type, NAME_DEFAULT, TRUE);
-+ write_declspec_left(file, init_declspec(&declspec, (type_t*)eval->cont_type), NAME_DEFAULT, TRUE);
- fprintf(file, " *)(pStubMsg->StackTop - %u);\n", eval->baseoff);
- }
- print_file(file, 1, "pStubMsg->Offset = 0;\n"); /* FIXME */
-@@ -4951,9 +4989,10 @@ error:
- void write_client_call_routine( FILE *file, const type_t *iface, const var_t *func,
- const char *prefix, unsigned int proc_offset )
- {
-- type_t *rettype = type_function_get_rettype( func->type );
-+ const decl_spec_t *retdeclspec = type_function_get_retdeclspec(func->declspec.type);
-+ type_t *rettype = retdeclspec->type;
- int has_ret = !is_void( rettype );
-- const var_list_t *args = type_get_function_args( func->type );
-+ const var_list_t *args = type_function_get_args( func->declspec.type );
- const var_t *arg;
- int len, needs_params = 0;
-
-@@ -4964,7 +5003,7 @@ void write_client_call_routine( FILE *file, const type_t *iface, const var_t *fu
- if (needs_params)
- {
- if (has_ret) print_file( file, 1, "%s", "CLIENT_CALL_RETURN _RetVal;\n" );
-- write_func_param_struct( file, iface, func->type, "__params", FALSE );
-+ write_func_param_struct( file, iface, func->declspec.type, "__params", FALSE );
- if (is_object( iface )) print_file( file, 1, "__params.This = This;\n" );
- if (args)
- LIST_FOR_EACH_ENTRY( arg, args, const var_t, entry )
-@@ -5001,7 +5040,7 @@ void write_client_call_routine( FILE *file, const type_t *iface, const var_t *fu
- if (has_ret)
- {
- print_file( file, 1, "return (" );
-- write_type_decl_left(file, rettype);
-+ write_declspec_decl_left(file, retdeclspec);
- fprintf( file, ")%s;\n", pointer_size == 8 ? "_RetVal.Simple" : "*(LONG_PTR *)&_RetVal" );
- }
- print_file( file, 0, "}\n\n");
-@@ -5029,7 +5068,7 @@ void write_exceptions( FILE *file )
- fprintf( file, " EXCEPTION_REGISTRATION_RECORD frame; \\\n");
- fprintf( file, " __filter_func filter; \\\n");
- fprintf( file, " __finally_func finally; \\\n");
-- fprintf( file, " sigjmp_buf jmp; \\\n");
-+ fprintf( file, " __wine_jmp_buf jmp; \\\n");
- fprintf( file, " DWORD code; \\\n");
- fprintf( file, " unsigned char abnormal_termination; \\\n");
- fprintf( file, " unsigned char filter_level; \\\n");
-@@ -5049,13 +5088,13 @@ void write_exceptions( FILE *file )
- fprintf( file, " __wine_pop_frame( &exc_frame->frame );\n");
- fprintf( file, " }\n");
- fprintf( file, " exc_frame->filter_level = 0;\n");
-- fprintf( file, " siglongjmp( exc_frame->jmp, 1 );\n");
-+ fprintf( file, " __wine_longjmp( &exc_frame->jmp, 1 );\n");
- fprintf( file, "}\n");
- fprintf( file, "\n");
-- fprintf( file, "static DWORD __widl_exception_handler( EXCEPTION_RECORD *record,\n");
-- fprintf( file, " EXCEPTION_REGISTRATION_RECORD *frame,\n");
-- fprintf( file, " CONTEXT *context,\n");
-- fprintf( file, " EXCEPTION_REGISTRATION_RECORD **pdispatcher )\n");
-+ fprintf( file, "static DWORD __cdecl __widl_exception_handler( EXCEPTION_RECORD *record,\n");
-+ fprintf( file, " EXCEPTION_REGISTRATION_RECORD *frame,\n");
-+ fprintf( file, " CONTEXT *context,\n");
-+ fprintf( file, " EXCEPTION_REGISTRATION_RECORD **pdispatcher )\n");
- fprintf( file, "{\n");
- fprintf( file, " struct __exception_frame *exc_frame = (struct __exception_frame *)frame;\n");
- fprintf( file, "\n");
-@@ -5075,7 +5114,7 @@ void write_exceptions( FILE *file )
- fprintf( file, "}\n");
- fprintf( file, "\n");
- fprintf( file, "#define RpcTryExcept \\\n");
-- fprintf( file, " if (!sigsetjmp( __frame->jmp, 0 )) \\\n");
-+ fprintf( file, " if (!__wine_setjmpex( &__frame->jmp, &__frame->frame )) \\\n");
- fprintf( file, " { \\\n");
- fprintf( file, " if (!__frame->finally_level) \\\n" );
- fprintf( file, " __wine_push_frame( &__frame->frame ); \\\n");
-diff --git a/mingw-w64-tools/widl/src/typelib.c b/mingw-w64-tools/widl/src/typelib.c
-index 9b1de2c8..2c2b1276 100644
---- a/mingw-w64-tools/widl/src/typelib.c
-+++ b/mingw-w64-tools/widl/src/typelib.c
-@@ -97,9 +97,9 @@ static unsigned short builtin_vt(const type_t *t)
- {
- const type_t *elem_type;
- if (is_array(t))
-- elem_type = type_array_get_element(t);
-+ elem_type = type_array_get_element_type(t);
- else
-- elem_type = type_pointer_get_ref(t);
-+ elem_type = type_pointer_get_ref_type(t);
- if (type_get_type(elem_type) == TYPE_BASIC)
- {
- switch (type_basic_get_type(elem_type))
-@@ -129,7 +129,8 @@ unsigned short get_type_vt(type_t *t)
- if (vt) return vt;
- }
-
-- if (type_is_alias(t) && is_attr(t->attrs, ATTR_PUBLIC))
-+ if (type_is_alias(t) &&
-+ (is_attr(t->attrs, ATTR_PUBLIC) || is_attr(t->attrs, ATTR_WIREMARSHAL)))
- return VT_USERDEFINED;
-
- switch (type_get_type(t)) {
-@@ -169,7 +170,7 @@ unsigned short get_type_vt(type_t *t)
- else
- return VT_I8;
- case TYPE_BASIC_INT3264:
-- if (typelib_kind == SYS_WIN64)
-+ if (pointer_size == 8)
- {
- if (type_basic_get_sign(t) > 0)
- return VT_UI8;
-@@ -198,7 +199,7 @@ unsigned short get_type_vt(type_t *t)
- case TYPE_ARRAY:
- if (type_array_is_decl_as_ptr(t))
- {
-- if (match(type_array_get_element(t)->name, "SAFEARRAY"))
-+ if (match(type_array_get_element_type(t)->name, "SAFEARRAY"))
- return VT_SAFEARRAY;
- return VT_PTR;
- }
-diff --git a/mingw-w64-tools/widl/src/typetree.c b/mingw-w64-tools/widl/src/typetree.c
-index b93806be..488f7a49 100644
---- a/mingw-w64-tools/widl/src/typetree.c
-+++ b/mingw-w64-tools/widl/src/typetree.c
-@@ -30,12 +30,16 @@
- #include "typetree.h"
- #include "header.h"
-
--type_t *duptype(type_t *t, int dupname)
-+/* this function is only used in declare_var in parser.y, see FIXME note */
-+type_t *dup_pointer_type(type_t *t)
- {
-- type_t *d = alloc_type();
-+ type_t *d;
-
-+ assert(is_ptr(t) && t->details.pointer.def_fc != FC_RP);
-+
-+ d = alloc_type();
- *d = *t;
-- if (dupname && t->name)
-+ if (t->name)
- d->name = xstrdup(t->name);
-
- return d;
-@@ -49,7 +53,6 @@ type_t *make_type(enum type_type type)
- t->type_type = type;
- t->attrs = NULL;
- t->c_name = NULL;
-- t->orig = NULL;
- memset(&t->details, 0, sizeof(t->details));
- t->typestring_offset = 0;
- t->ptrdesc = 0;
-@@ -137,7 +140,7 @@ type_t *type_new_function(var_list_t *args)
- if (args)
- {
- arg = LIST_ENTRY(list_head(args), var_t, entry);
-- if (list_count(args) == 1 && !arg->name && arg->type && type_get_type(arg->type) == TYPE_VOID)
-+ if (list_count(args) == 1 && !arg->name && arg->declspec.type && type_get_type(arg->declspec.type) == TYPE_VOID)
- {
- list_remove(&arg->entry);
- free(arg);
-@@ -147,7 +150,7 @@ type_t *type_new_function(var_list_t *args)
- }
- if (args) LIST_FOR_EACH_ENTRY(arg, args, var_t, entry)
- {
-- if (arg->type && type_get_type(arg->type) == TYPE_VOID)
-+ if (arg->declspec.type && type_get_type(arg->declspec.type) == TYPE_VOID)
- error_loc("argument '%s' has void type\n", arg->name);
- if (!arg->name)
- {
-@@ -178,34 +181,28 @@ type_t *type_new_function(var_list_t *args)
- return t;
- }
-
--type_t *type_new_pointer(unsigned char pointer_default, type_t *ref, attr_list_t *attrs)
-+type_t *type_new_pointer(unsigned char pointer_default, type_t *ref)
- {
- type_t *t = make_type(TYPE_POINTER);
- t->details.pointer.def_fc = pointer_default;
-- t->details.pointer.ref = ref;
-- t->attrs = attrs;
-+ t->details.pointer.ref.type = ref;
- return t;
- }
-
--type_t *type_new_alias(type_t *t, const char *name)
-+type_t *type_new_alias(const decl_spec_t *ds, const char *name)
- {
-- type_t *a = duptype(t, 0);
--
-+ type_t *a = make_type(ds->type->type_type);
- a->name = xstrdup(name);
- a->attrs = NULL;
-- a->orig = t;
-+ a->details.alias.aliasee = *ds;
- a->is_alias = TRUE;
-- /* for pointer types */
-- a->details = t->details;
-- init_loc_info(&a->loc_info);
--
- return a;
- }
-
- type_t *type_new_module(char *name)
- {
- type_t *type = get_type(TYPE_MODULE, name, NULL, 0);
-- if (type->type_type != TYPE_MODULE || type->defined)
-+ if (type->type_type != TYPE_MODULE || type_is_defined(type))
- error_loc("%s: redefinition error; original definition was at %s:%d\n",
- type->name, type->loc_info.input_name, type->loc_info.line_number);
- type->name = name;
-@@ -215,7 +212,7 @@ type_t *type_new_module(char *name)
- type_t *type_new_coclass(char *name)
- {
- type_t *type = get_type(TYPE_COCLASS, name, NULL, 0);
-- if (type->type_type != TYPE_COCLASS || type->defined)
-+ if (type->type_type != TYPE_COCLASS || type_is_defined(type))
- error_loc("%s: redefinition error; original definition was at %s:%d\n",
- type->name, type->loc_info.input_name, type->loc_info.line_number);
- type->name = name;
-@@ -223,7 +220,7 @@ type_t *type_new_coclass(char *name)
- }
-
-
--type_t *type_new_array(const char *name, type_t *element, int declptr,
-+type_t *type_new_array(const char *name, const decl_spec_t *element, int declptr,
- unsigned int dim, expr_t *size_is, expr_t *length_is,
- unsigned char ptr_default_fc)
- {
-@@ -235,7 +232,9 @@ type_t *type_new_array(const char *name, type_t *element, int declptr,
- t->details.array.size_is = size_is;
- else
- t->details.array.dim = dim;
-- t->details.array.elem = element;
-+ if (element) {
-+ t->details.array.elem = *element;
-+ }
- t->details.array.ptr_def_fc = ptr_default_fc;
- return t;
- }
-@@ -273,80 +272,99 @@ type_t *type_new_void(void)
-
- type_t *type_new_enum(const char *name, struct namespace *namespace, int defined, var_list_t *enums)
- {
-- type_t *tag_type = name ? find_type(name, namespace, tsENUM) : NULL;
-- type_t *t = make_type(TYPE_ENUM);
-- t->name = name;
-- t->namespace = namespace;
--
-- if (tag_type && tag_type->details.enumeration)
-- t->details.enumeration = tag_type->details.enumeration;
-- else if (defined)
-+ type_t *t = NULL;
-+
-+ if (name)
-+ t = find_type(name, namespace, tsENUM);
-+
-+ if (!t)
- {
-- t->details.enumeration = xmalloc(sizeof(*t->details.enumeration));
-- t->details.enumeration->enums = enums;
-- t->defined = TRUE;
-+ t = make_type(TYPE_ENUM);
-+ t->name = name;
-+ t->namespace = namespace;
-+ if (name)
-+ reg_type(t, name, namespace, tsENUM);
- }
-
-- if (name)
-+ if (!type_is_defined(t))
- {
- if (defined)
-- reg_type(t, name, namespace, tsENUM);
-+ {
-+ t->details.enumeration = xmalloc(sizeof(*t->details.enumeration));
-+ t->details.enumeration->enums = enums;
-+ t->defined = TRUE;
-+ }
- else
-+ {
- add_incomplete(t);
-+ }
- }
-+
- return t;
- }
-
- type_t *type_new_struct(char *name, struct namespace *namespace, int defined, var_list_t *fields)
- {
-- type_t *tag_type = name ? find_type(name, namespace, tsSTRUCT) : NULL;
-- type_t *t;
--
-- /* avoid creating duplicate typelib type entries */
-- if (tag_type && do_typelib) return tag_type;
-+ type_t *t = NULL;
-
-- t = make_type(TYPE_STRUCT);
-- t->name = name;
-- t->namespace = namespace;
-+ if (name)
-+ t = find_type(name, namespace, tsSTRUCT);
-
-- if (tag_type && tag_type->details.structure)
-- t->details.structure = tag_type->details.structure;
-- else if (defined)
-+ if (!t)
- {
-- t->details.structure = xmalloc(sizeof(*t->details.structure));
-- t->details.structure->fields = fields;
-- t->defined = TRUE;
-+ t = make_type(TYPE_STRUCT);
-+ t->name = name;
-+ t->namespace = namespace;
-+ if (name)
-+ reg_type(t, name, namespace, tsSTRUCT);
- }
-- if (name)
-+
-+ if (!type_is_defined(t))
- {
- if (defined)
-- reg_type(t, name, namespace, tsSTRUCT);
-+ {
-+ t->details.structure = xmalloc(sizeof(*t->details.structure));
-+ t->details.structure->fields = fields;
-+ t->defined = TRUE;
-+ }
- else
-+ {
- add_incomplete(t);
-+ }
- }
-+
- return t;
- }
-
- type_t *type_new_nonencapsulated_union(const char *name, int defined, var_list_t *fields)
- {
-- type_t *tag_type = name ? find_type(name, NULL, tsUNION) : NULL;
-- type_t *t = make_type(TYPE_UNION);
-- t->name = name;
-- if (tag_type && tag_type->details.structure)
-- t->details.structure = tag_type->details.structure;
-- else if (defined)
-+ type_t *t = NULL;
-+
-+ if (name)
-+ t = find_type(name, NULL, tsUNION);
-+
-+ if (!t)
- {
-- t->details.structure = xmalloc(sizeof(*t->details.structure));
-- t->details.structure->fields = fields;
-- t->defined = TRUE;
-+ t = make_type(TYPE_UNION);
-+ t->name = name;
-+ if (name)
-+ reg_type(t, name, NULL, tsUNION);
- }
-- if (name)
-+
-+ if (!type_is_defined(t))
- {
- if (defined)
-- reg_type(t, name, NULL, tsUNION);
-+ {
-+ t->details.structure = xmalloc(sizeof(*t->details.structure));
-+ t->details.structure->fields = fields;
-+ t->defined = TRUE;
-+ }
- else
-+ {
- add_incomplete(t);
-+ }
- }
-+
- return t;
- }
-
-@@ -354,7 +372,7 @@ type_t *type_new_encapsulated_union(char *name, var_t *switch_field, var_t *unio
- {
- type_t *t = get_type(TYPE_ENCAPSULATED_UNION, name, NULL, tsUNION);
- if (!union_field) union_field = make_var( xstrdup("tagged_union") );
-- union_field->type = type_new_nonencapsulated_union(NULL, TRUE, cases);
-+ union_field->declspec.type = type_new_nonencapsulated_union(NULL, TRUE, cases);
- t->details.structure = xmalloc(sizeof(*t->details.structure));
- t->details.structure->fields = append_var( NULL, switch_field );
- t->details.structure->fields = append_var( t->details.structure->fields, union_field );
-@@ -430,7 +448,7 @@ static int compute_method_indexes(type_t *iface)
- {
- var_t *func = stmt->u.var;
- if (!is_callas(func->attrs))
-- func->type->details.function->idx = idx++;
-+ func->declspec.type->details.function->idx = idx++;
- }
-
- return idx;
-@@ -438,6 +456,7 @@ static int compute_method_indexes(type_t *iface)
-
- void type_interface_define(type_t *iface, type_t *inherit, statement_list_t *stmts)
- {
-+ assert(type_get_type_detect_alias(iface) == TYPE_INTERFACE);
- iface->details.iface = xmalloc(sizeof(*iface->details.iface));
- iface->details.iface->disp_props = NULL;
- iface->details.iface->disp_methods = NULL;
-@@ -451,6 +470,7 @@ void type_interface_define(type_t *iface, type_t *inherit, statement_list_t *stm
-
- void type_dispinterface_define(type_t *iface, var_list_t *props, var_list_t *methods)
- {
-+ assert(type_get_type_detect_alias(iface) == TYPE_INTERFACE);
- iface->details.iface = xmalloc(sizeof(*iface->details.iface));
- iface->details.iface->disp_props = props;
- iface->details.iface->disp_methods = methods;
-@@ -465,6 +485,7 @@ void type_dispinterface_define(type_t *iface, var_list_t *props, var_list_t *met
-
- void type_dispinterface_define_from_iface(type_t *dispiface, type_t *iface)
- {
-+ assert(type_get_type_detect_alias(iface) == TYPE_INTERFACE);
- dispiface->details.iface = xmalloc(sizeof(*dispiface->details.iface));
- dispiface->details.iface->disp_props = NULL;
- dispiface->details.iface->disp_methods = NULL;
-@@ -479,6 +500,7 @@ void type_dispinterface_define_from_iface(type_t *dispiface, type_t *iface)
-
- void type_module_define(type_t *module, statement_list_t *stmts)
- {
-+ assert(type_get_type_detect_alias(module) == TYPE_MODULE);
- if (module->details.module) error_loc("multiple definition error\n");
- module->details.module = xmalloc(sizeof(*module->details.module));
- module->details.module->stmts = stmts;
-@@ -487,6 +509,7 @@ void type_module_define(type_t *module, statement_list_t *stmts)
-
- type_t *type_coclass_define(type_t *coclass, ifref_list_t *ifaces)
- {
-+ assert(type_get_type_detect_alias(coclass) == TYPE_COCLASS);
- coclass->details.coclass.ifaces = ifaces;
- coclass->defined = TRUE;
- return coclass;
-diff --git a/mingw-w64-tools/widl/src/typetree.h b/mingw-w64-tools/widl/src/typetree.h
-index fc134cd5..96fcae8d 100644
---- a/mingw-w64-tools/widl/src/typetree.h
-+++ b/mingw-w64-tools/widl/src/typetree.h
-@@ -30,10 +30,10 @@ enum name_type {
- };
-
- type_t *type_new_function(var_list_t *args);
--type_t *type_new_pointer(unsigned char pointer_default, type_t *ref, attr_list_t *attrs);
--type_t *type_new_alias(type_t *t, const char *name);
-+type_t *type_new_pointer(unsigned char pointer_default, type_t *ref);
-+type_t *type_new_alias(const decl_spec_t *aliasee, const char *name);
- type_t *type_new_module(char *name);
--type_t *type_new_array(const char *name, type_t *element, int declptr,
-+type_t *type_new_array(const char* name, const decl_spec_t *element, int declptr,
- unsigned int dim, expr_t *size_is, expr_t *length_is,
- unsigned char ptr_default_fc);
- type_t *type_new_basic(enum type_basic_type basic_type);
-@@ -53,14 +53,38 @@ type_t *type_coclass_define(type_t *coclass, ifref_list_t *ifaces);
- int type_is_equal(const type_t *type1, const type_t *type2);
- const char *type_get_name(const type_t *type, enum name_type name_type);
-
--/* FIXME: shouldn't need to export this */
--type_t *duptype(type_t *t, int dupname);
-+/* copy pointer type to deal with need for duplicate typeformat strings */
-+type_t *dup_pointer_type(type_t *t);
-+
-+#define STATEMENTS_FOR_EACH_FUNC(stmt, stmts) \
-+ if (stmts) LIST_FOR_EACH_ENTRY( stmt, stmts, statement_t, entry ) \
-+ if (stmt->type == STMT_DECLARATION && stmt->u.var->declspec.stgclass == STG_NONE && \
-+ type_get_type_detect_alias(stmt->u.var->declspec.type) == TYPE_FUNCTION)
-+
-+static inline enum type_type type_get_type_detect_alias(const type_t *type)
-+{
-+ if (type->is_alias)
-+ return TYPE_ALIAS;
-+ return type->type_type;
-+}
-+
-+static inline int statements_has_func(const statement_list_t *stmts)
-+{
-+ const statement_t *stmt;
-+ int has_func = 0;
-+ STATEMENTS_FOR_EACH_FUNC(stmt, stmts)
-+ {
-+ has_func = 1;
-+ break;
-+ }
-+ return has_func;
-+}
-
- /* un-alias the type until finding the non-alias type */
- static inline type_t *type_get_real_type(const type_t *type)
- {
- if (type->is_alias)
-- return type_get_real_type(type->orig);
-+ return type_get_real_type(type->details.alias.aliasee.type);
- else
- return (type_t *)type;
- }
-@@ -105,9 +129,14 @@ static inline var_t *type_function_get_retval(const type_t *type)
- return type->details.function->retval;
- }
-
-+static inline const decl_spec_t *type_function_get_retdeclspec(const type_t *type)
-+{
-+ return &type_function_get_retval(type)->declspec;
-+}
-+
- static inline type_t *type_function_get_rettype(const type_t *type)
- {
-- return type_function_get_retval(type)->type;
-+ return type_function_get_retdeclspec(type)->type;
- }
-
- static inline var_list_t *type_enum_get_values(const type_t *type)
-@@ -142,7 +171,7 @@ static inline var_list_t *type_union_get_cases(const type_t *type)
- if (type_type == TYPE_ENCAPSULATED_UNION)
- {
- const var_t *uv = LIST_ENTRY(list_tail(type->details.structure->fields), const var_t, entry);
-- return uv->type->details.structure->fields;
-+ return uv->declspec.type->details.structure->fields;
- }
- else
- return type->details.structure->fields;
-@@ -250,11 +279,16 @@ static inline expr_t *type_array_get_variance(const type_t *type)
- return type->details.array.length_is;
- }
-
--static inline type_t *type_array_get_element(const type_t *type)
-+static inline const decl_spec_t *type_array_get_element(const type_t *type)
- {
- type = type_get_real_type(type);
- assert(type_get_type(type) == TYPE_ARRAY);
-- return type->details.array.elem;
-+ return &type->details.array.elem;
-+}
-+
-+static inline type_t *type_array_get_element_type(const type_t *type)
-+{
-+ return type_array_get_element(type)->type;
- }
-
- static inline int type_array_is_decl_as_ptr(const type_t *type)
-@@ -276,10 +310,15 @@ static inline int type_is_alias(const type_t *type)
- return type->is_alias;
- }
-
--static inline type_t *type_alias_get_aliasee(const type_t *type)
-+static inline const decl_spec_t *type_alias_get_aliasee(const type_t *type)
- {
- assert(type_is_alias(type));
-- return type->orig;
-+ return &type->details.alias.aliasee;
-+}
-+
-+static inline type_t *type_alias_get_aliasee_type(const type_t *type)
-+{
-+ return type_alias_get_aliasee(type)->type;
- }
-
- static inline ifref_list_t *type_coclass_get_ifaces(const type_t *type)
-@@ -289,11 +328,16 @@ static inline ifref_list_t *type_coclass_get_ifaces(const type_t *type)
- return type->details.coclass.ifaces;
- }
-
--static inline type_t *type_pointer_get_ref(const type_t *type)
-+static inline const decl_spec_t *type_pointer_get_ref(const type_t *type)
- {
- type = type_get_real_type(type);
- assert(type_get_type(type) == TYPE_POINTER);
-- return type->details.pointer.ref;
-+ return &type->details.pointer.ref;
-+}
-+
-+static inline type_t *type_pointer_get_ref_type(const type_t *type)
-+{
-+ return type_pointer_get_ref(type)->type;
- }
-
- static inline unsigned char type_pointer_get_default_fc(const type_t *type)
-@@ -317,4 +361,54 @@ static inline const expr_t *type_bitfield_get_bits(const type_t *type)
- return type->details.bitfield.bits;
- }
-
-+/* gets pointer to details_t union with the assumption the caller wants to write to it
-+ * so assert if we're actually dealing with an alias and writing to the details would
-+ * overwrite the alias_details
-+ */
-+static inline details_t *type_get_details(type_t* type)
-+{
-+ assert(!type_is_alias(type));
-+ return &type->details;
-+}
-+
-+/* const overload of type_get_details */
-+
-+static inline const details_t *type_get_const_details(const type_t* type)
-+{
-+ assert(!type_is_alias(type));
-+ return &type->details;
-+}
-+
-+static inline int type_is_pointerish(const type_t *type)
-+{
-+ type = type_get_real_type(type);
-+ return type_get_type(type) == TYPE_ARRAY || type_get_type(type) == TYPE_POINTER;
-+}
-+
-+static inline type_t * type_get_pointer_chain_tail(const type_t *type)
-+{
-+ type_t *pointee = NULL;
-+ type_t *pointer = type_get_real_type(type);
-+
-+ if (type_get_type(pointer) == TYPE_ARRAY)
-+ {
-+ pointee = type_array_get_element_type(pointer);
-+ }
-+ else if (type_get_type(pointer) == TYPE_POINTER)
-+ {
-+ pointee = type_pointer_get_ref_type(pointer);
-+ }
-+ else
-+ {
-+ assert(FALSE);
-+ }
-+
-+ if (type_is_pointerish(pointee))
-+ {
-+ return type_get_pointer_chain_tail(pointee);
-+ }
-+
-+ return pointee;
-+}
-+
- #endif /* WIDL_TYPE_TREE_H */
-diff --git a/mingw-w64-tools/widl/src/widl.c b/mingw-w64-tools/widl/src/widl.c
-index 1af42509..8542e518 100644
---- a/mingw-w64-tools/widl/src/widl.c
-+++ b/mingw-w64-tools/widl/src/widl.c
-@@ -44,11 +44,6 @@
- #include "header.h"
- #include "pathtools.h"
-
--/* future options to reserve characters for: */
--/* A = ACF input filename */
--/* J = do not search standard include path */
--/* w = select win16/win32 output (?) */
--
- static const char usage[] =
- "Usage: widl [options...] infile.idl\n"
- " or: widl [options...] --dlldata-only name1 [name2...]\n"
-@@ -64,7 +59,7 @@ static const char usage[] =
- " -H file Name of header file (default is infile.h)\n"
- " -I path Set include search dir to path (multiple -I allowed)\n"
- " --local-stubs=file Write empty stubs for call_as/local methods to file\n"
--" -m32, -m64 Set the kind of typelib to build (Win32 or Win64)\n"
-+" -m32, -m64 Set the target architecture (Win32 or Win64)\n"
- " -N Do not preprocess input\n"
- " --oldnames Use old naming conventions\n"
- " -o, --output=NAME Set the output file name\n"
-@@ -82,8 +77,7 @@ static const char usage[] =
- " -u Generate interface identifiers file\n"
- " -V Print version and exit\n"
- " -W Enable pedantic warnings\n"
--" --win32 Only generate 32-bit code\n"
--" --win64 Only generate 64-bit code\n"
-+" --win32, --win64 Set the target architecture (Win32 or Win64)\n"
- " --win32-align n Set win32 structure alignment to 'n'\n"
- " --win64-align n Set win64 structure alignment to 'n'\n"
- "Debug level 'n' is a bitmask with following meaning:\n"
-@@ -98,6 +92,20 @@ static const char usage[] =
- static const char version_string[] = "Wine IDL Compiler version " PACKAGE_VERSION "\n"
- "Copyright 2002 Ove Kaaven\n";
-
-+#ifdef __i386__
-+enum target_cpu target_cpu = CPU_x86;
-+#elif defined(__x86_64__)
-+enum target_cpu target_cpu = CPU_x86_64;
-+#elif defined(__powerpc__)
-+enum target_cpu target_cpu = CPU_POWERPC;
-+#elif defined(__arm__)
-+enum target_cpu target_cpu = CPU_ARM;
-+#elif defined(__aarch64__)
-+enum target_cpu target_cpu = CPU_ARM64;
-+#else
-+#error Unsupported CPU
-+#endif
-+
- int debuglevel = DEBUGLEVEL_NONE;
- int parser_debug, yy_flex_debug;
-
-@@ -114,8 +122,6 @@ int do_idfile = 0;
- int do_dlldata = 0;
- static int no_preprocess = 0;
- int old_names = 0;
--int do_win32 = 1;
--int do_win64 = 1;
- int win32_packing = 8;
- int win64_packing = 8;
- int winrt_mode = 0;
-@@ -148,7 +154,6 @@ int line_number = 1;
- static FILE *idfile;
-
- unsigned int pointer_size = 0;
--syskind_t typelib_kind = sizeof(void*) == 8 ? SYS_WIN64 : SYS_WIN32;
-
- time_t now;
-
-@@ -188,6 +193,7 @@ static const struct option long_options[] = {
- { "prefix-client", 1, NULL, PREFIX_CLIENT_OPTION },
- { "prefix-server", 1, NULL, PREFIX_SERVER_OPTION },
- { "robust", 0, NULL, ROBUST_OPTION },
-+ { "target", 0, NULL, 'b' },
- { "winrt", 0, NULL, RT_OPTION },
- { "win32", 0, NULL, WIN32_OPTION },
- { "win64", 0, NULL, WIN64_OPTION },
-@@ -269,20 +275,25 @@ static void set_target( const char *target )
- {
- static const struct
- {
-- const char *name;
-- syskind_t kind;
-+ const char *name;
-+ enum target_cpu cpu;
- } cpu_names[] =
- {
-- { "i386", SYS_WIN32 },
-- { "i486", SYS_WIN32 },
-- { "i586", SYS_WIN32 },
-- { "i686", SYS_WIN32 },
-- { "i786", SYS_WIN32 },
-- { "amd64", SYS_WIN64 },
-- { "x86_64", SYS_WIN64 },
-- { "powerpc", SYS_WIN32 },
-- { "arm", SYS_WIN32 },
-- { "aarch64", SYS_WIN64 }
-+ { "i386", CPU_x86 },
-+ { "i486", CPU_x86 },
-+ { "i586", CPU_x86 },
-+ { "i686", CPU_x86 },
-+ { "i786", CPU_x86 },
-+ { "amd64", CPU_x86_64 },
-+ { "x86_64", CPU_x86_64 },
-+ { "powerpc", CPU_POWERPC },
-+ { "arm", CPU_ARM },
-+ { "armv5", CPU_ARM },
-+ { "armv6", CPU_ARM },
-+ { "armv7", CPU_ARM },
-+ { "armv7a", CPU_ARM },
-+ { "arm64", CPU_ARM64 },
-+ { "aarch64", CPU_ARM64 },
- };
-
- unsigned int i;
-@@ -296,7 +307,7 @@ static void set_target( const char *target )
- {
- if (!strcmp( cpu_names[i].name, spec ))
- {
-- typelib_kind = cpu_names[i].kind;
-+ target_cpu = cpu_names[i].cpu;
- free( spec );
- return;
- }
-@@ -484,6 +495,7 @@ static void write_id_data_stmts(const statement_list_t *stmts)
- uuid = get_attrp(type->attrs, ATTR_UUID);
- write_id_guid(idfile, "IID", is_attr(type->attrs, ATTR_DISPINTERFACE) ? "DIID" : "IID",
- type->name, uuid);
-+ assert(type_get_type_detect_alias(type) == TYPE_INTERFACE);
- if (type->details.iface->async_iface)
- {
- uuid = get_attrp(type->details.iface->async_iface->attrs, ATTR_UUID);
-@@ -606,12 +618,10 @@ int main(int argc,char *argv[])
- use_abi_namespace = 1;
- break;
- case WIN32_OPTION:
-- do_win32 = 1;
-- do_win64 = 0;
-+ pointer_size = 4;
- break;
- case WIN64_OPTION:
-- do_win32 = 0;
-- do_win64 = 1;
-+ pointer_size = 8;
- break;
- case WIN32_ALIGN_OPTION:
- win32_packing = strtol(optarg, NULL, 0);
-@@ -664,8 +674,8 @@ int main(int argc,char *argv[])
- wpp_add_include_path(optarg);
- break;
- case 'm':
-- if (!strcmp( optarg, "32" )) typelib_kind = SYS_WIN32;
-- else if (!strcmp( optarg, "64" )) typelib_kind = SYS_WIN64;
-+ if (!strcmp( optarg, "32" )) pointer_size = 4;
-+ else if (!strcmp( optarg, "64" )) pointer_size = 8;
- break;
- case 'N':
- no_preprocess = 1;
-@@ -726,6 +736,7 @@ int main(int argc,char *argv[])
- }
-
- #ifdef DEFAULT_INCLUDE_DIR
-+ wpp_add_include_path(DEFAULT_INCLUDE_DIR);
- char exe_path[PATH_MAX];
- get_executable_path (argv[0], &exe_path[0], sizeof (exe_path) / sizeof (exe_path[0]));
- char * rel_to_includedir = get_relative_path (DEFAULT_BINDIR, DEFAULT_INCLUDE_DIR);
-@@ -739,6 +750,26 @@ int main(int argc,char *argv[])
- wpp_add_include_path(relocated_default_include_dir);
- #endif
-
-+ switch (target_cpu)
-+ {
-+ case CPU_x86:
-+ if (pointer_size == 8) target_cpu = CPU_x86_64;
-+ else pointer_size = 4;
-+ break;
-+ case CPU_x86_64:
-+ if (pointer_size == 4) target_cpu = CPU_x86;
-+ else pointer_size = 8;
-+ break;
-+ case CPU_ARM64:
-+ if (pointer_size == 4) error( "Cannot build 32-bit code for this CPU\n" );
-+ pointer_size = 8;
-+ break;
-+ default:
-+ if (pointer_size == 8) error( "Cannot build 64-bit code for this CPU\n" );
-+ pointer_size = 4;
-+ break;
-+ }
-+
- /* if nothing specified, try to guess output type from the output file name */
- if (output_name && do_everything && !do_header && !do_typelib && !do_proxies &&
- !do_client && !do_server && !do_regscript && !do_idfile && !do_dlldata)
-diff --git a/mingw-w64-tools/widl/src/widl.h b/mingw-w64-tools/widl/src/widl.h
-index 118e2245..4f4252e3 100644
---- a/mingw-w64-tools/widl/src/widl.h
-+++ b/mingw-w64-tools/widl/src/widl.h
-@@ -45,8 +45,6 @@ extern int do_regscript;
- extern int do_idfile;
- extern int do_dlldata;
- extern int old_names;
--extern int do_win32;
--extern int do_win64;
- extern int win32_packing;
- extern int win64_packing;
- extern int winrt_mode;
-@@ -76,6 +74,13 @@ extern time_t now;
- extern int line_number;
- extern int char_number;
-
-+enum target_cpu
-+{
-+ CPU_x86, CPU_x86_64, CPU_POWERPC, CPU_ARM, CPU_ARM64, CPU_LAST = CPU_ARM64
-+};
-+
-+extern enum target_cpu target_cpu;
-+
- enum stub_mode
- {
- MODE_Os, /* inline stubs */
-diff --git a/mingw-w64-tools/widl/src/widltypes.h b/mingw-w64-tools/widl/src/widltypes.h
-index 08584de5..cd71e9af 100644
---- a/mingw-w64-tools/widl/src/widltypes.h
-+++ b/mingw-w64-tools/widl/src/widltypes.h
-@@ -40,6 +40,7 @@ typedef struct _attr_t attr_t;
- typedef struct _expr_t expr_t;
- typedef struct _type_t type_t;
- typedef struct _var_t var_t;
-+typedef struct _decl_spec_t decl_spec_t;
- typedef struct _declarator_t declarator_t;
- typedef struct _ifref_t ifref_t;
- typedef struct _typelib_entry_t typelib_entry_t;
-@@ -80,7 +81,6 @@ enum attr_type
- ATTR_CASE,
- ATTR_CODE,
- ATTR_COMMSTATUS,
-- ATTR_CONST, /* const pseudo-attribute */
- ATTR_CONTEXTHANDLE,
- ATTR_CONTROL,
- ATTR_DECODE,
-@@ -115,7 +115,6 @@ enum attr_type
- ATTR_IMMEDIATEBIND,
- ATTR_IMPLICIT_HANDLE,
- ATTR_IN,
-- ATTR_INLINE,
- ATTR_INPUTSYNC,
- ATTR_LENGTHIS,
- ATTR_LIBLCID,
-@@ -234,6 +233,18 @@ enum storage_class
- STG_REGISTER,
- };
-
-+enum type_qualifier
-+{
-+ TYPE_QUALIFIER_NONE = 0,
-+ TYPE_QUALIFIER_CONST = 1,
-+};
-+
-+enum function_specifier
-+{
-+ FUNCTION_SPECIFIER_NONE,
-+ FUNCTION_SPECIFIER_INLINE,
-+};
-+
- enum statement_type
- {
- STMT_LIBRARY,
-@@ -293,6 +304,14 @@ struct str_list_entry_t
- struct list entry;
- };
-
-+struct _decl_spec_t
-+{
-+ type_t *type;
-+ enum storage_class stgclass;
-+ enum type_qualifier typequalifier;
-+ enum function_specifier funcspecifier;
-+};
-+
- struct _attr_t {
- enum attr_type type;
- union {
-@@ -356,7 +375,7 @@ struct array_details
- {
- expr_t *size_is;
- expr_t *length_is;
-- struct _type_t *elem;
-+ struct _decl_spec_t elem;
- unsigned int dim;
- unsigned char ptr_def_fc;
- unsigned char declptr; /* if declared as a pointer */
-@@ -376,7 +395,7 @@ struct basic_details
-
- struct pointer_details
- {
-- struct _type_t *ref;
-+ struct _decl_spec_t ref;
- unsigned char def_fc;
- };
-
-@@ -386,6 +405,11 @@ struct bitfield_details
- const expr_t *bits;
- };
-
-+struct alias_details
-+{
-+ struct _decl_spec_t aliasee;
-+};
-+
- #define HASHMAX 64
-
- struct namespace {
-@@ -414,26 +438,28 @@ enum type_type
- TYPE_BITFIELD,
- };
-
-+typedef union _details_t
-+{
-+ struct struct_details *structure;
-+ struct enumeration_details *enumeration;
-+ struct func_details *function;
-+ struct iface_details *iface;
-+ struct module_details *module;
-+ struct array_details array;
-+ struct coclass_details coclass;
-+ struct basic_details basic;
-+ struct pointer_details pointer;
-+ struct bitfield_details bitfield;
-+ struct alias_details alias;
-+} details_t;
-+
- struct _type_t {
- const char *name;
- struct namespace *namespace;
- enum type_type type_type;
- attr_list_t *attrs;
-- union
-- {
-- struct struct_details *structure;
-- struct enumeration_details *enumeration;
-- struct func_details *function;
-- struct iface_details *iface;
-- struct module_details *module;
-- struct array_details array;
-- struct coclass_details coclass;
-- struct basic_details basic;
-- struct pointer_details pointer;
-- struct bitfield_details bitfield;
-- } details;
-+ details_t details;
- const char *c_name;
-- type_t *orig; /* dup'd types */
- unsigned int typestring_offset;
- unsigned int ptrdesc; /* used for complex structs */
- int typelib_idx;
-@@ -449,14 +475,20 @@ struct _type_t {
-
- struct _var_t {
- char *name;
-- type_t *type;
-+ decl_spec_t declspec;
- attr_list_t *attrs;
- expr_t *eval;
-- enum storage_class stgclass;
- unsigned int procstring_offset;
- unsigned int typestring_offset;
-
- struct _loc_info_t loc_info;
-+ /* this flag indicates that this var's type (or pointed to type in the case of
-+ * array or pointer) was not fully defined at the time of declaration.
-+ * If this flag is set to TRUE then the type definition will not be written for this var
-+ * If this flag is set to FALSE then the type definition will only be written if it has not
-+ * been written yet (determined by the type_t's 'written' flag)
-+ */
-+ int declonly : 1;
-
- /* parser-internal */
- struct list entry;
-@@ -464,7 +496,7 @@ struct _var_t {
-
- struct _declarator_t {
- var_t *var;
-- type_t *type;
-+ decl_spec_t declspec;
- type_t *func_type;
- expr_t *bits;
-
-@@ -497,6 +529,7 @@ struct _importinfo_t {
- };
-
- struct _importlib_t {
-+ int offset;
- char *name;
-
- int version;
-@@ -539,6 +572,13 @@ struct _statement_t {
- typelib_t *lib;
- type_list_t *type_list;
- } u;
-+ /* this flag indicates that this statement's type (or pointed to type in the case of
-+ * array or pointer) was not fully defined at the time of declaration.
-+ * If this flag is set to TRUE then the type definition will not be written for this statement
-+ * If this flag is set to FALSE then the type definition will only be written if it has not
-+ * been written yet (determined by the type_t's 'written' flag)
-+ */
-+ int declonly : 1;
- };
-
- struct _warning_t {
-@@ -553,11 +593,10 @@ typedef enum {
- SYS_WIN64
- } syskind_t;
-
--extern syskind_t typelib_kind;
- extern user_type_list_t user_type_list;
- extern context_handle_list_t context_handle_list;
- extern generic_handle_list_t generic_handle_list;
--void check_for_additional_prototype_types(const var_list_t *list);
-+void check_for_additional_prototype_types(type_t *type);
-
- void init_types(void);
- type_t *alloc_type(void);
-@@ -582,38 +621,18 @@ void init_loc_info(loc_info_t *);
-
- char *format_namespace(struct namespace *namespace, const char *prefix, const char *separator, const char *suffix);
-
--static inline var_list_t *type_get_function_args(const type_t *func_type)
--{
-- return func_type->details.function->args;
--}
--
--static inline enum type_type type_get_type_detect_alias(const type_t *type)
--{
-- if (type->is_alias)
-- return TYPE_ALIAS;
-- return type->type_type;
--}
--
--#define STATEMENTS_FOR_EACH_FUNC(stmt, stmts) \
-- if (stmts) LIST_FOR_EACH_ENTRY( stmt, stmts, statement_t, entry ) \
-- if (stmt->type == STMT_DECLARATION && stmt->u.var->stgclass == STG_NONE && \
-- type_get_type_detect_alias(stmt->u.var->type) == TYPE_FUNCTION)
--
--static inline int statements_has_func(const statement_list_t *stmts)
-+static inline int is_global_namespace(const struct namespace *namespace)
- {
-- const statement_t *stmt;
-- int has_func = 0;
-- STATEMENTS_FOR_EACH_FUNC(stmt, stmts)
-- {
-- has_func = 1;
-- break;
-- }
-- return has_func;
-+ return !namespace->name;
- }
-
--static inline int is_global_namespace(const struct namespace *namespace)
-+static inline decl_spec_t *init_declspec(decl_spec_t *declspec, type_t *type)
- {
-- return !namespace->name;
-+ declspec->type = type;
-+ declspec->stgclass = STG_NONE;
-+ declspec->typequalifier=TYPE_QUALIFIER_NONE;
-+ declspec->funcspecifier=FUNCTION_SPECIFIER_NONE;
-+ return declspec;
- }
-
- #endif
-diff --git a/mingw-w64-tools/widl/src/write_msft.c b/mingw-w64-tools/widl/src/write_msft.c
-index 88a80d12..da7ce89d 100644
---- a/mingw-w64-tools/widl/src/write_msft.c
-+++ b/mingw-w64-tools/widl/src/write_msft.c
-@@ -702,15 +702,15 @@ static void alloc_importinfo(msft_typelib_t *typelib, importinfo_t *importinfo)
-
- guid_idx = ctl2_alloc_guid(typelib, &guid);
-
-- alloc_importfile(typelib, guid_idx, importlib->version&0xffff,
-- importlib->version>>16, importlib->name);
-+ importlib->offset = alloc_importfile(typelib, guid_idx, importlib->version & 0xffff,
-+ importlib->version >> 16, importlib->name);
- }
-
- if(importinfo->offset == -1 || !(importinfo->flags & MSFT_IMPINFO_OFFSET_IS_GUID)) {
- MSFT_ImpInfo impinfo;
-
- impinfo.flags = importinfo->flags;
-- impinfo.oImpFile = 0;
-+ impinfo.oImpFile = importlib->offset;
-
- if(importinfo->flags & MSFT_IMPINFO_OFFSET_IS_GUID) {
- MSFT_GuidEntry guid;
-@@ -763,7 +763,7 @@ static void add_enum_typeinfo(msft_typelib_t *typelib, type_t *enumeration);
- static void add_union_typeinfo(msft_typelib_t *typelib, type_t *tunion);
- static void add_coclass_typeinfo(msft_typelib_t *typelib, type_t *cls);
- static void add_dispinterface_typeinfo(msft_typelib_t *typelib, type_t *dispinterface);
--
-+static void add_typedef_typeinfo(msft_typelib_t *typelib, type_t *tdef);
-
- /****************************************************************************
- * encode_type
-@@ -862,8 +862,8 @@ static int encode_type(
- case VT_PTR:
- {
- int next_vt;
-- for(next_vt = 0; is_ptr(type); type = type_pointer_get_ref(type)) {
-- next_vt = get_type_vt(type_pointer_get_ref(type));
-+ for(next_vt = 0; is_ptr(type); type = type_pointer_get_ref_type(type)) {
-+ next_vt = get_type_vt(type_pointer_get_ref_type(type));
- if (next_vt != 0)
- break;
- }
-@@ -871,7 +871,7 @@ static int encode_type(
- if (next_vt == 0)
- next_vt = VT_VOID;
-
-- encode_type(typelib, next_vt, type_pointer_get_ref(type),
-+ encode_type(typelib, next_vt, type_pointer_get_ref_type(type),
- &target_type, &child_size);
- /* these types already have an implicit pointer, so we don't need to
- * add another */
-@@ -912,10 +912,10 @@ static int encode_type(
-
- case VT_SAFEARRAY:
- {
-- type_t *element_type = type_alias_get_aliasee(type_array_get_element(type));
-+ type_t *element_type = type_alias_get_aliasee_type(type_array_get_element_type(type));
- int next_vt = get_type_vt(element_type);
-
-- encode_type(typelib, next_vt, type_alias_get_aliasee(type_array_get_element(type)),
-+ encode_type(typelib, next_vt, type_alias_get_aliasee_type(type_array_get_element_type(type)),
- &target_type, &child_size);
-
- for (typeoffset = 0; typeoffset < typelib->typelib_segdir[MSFT_SEG_TYPEDESC].length; typeoffset += 8) {
-@@ -966,33 +966,61 @@ static int encode_type(
- }
- else
- {
-- /* typedef'd types without public attribute aren't included in the typelib */
-- while (type_is_alias(type) && !is_attr(type->attrs, ATTR_PUBLIC))
-- type = type_alias_get_aliasee(type);
-+ /* typedef'd types without public attribute aren't included in the typelib
-+ * typedef'd types with a wire_marshal attribute must be included
-+ */
-+ while (type_is_alias(type))
-+ {
-+ if (is_attr(type->attrs, ATTR_WIREMARSHAL))
-+ {
-+ type = get_attrp(type->attrs, ATTR_WIREMARSHAL);
-+ break;
-+ }
-+ else if(!is_attr(type->attrs, ATTR_PUBLIC))
-+ {
-+ type = type_alias_get_aliasee_type(type);
-+ }
-+ else
-+ {
-+ break;
-+ }
-+ }
-
- chat("encode_type: VT_USERDEFINED - adding new type %s, real type %d\n",
- type->name, type_get_type(type));
-
-- switch (type_get_type(type))
-+ /* we've either fully resolved the typedef down to an actual type or
-+ * we must include the typedef because it's a wiremarshal (or public) type
-+ */
-+ if (type_is_alias(type))
- {
-- case TYPE_STRUCT:
-- add_structure_typeinfo(typelib, type);
-- break;
-- case TYPE_INTERFACE:
-- add_interface_typeinfo(typelib, type);
-- break;
-- case TYPE_ENUM:
-- add_enum_typeinfo(typelib, type);
-- break;
-- case TYPE_UNION:
-- add_union_typeinfo(typelib, type);
-- break;
-- case TYPE_COCLASS:
-- add_coclass_typeinfo(typelib, type);
-- break;
-- default:
-- error("encode_type: VT_USERDEFINED - unhandled type %d\n",
-- type_get_type(type));
-+ add_typedef_typeinfo(typelib, type);
-+ }
-+ else
-+ {
-+ switch (type_get_type(type))
-+ {
-+ case TYPE_STRUCT:
-+ add_structure_typeinfo(typelib, type);
-+ break;
-+ case TYPE_INTERFACE:
-+ add_interface_typeinfo(typelib, type);
-+ break;
-+ case TYPE_ENUM:
-+ add_enum_typeinfo(typelib, type);
-+ break;
-+ /* fallthrough */
-+ case TYPE_UNION:
-+ case TYPE_ENCAPSULATED_UNION:
-+ add_union_typeinfo(typelib, type);
-+ break;
-+ case TYPE_COCLASS:
-+ add_coclass_typeinfo(typelib, type);
-+ break;
-+ default:
-+ error("encode_type: VT_USERDEFINED - unhandled type %d\n",
-+ type_get_type(type));
-+ }
- }
-
- typeinfo_offset = typelib->typelib_typeinfo_offsets[type->typelib_idx];
-@@ -1056,7 +1084,7 @@ static int encode_var(
- num_dims = 0;
- for (atype = type;
- is_array(atype) && !type_array_is_decl_as_ptr(atype);
-- atype = type_array_get_element(atype))
-+ atype = type_array_get_element_type(atype))
- ++num_dims;
-
- chat("array with %d dimensions\n", num_dims);
-@@ -1071,7 +1099,7 @@ static int encode_var(
- arraydata += 2;
- for (atype = type;
- is_array(atype) && !type_array_is_decl_as_ptr(atype);
-- atype = type_array_get_element(atype))
-+ atype = type_array_get_element_type(atype))
- {
- arraydata[0] = type_array_get_dim(atype);
- arraydata[1] = 0;
-@@ -1093,7 +1121,7 @@ static int encode_var(
- vt = get_type_vt(type);
- if (vt == VT_PTR) {
- type_t *ref = is_ptr(type) ?
-- type_pointer_get_ref(type) : type_array_get_element(type);
-+ type_pointer_get_ref_type(type) : type_array_get_element_type(type);
- int skip_ptr = encode_var(typelib, ref, var, &target_type, &child_size);
-
- if(skip_ptr == 2) {
-@@ -1114,7 +1142,7 @@ static int encode_var(
- if (target_type & 0x80000000) {
- mix_field = ((target_type >> 16) & 0x3fff) | VT_BYREF;
- } else if (get_type_vt(ref) == VT_SAFEARRAY) {
-- type_t *element_type = type_alias_get_aliasee(type_array_get_element(ref));
-+ type_t *element_type = type_alias_get_aliasee_type(type_array_get_element_type(ref));
- mix_field = get_type_vt(element_type) | VT_ARRAY | VT_BYREF;
- } else {
- typedata = (void *)&typelib->typelib_segment_data[MSFT_SEG_TYPEDESC][target_type];
-@@ -1204,7 +1232,7 @@ static void write_default_value(msft_typelib_t *typelib, type_t *type, expr_t *e
- if (type_get_type(type) == TYPE_ENUM) {
- vt = VT_I4;
- } else if (is_ptr(type)) {
-- vt = get_type_vt(type_pointer_get_ref(type));
-+ vt = get_type_vt(type_pointer_get_ref_type(type));
- if (vt == VT_USERDEFINED)
- vt = VT_I4;
- if (expr->cval)
-@@ -1301,8 +1329,8 @@ static HRESULT add_func_desc(msft_typeinfo_t* typeinfo, var_t *func, int index)
- return S_FALSE;
- }
-
-- if (type_get_function_args(func->type))
-- LIST_FOR_EACH_ENTRY( arg, type_get_function_args(func->type), var_t, entry )
-+ if (type_function_get_args(func->declspec.type))
-+ LIST_FOR_EACH_ENTRY( arg, type_function_get_args(func->declspec.type), var_t, entry )
- {
- num_params++;
- if (arg->attrs) LIST_FOR_EACH_ENTRY( attr, arg->attrs, const attr_t, entry ) {
-@@ -1444,7 +1472,7 @@ static HRESULT add_func_desc(msft_typeinfo_t* typeinfo, var_t *func, int index)
-
- /* fill out the basic type information */
- typedata[0] = typedata_size | (index << 16);
-- encode_var(typeinfo->typelib, type_function_get_rettype(func->type), func,
-+ encode_var(typeinfo->typelib, type_function_get_rettype(func->declspec.type), func,
- &typedata[1], &decoded_size);
- typedata[2] = funcflags;
- typedata[3] = ((52 /*sizeof(FUNCDESC)*/ + decoded_size) << 16) | typeinfo->typeinfo->cbSizeVft;
-@@ -1471,10 +1499,10 @@ static HRESULT add_func_desc(msft_typeinfo_t* typeinfo, var_t *func, int index)
- warning("unknown number of optional attrs\n");
- }
-
-- if (type_get_function_args(func->type))
-+ if (type_function_get_args(func->declspec.type))
- {
- i = 0;
-- LIST_FOR_EACH_ENTRY( arg, type_get_function_args(func->type), var_t, entry )
-+ LIST_FOR_EACH_ENTRY( arg, type_function_get_args(func->declspec.type), var_t, entry )
- {
- int paramflags = 0;
- int *paramdata = typedata + 6 + extra_attr + (num_defaults ? num_params : 0) + i * 3;
-@@ -1482,13 +1510,13 @@ static HRESULT add_func_desc(msft_typeinfo_t* typeinfo, var_t *func, int index)
-
- if(defaultdata) *defaultdata = -1;
-
-- encode_var(typeinfo->typelib, arg->type, arg, paramdata, &decoded_size);
-+ encode_var(typeinfo->typelib, arg->declspec.type, arg, paramdata, &decoded_size);
- if (arg->attrs) LIST_FOR_EACH_ENTRY( attr, arg->attrs, const attr_t, entry ) {
- switch(attr->type) {
- case ATTR_DEFAULTVALUE:
- {
- paramflags |= 0x30; /* PARAMFLAG_FHASDEFAULT | PARAMFLAG_FOPT */
-- write_default_value(typeinfo->typelib, arg->type, (expr_t *)attr->u.pval, defaultdata);
-+ write_default_value(typeinfo->typelib, arg->declspec.type, (expr_t *)attr->u.pval, defaultdata);
- break;
- }
- case ATTR_IN:
-@@ -1572,10 +1600,10 @@ static HRESULT add_func_desc(msft_typeinfo_t* typeinfo, var_t *func, int index)
- if(typeinfo->typekind == TKIND_MODULE)
- namedata[9] |= 0x20;
-
-- if (type_get_function_args(func->type))
-+ if (type_function_get_args(func->declspec.type))
- {
- i = 0;
-- LIST_FOR_EACH_ENTRY( arg, type_get_function_args(func->type), var_t, entry )
-+ LIST_FOR_EACH_ENTRY( arg, type_function_get_args(func->declspec.type), var_t, entry )
- {
- /* don't give the last arg of a [propput*] func a name */
- if(i != num_params - 1 || (invokekind != 0x4 /* INVOKE_PROPERTYPUT */ && invokekind != 0x8 /* INVOKE_PROPERTYPUTREF */))
-@@ -1697,8 +1725,8 @@ static HRESULT add_var_desc(msft_typeinfo_t *typeinfo, UINT index, var_t* var)
- typeinfo->var_offsets[var_num] = offset;
-
- /* figure out type widths and whatnot */
-- var_datawidth = type_memsize_and_alignment(var->type, &var_alignment);
-- encode_var(typeinfo->typelib, var->type, var, &typedata[1], &var_type_size);
-+ var_datawidth = type_memsize_and_alignment(var->declspec.type, &var_alignment);
-+ encode_var(typeinfo->typelib, var->declspec.type, var, &typedata[1], &var_type_size);
-
- /* pad out starting position to data width */
- typeinfo->datawidth += var_alignment - 1;
-@@ -1977,6 +2005,7 @@ static void add_dispinterface_typeinfo(msft_typelib_t *typelib, type_t *dispinte
- var_t *var;
- msft_typeinfo_t *msft_typeinfo;
-
-+ assert(type_get_type_detect_alias(dispinterface) == TYPE_INTERFACE);
- if (-1 < dispinterface->typelib_idx)
- return;
-
-@@ -2181,7 +2210,7 @@ static void add_typedef_typeinfo(msft_typelib_t *typelib, type_t *tdef)
- if (-1 < tdef->typelib_idx)
- return;
-
-- type = type_alias_get_aliasee(tdef);
-+ type = type_alias_get_aliasee_type(tdef);
-
- if (!type->name || strcmp(tdef->name, type->name) != 0)
- {
-@@ -2297,6 +2326,7 @@ static void add_module_typeinfo(msft_typelib_t *typelib, type_t *module)
- const statement_t *stmt;
- msft_typeinfo_t *msft_typeinfo;
-
-+ assert(type_get_type_detect_alias(module) == TYPE_MODULE);
- if (-1 < module->typelib_idx)
- return;
-
-@@ -2364,7 +2394,7 @@ static void add_entry(msft_typelib_t *typelib, const statement_t *stmt)
- if (is_attr(type_entry->type->attrs, ATTR_PUBLIC))
- add_typedef_typeinfo(typelib, type_entry->type);
- else
-- add_type_typeinfo(typelib, type_alias_get_aliasee(type_entry->type));
-+ add_type_typeinfo(typelib, type_alias_get_aliasee_type(type_entry->type));
- }
- break;
- }
-@@ -2653,8 +2683,6 @@ int create_msft_typelib(typelib_t *typelib)
- GUID midl_info_guid = {0xde77ba65,0x517c,0x11d1,{0xa2,0xda,0x00,0x00,0xf8,0x77,0x3c,0xe9}};
- char info_string[128];
-
-- pointer_size = (typelib_kind == SYS_WIN64) ? 8 : 4;
--
- msft = xmalloc(sizeof(*msft));
- memset(msft, 0, sizeof(*msft));
- msft->typelib = typelib;
-@@ -2662,7 +2690,7 @@ int create_msft_typelib(typelib_t *typelib)
- ctl2_init_header(msft);
- ctl2_init_segdir(msft);
-
-- msft->typelib_header.varflags |= typelib_kind;
-+ msft->typelib_header.varflags |= (pointer_size == 8) ? SYS_WIN64 : SYS_WIN32;
-
- /*
- * The following two calls return an offset or -1 if out of memory. We
diff --git a/projects/mingw-w64/build b/projects/mingw-w64/build
index faa5997..4be660d 100644
--- a/projects/mingw-w64/build
+++ b/projects/mingw-w64/build
@@ -52,9 +52,6 @@ cd /var/tmp/build/builddir/mingw-w64/mingw-w64-pthread
make -j[% c("buildconf/num_procs") %]
make install
-# patch mingw with widl fixes for #27503 ( https://trac.torproject.org/projects/tor/ticket/27503 )
-patch -p1 -d /var/tmp/build/[% project %]-[% c("version") %] < $rootdir/27503.patch
-
mkdir -p /var/tmp/build/builddir/mingw-w64/widl32
cd /var/tmp/build/builddir/mingw-w64/widl32
/var/tmp/build/[% project %]-[% c("version") %]/mingw-w64-tools/widl/configure \
diff --git a/projects/mingw-w64/config b/projects/mingw-w64/config
index a2f0701..3bb1dda 100644
--- a/projects/mingw-w64/config
+++ b/projects/mingw-w64/config
@@ -1,7 +1,7 @@
# vim: filetype=yaml sw=2
filename: '[% project %]-[% c("version") %]-[% c("var/build_id") %].tar.gz'
git_url: https://git.code.sf.net/p/mingw-w64/mingw-w64
-git_hash: 2d4e517ad0c7a9f0bd7001c42e6c131b977c15d9
+git_hash: 2d52c4b3433e55b1c454f9567c0ae9adc4b83b41
version: '[% c("abbrev") %]'
var:
container:
@@ -35,4 +35,3 @@ input_files:
- name: binutils
project: binutils
- filename: libtool-sort.patch
- - filename: 27503.patch
1
0

27 Aug '19
commit 9117a7ac078e6089ca4a0a01f8129206e1195ed9
Author: Georg Koppen <gk(a)torproject.org>
Date: Tue Aug 27 15:48:01 2019 +0000
Bug 28119: Tor Browser for aarch64
There is actually no --disable-tor-launcher option on stable yet.
Remove it.
---
projects/firefox/mozconfig-android-aarch64 | 3 ---
1 file changed, 3 deletions(-)
diff --git a/projects/firefox/mozconfig-android-aarch64 b/projects/firefox/mozconfig-android-aarch64
index 2a9eb67..39d0e1d 100644
--- a/projects/firefox/mozconfig-android-aarch64
+++ b/projects/firefox/mozconfig-android-aarch64
@@ -19,9 +19,6 @@ ac_add_options --with-clang-path=/var/tmp/dist/android-toolchain/android-ndk/arm
ac_add_options --with-android-distribution-directory=@TOPSRCDIR@/mobile/android/torbrowser
ac_add_options --with-l10n-base=/var/tmp/dist/locales
-# We do not use Tor Launcher on Android:
-ac_add_options --disable-tor-launcher
-
if [ -z "${TB_BUILD_WITH_UPDATER}" ]; then
# Because Google Play will likely be the primary distribution medium,
# we disable updating and rely on Google Play by default. The
1
0

[torbutton/master] Bug 31520: Remove monthly giving banner from Tor Browser
by gk@torproject.org 27 Aug '19
by gk@torproject.org 27 Aug '19
27 Aug '19
commit 133eb64aee4bd929f792b5e91d9a73e35f826161
Author: Alex Catarineu <acat(a)torproject.org>
Date: Tue Aug 27 13:31:25 2019 +0200
Bug 31520: Remove monthly giving banner from Tor Browser
This reverts commit 676f9b37aa8a74c4fb0e2d624d7e4b2a73082352.
---
chrome/content/aboutTor/aboutTor-content.js | 19 -------
chrome/content/aboutTor/aboutTor.xhtml | 13 -----
chrome/content/torbutton.js | 17 ------
chrome/locale/en-US/aboutTor.dtd | 3 -
chrome/skin/aboutTor.css | 83 ----------------------------
chrome/skin/icon_monthly_donors.png | Bin 3093 -> 0 bytes
defaults/preferences/preferences.js | 1 -
7 files changed, 136 deletions(-)
diff --git a/chrome/content/aboutTor/aboutTor-content.js b/chrome/content/aboutTor/aboutTor-content.js
index 01b4c2c7..4a77af53 100644
--- a/chrome/content/aboutTor/aboutTor-content.js
+++ b/chrome/content/aboutTor/aboutTor-content.js
@@ -22,7 +22,6 @@ let { bindPrefAndInit, show_torbrowser_manual } = ChromeUtils.import("resource:/
var AboutTorListener = {
kAboutTorLoadedMessage: "AboutTor:Loaded",
kAboutTorChromeDataMessage: "AboutTor:ChromeData",
- kAboutTorHideDonationBanner: "AboutTor:HideDonationBanner",
get isAboutTor() {
return content.document.documentURI.toLowerCase() == "about:tor";
@@ -57,22 +56,6 @@ var AboutTorListener = {
}
},
- setupBannerClosing: function () {
- let that = this;
- let closer = content.document.getElementById("donation-banner-closer");
- closer.addEventListener("click", function () {
- sendAsyncMessage(that.kAboutTorHideDonationBanner);
- });
-
- bindPrefAndInit("extensions.torbutton.donation_banner_countdown3",
- countdown => {
- if (content.document && content.document.body) {
- content.document.body.setAttribute(
- "show-donation-banner", countdown > 0);
- }
- });
- },
-
onPageLoad: function() {
// Arrange to update localized text and links.
bindPrefAndInit("intl.locale.requested", aNewVal => {
@@ -81,8 +64,6 @@ var AboutTorListener = {
}
});
- this.setupBannerClosing();
-
// Add message and event listeners.
addMessageListener(this.kAboutTorChromeDataMessage, this);
addEventListener("pagehide", this, false);
diff --git a/chrome/content/aboutTor/aboutTor.xhtml b/chrome/content/aboutTor/aboutTor.xhtml
index 106bd936..4736f653 100644
--- a/chrome/content/aboutTor/aboutTor.xhtml
+++ b/chrome/content/aboutTor/aboutTor.xhtml
@@ -34,19 +34,6 @@ window.addEventListener("pageshow", function() {
</script>
</head>
<body dir="&locale.dir;">
- <div id="donation-banner">
- <div><!--EMPTY SPACER DIV--></div>
- <div id="donation-banner-message">
- <div id="donation-banner-icon"></div>
- <div>&aboutTor.donationBanner3.line1;
- <a href="https://donate.torproject.org/monthly-giving">
- &aboutTor.donationBanner3.line2;
- </a>
- </div>
- </div>
- <div id="donation-banner-closer">×</div>
- </div>
-
<div class="torcontent-container">
<div id="torbrowser-info">
<div id="torbrowser-version"/>
diff --git a/chrome/content/torbutton.js b/chrome/content/torbutton.js
index 0ad9d620..756c2c7c 100644
--- a/chrome/content/torbutton.js
+++ b/chrome/content/torbutton.js
@@ -26,7 +26,6 @@ const k_tb_last_browser_version_pref = "extensions.torbutton.lastBrowserVersion"
const k_tb_browser_update_needed_pref = "extensions.torbutton.updateNeeded";
const k_tb_last_update_check_pref = "extensions.torbutton.lastUpdateCheck";
const k_tb_tor_check_failed_topic = "Torbutton:TorCheckFailed";
-const k_tb_donation_banner_countdown = "extensions.torbutton.donation_banner_countdown3";
var m_tb_prefs = Services.prefs;
@@ -217,14 +216,6 @@ function torbutton_init_toolbutton()
}
}
-// Show the donation banner a finite number of times.
-function torbutton_donation_banner_countdown() {
- let count = m_tb_prefs.getIntPref(k_tb_donation_banner_countdown, 0);
- if (count > 0) {
- m_tb_prefs.setIntPref(k_tb_donation_banner_countdown, count - 1);
- }
-}
-
function torbutton_is_mobile() {
return Services.appinfo.OS === "Android";
}
@@ -339,10 +330,6 @@ function torbutton_init() {
// Add about:tor IPC message listener.
window.messageManager.addMessageListener("AboutTor:Loaded",
torbutton_abouttor_message_handler);
- window.messageManager.addMessageListener("AboutTor:HideDonationBanner",
- torbutton_abouttor_message_handler);
-
- torbutton_donation_banner_countdown();
setupPreferencesForMobile();
@@ -457,10 +444,6 @@ var torbutton_abouttor_message_handler = {
aMessage.target.messageManager.sendAsyncMessage("AboutTor:ChromeData",
this.getChromeData(true));
break;
- case "AboutTor:HideDonationBanner":
- torbutton_log(5, "message AboutTor:HideDonationBanner received");
- m_tb_prefs.setIntPref(k_tb_donation_banner_countdown, 0);
- break;
}
},
diff --git a/chrome/locale/en-US/aboutTor.dtd b/chrome/locale/en-US/aboutTor.dtd
index 5757fae4..c4273ad2 100644
--- a/chrome/locale/en-US/aboutTor.dtd
+++ b/chrome/locale/en-US/aboutTor.dtd
@@ -30,6 +30,3 @@
<!ENTITY aboutTor.newsletter.link_text "Sign up for Tor News.">
<!ENTITY aboutTor.donationBanner.line2e "Keep Tor strong.">
<!ENTITY aboutTor.donationBanner.buttonA "Donate Now">
-
-<!ENTITY aboutTor.donationBanner3.line1 "Automatic monthly donations keep Tor strong.">
-<!ENTITY aboutTor.donationBanner3.line2 "Become a Defender of Privacy today.">
diff --git a/chrome/skin/aboutTor.css b/chrome/skin/aboutTor.css
index 09f6208d..baa92b42 100644
--- a/chrome/skin/aboutTor.css
+++ b/chrome/skin/aboutTor.css
@@ -137,12 +137,6 @@ body:not([showmanual]) .showForManual {
margin-top: 10vh;
}
-/* Reducing this on mobile to avoid vertical overflow
- * on small screens when showing donation banner */
-body[mobile] #bottom {
- margin-top: 3vh;
-}
-
#bottom p {
font-size: 10px;
text-align: start;
@@ -310,83 +304,6 @@ body[mobile] #bottom {
border-radius: 50px 50px 0 0;
}
-/* Donation Banner
- * While this banner is present, we need to
- * offset the elements normally at the top of
- * the window.
- */
-
-#donation-banner {
- display: flex;
- align-items: stretch;
- background-color: white;
- color: var(--abouttor-bg-toron-color);
- font-size: 16px;
- height: 70px;
- justify-content: center;
- left: 0px;
- right: 0px;
- top: 0px;
- position: absolute;
- transform: translateY(-70px);
- transition: transform 200ms;
- z-index: 1;
- padding-right:38px;
-}
-
-body[mobile] #donation-banner {
- font-size: 14px;
-}
-
-body[show-donation-banner="true"] #donation-banner {
- transform: translateY(0px);
- transition: transform 0ms;
-}
-
-#donation-banner-message {
- align-items: center;
- display: flex;
- justify-content: center;
-}
-
-#donation-banner-message a {
- color: var(--abouttor-bg-toron-color);
-}
-
-#donation-banner-icon {
- background: url('chrome://torbutton/skin/icon_monthly_donors.png') no-repeat center center;
- background-size: contain;
- background-position: bottom;
- height: 56px;
- margin: 14px 16px 0px 16px;
- width: 65px;
-}
-
-#donation-banner-closer {
- display: flex;
- align-items: center;
- font-size: 20px;
- height: 22px;
- justify-content: center;
- margin: 4px;
- padding: 4px;
- position: absolute;
- offset-inline-end: 0px;
- top: 0px;
- width: 22px;
- -moz-user-select: none;
-}
-
-#donation-banner-closer:hover {
- background-color: gray;
- cursor: pointer;
-}
-
-body[show-donation-banner="true"] #onboarding-overlay-button-container,
-body[show-donation-banner="true"] .torcontent-container {
- margin-top: 72px;
-}
-
/*
* Mobile specific css
*/
diff --git a/chrome/skin/icon_monthly_donors.png b/chrome/skin/icon_monthly_donors.png
deleted file mode 100644
index 9505f471..00000000
Binary files a/chrome/skin/icon_monthly_donors.png and /dev/null differ
diff --git a/defaults/preferences/preferences.js b/defaults/preferences/preferences.js
index 3a2cdcd3..e5d66d55 100644
--- a/defaults/preferences/preferences.js
+++ b/defaults/preferences/preferences.js
@@ -6,7 +6,6 @@ pref("extensions.torbutton.logmethod",1); // 0=stdout, 1=errorconsole, 2=debuglo
pref("extensions.torbutton.display_circuit", true);
pref("extensions.torbutton(a)torproject.org.description", "chrome://torbutton/locale/torbutton.properties");
pref("extensions.torbutton.updateNeeded", false);
-pref("extensions.torbutton.donation_banner_countdown3", 4);
// Tor check and proxy prefs
pref("extensions.torbutton.test_enabled",true);
1
0