Add LenovoYogaC630 (Win arm64 bot)

Change-Id: I70f4e01a2c55e85ee5e17a29f7f05a4a4aff2ae2
Bug: skia:8569 skia:8976
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/204264
Commit-Queue: Ben Wagner aka dogben <benjaminwagner@google.com>
Reviewed-by: Eric Boren <borenet@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
diff --git a/infra/bots/gen_tasks.go b/infra/bots/gen_tasks.go
index 2925bd3..1330e96 100644
--- a/infra/bots/gen_tasks.go
+++ b/infra/bots/gen_tasks.go
@@ -258,7 +258,7 @@
 		serviceAccount = alternateServiceAccount(serviceAccount)
 	}
 	cipd := append([]*specs.CipdPackage{}, CIPD_PKGS_KITCHEN...)
-	if strings.Contains(name, "Win") {
+	if strings.Contains(name, "Win") && !strings.Contains(name, "LenovoYogaC630") {
 		cipd = append(cipd, CIPD_PKGS_CPYTHON...)
 	}
 	properties := map[string]string{
@@ -541,6 +541,9 @@
 				"AVX512": {
 					"GCE": "x86-64-Skylake_GCE",
 				},
+				"Snapdragon850": {
+					"LenovoYogaC630": "arm64-64-Snapdragon850",
+				},
 			}[parts["cpu_or_gpu_value"]]
 			if !ok {
 				glog.Fatalf("Entry %q not found in CPU mapping.", parts["cpu_or_gpu_value"])
@@ -563,6 +566,8 @@
 				return dockerGceDimensions()
 			} else if strings.Contains(parts["os"], "Win") {
 				gpu, ok := map[string]string{
+					// At some point this might use the device ID, but for now it's like Chromebooks.
+					"Adreno630":     "Adreno630",
 					"GT610":         "10de:104a-23.21.13.9101",
 					"GTX660":        "10de:11c0-25.21.14.1634",
 					"GTX960":        "10de:1401-25.21.14.1634",
diff --git a/infra/bots/jobs.json b/infra/bots/jobs.json
index ab710e2..e2e10c5 100644
--- a/infra/bots/jobs.json
+++ b/infra/bots/jobs.json
@@ -113,7 +113,9 @@
   "Build-Win-Clang-x86_64-Release-Vulkan",
   "Build-Win-Clang-x86_64-Release-Shared",
   "Build-Win-MSVC-arm64-Debug",
+  "Build-Win-MSVC-arm64-Debug-ANGLE",
   "Build-Win-MSVC-arm64-Release",
+  "Build-Win-MSVC-arm64-Release-ANGLE",
   "Build-Win-MSVC-x86-Debug",
   "Build-Win-MSVC-x86-Release",
   "Build-Win-MSVC-x86_64-Debug",
@@ -626,6 +628,8 @@
   "Test-Win10-MSVC-Golo-GPU-QuadroP400-x86_64-Debug-All-Vulkan",
   "Test-Win10-MSVC-Golo-GPU-QuadroP400-x86_64-Release-All",
   "Test-Win10-MSVC-Golo-GPU-QuadroP400-x86_64-Release-All-Vulkan",
+  "Test-Win10-MSVC-LenovoYogaC630-CPU-Snapdragon850-arm64-Debug-All",
+  "Test-Win10-MSVC-LenovoYogaC630-GPU-Adreno630-arm64-Debug-All-ANGLE",
   "Test-Win2016-Clang-GCE-CPU-AVX2-x86-Debug-All",
   "Test-Win2016-Clang-GCE-CPU-AVX2-x86-Release-All",
   "Test-Win2016-Clang-GCE-CPU-AVX2-x86_64-Debug-All",
diff --git a/infra/bots/recipe_modules/flavor/api.py b/infra/bots/recipe_modules/flavor/api.py
index afc219b..4ba6ff7 100644
--- a/infra/bots/recipe_modules/flavor/api.py
+++ b/infra/bots/recipe_modules/flavor/api.py
@@ -14,6 +14,7 @@
 from . import default
 from . import ios
 from . import valgrind
+from . import win_ssh
 
 
 """Abstractions for running code on various platforms.
@@ -58,6 +59,9 @@
 def is_valgrind(vars_api):
   return 'Valgrind' in vars_api.extra_tokens
 
+def is_win_ssh(vars_api):
+  return 'LenovoYogaC630' in vars_api.builder_cfg.get('model', '')
+
 
 class SkiaFlavorApi(recipe_api.RecipeApi):
   def get_flavor(self, vars_api):
@@ -72,6 +76,8 @@
       return ios.iOSFlavor(self)
     elif is_valgrind(vars_api):
       return valgrind.ValgrindFlavor(self)
+    elif is_win_ssh(vars_api):
+      return win_ssh.WinSSHFlavor(self)
     else:
       return default.DefaultFlavor(self)
 
diff --git a/infra/bots/recipe_modules/flavor/examples/full.expected/Test-Win10-MSVC-LenovoYogaC630-GPU-Adreno630-arm64-Debug-All-ANGLE.json b/infra/bots/recipe_modules/flavor/examples/full.expected/Test-Win10-MSVC-LenovoYogaC630-GPU-Adreno630-arm64-Debug-All-ANGLE.json
new file mode 100644
index 0000000..9dbcc3a
--- /dev/null
+++ b/infra/bots/recipe_modules/flavor/examples/full.expected/Test-Win10-MSVC-LenovoYogaC630-GPU-Adreno630-arm64-Debug-All-ANGLE.json
@@ -0,0 +1,928 @@
+[
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "[HOME]/ssh_machine.json",
+      "/path/to/tmp/"
+    ],
+    "infra_step": true,
+    "name": "read ssh_machine.json"
+  },
+  {
+    "cmd": [
+      "scp",
+      "file.txt",
+      "foo@127.0.0.1:file.txt"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "scp file.txt foo@127.0.0.1:file.txt"
+  },
+  {
+    "cmd": [],
+    "name": "read file.txt"
+  },
+  {
+    "cmd": [
+      "scp",
+      "foo@127.0.0.1:file.txt",
+      "[CLEANUP]/read_file_on_device_tmp_1/file.txt"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "read file.txt.scp foo@127.0.0.1:file.txt [CLEANUP]/read_file_on_device_tmp_1/file.txt",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "[CLEANUP]/read_file_on_device_tmp_1/file.txt",
+      "/path/to/tmp/"
+    ],
+    "infra_step": true,
+    "name": "read file.txt.read file.txt",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "rmtree",
+      "[CLEANUP]/read_file_on_device_tmp_1"
+    ],
+    "infra_step": true,
+    "name": "read file.txt.rmtree [CLEANUP]/read_file_on_device_tmp_1",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "if exist \"file.txt\" del \"file.txt\"",
+      "1"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "rm file.txt"
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "rmtree",
+      "results_dir"
+    ],
+    "infra_step": true,
+    "name": "rmtree results_dir"
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "ensure-directory",
+      "--mode",
+      "0777",
+      "results_dir"
+    ],
+    "infra_step": true,
+    "name": "makedirs results_dir"
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "robocopy /mir \"C:\\Users\\chrome-bot\\botdata\\empty\" \"device_results_dir\"",
+      "8"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "clean device_results_dir"
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "if not exist \"C:\\Users\\chrome-bot\\botdata\\resources\" md \"C:\\Users\\chrome-bot\\botdata\\resources\"",
+      "1"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "mkdir C:\\Users\\chrome-bot\\botdata\\resources"
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "robocopy /mir \"C:\\Users\\chrome-bot\\botdata\\empty\" \"C:\\Users\\chrome-bot\\botdata\\bin\"",
+      "8"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "clean C:\\Users\\chrome-bot\\botdata\\bin"
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "if exist \"C:\\Users\\chrome-bot\\botdata\\empty\" rd \"C:\\Users\\chrome-bot\\botdata\\empty\"",
+      "1"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "rmdir C:\\Users\\chrome-bot\\botdata\\empty"
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "if not exist \"C:\\Users\\chrome-bot\\botdata\\empty\" md \"C:\\Users\\chrome-bot\\botdata\\empty\"",
+      "1"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "mkdir C:\\Users\\chrome-bot\\botdata\\empty"
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "robocopy /mir \"C:\\Users\\chrome-bot\\botdata\\empty\" \"C:\\Users\\chrome-bot\\botdata\\bin\"",
+      "8"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "clean C:\\Users\\chrome-bot\\botdata\\bin (2)"
+  },
+  {
+    "cmd": [],
+    "name": "copy [START_DIR]/skia/resources to device"
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "robocopy /mir \"C:\\Users\\chrome-bot\\botdata\\empty\" \"C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\"",
+      "8"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "copy [START_DIR]/skia/resources to device.clean C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "scp",
+      "-r",
+      "[START_DIR]/skia/resources",
+      "foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\\resources"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "copy [START_DIR]/skia/resources to device.scp -r [START_DIR]/skia/resources foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\\resources",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "robocopy /mir \"C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\\resources\" \"C:\\Users\\chrome-bot\\botdata\\resources\"",
+      "8"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "copy [START_DIR]/skia/resources to device.copy C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\\resources to C:\\Users\\chrome-bot\\botdata\\resources",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "[START_DIR]/skia/infra/bots/assets/skp/VERSION",
+      "/path/to/tmp/"
+    ],
+    "infra_step": true,
+    "name": "Get skp VERSION"
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "42",
+      "[START_DIR]/tmp/SKP_VERSION"
+    ],
+    "infra_step": true,
+    "name": "write SKP_VERSION"
+  },
+  {
+    "cmd": [],
+    "name": "read C:\\Users\\chrome-bot\\botdata\\SKP_VERSION"
+  },
+  {
+    "cmd": [
+      "scp",
+      "foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\SKP_VERSION",
+      "[CLEANUP]/read_file_on_device_tmp_2/SKP_VERSION"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "read C:\\Users\\chrome-bot\\botdata\\SKP_VERSION.scp foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\SKP_VERSION [CLEANUP]/read_file_on_device_tmp_2/SKP_VERSION",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "[CLEANUP]/read_file_on_device_tmp_2/SKP_VERSION",
+      "/path/to/tmp/"
+    ],
+    "infra_step": true,
+    "name": "read C:\\Users\\chrome-bot\\botdata\\SKP_VERSION.read SKP_VERSION",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "rmtree",
+      "[CLEANUP]/read_file_on_device_tmp_2"
+    ],
+    "infra_step": true,
+    "name": "read C:\\Users\\chrome-bot\\botdata\\SKP_VERSION.rmtree [CLEANUP]/read_file_on_device_tmp_2",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "if exist \"C:\\Users\\chrome-bot\\botdata\\SKP_VERSION\" del \"C:\\Users\\chrome-bot\\botdata\\SKP_VERSION\"",
+      "1"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "rm C:\\Users\\chrome-bot\\botdata\\SKP_VERSION"
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "robocopy /mir \"C:\\Users\\chrome-bot\\botdata\\empty\" \"C:\\Users\\chrome-bot\\botdata\\skps\"",
+      "8"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "clean C:\\Users\\chrome-bot\\botdata\\skps"
+  },
+  {
+    "cmd": [],
+    "name": "copy [START_DIR]/skp to device"
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "robocopy /mir \"C:\\Users\\chrome-bot\\botdata\\empty\" \"C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\"",
+      "8"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "copy [START_DIR]/skp to device.clean C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "scp",
+      "-r",
+      "[START_DIR]/skp",
+      "foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\\skp"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "copy [START_DIR]/skp to device.scp -r [START_DIR]/skp foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\\skp",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "robocopy /mir \"C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\\skp\" \"C:\\Users\\chrome-bot\\botdata\\skps\"",
+      "8"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "copy [START_DIR]/skp to device.copy C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\\skp to C:\\Users\\chrome-bot\\botdata\\skps",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "scp",
+      "[START_DIR]/tmp/SKP_VERSION",
+      "foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\SKP_VERSION"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "scp [START_DIR]/tmp/SKP_VERSION foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\SKP_VERSION"
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
+      "/path/to/tmp/"
+    ],
+    "infra_step": true,
+    "name": "Get skimage VERSION"
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "42",
+      "[START_DIR]/tmp/SK_IMAGE_VERSION"
+    ],
+    "infra_step": true,
+    "name": "write SK_IMAGE_VERSION"
+  },
+  {
+    "cmd": [],
+    "name": "read C:\\Users\\chrome-bot\\botdata\\SK_IMAGE_VERSION"
+  },
+  {
+    "cmd": [
+      "scp",
+      "foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\SK_IMAGE_VERSION",
+      "[CLEANUP]/read_file_on_device_tmp_3/SK_IMAGE_VERSION"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "read C:\\Users\\chrome-bot\\botdata\\SK_IMAGE_VERSION.scp foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\SK_IMAGE_VERSION [CLEANUP]/read_file_on_device_tmp_3/SK_IMAGE_VERSION",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "[CLEANUP]/read_file_on_device_tmp_3/SK_IMAGE_VERSION",
+      "/path/to/tmp/"
+    ],
+    "infra_step": true,
+    "name": "read C:\\Users\\chrome-bot\\botdata\\SK_IMAGE_VERSION.read SK_IMAGE_VERSION",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "rmtree",
+      "[CLEANUP]/read_file_on_device_tmp_3"
+    ],
+    "infra_step": true,
+    "name": "read C:\\Users\\chrome-bot\\botdata\\SK_IMAGE_VERSION.rmtree [CLEANUP]/read_file_on_device_tmp_3",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "if exist \"C:\\Users\\chrome-bot\\botdata\\SK_IMAGE_VERSION\" del \"C:\\Users\\chrome-bot\\botdata\\SK_IMAGE_VERSION\"",
+      "1"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "rm C:\\Users\\chrome-bot\\botdata\\SK_IMAGE_VERSION"
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "robocopy /mir \"C:\\Users\\chrome-bot\\botdata\\empty\" \"C:\\Users\\chrome-bot\\botdata\\images\"",
+      "8"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "clean C:\\Users\\chrome-bot\\botdata\\images"
+  },
+  {
+    "cmd": [],
+    "name": "copy [START_DIR]/skimage to device"
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "robocopy /mir \"C:\\Users\\chrome-bot\\botdata\\empty\" \"C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\"",
+      "8"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "copy [START_DIR]/skimage to device.clean C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "scp",
+      "-r",
+      "[START_DIR]/skimage",
+      "foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\\skimage"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "copy [START_DIR]/skimage to device.scp -r [START_DIR]/skimage foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\\skimage",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "robocopy /mir \"C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\\skimage\" \"C:\\Users\\chrome-bot\\botdata\\images\"",
+      "8"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "copy [START_DIR]/skimage to device.copy C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\\skimage to C:\\Users\\chrome-bot\\botdata\\images",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "scp",
+      "[START_DIR]/tmp/SK_IMAGE_VERSION",
+      "foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\SK_IMAGE_VERSION"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "scp [START_DIR]/tmp/SK_IMAGE_VERSION foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\SK_IMAGE_VERSION"
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
+      "/path/to/tmp/"
+    ],
+    "infra_step": true,
+    "name": "Get svg VERSION"
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "42",
+      "[START_DIR]/tmp/SVG_VERSION"
+    ],
+    "infra_step": true,
+    "name": "write SVG_VERSION"
+  },
+  {
+    "cmd": [],
+    "name": "read C:\\Users\\chrome-bot\\botdata\\SVG_VERSION"
+  },
+  {
+    "cmd": [
+      "scp",
+      "foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\SVG_VERSION",
+      "[CLEANUP]/read_file_on_device_tmp_4/SVG_VERSION"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "read C:\\Users\\chrome-bot\\botdata\\SVG_VERSION.scp foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\SVG_VERSION [CLEANUP]/read_file_on_device_tmp_4/SVG_VERSION",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "[CLEANUP]/read_file_on_device_tmp_4/SVG_VERSION",
+      "/path/to/tmp/"
+    ],
+    "infra_step": true,
+    "name": "read C:\\Users\\chrome-bot\\botdata\\SVG_VERSION.read SVG_VERSION",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "rmtree",
+      "[CLEANUP]/read_file_on_device_tmp_4"
+    ],
+    "infra_step": true,
+    "name": "read C:\\Users\\chrome-bot\\botdata\\SVG_VERSION.rmtree [CLEANUP]/read_file_on_device_tmp_4",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "if exist \"C:\\Users\\chrome-bot\\botdata\\SVG_VERSION\" del \"C:\\Users\\chrome-bot\\botdata\\SVG_VERSION\"",
+      "1"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "rm C:\\Users\\chrome-bot\\botdata\\SVG_VERSION"
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "robocopy /mir \"C:\\Users\\chrome-bot\\botdata\\empty\" \"C:\\Users\\chrome-bot\\botdata\\svgs\"",
+      "8"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "clean C:\\Users\\chrome-bot\\botdata\\svgs"
+  },
+  {
+    "cmd": [],
+    "name": "copy [START_DIR]/svg to device"
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "robocopy /mir \"C:\\Users\\chrome-bot\\botdata\\empty\" \"C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\"",
+      "8"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "copy [START_DIR]/svg to device.clean C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "scp",
+      "-r",
+      "[START_DIR]/svg",
+      "foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\\svg"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "copy [START_DIR]/svg to device.scp -r [START_DIR]/svg foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\\svg",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "robocopy /mir \"C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\\svg\" \"C:\\Users\\chrome-bot\\botdata\\svgs\"",
+      "8"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "copy [START_DIR]/svg to device.copy C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\\svg to C:\\Users\\chrome-bot\\botdata\\svgs",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "scp",
+      "[START_DIR]/tmp/SVG_VERSION",
+      "foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\SVG_VERSION"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "scp [START_DIR]/tmp/SVG_VERSION foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\SVG_VERSION"
+  },
+  {
+    "cmd": [],
+    "name": "copy [START_DIR]/build to device"
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "robocopy /mir \"C:\\Users\\chrome-bot\\botdata\\empty\" \"C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\"",
+      "8"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "copy [START_DIR]/build to device.clean C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "scp",
+      "-r",
+      "[START_DIR]/build",
+      "foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\\build"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "copy [START_DIR]/build to device.scp -r [START_DIR]/build foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\\build",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "robocopy /mir \"C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\\build\" \"C:\\Users\\chrome-bot\\botdata\\bin\"",
+      "8"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "copy [START_DIR]/build to device.copy C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\\build to C:\\Users\\chrome-bot\\botdata\\bin",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "C:\\Users\\chrome-bot\\botdata\\bin\\dm --some-flag",
+      "1"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "name": "dm"
+  },
+  {
+    "cmd": [
+      "scp",
+      "-r",
+      "foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\dm_out\\*",
+      "[START_DIR]/[SWARM_OUT_DIR]"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "scp -r foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\dm_out\\* [START_DIR]/[SWARM_OUT_DIR]"
+  },
+  {
+    "jsonResult": null,
+    "name": "$result"
+  }
+]
\ No newline at end of file
diff --git a/infra/bots/recipe_modules/flavor/examples/full.py b/infra/bots/recipe_modules/flavor/examples/full.py
index 20d9b9d..3e92ff7 100644
--- a/infra/bots/recipe_modules/flavor/examples/full.py
+++ b/infra/bots/recipe_modules/flavor/examples/full.py
@@ -87,6 +87,7 @@
   ('Test-Ubuntu17-GCC-Golo-GPU-QuadroP400-x86_64-Release-All'
    '-Valgrind_AbandonGpuContext_SK_CPU_LIMIT_SSE41'),
   'Test-Win10-Clang-Golo-GPU-QuadroP400-x86_64-Release-All-Vulkan_ProcDump',
+  'Test-Win10-MSVC-LenovoYogaC630-GPU-Adreno630-arm64-Debug-All-ANGLE',
 ]
 
 # Default properties used for TEST_BUILDERS.
diff --git a/infra/bots/recipe_modules/flavor/resources/win_ssh_cmd.py b/infra/bots/recipe_modules/flavor/resources/win_ssh_cmd.py
new file mode 100644
index 0000000..1fa6c9e
--- /dev/null
+++ b/infra/bots/recipe_modules/flavor/resources/win_ssh_cmd.py
@@ -0,0 +1,61 @@
+#!/usr/bin/env python
+# Copyright 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import base64
+import re
+import subprocess
+import sys
+
+# Usage: win_ssh_cmd.py <user@host> <cmd shell string> [<fail errorlevel>]
+# Runs the given command over ssh and exits with 0 if the command succeeds or 1
+# if the command fails. The command is considered to fail if the errorlevel is
+# greater than or equal to <fail errorlevel>. Ignores all ANSI escape codes.
+
+
+SENTINEL = 'win_ssh_cmd remote command successful'
+
+# Based on https://stackoverflow.com/a/14693789; edited to incorporate OSC
+# based on https://en.wikipedia.org/wiki/ANSI_escape_code#Escape_sequences
+ANSI_ESCAPE_RE = re.compile(r'\x1B(\[[0-?]*[ -/]*[@-~]|\].*(\x1B\\|\x07))')
+
+def main(user_host, cmd, fail_errorlevel):
+  ssh_cmd = ['ssh', '-oConnectTimeout=15', '-oBatchMode=yes', '-t', '-t',
+             user_host,
+             '(' + cmd + ') & if not errorlevel %s echo "%s"' % (
+                 fail_errorlevel, SENTINEL)]
+  # orig_lines stores the full output of ssh_cmd.
+  orig_lines = []
+  # True if we saw a line matching SENTINEL.
+  saw_sentinel = False
+  print >> sys.stderr, 'Original command:\n%s\nFull command:\n%s' % (
+      cmd, ' '.join([repr(s) for s in ssh_cmd]))
+  proc = subprocess.Popen(ssh_cmd, stdout=subprocess.PIPE)
+  for line in iter(proc.stdout.readline, ''):
+    orig_lines.append(line)
+    line = ANSI_ESCAPE_RE.sub('', line)
+    stripped = line.strip()
+    if stripped == SENTINEL:
+      saw_sentinel = True
+    elif stripped != '':
+      print stripped
+  proc.wait()
+  sys.stdout.flush()
+  print >> sys.stderr, 'Raw output base64-encoded:\n%s' % (
+      base64.b64encode(''.join(orig_lines)))
+  if proc.returncode != 0:
+    sys.exit(proc.returncode)
+  if not saw_sentinel:
+    sys.exit(1)
+  sys.exit(0)
+
+
+if __name__ == '__main__':
+  if len(sys.argv) < 3:
+    print >> sys.stderr, (
+        'USAGE: %s <user@host> <cmd shell string>  [<fail errorlevel>]' %
+        sys.argv[0])
+    sys.exit(1)
+  arg_fail_errorlevel = 1 if len(sys.argv) < 4 else sys.argv[3]
+  main(sys.argv[1], sys.argv[2], arg_fail_errorlevel)
diff --git a/infra/bots/recipe_modules/flavor/win_ssh.py b/infra/bots/recipe_modules/flavor/win_ssh.py
new file mode 100644
index 0000000..d27ceed
--- /dev/null
+++ b/infra/bots/recipe_modules/flavor/win_ssh.py
@@ -0,0 +1,122 @@
+# Copyright 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+
+from recipe_engine import recipe_api
+
+import default
+import ntpath
+import ssh
+import subprocess  # TODO(borenet): No! Remove this.
+
+
+"""Win SSH flavor, used for running code on Windows via an SSH connection.
+
+Copied from chromebook.py and modified for Windows.
+"""
+
+
+class WinSSHFlavor(ssh.SSHFlavor):
+
+  def __init__(self, m):
+    super(WinSSHFlavor, self).__init__(m)
+    self.remote_homedir = 'C:\\Users\\chrome-bot\\botdata\\'
+    self.device_dirs = default.DeviceDirs(
+      bin_dir       = self.device_path_join(self.remote_homedir, 'bin'),
+      dm_dir        = self.device_path_join(self.remote_homedir, 'dm_out'),
+      perf_data_dir = self.device_path_join(self.remote_homedir, 'perf'),
+      resource_dir  = self.device_path_join(self.remote_homedir, 'resources'),
+      images_dir    = self.device_path_join(self.remote_homedir, 'images'),
+      lotties_dir   = self.device_path_join(self.remote_homedir, 'lotties'),
+      skp_dir       = self.device_path_join(self.remote_homedir, 'skps'),
+      svg_dir       = self.device_path_join(self.remote_homedir, 'svgs'),
+      tmp_dir       = self.remote_homedir)
+    self._empty_dir = self.device_path_join(self.remote_homedir, 'empty')
+
+
+  def _cmd(self, title, cmd, infra_step=True, fail_errorlevel=1, **kwargs):
+    return self.m.run(self.m.python, title,
+                      script=self.module.resource('win_ssh_cmd.py'),
+                      args=[self.user_ip, cmd, fail_errorlevel],
+                      infra_step=infra_step, **kwargs)
+
+  def ensure_device_dir(self, path):
+    self._cmd('mkdir %s' % path, 'if not exist "%s" md "%s"' % (path, path))
+
+  def _rmdir(self, path):
+    self._cmd('rmdir %s' % path, 'if exist "%s" rd "%s"' % (path, path))
+
+  def device_path_join(self, *args):
+    return ntpath.join(*args)
+
+  def install(self):
+    super(WinSSHFlavor, self).install()
+
+    # Ensure that our empty dir is actually empty.
+    self._rmdir(self._empty_dir)
+    self.ensure_device_dir(self._empty_dir)
+
+    self.create_clean_device_dir(self.device_dirs.bin_dir)
+
+  def create_clean_device_dir(self, path):
+    # Based on https://stackoverflow.com/a/98069 and
+    # https://superuser.com/a/346112.
+    self._cmd('clean %s' % path,
+              'robocopy /mir "%s" "%s"' % (self._empty_dir, path),
+              fail_errorlevel=8)
+
+  def read_file_on_device(self, path, **kwargs):
+    with self.m.step.nest('read %s' % path):
+      with self.m.tempfile.temp_dir('read_file_on_device') as tmp:
+        host_path = tmp.join(ntpath.basename(path))
+        device_path = self.scp_device_path(path)
+        ok = self._run('scp %s %s' % (device_path, host_path),
+                       cmd=['scp', device_path, host_path],
+                       infra_step=True, **kwargs)
+        # TODO(dogben): Should readfile respect fail_build_on_failure and
+        # abort_on_failure?
+        if ok:
+          return self.m.run.readfile(host_path)
+
+  def remove_file_on_device(self, path):
+    self._cmd('rm %s' % path, 'if exist "%s" del "%s"' % (path, path))
+
+  def _copy_dir(self, src, dest):
+    self._run('scp -r %s %s' % (src, dest),
+              cmd=['scp', '-r', src, dest], infra_step=True)
+
+  def copy_directory_contents_to_device(self, host_path, device_path):
+    # Callers expect that the destination directory is replaced, which is not
+    # how scp works when the destination is a directory. Instead scp to tmp_dir
+    # and then robocopy to the correct destination.
+    # Other flavors use a glob and subprocess with shell=True to copy the
+    # contents of host_path; however, there are a lot of ways POSIX shell
+    # interpretation could mess up Windows path names.
+    with self.m.step.nest('copy %s to device' % host_path):
+      tmp_pardir = self.device_path_join(
+          self.device_dirs.tmp_dir,
+          'tmp_copy_directory_contents_to_device')
+      self.create_clean_device_dir(tmp_pardir)
+      tmpdir = self.device_path_join(tmp_pardir,
+                                     self.m.path.basename(host_path))
+      self._copy_dir(host_path, self.scp_device_path(tmpdir))
+      self._cmd('copy %s to %s' % (tmpdir, device_path),
+                'robocopy /mir "%s" "%s"' % (tmpdir, device_path),
+                fail_errorlevel=8)
+
+  def copy_directory_contents_to_host(self, device_path, host_path):
+    # Note that the glob in src is interpreted by the remote shell.
+    src = self.scp_device_path(self.device_path_join(device_path, '*'))
+    self._copy_dir(src, host_path)
+
+  def step(self, name, cmd, infra_step=False, **kwargs):
+    # There may be DLLs in the same dir as the executable that must be loaded
+    # (yes, Windows allows overriding system DLLs with files in the local
+    # directory). For simplicity, just copy the entire dir to the device.
+    self.copy_directory_contents_to_device(self.host_dirs.bin_dir,
+                                           self.device_dirs.bin_dir)
+
+    cmd[0] = self.device_path_join(self.device_dirs.bin_dir, cmd[0])
+    self._cmd(name, subprocess.list2cmdline(map(str, cmd)),
+              infra_step=infra_step, **kwargs)
diff --git a/infra/bots/recipes/test.expected/Test-Win10-MSVC-LenovoYogaC630-GPU-Adreno630-arm64-Debug-All-ANGLE.json b/infra/bots/recipes/test.expected/Test-Win10-MSVC-LenovoYogaC630-GPU-Adreno630-arm64-Debug-All-ANGLE.json
new file mode 100644
index 0000000..0b00036
--- /dev/null
+++ b/infra/bots/recipes/test.expected/Test-Win10-MSVC-LenovoYogaC630-GPU-Adreno630-arm64-Debug-All-ANGLE.json
@@ -0,0 +1,950 @@
+[
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "ensure-directory",
+      "--mode",
+      "0777",
+      "[START_DIR]/tmp"
+    ],
+    "infra_step": true,
+    "name": "makedirs tmp_dir"
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "[HOME]/ssh_machine.json",
+      "/path/to/tmp/"
+    ],
+    "infra_step": true,
+    "name": "read ssh_machine.json"
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "if not exist \"C:\\Users\\chrome-bot\\botdata\\resources\" md \"C:\\Users\\chrome-bot\\botdata\\resources\"",
+      "1"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "mkdir C:\\Users\\chrome-bot\\botdata\\resources"
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "robocopy /mir \"C:\\Users\\chrome-bot\\botdata\\empty\" \"C:\\Users\\chrome-bot\\botdata\\bin\"",
+      "8"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "clean C:\\Users\\chrome-bot\\botdata\\bin"
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "if exist \"C:\\Users\\chrome-bot\\botdata\\empty\" rd \"C:\\Users\\chrome-bot\\botdata\\empty\"",
+      "1"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "rmdir C:\\Users\\chrome-bot\\botdata\\empty"
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "if not exist \"C:\\Users\\chrome-bot\\botdata\\empty\" md \"C:\\Users\\chrome-bot\\botdata\\empty\"",
+      "1"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "mkdir C:\\Users\\chrome-bot\\botdata\\empty"
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "robocopy /mir \"C:\\Users\\chrome-bot\\botdata\\empty\" \"C:\\Users\\chrome-bot\\botdata\\bin\"",
+      "8"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "clean C:\\Users\\chrome-bot\\botdata\\bin (2)"
+  },
+  {
+    "cmd": [],
+    "name": "copy [START_DIR]/skia/resources to device"
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "robocopy /mir \"C:\\Users\\chrome-bot\\botdata\\empty\" \"C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\"",
+      "8"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "copy [START_DIR]/skia/resources to device.clean C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "scp",
+      "-r",
+      "[START_DIR]/skia/resources",
+      "foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\\resources"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "copy [START_DIR]/skia/resources to device.scp -r [START_DIR]/skia/resources foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\\resources",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "robocopy /mir \"C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\\resources\" \"C:\\Users\\chrome-bot\\botdata\\resources\"",
+      "8"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "copy [START_DIR]/skia/resources to device.copy C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\\resources to C:\\Users\\chrome-bot\\botdata\\resources",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "[START_DIR]/skia/infra/bots/assets/skp/VERSION",
+      "/path/to/tmp/"
+    ],
+    "infra_step": true,
+    "name": "Get skp VERSION"
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "42",
+      "[START_DIR]/tmp/SKP_VERSION"
+    ],
+    "infra_step": true,
+    "name": "write SKP_VERSION"
+  },
+  {
+    "cmd": [],
+    "name": "read C:\\Users\\chrome-bot\\botdata\\SKP_VERSION"
+  },
+  {
+    "cmd": [
+      "scp",
+      "foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\SKP_VERSION",
+      "[CLEANUP]/read_file_on_device_tmp_1/SKP_VERSION"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "read C:\\Users\\chrome-bot\\botdata\\SKP_VERSION.scp foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\SKP_VERSION [CLEANUP]/read_file_on_device_tmp_1/SKP_VERSION",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "[CLEANUP]/read_file_on_device_tmp_1/SKP_VERSION",
+      "/path/to/tmp/"
+    ],
+    "infra_step": true,
+    "name": "read C:\\Users\\chrome-bot\\botdata\\SKP_VERSION.read SKP_VERSION",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "rmtree",
+      "[CLEANUP]/read_file_on_device_tmp_1"
+    ],
+    "infra_step": true,
+    "name": "read C:\\Users\\chrome-bot\\botdata\\SKP_VERSION.rmtree [CLEANUP]/read_file_on_device_tmp_1",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "if exist \"C:\\Users\\chrome-bot\\botdata\\SKP_VERSION\" del \"C:\\Users\\chrome-bot\\botdata\\SKP_VERSION\"",
+      "1"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "rm C:\\Users\\chrome-bot\\botdata\\SKP_VERSION"
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "robocopy /mir \"C:\\Users\\chrome-bot\\botdata\\empty\" \"C:\\Users\\chrome-bot\\botdata\\skps\"",
+      "8"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "clean C:\\Users\\chrome-bot\\botdata\\skps"
+  },
+  {
+    "cmd": [],
+    "name": "copy [START_DIR]/skp to device"
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "robocopy /mir \"C:\\Users\\chrome-bot\\botdata\\empty\" \"C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\"",
+      "8"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "copy [START_DIR]/skp to device.clean C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "scp",
+      "-r",
+      "[START_DIR]/skp",
+      "foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\\skp"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "copy [START_DIR]/skp to device.scp -r [START_DIR]/skp foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\\skp",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "robocopy /mir \"C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\\skp\" \"C:\\Users\\chrome-bot\\botdata\\skps\"",
+      "8"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "copy [START_DIR]/skp to device.copy C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\\skp to C:\\Users\\chrome-bot\\botdata\\skps",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "scp",
+      "[START_DIR]/tmp/SKP_VERSION",
+      "foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\SKP_VERSION"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "scp [START_DIR]/tmp/SKP_VERSION foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\SKP_VERSION"
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "[START_DIR]/skia/infra/bots/assets/skimage/VERSION",
+      "/path/to/tmp/"
+    ],
+    "infra_step": true,
+    "name": "Get skimage VERSION"
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "42",
+      "[START_DIR]/tmp/SK_IMAGE_VERSION"
+    ],
+    "infra_step": true,
+    "name": "write SK_IMAGE_VERSION"
+  },
+  {
+    "cmd": [],
+    "name": "read C:\\Users\\chrome-bot\\botdata\\SK_IMAGE_VERSION"
+  },
+  {
+    "cmd": [
+      "scp",
+      "foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\SK_IMAGE_VERSION",
+      "[CLEANUP]/read_file_on_device_tmp_2/SK_IMAGE_VERSION"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "read C:\\Users\\chrome-bot\\botdata\\SK_IMAGE_VERSION.scp foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\SK_IMAGE_VERSION [CLEANUP]/read_file_on_device_tmp_2/SK_IMAGE_VERSION",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "[CLEANUP]/read_file_on_device_tmp_2/SK_IMAGE_VERSION",
+      "/path/to/tmp/"
+    ],
+    "infra_step": true,
+    "name": "read C:\\Users\\chrome-bot\\botdata\\SK_IMAGE_VERSION.read SK_IMAGE_VERSION",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "rmtree",
+      "[CLEANUP]/read_file_on_device_tmp_2"
+    ],
+    "infra_step": true,
+    "name": "read C:\\Users\\chrome-bot\\botdata\\SK_IMAGE_VERSION.rmtree [CLEANUP]/read_file_on_device_tmp_2",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "if exist \"C:\\Users\\chrome-bot\\botdata\\SK_IMAGE_VERSION\" del \"C:\\Users\\chrome-bot\\botdata\\SK_IMAGE_VERSION\"",
+      "1"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "rm C:\\Users\\chrome-bot\\botdata\\SK_IMAGE_VERSION"
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "robocopy /mir \"C:\\Users\\chrome-bot\\botdata\\empty\" \"C:\\Users\\chrome-bot\\botdata\\images\"",
+      "8"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "clean C:\\Users\\chrome-bot\\botdata\\images"
+  },
+  {
+    "cmd": [],
+    "name": "copy [START_DIR]/skimage to device"
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "robocopy /mir \"C:\\Users\\chrome-bot\\botdata\\empty\" \"C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\"",
+      "8"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "copy [START_DIR]/skimage to device.clean C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "scp",
+      "-r",
+      "[START_DIR]/skimage",
+      "foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\\skimage"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "copy [START_DIR]/skimage to device.scp -r [START_DIR]/skimage foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\\skimage",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "robocopy /mir \"C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\\skimage\" \"C:\\Users\\chrome-bot\\botdata\\images\"",
+      "8"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "copy [START_DIR]/skimage to device.copy C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\\skimage to C:\\Users\\chrome-bot\\botdata\\images",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "scp",
+      "[START_DIR]/tmp/SK_IMAGE_VERSION",
+      "foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\SK_IMAGE_VERSION"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "scp [START_DIR]/tmp/SK_IMAGE_VERSION foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\SK_IMAGE_VERSION"
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "[START_DIR]/skia/infra/bots/assets/svg/VERSION",
+      "/path/to/tmp/"
+    ],
+    "infra_step": true,
+    "name": "Get svg VERSION"
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "42",
+      "[START_DIR]/tmp/SVG_VERSION"
+    ],
+    "infra_step": true,
+    "name": "write SVG_VERSION"
+  },
+  {
+    "cmd": [],
+    "name": "read C:\\Users\\chrome-bot\\botdata\\SVG_VERSION"
+  },
+  {
+    "cmd": [
+      "scp",
+      "foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\SVG_VERSION",
+      "[CLEANUP]/read_file_on_device_tmp_3/SVG_VERSION"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "read C:\\Users\\chrome-bot\\botdata\\SVG_VERSION.scp foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\SVG_VERSION [CLEANUP]/read_file_on_device_tmp_3/SVG_VERSION",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "[CLEANUP]/read_file_on_device_tmp_3/SVG_VERSION",
+      "/path/to/tmp/"
+    ],
+    "infra_step": true,
+    "name": "read C:\\Users\\chrome-bot\\botdata\\SVG_VERSION.read SVG_VERSION",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "rmtree",
+      "[CLEANUP]/read_file_on_device_tmp_3"
+    ],
+    "infra_step": true,
+    "name": "read C:\\Users\\chrome-bot\\botdata\\SVG_VERSION.rmtree [CLEANUP]/read_file_on_device_tmp_3",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "if exist \"C:\\Users\\chrome-bot\\botdata\\SVG_VERSION\" del \"C:\\Users\\chrome-bot\\botdata\\SVG_VERSION\"",
+      "1"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "rm C:\\Users\\chrome-bot\\botdata\\SVG_VERSION"
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "robocopy /mir \"C:\\Users\\chrome-bot\\botdata\\empty\" \"C:\\Users\\chrome-bot\\botdata\\svgs\"",
+      "8"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "clean C:\\Users\\chrome-bot\\botdata\\svgs"
+  },
+  {
+    "cmd": [],
+    "name": "copy [START_DIR]/svg to device"
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "robocopy /mir \"C:\\Users\\chrome-bot\\botdata\\empty\" \"C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\"",
+      "8"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "copy [START_DIR]/svg to device.clean C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "scp",
+      "-r",
+      "[START_DIR]/svg",
+      "foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\\svg"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "copy [START_DIR]/svg to device.scp -r [START_DIR]/svg foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\\svg",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "robocopy /mir \"C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\\svg\" \"C:\\Users\\chrome-bot\\botdata\\svgs\"",
+      "8"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "copy [START_DIR]/svg to device.copy C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\\svg to C:\\Users\\chrome-bot\\botdata\\svgs",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "scp",
+      "[START_DIR]/tmp/SVG_VERSION",
+      "foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\SVG_VERSION"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "scp [START_DIR]/tmp/SVG_VERSION foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\SVG_VERSION"
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "rmtree",
+      "[START_DIR]/test"
+    ],
+    "infra_step": true,
+    "name": "rmtree test"
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "ensure-directory",
+      "--mode",
+      "0777",
+      "[START_DIR]/test"
+    ],
+    "infra_step": true,
+    "name": "makedirs test"
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "robocopy /mir \"C:\\Users\\chrome-bot\\botdata\\empty\" \"C:\\Users\\chrome-bot\\botdata\\dm_out\"",
+      "8"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "clean C:\\Users\\chrome-bot\\botdata\\dm_out"
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "\nimport contextlib\nimport math\nimport socket\nimport sys\nimport time\nimport urllib2\n\nHASHES_URL = sys.argv[1]\nRETRIES = 5\nTIMEOUT = 60\nWAIT_BASE = 15\n\nsocket.setdefaulttimeout(TIMEOUT)\nfor retry in range(RETRIES):\n  try:\n    with contextlib.closing(\n        urllib2.urlopen(HASHES_URL, timeout=TIMEOUT)) as w:\n      hashes = w.read()\n      with open(sys.argv[2], 'w') as f:\n        f.write(hashes)\n        break\n  except Exception as e:\n    print 'Failed to get uninteresting hashes from %s:' % HASHES_URL\n    print e\n    if retry == RETRIES:\n      raise\n    waittime = WAIT_BASE * math.pow(2, retry)\n    print 'Retry in %d seconds.' % waittime\n    time.sleep(waittime)\n",
+      "https://example.com/hashes.txt",
+      "[START_DIR]/tmp/uninteresting_hashes.txt"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "get uninteresting hashes",
+    "~followup_annotations": [
+      "@@@STEP_LOG_LINE@python.inline@@@@",
+      "@@@STEP_LOG_LINE@python.inline@import contextlib@@@",
+      "@@@STEP_LOG_LINE@python.inline@import math@@@",
+      "@@@STEP_LOG_LINE@python.inline@import socket@@@",
+      "@@@STEP_LOG_LINE@python.inline@import sys@@@",
+      "@@@STEP_LOG_LINE@python.inline@import time@@@",
+      "@@@STEP_LOG_LINE@python.inline@import urllib2@@@",
+      "@@@STEP_LOG_LINE@python.inline@@@@",
+      "@@@STEP_LOG_LINE@python.inline@HASHES_URL = sys.argv[1]@@@",
+      "@@@STEP_LOG_LINE@python.inline@RETRIES = 5@@@",
+      "@@@STEP_LOG_LINE@python.inline@TIMEOUT = 60@@@",
+      "@@@STEP_LOG_LINE@python.inline@WAIT_BASE = 15@@@",
+      "@@@STEP_LOG_LINE@python.inline@@@@",
+      "@@@STEP_LOG_LINE@python.inline@socket.setdefaulttimeout(TIMEOUT)@@@",
+      "@@@STEP_LOG_LINE@python.inline@for retry in range(RETRIES):@@@",
+      "@@@STEP_LOG_LINE@python.inline@  try:@@@",
+      "@@@STEP_LOG_LINE@python.inline@    with contextlib.closing(@@@",
+      "@@@STEP_LOG_LINE@python.inline@        urllib2.urlopen(HASHES_URL, timeout=TIMEOUT)) as w:@@@",
+      "@@@STEP_LOG_LINE@python.inline@      hashes = w.read()@@@",
+      "@@@STEP_LOG_LINE@python.inline@      with open(sys.argv[2], 'w') as f:@@@",
+      "@@@STEP_LOG_LINE@python.inline@        f.write(hashes)@@@",
+      "@@@STEP_LOG_LINE@python.inline@        break@@@",
+      "@@@STEP_LOG_LINE@python.inline@  except Exception as e:@@@",
+      "@@@STEP_LOG_LINE@python.inline@    print 'Failed to get uninteresting hashes from %s:' % HASHES_URL@@@",
+      "@@@STEP_LOG_LINE@python.inline@    print e@@@",
+      "@@@STEP_LOG_LINE@python.inline@    if retry == RETRIES:@@@",
+      "@@@STEP_LOG_LINE@python.inline@      raise@@@",
+      "@@@STEP_LOG_LINE@python.inline@    waittime = WAIT_BASE * math.pow(2, retry)@@@",
+      "@@@STEP_LOG_LINE@python.inline@    print 'Retry in %d seconds.' % waittime@@@",
+      "@@@STEP_LOG_LINE@python.inline@    time.sleep(waittime)@@@",
+      "@@@STEP_LOG_END@python.inline@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "scp",
+      "[START_DIR]/tmp/uninteresting_hashes.txt",
+      "foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\uninteresting_hashes.txt"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "scp [START_DIR]/tmp/uninteresting_hashes.txt foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\uninteresting_hashes.txt"
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "import os\nprint os.environ.get('SWARMING_BOT_ID', '')\n"
+    ],
+    "name": "get swarming bot id",
+    "stdout": "/path/to/tmp/",
+    "~followup_annotations": [
+      "@@@STEP_LOG_LINE@python.inline@import os@@@",
+      "@@@STEP_LOG_LINE@python.inline@print os.environ.get('SWARMING_BOT_ID', '')@@@",
+      "@@@STEP_LOG_END@python.inline@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "import os\nprint os.environ.get('SWARMING_TASK_ID', '')\n"
+    ],
+    "name": "get swarming task id",
+    "stdout": "/path/to/tmp/",
+    "~followup_annotations": [
+      "@@@STEP_LOG_LINE@python.inline@import os@@@",
+      "@@@STEP_LOG_LINE@python.inline@print os.environ.get('SWARMING_TASK_ID', '')@@@",
+      "@@@STEP_LOG_END@python.inline@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "copy [START_DIR]/build to device"
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "robocopy /mir \"C:\\Users\\chrome-bot\\botdata\\empty\" \"C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\"",
+      "8"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "copy [START_DIR]/build to device.clean C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "scp",
+      "-r",
+      "[START_DIR]/build",
+      "foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\\build"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "copy [START_DIR]/build to device.scp -r [START_DIR]/build foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\\build",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "robocopy /mir \"C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\\build\" \"C:\\Users\\chrome-bot\\botdata\\bin\"",
+      "8"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "copy [START_DIR]/build to device.copy C:\\Users\\chrome-bot\\botdata\\tmp_copy_directory_contents_to_device\\build to C:\\Users\\chrome-bot\\botdata\\bin",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[skia::flavor]/resources/win_ssh_cmd.py",
+      "foo@127.0.0.1",
+      "C:\\Users\\chrome-bot\\botdata\\bin\\dm --resourcePath C:\\Users\\chrome-bot\\botdata\\resources --skps C:\\Users\\chrome-bot\\botdata\\skps --images C:\\Users\\chrome-bot\\botdata\\images\\dm --colorImages C:\\Users\\chrome-bot\\botdata\\images\\colorspace --nameByHash --properties gitHash abc123 builder Test-Win10-MSVC-LenovoYogaC630-GPU-Adreno630-arm64-Debug-All-ANGLE buildbucket_build_id 123454321 task_id task_12345 swarming_bot_id skia-bot-123 swarming_task_id 123456 --svgs C:\\Users\\chrome-bot\\botdata\\svgs --key arch arm64 compiler MSVC configuration Debug cpu_or_gpu GPU cpu_or_gpu_value Adreno630 extra_config ANGLE model LenovoYogaC630 os Win10 style default --uninterestingHashesFile C:\\Users\\chrome-bot\\botdata\\uninteresting_hashes.txt --writePath C:\\Users\\chrome-bot\\botdata\\dm_out --dont_write pdf --randomProcessorTest --nocpu --config angle_d3d11_es2 angle_d3d11_es3 angle_d3d11_es2_msaa8 angle_d3d11_es3_msaa8 --src tests gm image colorImage svg --blacklist _ svg _ svgparse_ _ image gen_platf pal8os2v2.bmp _ image gen_platf pal8os2v2-16.bmp _ image gen_platf rgba32abf.bmp _ image gen_platf rgb24prof.bmp _ image gen_platf rgb24lprof.bmp _ image gen_platf 8bpp-pixeldata-cropped.bmp _ image gen_platf 4bpp-pixeldata-cropped.bmp _ image gen_platf 32bpp-pixeldata-cropped.bmp _ image gen_platf 24bpp-pixeldata-cropped.bmp _ image gen_platf testimgari.jpg _ image gen_platf rle8-height-negative.bmp _ image gen_platf rle4-height-negative.bmp _ image gen_platf error _ image _ interlaced1.png _ image _ interlaced2.png _ image _ interlaced3.png _ image _ .arw _ image _ .cr2 _ image _ .dng _ image _ .nef _ image _ .nrw _ image _ .orf _ image _ .raf _ image _ .rw2 _ image _ .pef _ image _ .srw _ image _ .ARW _ image _ .CR2 _ image _ .DNG _ image _ .NEF _ image _ .NRW _ image _ .ORF _ image _ .RAF _ image _ .RW2 _ image _ .PEF _ image _ .SRW _ tests _ GrDefaultPathRendererTest --match ~BlurMaskBiggerThanDest --nonativeFonts --verbose",
+      "1"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "name": "dm"
+  },
+  {
+    "cmd": [
+      "scp",
+      "-r",
+      "foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\dm_out\\*",
+      "[START_DIR]/[SWARM_OUT_DIR]"
+    ],
+    "env": {
+      "CHROME_HEADLESS": "1",
+      "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+    },
+    "infra_step": true,
+    "name": "scp -r foo@127.0.0.1:C:\\Users\\chrome-bot\\botdata\\dm_out\\* [START_DIR]/[SWARM_OUT_DIR]"
+  },
+  {
+    "jsonResult": null,
+    "name": "$result"
+  }
+]
\ No newline at end of file
diff --git a/infra/bots/recipes/test.py b/infra/bots/recipes/test.py
index 70f1aa4..597309d 100644
--- a/infra/bots/recipes/test.py
+++ b/infra/bots/recipes/test.py
@@ -196,6 +196,10 @@
                  'angle_d3d9_es2',
                  'angle_gl_es2',
                  'angle_d3d11_es3']
+      if 'LenovoYogaC630' in bot:
+        # LenovoYogaC630 only supports D3D11, not GL.
+        configs = ['angle_d3d11_es2',
+                   'angle_d3d11_es3']
       if sample_count is not '':
         configs.append('angle_d3d11_es2_msaa' + sample_count)
         configs.append('angle_d3d11_es3_msaa' + sample_count)
@@ -768,6 +772,10 @@
     # skia:8762
     blacklist(['_', 'tests', '_', 'Codec_gif'])
 
+  if 'LenovoYogaC630' in bot and 'ANGLE' in api.vars.extra_tokens:
+    # skia:8976
+    blacklist(['_', 'tests', '_', 'GrDefaultPathRendererTest'])
+
   if blacklisted:
     args.append('--blacklist')
     args.extend(blacklisted)
@@ -1050,6 +1058,7 @@
   'Test-Win10-Clang-NUCD34010WYKH-GPU-IntelHD4400-x86_64-Release-All-ANGLE',
   'Test-Win10-Clang-ShuttleA-GPU-GTX660-x86_64-Release-All-Vulkan',
   'Test-Win10-Clang-ShuttleC-GPU-GTX960-x86_64-Debug-All-ANGLE',
+  'Test-Win10-MSVC-LenovoYogaC630-GPU-Adreno630-arm64-Debug-All-ANGLE',
   'Test-Win2016-Clang-GCE-CPU-AVX2-x86_64-Debug-All-FAAA',
   'Test-Win2016-Clang-GCE-CPU-AVX2-x86_64-Debug-All-FSAA',
   'Test-Win2016-MSVC-GCE-CPU-AVX2-x86_64-Debug-All-MSRTC',
@@ -1083,7 +1092,7 @@
       api.step_data('get swarming task id',
           stdout=api.raw_io.output('123456'))
     )
-    if 'Win' in builder:
+    if 'Win' in builder and not 'LenovoYogaC630' in builder:
       test += api.platform('win', 64)
 
     if 'Chromecast' in builder:
diff --git a/infra/bots/tasks.json b/infra/bots/tasks.json
index 28077e9..162785ce 100755
--- a/infra/bots/tasks.json
+++ b/infra/bots/tasks.json
@@ -575,11 +575,21 @@
         "Build-Win-MSVC-arm64-Debug"
       ]
     },
+    "Build-Win-MSVC-arm64-Debug-ANGLE": {
+      "tasks": [
+        "Build-Win-MSVC-arm64-Debug-ANGLE"
+      ]
+    },
     "Build-Win-MSVC-arm64-Release": {
       "tasks": [
         "Build-Win-MSVC-arm64-Release"
       ]
     },
+    "Build-Win-MSVC-arm64-Release-ANGLE": {
+      "tasks": [
+        "Build-Win-MSVC-arm64-Release-ANGLE"
+      ]
+    },
     "Build-Win-MSVC-x86-Debug": {
       "tasks": [
         "Build-Win-MSVC-x86-Debug"
@@ -3158,6 +3168,16 @@
         "Upload-Test-Win10-MSVC-Golo-GPU-QuadroP400-x86_64-Release-All-Vulkan"
       ]
     },
+    "Test-Win10-MSVC-LenovoYogaC630-CPU-Snapdragon850-arm64-Debug-All": {
+      "tasks": [
+        "Upload-Test-Win10-MSVC-LenovoYogaC630-CPU-Snapdragon850-arm64-Debug-All"
+      ]
+    },
+    "Test-Win10-MSVC-LenovoYogaC630-GPU-Adreno630-arm64-Debug-All-ANGLE": {
+      "tasks": [
+        "Upload-Test-Win10-MSVC-LenovoYogaC630-GPU-Adreno630-arm64-Debug-All-ANGLE"
+      ]
+    },
     "Test-Win2016-Clang-GCE-CPU-AVX2-x86-Debug-All": {
       "tasks": [
         "Upload-Test-Win2016-Clang-GCE-CPU-AVX2-x86-Debug-All"
@@ -18067,6 +18087,137 @@
       ],
       "service_account": "skia-external-compile-tasks@skia-swarming-bots.iam.gserviceaccount.com"
     },
+    "Build-Win-MSVC-arm64-Debug-ANGLE": {
+      "caches": [
+        {
+          "name": "vpython",
+          "path": "cache/vpython"
+        },
+        {
+          "name": "git",
+          "path": "cache/git"
+        },
+        {
+          "name": "git_cache",
+          "path": "cache/git_cache"
+        },
+        {
+          "name": "work",
+          "path": "cache/work"
+        }
+      ],
+      "cipd_packages": [
+        {
+          "name": "infra/tools/luci/kitchen/${platform}",
+          "path": ".",
+          "version": "git_revision:d8f38ca9494b5af249942631f9cee45927f6b4bc"
+        },
+        {
+          "name": "infra/tools/luci-auth/${platform}",
+          "path": "cipd_bin_packages",
+          "version": "git_revision:2c805f1c716f6c5ad2126b27ec88b8585a09481e"
+        },
+        {
+          "name": "infra/tools/luci/vpython/${platform}",
+          "path": "cipd_bin_packages",
+          "version": "git_revision:96f81e737868d43124b4661cf1c325296ca04944"
+        },
+        {
+          "name": "infra/python/cpython/${platform}",
+          "path": "cipd_bin_packages",
+          "version": "version:2.7.14.chromium14"
+        },
+        {
+          "name": "infra/git/${platform}",
+          "path": "cipd_bin_packages",
+          "version": "version:2.17.1.chromium15"
+        },
+        {
+          "name": "infra/tools/git/${platform}",
+          "path": "cipd_bin_packages",
+          "version": "git_revision:c9c8a52bfeaf8bc00ece22fdfd447822c8fcad77"
+        },
+        {
+          "name": "infra/tools/luci/git-credential-luci/${platform}",
+          "path": "cipd_bin_packages",
+          "version": "git_revision:2c805f1c716f6c5ad2126b27ec88b8585a09481e"
+        }
+      ],
+      "command": [
+        "./kitchen${EXECUTABLE_SUFFIX}",
+        "cook",
+        "-checkout-dir",
+        "recipe_bundle",
+        "-mode",
+        "swarming",
+        "-luci-system-account",
+        "system",
+        "-cache-dir",
+        "cache",
+        "-temp-dir",
+        "tmp",
+        "-known-gerrit-host",
+        "android.googlesource.com",
+        "-known-gerrit-host",
+        "boringssl.googlesource.com",
+        "-known-gerrit-host",
+        "chromium.googlesource.com",
+        "-known-gerrit-host",
+        "dart.googlesource.com",
+        "-known-gerrit-host",
+        "fuchsia.googlesource.com",
+        "-known-gerrit-host",
+        "go.googlesource.com",
+        "-known-gerrit-host",
+        "llvm.googlesource.com",
+        "-known-gerrit-host",
+        "skia.googlesource.com",
+        "-known-gerrit-host",
+        "webrtc.googlesource.com",
+        "-output-result-json",
+        "${ISOLATED_OUTDIR}/build_result_filename",
+        "-workdir",
+        ".",
+        "-recipe",
+        "compile",
+        "-properties",
+        "{\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"buildbucket_build_id\":\"<(BUILDBUCKET_BUILD_ID)\",\"buildername\":\"Build-Win-MSVC-arm64-Debug-ANGLE\",\"patch_issue\":\"<(ISSUE)\",\"patch_ref\":\"<(PATCH_REF)\",\"patch_repo\":\"<(PATCH_REPO)\",\"patch_set\":\"<(PATCHSET)\",\"patch_storage\":\"<(PATCH_STORAGE)\",\"repository\":\"<(REPO)\",\"revision\":\"<(REVISION)\",\"swarm_out_dir\":\"build\",\"task_id\":\"<(TASK_ID)\"}",
+        "-logdog-annotation-url",
+        "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
+      ],
+      "dependencies": [
+        "Housekeeper-PerCommit-BundleRecipes",
+        "Housekeeper-PerCommit-IsolateWinToolchain"
+      ],
+      "dimensions": [
+        "cpu:x86-64-Haswell_GCE",
+        "gpu:none",
+        "image:windows-server-2016-dc-v20190108",
+        "machine_type:n1-highcpu-64",
+        "os:Windows-2016Server-14393",
+        "pool:Skia"
+      ],
+      "env_prefixes": {
+        "PATH": [
+          "cipd_bin_packages",
+          "cipd_bin_packages/bin"
+        ],
+        "VPYTHON_VIRTUALENV_ROOT": [
+          "cache/vpython"
+        ]
+      },
+      "execution_timeout_ns": 3600000000000,
+      "extra_tags": {
+        "log_location": "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
+      },
+      "io_timeout_ns": 3600000000000,
+      "isolate": "swarm_recipe.isolate",
+      "max_attempts": 2,
+      "outputs": [
+        "build"
+      ],
+      "service_account": "skia-external-compile-tasks@skia-swarming-bots.iam.gserviceaccount.com"
+    },
     "Build-Win-MSVC-arm64-Release": {
       "caches": [
         {
@@ -18198,6 +18349,137 @@
       ],
       "service_account": "skia-external-compile-tasks@skia-swarming-bots.iam.gserviceaccount.com"
     },
+    "Build-Win-MSVC-arm64-Release-ANGLE": {
+      "caches": [
+        {
+          "name": "vpython",
+          "path": "cache/vpython"
+        },
+        {
+          "name": "git",
+          "path": "cache/git"
+        },
+        {
+          "name": "git_cache",
+          "path": "cache/git_cache"
+        },
+        {
+          "name": "work",
+          "path": "cache/work"
+        }
+      ],
+      "cipd_packages": [
+        {
+          "name": "infra/tools/luci/kitchen/${platform}",
+          "path": ".",
+          "version": "git_revision:d8f38ca9494b5af249942631f9cee45927f6b4bc"
+        },
+        {
+          "name": "infra/tools/luci-auth/${platform}",
+          "path": "cipd_bin_packages",
+          "version": "git_revision:2c805f1c716f6c5ad2126b27ec88b8585a09481e"
+        },
+        {
+          "name": "infra/tools/luci/vpython/${platform}",
+          "path": "cipd_bin_packages",
+          "version": "git_revision:96f81e737868d43124b4661cf1c325296ca04944"
+        },
+        {
+          "name": "infra/python/cpython/${platform}",
+          "path": "cipd_bin_packages",
+          "version": "version:2.7.14.chromium14"
+        },
+        {
+          "name": "infra/git/${platform}",
+          "path": "cipd_bin_packages",
+          "version": "version:2.17.1.chromium15"
+        },
+        {
+          "name": "infra/tools/git/${platform}",
+          "path": "cipd_bin_packages",
+          "version": "git_revision:c9c8a52bfeaf8bc00ece22fdfd447822c8fcad77"
+        },
+        {
+          "name": "infra/tools/luci/git-credential-luci/${platform}",
+          "path": "cipd_bin_packages",
+          "version": "git_revision:2c805f1c716f6c5ad2126b27ec88b8585a09481e"
+        }
+      ],
+      "command": [
+        "./kitchen${EXECUTABLE_SUFFIX}",
+        "cook",
+        "-checkout-dir",
+        "recipe_bundle",
+        "-mode",
+        "swarming",
+        "-luci-system-account",
+        "system",
+        "-cache-dir",
+        "cache",
+        "-temp-dir",
+        "tmp",
+        "-known-gerrit-host",
+        "android.googlesource.com",
+        "-known-gerrit-host",
+        "boringssl.googlesource.com",
+        "-known-gerrit-host",
+        "chromium.googlesource.com",
+        "-known-gerrit-host",
+        "dart.googlesource.com",
+        "-known-gerrit-host",
+        "fuchsia.googlesource.com",
+        "-known-gerrit-host",
+        "go.googlesource.com",
+        "-known-gerrit-host",
+        "llvm.googlesource.com",
+        "-known-gerrit-host",
+        "skia.googlesource.com",
+        "-known-gerrit-host",
+        "webrtc.googlesource.com",
+        "-output-result-json",
+        "${ISOLATED_OUTDIR}/build_result_filename",
+        "-workdir",
+        ".",
+        "-recipe",
+        "compile",
+        "-properties",
+        "{\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"buildbucket_build_id\":\"<(BUILDBUCKET_BUILD_ID)\",\"buildername\":\"Build-Win-MSVC-arm64-Release-ANGLE\",\"patch_issue\":\"<(ISSUE)\",\"patch_ref\":\"<(PATCH_REF)\",\"patch_repo\":\"<(PATCH_REPO)\",\"patch_set\":\"<(PATCHSET)\",\"patch_storage\":\"<(PATCH_STORAGE)\",\"repository\":\"<(REPO)\",\"revision\":\"<(REVISION)\",\"swarm_out_dir\":\"build\",\"task_id\":\"<(TASK_ID)\"}",
+        "-logdog-annotation-url",
+        "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
+      ],
+      "dependencies": [
+        "Housekeeper-PerCommit-BundleRecipes",
+        "Housekeeper-PerCommit-IsolateWinToolchain"
+      ],
+      "dimensions": [
+        "cpu:x86-64-Haswell_GCE",
+        "gpu:none",
+        "image:windows-server-2016-dc-v20190108",
+        "machine_type:n1-highcpu-64",
+        "os:Windows-2016Server-14393",
+        "pool:Skia"
+      ],
+      "env_prefixes": {
+        "PATH": [
+          "cipd_bin_packages",
+          "cipd_bin_packages/bin"
+        ],
+        "VPYTHON_VIRTUALENV_ROOT": [
+          "cache/vpython"
+        ]
+      },
+      "execution_timeout_ns": 3600000000000,
+      "extra_tags": {
+        "log_location": "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
+      },
+      "io_timeout_ns": 3600000000000,
+      "isolate": "swarm_recipe.isolate",
+      "max_attempts": 2,
+      "outputs": [
+        "build"
+      ],
+      "service_account": "skia-external-compile-tasks@skia-swarming-bots.iam.gserviceaccount.com"
+    },
     "Build-Win-MSVC-x86-Debug": {
       "caches": [
         {
@@ -73876,6 +74158,228 @@
         "test"
       ]
     },
+    "Test-Win10-MSVC-LenovoYogaC630-CPU-Snapdragon850-arm64-Debug-All": {
+      "caches": [
+        {
+          "name": "vpython",
+          "path": "cache/vpython"
+        }
+      ],
+      "cipd_packages": [
+        {
+          "name": "infra/tools/luci/kitchen/${platform}",
+          "path": ".",
+          "version": "git_revision:d8f38ca9494b5af249942631f9cee45927f6b4bc"
+        },
+        {
+          "name": "infra/tools/luci-auth/${platform}",
+          "path": "cipd_bin_packages",
+          "version": "git_revision:2c805f1c716f6c5ad2126b27ec88b8585a09481e"
+        },
+        {
+          "name": "infra/tools/luci/vpython/${platform}",
+          "path": "cipd_bin_packages",
+          "version": "git_revision:96f81e737868d43124b4661cf1c325296ca04944"
+        },
+        {
+          "name": "skia/bots/skimage",
+          "path": "skimage",
+          "version": "version:39"
+        },
+        {
+          "name": "skia/bots/skp",
+          "path": "skp",
+          "version": "version:182"
+        },
+        {
+          "name": "skia/bots/svg",
+          "path": "svg",
+          "version": "version:9"
+        }
+      ],
+      "command": [
+        "./kitchen${EXECUTABLE_SUFFIX}",
+        "cook",
+        "-checkout-dir",
+        "recipe_bundle",
+        "-mode",
+        "swarming",
+        "-luci-system-account",
+        "system",
+        "-cache-dir",
+        "cache",
+        "-temp-dir",
+        "tmp",
+        "-known-gerrit-host",
+        "android.googlesource.com",
+        "-known-gerrit-host",
+        "boringssl.googlesource.com",
+        "-known-gerrit-host",
+        "chromium.googlesource.com",
+        "-known-gerrit-host",
+        "dart.googlesource.com",
+        "-known-gerrit-host",
+        "fuchsia.googlesource.com",
+        "-known-gerrit-host",
+        "go.googlesource.com",
+        "-known-gerrit-host",
+        "llvm.googlesource.com",
+        "-known-gerrit-host",
+        "skia.googlesource.com",
+        "-known-gerrit-host",
+        "webrtc.googlesource.com",
+        "-output-result-json",
+        "${ISOLATED_OUTDIR}/build_result_filename",
+        "-workdir",
+        ".",
+        "-recipe",
+        "test",
+        "-properties",
+        "{\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"buildbucket_build_id\":\"<(BUILDBUCKET_BUILD_ID)\",\"buildername\":\"Test-Win10-MSVC-LenovoYogaC630-CPU-Snapdragon850-arm64-Debug-All\",\"gold_hashes_url\":\"https://storage.googleapis.com/skia-infra-gm/hash_files/gold-prod-hashes.txt\",\"patch_issue\":\"<(ISSUE)\",\"patch_ref\":\"<(PATCH_REF)\",\"patch_repo\":\"<(PATCH_REPO)\",\"patch_set\":\"<(PATCHSET)\",\"patch_storage\":\"<(PATCH_STORAGE)\",\"repository\":\"<(REPO)\",\"revision\":\"<(REVISION)\",\"swarm_out_dir\":\"test\",\"task_id\":\"<(TASK_ID)\"}",
+        "-logdog-annotation-url",
+        "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
+      ],
+      "dependencies": [
+        "Housekeeper-PerCommit-BundleRecipes",
+        "Build-Win-MSVC-arm64-Debug"
+      ],
+      "dimensions": [
+        "cpu:arm64-64-Snapdragon850",
+        "os:Windows-10-17763.379",
+        "pool:Skia"
+      ],
+      "env_prefixes": {
+        "PATH": [
+          "cipd_bin_packages",
+          "cipd_bin_packages/bin"
+        ],
+        "VPYTHON_VIRTUALENV_ROOT": [
+          "cache/vpython"
+        ]
+      },
+      "execution_timeout_ns": 14400000000000,
+      "expiration_ns": 72000000000000,
+      "extra_tags": {
+        "log_location": "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
+      },
+      "io_timeout_ns": 14400000000000,
+      "isolate": "test_skia_bundled.isolate",
+      "max_attempts": 2,
+      "outputs": [
+        "test"
+      ]
+    },
+    "Test-Win10-MSVC-LenovoYogaC630-GPU-Adreno630-arm64-Debug-All-ANGLE": {
+      "caches": [
+        {
+          "name": "vpython",
+          "path": "cache/vpython"
+        }
+      ],
+      "cipd_packages": [
+        {
+          "name": "infra/tools/luci/kitchen/${platform}",
+          "path": ".",
+          "version": "git_revision:d8f38ca9494b5af249942631f9cee45927f6b4bc"
+        },
+        {
+          "name": "infra/tools/luci-auth/${platform}",
+          "path": "cipd_bin_packages",
+          "version": "git_revision:2c805f1c716f6c5ad2126b27ec88b8585a09481e"
+        },
+        {
+          "name": "infra/tools/luci/vpython/${platform}",
+          "path": "cipd_bin_packages",
+          "version": "git_revision:96f81e737868d43124b4661cf1c325296ca04944"
+        },
+        {
+          "name": "skia/bots/skimage",
+          "path": "skimage",
+          "version": "version:39"
+        },
+        {
+          "name": "skia/bots/skp",
+          "path": "skp",
+          "version": "version:182"
+        },
+        {
+          "name": "skia/bots/svg",
+          "path": "svg",
+          "version": "version:9"
+        }
+      ],
+      "command": [
+        "./kitchen${EXECUTABLE_SUFFIX}",
+        "cook",
+        "-checkout-dir",
+        "recipe_bundle",
+        "-mode",
+        "swarming",
+        "-luci-system-account",
+        "system",
+        "-cache-dir",
+        "cache",
+        "-temp-dir",
+        "tmp",
+        "-known-gerrit-host",
+        "android.googlesource.com",
+        "-known-gerrit-host",
+        "boringssl.googlesource.com",
+        "-known-gerrit-host",
+        "chromium.googlesource.com",
+        "-known-gerrit-host",
+        "dart.googlesource.com",
+        "-known-gerrit-host",
+        "fuchsia.googlesource.com",
+        "-known-gerrit-host",
+        "go.googlesource.com",
+        "-known-gerrit-host",
+        "llvm.googlesource.com",
+        "-known-gerrit-host",
+        "skia.googlesource.com",
+        "-known-gerrit-host",
+        "webrtc.googlesource.com",
+        "-output-result-json",
+        "${ISOLATED_OUTDIR}/build_result_filename",
+        "-workdir",
+        ".",
+        "-recipe",
+        "test",
+        "-properties",
+        "{\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"buildbucket_build_id\":\"<(BUILDBUCKET_BUILD_ID)\",\"buildername\":\"Test-Win10-MSVC-LenovoYogaC630-GPU-Adreno630-arm64-Debug-All-ANGLE\",\"gold_hashes_url\":\"https://storage.googleapis.com/skia-infra-gm/hash_files/gold-prod-hashes.txt\",\"patch_issue\":\"<(ISSUE)\",\"patch_ref\":\"<(PATCH_REF)\",\"patch_repo\":\"<(PATCH_REPO)\",\"patch_set\":\"<(PATCHSET)\",\"patch_storage\":\"<(PATCH_STORAGE)\",\"repository\":\"<(REPO)\",\"revision\":\"<(REVISION)\",\"swarm_out_dir\":\"test\",\"task_id\":\"<(TASK_ID)\"}",
+        "-logdog-annotation-url",
+        "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
+      ],
+      "dependencies": [
+        "Housekeeper-PerCommit-BundleRecipes",
+        "Build-Win-MSVC-arm64-Debug-ANGLE"
+      ],
+      "dimensions": [
+        "gpu:Adreno630",
+        "os:Windows-10-17763.379",
+        "pool:Skia"
+      ],
+      "env_prefixes": {
+        "PATH": [
+          "cipd_bin_packages",
+          "cipd_bin_packages/bin"
+        ],
+        "VPYTHON_VIRTUALENV_ROOT": [
+          "cache/vpython"
+        ]
+      },
+      "execution_timeout_ns": 14400000000000,
+      "expiration_ns": 72000000000000,
+      "extra_tags": {
+        "log_location": "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
+      },
+      "io_timeout_ns": 14400000000000,
+      "isolate": "test_skia_bundled.isolate",
+      "max_attempts": 2,
+      "outputs": [
+        "test"
+      ]
+    },
     "Test-Win2016-Clang-GCE-CPU-AVX2-x86-Debug-All": {
       "caches": [
         {
@@ -113064,6 +113568,206 @@
       "max_attempts": 2,
       "service_account": "skia-external-gm-uploader@skia-swarming-bots.iam.gserviceaccount.com"
     },
+    "Upload-Test-Win10-MSVC-LenovoYogaC630-CPU-Snapdragon850-arm64-Debug-All": {
+      "caches": [
+        {
+          "name": "vpython",
+          "path": "cache/vpython"
+        }
+      ],
+      "cipd_packages": [
+        {
+          "name": "infra/tools/luci/kitchen/${platform}",
+          "path": ".",
+          "version": "git_revision:d8f38ca9494b5af249942631f9cee45927f6b4bc"
+        },
+        {
+          "name": "infra/tools/luci-auth/${platform}",
+          "path": "cipd_bin_packages",
+          "version": "git_revision:2c805f1c716f6c5ad2126b27ec88b8585a09481e"
+        },
+        {
+          "name": "infra/tools/luci/vpython/${platform}",
+          "path": "cipd_bin_packages",
+          "version": "git_revision:96f81e737868d43124b4661cf1c325296ca04944"
+        },
+        {
+          "name": "infra/gsutil",
+          "path": "cipd_bin_packages",
+          "version": "version:4.28"
+        }
+      ],
+      "command": [
+        "./kitchen${EXECUTABLE_SUFFIX}",
+        "cook",
+        "-checkout-dir",
+        "recipe_bundle",
+        "-mode",
+        "swarming",
+        "-luci-system-account",
+        "system",
+        "-cache-dir",
+        "cache",
+        "-temp-dir",
+        "tmp",
+        "-known-gerrit-host",
+        "android.googlesource.com",
+        "-known-gerrit-host",
+        "boringssl.googlesource.com",
+        "-known-gerrit-host",
+        "chromium.googlesource.com",
+        "-known-gerrit-host",
+        "dart.googlesource.com",
+        "-known-gerrit-host",
+        "fuchsia.googlesource.com",
+        "-known-gerrit-host",
+        "go.googlesource.com",
+        "-known-gerrit-host",
+        "llvm.googlesource.com",
+        "-known-gerrit-host",
+        "skia.googlesource.com",
+        "-known-gerrit-host",
+        "webrtc.googlesource.com",
+        "-output-result-json",
+        "${ISOLATED_OUTDIR}/build_result_filename",
+        "-workdir",
+        ".",
+        "-recipe",
+        "upload_dm_results",
+        "-properties",
+        "{\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"buildbucket_build_id\":\"<(BUILDBUCKET_BUILD_ID)\",\"buildername\":\"Test-Win10-MSVC-LenovoYogaC630-CPU-Snapdragon850-arm64-Debug-All\",\"gs_bucket\":\"skia-infra-gm\",\"patch_issue\":\"<(ISSUE)\",\"patch_ref\":\"<(PATCH_REF)\",\"patch_repo\":\"<(PATCH_REPO)\",\"patch_set\":\"<(PATCHSET)\",\"patch_storage\":\"<(PATCH_STORAGE)\",\"repository\":\"<(REPO)\",\"revision\":\"<(REVISION)\",\"swarm_out_dir\":\"output_ignored\",\"task_id\":\"<(TASK_ID)\"}",
+        "-logdog-annotation-url",
+        "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
+      ],
+      "dependencies": [
+        "Housekeeper-PerCommit-BundleRecipes",
+        "Test-Win10-MSVC-LenovoYogaC630-CPU-Snapdragon850-arm64-Debug-All"
+      ],
+      "dimensions": [
+        "cpu:x86-64-Haswell_GCE",
+        "gpu:none",
+        "machine_type:n1-highmem-2",
+        "os:Debian-9.8",
+        "pool:Skia"
+      ],
+      "env_prefixes": {
+        "PATH": [
+          "cipd_bin_packages",
+          "cipd_bin_packages/bin"
+        ],
+        "VPYTHON_VIRTUALENV_ROOT": [
+          "cache/vpython"
+        ]
+      },
+      "execution_timeout_ns": 3600000000000,
+      "extra_tags": {
+        "log_location": "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
+      },
+      "io_timeout_ns": 3600000000000,
+      "isolate": "swarm_recipe.isolate",
+      "max_attempts": 2,
+      "service_account": "skia-external-gm-uploader@skia-swarming-bots.iam.gserviceaccount.com"
+    },
+    "Upload-Test-Win10-MSVC-LenovoYogaC630-GPU-Adreno630-arm64-Debug-All-ANGLE": {
+      "caches": [
+        {
+          "name": "vpython",
+          "path": "cache/vpython"
+        }
+      ],
+      "cipd_packages": [
+        {
+          "name": "infra/tools/luci/kitchen/${platform}",
+          "path": ".",
+          "version": "git_revision:d8f38ca9494b5af249942631f9cee45927f6b4bc"
+        },
+        {
+          "name": "infra/tools/luci-auth/${platform}",
+          "path": "cipd_bin_packages",
+          "version": "git_revision:2c805f1c716f6c5ad2126b27ec88b8585a09481e"
+        },
+        {
+          "name": "infra/tools/luci/vpython/${platform}",
+          "path": "cipd_bin_packages",
+          "version": "git_revision:96f81e737868d43124b4661cf1c325296ca04944"
+        },
+        {
+          "name": "infra/gsutil",
+          "path": "cipd_bin_packages",
+          "version": "version:4.28"
+        }
+      ],
+      "command": [
+        "./kitchen${EXECUTABLE_SUFFIX}",
+        "cook",
+        "-checkout-dir",
+        "recipe_bundle",
+        "-mode",
+        "swarming",
+        "-luci-system-account",
+        "system",
+        "-cache-dir",
+        "cache",
+        "-temp-dir",
+        "tmp",
+        "-known-gerrit-host",
+        "android.googlesource.com",
+        "-known-gerrit-host",
+        "boringssl.googlesource.com",
+        "-known-gerrit-host",
+        "chromium.googlesource.com",
+        "-known-gerrit-host",
+        "dart.googlesource.com",
+        "-known-gerrit-host",
+        "fuchsia.googlesource.com",
+        "-known-gerrit-host",
+        "go.googlesource.com",
+        "-known-gerrit-host",
+        "llvm.googlesource.com",
+        "-known-gerrit-host",
+        "skia.googlesource.com",
+        "-known-gerrit-host",
+        "webrtc.googlesource.com",
+        "-output-result-json",
+        "${ISOLATED_OUTDIR}/build_result_filename",
+        "-workdir",
+        ".",
+        "-recipe",
+        "upload_dm_results",
+        "-properties",
+        "{\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"buildbucket_build_id\":\"<(BUILDBUCKET_BUILD_ID)\",\"buildername\":\"Test-Win10-MSVC-LenovoYogaC630-GPU-Adreno630-arm64-Debug-All-ANGLE\",\"gs_bucket\":\"skia-infra-gm\",\"patch_issue\":\"<(ISSUE)\",\"patch_ref\":\"<(PATCH_REF)\",\"patch_repo\":\"<(PATCH_REPO)\",\"patch_set\":\"<(PATCHSET)\",\"patch_storage\":\"<(PATCH_STORAGE)\",\"repository\":\"<(REPO)\",\"revision\":\"<(REVISION)\",\"swarm_out_dir\":\"output_ignored\",\"task_id\":\"<(TASK_ID)\"}",
+        "-logdog-annotation-url",
+        "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
+      ],
+      "dependencies": [
+        "Housekeeper-PerCommit-BundleRecipes",
+        "Test-Win10-MSVC-LenovoYogaC630-GPU-Adreno630-arm64-Debug-All-ANGLE"
+      ],
+      "dimensions": [
+        "cpu:x86-64-Haswell_GCE",
+        "gpu:none",
+        "machine_type:n1-highmem-2",
+        "os:Debian-9.8",
+        "pool:Skia"
+      ],
+      "env_prefixes": {
+        "PATH": [
+          "cipd_bin_packages",
+          "cipd_bin_packages/bin"
+        ],
+        "VPYTHON_VIRTUALENV_ROOT": [
+          "cache/vpython"
+        ]
+      },
+      "execution_timeout_ns": 3600000000000,
+      "extra_tags": {
+        "log_location": "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
+      },
+      "io_timeout_ns": 3600000000000,
+      "isolate": "swarm_recipe.isolate",
+      "max_attempts": 2,
+      "service_account": "skia-external-gm-uploader@skia-swarming-bots.iam.gserviceaccount.com"
+    },
     "Upload-Test-Win2016-Clang-GCE-CPU-AVX2-x86-Debug-All": {
       "caches": [
         {