Unverified Commit 48ae5ff6 authored by Reid Baker's avatar Reid Baker Committed by GitHub

Use double quotes over single quotes in gradle build files (#140512)

Following https://developer.android.com/build/migrate-to-kotlin-dsl
2/n Use double quotes instead of single quotes. 

Should be a no-op change. If you see a behavioral change please flag it.
parent ede594f8
...@@ -64,7 +64,7 @@ class FlutterExtension { ...@@ -64,7 +64,7 @@ class FlutterExtension {
* Specifies the relative directory to the Flutter project directory. * Specifies the relative directory to the Flutter project directory.
* In an app project, this is ../.. since the app's build.gradle is under android/app. * In an app project, this is ../.. since the app's build.gradle is under android/app.
*/ */
String source = '../..' String source = "../.."
/** Allows to override the target file. Otherwise, the target is lib/main.dart. */ /** Allows to override the target file. Otherwise, the target is lib/main.dart. */
String target String target
...@@ -84,7 +84,7 @@ buildscript { ...@@ -84,7 +84,7 @@ buildscript {
// * ndkVersion in FlutterExtension in packages/flutter_tools/gradle/src/main/flutter.groovy // * ndkVersion in FlutterExtension in packages/flutter_tools/gradle/src/main/flutter.groovy
// * AGP version constants in packages/flutter_tools/lib/src/android/gradle_utils.dart // * AGP version constants in packages/flutter_tools/lib/src/android/gradle_utils.dart
// * AGP version in dependencies block in packages/flutter_tools/gradle/build.gradle.kts // * AGP version in dependencies block in packages/flutter_tools/gradle/build.gradle.kts
classpath 'com.android.tools.build:gradle:7.3.0' classpath("com.android.tools.build:gradle:7.3.0")
} }
} }
...@@ -169,7 +169,7 @@ class FlutterPlugin implements Plugin<Project> { ...@@ -169,7 +169,7 @@ class FlutterPlugin implements Plugin<Project> {
/** /**
* Flutter Docs Website URLs for help messages. * Flutter Docs Website URLs for help messages.
*/ */
private final String kWebsiteDeploymentAndroidBuildConfig = 'https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration' private final String kWebsiteDeploymentAndroidBuildConfig = "https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration"
@Override @Override
void apply(Project project) { void apply(Project project) {
...@@ -177,7 +177,7 @@ class FlutterPlugin implements Plugin<Project> { ...@@ -177,7 +177,7 @@ class FlutterPlugin implements Plugin<Project> {
def rootProject = project.rootProject def rootProject = project.rootProject
if (isFlutterAppProject()) { if (isFlutterAppProject()) {
rootProject.tasks.register('generateLockfiles') { rootProject.tasks.register("generateLockfiles") {
rootProject.subprojects.each { subproject -> rootProject.subprojects.each { subproject ->
def gradlew = (OperatingSystem.current().isWindows()) ? def gradlew = (OperatingSystem.current().isWindows()) ?
"${rootProject.projectDir}/gradlew.bat" : "${rootProject.projectDir}/gradlew" "${rootProject.projectDir}/gradlew.bat" : "${rootProject.projectDir}/gradlew"
...@@ -211,7 +211,7 @@ class FlutterPlugin implements Plugin<Project> { ...@@ -211,7 +211,7 @@ class FlutterPlugin implements Plugin<Project> {
// Configure the Maven repository. // Configure the Maven repository.
String hostedRepository = System.env.FLUTTER_STORAGE_BASE_URL ?: DEFAULT_MAVEN_HOST String hostedRepository = System.env.FLUTTER_STORAGE_BASE_URL ?: DEFAULT_MAVEN_HOST
String repository = useLocalEngine() String repository = useLocalEngine()
? project.property('local-engine-repo') ? project.property("local-engine-repo")
: "$hostedRepository/${engineRealm}download.flutter.io" : "$hostedRepository/${engineRealm}download.flutter.io"
rootProject.allprojects { rootProject.allprojects {
repositories { repositories {
...@@ -245,8 +245,8 @@ class FlutterPlugin implements Plugin<Project> { ...@@ -245,8 +245,8 @@ class FlutterPlugin implements Plugin<Project> {
} }
} }
if (project.hasProperty('deferred-component-names')) { if (project.hasProperty("deferred-component-names")) {
String[] componentNames = project.property('deferred-component-names').split(',').collect {":${it}"} String[] componentNames = project.property("deferred-component-names").split(",").collect {":${it}"}
project.android { project.android {
dynamicFeatures = componentNames dynamicFeatures = componentNames
} }
...@@ -317,18 +317,18 @@ class FlutterPlugin implements Plugin<Project> { ...@@ -317,18 +317,18 @@ class FlutterPlugin implements Plugin<Project> {
if (useLocalEngine()) { if (useLocalEngine()) {
// This is required to pass the local engine to flutter build aot. // This is required to pass the local engine to flutter build aot.
String engineOutPath = project.property('local-engine-out') String engineOutPath = project.property("local-engine-out")
File engineOut = project.file(engineOutPath) File engineOut = project.file(engineOutPath)
if (!engineOut.isDirectory()) { if (!engineOut.isDirectory()) {
throw new GradleException('local-engine-out must point to a local engine build') throw new GradleException("local-engine-out must point to a local engine build")
} }
localEngine = engineOut.name localEngine = engineOut.name
localEngineSrcPath = engineOut.parentFile.parent localEngineSrcPath = engineOut.parentFile.parent
String engineHostOutPath = project.property('local-engine-host-out') String engineHostOutPath = project.property("local-engine-host-out")
File engineHostOut = project.file(engineHostOutPath) File engineHostOut = project.file(engineHostOutPath)
if (!engineHostOut.isDirectory()) { if (!engineHostOut.isDirectory()) {
throw new GradleException('local-engine-host-out must point to a local engine host build') throw new GradleException("local-engine-host-out must point to a local engine host build")
} }
localEngineHost = engineHostOut.name localEngineHost = engineHostOut.name
} }
...@@ -423,7 +423,7 @@ class FlutterPlugin implements Plugin<Project> { ...@@ -423,7 +423,7 @@ class FlutterPlugin implements Plugin<Project> {
* just using the `plugins.android` list. * just using the `plugins.android` list.
*/ */
private configureLegacyPluginEachProjects(Project project) { private configureLegacyPluginEachProjects(Project project) {
File settingsGradle = new File(project.projectDir.parentFile, 'settings.gradle') File settingsGradle = new File(project.projectDir.parentFile, "settings.gradle")
try { try {
if (!settingsGradle.text.contains("'.flutter-plugins'")) { if (!settingsGradle.text.contains("'.flutter-plugins'")) {
return return
...@@ -454,7 +454,7 @@ class FlutterPlugin implements Plugin<Project> { ...@@ -454,7 +454,7 @@ class FlutterPlugin implements Plugin<Project> {
* Returns `true` if the given path contains an `android/build.gradle` file. * Returns `true` if the given path contains an `android/build.gradle` file.
*/ */
private static Boolean doesSupportAndroidPlatform(String path) { private static Boolean doesSupportAndroidPlatform(String path) {
File editableAndroidProject = new File(path, 'android' + File.separator + 'build.gradle') File editableAndroidProject = new File(path, "android" + File.separator + "build.gradle")
return editableAndroidProject.exists() return editableAndroidProject.exists()
} }
...@@ -477,7 +477,7 @@ class FlutterPlugin implements Plugin<Project> { ...@@ -477,7 +477,7 @@ class FlutterPlugin implements Plugin<Project> {
if (!supportsBuildMode(flutterBuildMode)) { if (!supportsBuildMode(flutterBuildMode)) {
return return
} }
if (!pluginProject.hasProperty('android')) { if (!pluginProject.hasProperty("android")) {
return return
} }
// Copy build types from the app to the plugin. // Copy build types from the app to the plugin.
...@@ -519,8 +519,8 @@ class FlutterPlugin implements Plugin<Project> { ...@@ -519,8 +519,8 @@ class FlutterPlugin implements Plugin<Project> {
* For example, "2.8.0" vs "2.8" will always consider "2.8.0" to be the most recent version. * For example, "2.8.0" vs "2.8" will always consider "2.8.0" to be the most recent version.
*/ */
static String mostRecentSemanticVersion(String version1, String version2) { static String mostRecentSemanticVersion(String version1, String version2) {
List version1Tokenized = version1.tokenize('.') List version1Tokenized = version1.tokenize(".")
List version2Tokenized = version2.tokenize('.') List version2Tokenized = version2.tokenize(".")
def version1numTokens = version1Tokenized.size() def version1numTokens = version1Tokenized.size()
def version2numTokens = version2Tokenized.size() def version2numTokens = version2Tokenized.size()
def minNumTokens = Math.min(version1numTokens, version2numTokens) def minNumTokens = Math.min(version1numTokens, version2numTokens)
...@@ -674,16 +674,16 @@ class FlutterPlugin implements Plugin<Project> { ...@@ -674,16 +674,16 @@ class FlutterPlugin implements Plugin<Project> {
private static Properties readPropertiesIfExist(File propertiesFile) { private static Properties readPropertiesIfExist(File propertiesFile) {
Properties result = new Properties() Properties result = new Properties()
if (propertiesFile.exists()) { if (propertiesFile.exists()) {
propertiesFile.withReader('UTF-8') { reader -> result.load(reader) } propertiesFile.withReader("UTF-8") { reader -> result.load(reader) }
} }
return result return result
} }
private List<String> getTargetPlatforms() { private List<String> getTargetPlatforms() {
if (!project.hasProperty('target-platform')) { if (!project.hasProperty("target-platform")) {
return DEFAULT_PLATFORMS return DEFAULT_PLATFORMS
} }
return project.property('target-platform').split(',').collect { return project.property("target-platform").split(",").collect {
if (!PLATFORM_ARCH_MAP[it]) { if (!PLATFORM_ARCH_MAP[it]) {
throw new GradleException("Invalid platform: $it.") throw new GradleException("Invalid platform: $it.")
} }
...@@ -692,15 +692,15 @@ class FlutterPlugin implements Plugin<Project> { ...@@ -692,15 +692,15 @@ class FlutterPlugin implements Plugin<Project> {
} }
private Boolean shouldSplitPerAbi() { private Boolean shouldSplitPerAbi() {
return project.findProperty('split-per-abi')?.toBoolean() ?: false; return project.findProperty("split-per-abi")?.toBoolean() ?: false;
} }
private Boolean useLocalEngine() { private Boolean useLocalEngine() {
return project.hasProperty('local-engine-repo') return project.hasProperty("local-engine-repo")
} }
private Boolean isVerbose() { private Boolean isVerbose() {
return project.findProperty('verbose')?.toBoolean() ?: false; return project.findProperty("verbose")?.toBoolean() ?: false;
} }
/** Whether to build the debug app in "fast-start" mode. */ /** Whether to build the debug app in "fast-start" mode. */
...@@ -723,10 +723,10 @@ class FlutterPlugin implements Plugin<Project> { ...@@ -723,10 +723,10 @@ class FlutterPlugin implements Plugin<Project> {
if (!useLocalEngine()) { if (!useLocalEngine()) {
return true; return true;
} }
assert(project.hasProperty('local-engine-build-mode')) assert(project.hasProperty("local-engine-build-mode"))
// Don't configure dependencies for a build mode that the local engine // Don't configure dependencies for a build mode that the local engine
// doesn't support. // doesn't support.
return project.property('local-engine-build-mode') == flutterBuildMode return project.property("local-engine-build-mode") == flutterBuildMode
} }
private void addCompileOnlyDependency(Project project, String variantName, Object dependency, Closure config = null) { private void addCompileOnlyDependency(Project project, String variantName, Object dependency, Closure config = null) {
...@@ -760,9 +760,9 @@ class FlutterPlugin implements Plugin<Project> { ...@@ -760,9 +760,9 @@ class FlutterPlugin implements Plugin<Project> {
// Gradle is slower than we want. Particularly in light of https://github.com/flutter/flutter/issues/119196. // Gradle is slower than we want. Particularly in light of https://github.com/flutter/flutter/issues/119196.
private static void addTaskForJavaVersion(Project project) { private static void addTaskForJavaVersion(Project project) {
// Warning: the name of this task is used by other code. Change with caution. // Warning: the name of this task is used by other code. Change with caution.
project.tasks.register('javaVersion') { project.tasks.register("javaVersion") {
description 'Print the current java version used by gradle. ' description "Print the current java version used by gradle. "
'see: https://docs.gradle.org/current/javadoc/org/gradle/api/JavaVersion.html' "see: https://docs.gradle.org/current/javadoc/org/gradle/api/JavaVersion.html"
doLast { doLast {
println(JavaVersion.current()) println(JavaVersion.current())
} }
...@@ -829,7 +829,7 @@ class FlutterPlugin implements Plugin<Project> { ...@@ -829,7 +829,7 @@ class FlutterPlugin implements Plugin<Project> {
output.processResourcesProvider.get() : output.processResources output.processResourcesProvider.get() : output.processResources
def manifest = new XmlParser().parse(processResources.manifestFile) def manifest = new XmlParser().parse(processResources.manifestFile)
manifest.application.activity.each { activity -> manifest.application.activity.each { activity ->
activity.'intent-filter'.each { appLinkIntent -> activity."intent-filter".each { appLinkIntent ->
// Print out the host attributes in data tags. // Print out the host attributes in data tags.
def schemes = [] as Set<String> def schemes = [] as Set<String>
def hosts = [] as Set<String> def hosts = [] as Set<String>
...@@ -922,10 +922,10 @@ class FlutterPlugin implements Plugin<Project> { ...@@ -922,10 +922,10 @@ class FlutterPlugin implements Plugin<Project> {
private String getFlutterTarget() { private String getFlutterTarget() {
String target = project.flutter.target String target = project.flutter.target
if (target == null) { if (target == null) {
target = 'lib/main.dart' target = "lib/main.dart"
} }
if (project.hasProperty('target')) { if (project.hasProperty("target")) {
target = project.property('target') target = project.property("target")
} }
return target return target
} }
...@@ -997,64 +997,64 @@ class FlutterPlugin implements Plugin<Project> { ...@@ -997,64 +997,64 @@ class FlutterPlugin implements Plugin<Project> {
return return
} }
String[] fileSystemRootsValue = null String[] fileSystemRootsValue = null
if (project.hasProperty('filesystem-roots')) { if (project.hasProperty("filesystem-roots")) {
fileSystemRootsValue = project.property('filesystem-roots').split('\\|') fileSystemRootsValue = project.property("filesystem-roots").split("\\|")
} }
String fileSystemSchemeValue = null String fileSystemSchemeValue = null
if (project.hasProperty('filesystem-scheme')) { if (project.hasProperty("filesystem-scheme")) {
fileSystemSchemeValue = project.property('filesystem-scheme') fileSystemSchemeValue = project.property("filesystem-scheme")
} }
Boolean trackWidgetCreationValue = true Boolean trackWidgetCreationValue = true
if (project.hasProperty('track-widget-creation')) { if (project.hasProperty("track-widget-creation")) {
trackWidgetCreationValue = project.property('track-widget-creation').toBoolean() trackWidgetCreationValue = project.property("track-widget-creation").toBoolean()
} }
String frontendServerStarterPathValue = null String frontendServerStarterPathValue = null
if (project.hasProperty('frontend-server-starter-path')) { if (project.hasProperty("frontend-server-starter-path")) {
frontendServerStarterPathValue = project.property('frontend-server-starter-path') frontendServerStarterPathValue = project.property("frontend-server-starter-path")
} }
String extraFrontEndOptionsValue = null String extraFrontEndOptionsValue = null
if (project.hasProperty('extra-front-end-options')) { if (project.hasProperty("extra-front-end-options")) {
extraFrontEndOptionsValue = project.property('extra-front-end-options') extraFrontEndOptionsValue = project.property("extra-front-end-options")
} }
String extraGenSnapshotOptionsValue = null String extraGenSnapshotOptionsValue = null
if (project.hasProperty('extra-gen-snapshot-options')) { if (project.hasProperty("extra-gen-snapshot-options")) {
extraGenSnapshotOptionsValue = project.property('extra-gen-snapshot-options') extraGenSnapshotOptionsValue = project.property("extra-gen-snapshot-options")
} }
String splitDebugInfoValue = null String splitDebugInfoValue = null
if (project.hasProperty('split-debug-info')) { if (project.hasProperty("split-debug-info")) {
splitDebugInfoValue = project.property('split-debug-info') splitDebugInfoValue = project.property("split-debug-info")
} }
Boolean dartObfuscationValue = false Boolean dartObfuscationValue = false
if (project.hasProperty('dart-obfuscation')) { if (project.hasProperty("dart-obfuscation")) {
dartObfuscationValue = project.property('dart-obfuscation').toBoolean(); dartObfuscationValue = project.property("dart-obfuscation").toBoolean();
} }
Boolean treeShakeIconsOptionsValue = false Boolean treeShakeIconsOptionsValue = false
if (project.hasProperty('tree-shake-icons')) { if (project.hasProperty("tree-shake-icons")) {
treeShakeIconsOptionsValue = project.property('tree-shake-icons').toBoolean() treeShakeIconsOptionsValue = project.property("tree-shake-icons").toBoolean()
} }
String dartDefinesValue = null String dartDefinesValue = null
if (project.hasProperty('dart-defines')) { if (project.hasProperty("dart-defines")) {
dartDefinesValue = project.property('dart-defines') dartDefinesValue = project.property("dart-defines")
} }
String bundleSkSLPathValue; String bundleSkSLPathValue;
if (project.hasProperty('bundle-sksl-path')) { if (project.hasProperty("bundle-sksl-path")) {
bundleSkSLPathValue = project.property('bundle-sksl-path') bundleSkSLPathValue = project.property("bundle-sksl-path")
} }
String performanceMeasurementFileValue; String performanceMeasurementFileValue;
if (project.hasProperty('performance-measurement-file')) { if (project.hasProperty("performance-measurement-file")) {
performanceMeasurementFileValue = project.property('performance-measurement-file') performanceMeasurementFileValue = project.property("performance-measurement-file")
} }
String codeSizeDirectoryValue; String codeSizeDirectoryValue;
if (project.hasProperty('code-size-directory')) { if (project.hasProperty("code-size-directory")) {
codeSizeDirectoryValue = project.property('code-size-directory') codeSizeDirectoryValue = project.property("code-size-directory")
} }
Boolean deferredComponentsValue = false Boolean deferredComponentsValue = false
if (project.hasProperty('deferred-components')) { if (project.hasProperty("deferred-components")) {
deferredComponentsValue = project.property('deferred-components').toBoolean() deferredComponentsValue = project.property("deferred-components").toBoolean()
} }
Boolean validateDeferredComponentsValue = true Boolean validateDeferredComponentsValue = true
if (project.hasProperty('validate-deferred-components')) { if (project.hasProperty("validate-deferred-components")) {
validateDeferredComponentsValue = project.property('validate-deferred-components').toBoolean() validateDeferredComponentsValue = project.property("validate-deferred-components").toBoolean()
} }
addTaskForJavaVersion(project) addTaskForJavaVersion(project)
if(isFlutterAppProject()) { if(isFlutterAppProject()) {
...@@ -1077,7 +1077,7 @@ class FlutterPlugin implements Plugin<Project> { ...@@ -1077,7 +1077,7 @@ class FlutterPlugin implements Plugin<Project> {
} }
} }
// Build an AAR when this property is defined. // Build an AAR when this property is defined.
boolean isBuildingAar = project.hasProperty('is-plugin') boolean isBuildingAar = project.hasProperty("is-plugin")
// In add to app scenarios, a Gradle project contains a `:flutter` and `:app` project. // In add to app scenarios, a Gradle project contains a `:flutter` and `:app` project.
// `:flutter` is used as a subproject when these tasks exists and the build isn't building an AAR. // `:flutter` is used as a subproject when these tasks exists and the build isn't building an AAR.
Task packageAssets = project.tasks.findByPath(":flutter:package${variant.name.capitalize()}Assets") Task packageAssets = project.tasks.findByPath(":flutter:package${variant.name.capitalize()}Assets")
...@@ -1155,7 +1155,7 @@ class FlutterPlugin implements Plugin<Project> { ...@@ -1155,7 +1155,7 @@ class FlutterPlugin implements Plugin<Project> {
// See https://docs.gradle.org/current/javadoc/org/gradle/api/file/ConfigurableFilePermissions.html // See https://docs.gradle.org/current/javadoc/org/gradle/api/file/ConfigurableFilePermissions.html
// See https://github.com/flutter/flutter/pull/50047 // See https://github.com/flutter/flutter/pull/50047
if (compareVersionStrings(currentGradleVersion, '8.3') >= 0) { if (compareVersionStrings(currentGradleVersion, "8.3") >= 0) {
filePermissions { filePermissions {
user { user {
read = true read = true
...@@ -1260,7 +1260,7 @@ class FlutterPlugin implements Plugin<Project> { ...@@ -1260,7 +1260,7 @@ class FlutterPlugin implements Plugin<Project> {
return return
} }
// Flutter host module project (Add-to-app). // Flutter host module project (Add-to-app).
String hostAppProjectName = project.rootProject.hasProperty('flutter.hostAppProjectName') ? project.rootProject.property('flutter.hostAppProjectName') : "app" String hostAppProjectName = project.rootProject.hasProperty("flutter.hostAppProjectName") ? project.rootProject.property("flutter.hostAppProjectName") : "app"
Project appProject = project.rootProject.findProject(":${hostAppProjectName}") Project appProject = project.rootProject.findProject(":${hostAppProjectName}")
assert(appProject != null) : "Project :${hostAppProjectName} doesn't exist. To customize the host app project name, set `flutter.hostAppProjectName=<project-name>` in gradle.properties." assert(appProject != null) : "Project :${hostAppProjectName} doesn't exist. To customize the host app project name, set `flutter.hostAppProjectName=<project-name>` in gradle.properties."
// Wait for the host app project configuration. // Wait for the host app project configuration.
...@@ -1314,8 +1314,8 @@ class FlutterPlugin implements Plugin<Project> { ...@@ -1314,8 +1314,8 @@ class FlutterPlugin implements Plugin<Project> {
// compareTo implementation of version strings in the format of ints and periods // compareTo implementation of version strings in the format of ints and periods
// Requires non null objects. // Requires non null objects.
static int compareVersionStrings(String firstString, String secondString) { static int compareVersionStrings(String firstString, String secondString) {
List firstVersion = firstString.tokenize('.') List firstVersion = firstString.tokenize(".")
List secondVersion = secondString.tokenize('.') List secondVersion = secondString.tokenize(".")
def commonIndices = Math.min(firstVersion.size(), secondVersion.size()) def commonIndices = Math.min(firstVersion.size(), secondVersion.size())
...@@ -1542,7 +1542,7 @@ class FlutterTask extends BaseFlutterTask { ...@@ -1542,7 +1542,7 @@ class FlutterTask extends BaseFlutterTask {
return project.copySpec { return project.copySpec {
from("${intermediateDir}") from("${intermediateDir}")
if (buildMode == 'release' || buildMode == 'profile') { if (buildMode == "release" || buildMode == "profile") {
targetPlatformValues.each { targetPlatformValues.each {
include("${PLATFORM_ARCH_MAP[targetArch]}/app.so") include("${PLATFORM_ARCH_MAP[targetArch]}/app.so")
} }
...@@ -1556,7 +1556,7 @@ class FlutterTask extends BaseFlutterTask { ...@@ -1556,7 +1556,7 @@ class FlutterTask extends BaseFlutterTask {
// <target> <files>: <source> <files> <separated> <by> <non-escaped space> // <target> <files>: <source> <files> <separated> <by> <non-escaped space>
String depText = dependenciesFile.text String depText = dependenciesFile.text
// So we split list of files by non-escaped(by backslash) space, // So we split list of files by non-escaped(by backslash) space,
def matcher = depText.split(': ')[inputs ? 1 : 0] =~ /(\\ |[^\s])+/ def matcher = depText.split(": ")[inputs ? 1 : 0] =~ /(\\ |[^\s])+/
// then we replace all escaped spaces with regular spaces // then we replace all escaped spaces with regular spaces
def depList = matcher.collect{it[0].replaceAll("\\\\ ", " ")} def depList = matcher.collect{it[0].replaceAll("\\\\ ", " ")}
return project.files(depList) return project.files(depList)
...@@ -1570,7 +1570,7 @@ class FlutterTask extends BaseFlutterTask { ...@@ -1570,7 +1570,7 @@ class FlutterTask extends BaseFlutterTask {
for (File depfile in getDependenciesFiles()) { for (File depfile in getDependenciesFiles()) {
sources += readDependencies(depfile, true) sources += readDependencies(depfile, true)
} }
return sources + project.files('pubspec.yaml') return sources + project.files("pubspec.yaml")
} }
@OutputFiles @OutputFiles
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment