gerrit-config: Initial commit

Change-Id: Ib457ae15f2013d4bb63c13701a1e028a89f8c3b1
diff --git a/nginx/dark.css b/nginx/dark.css
new file mode 100644
index 0000000..e3f359f
--- /dev/null
+++ b/nginx/dark.css
@@ -0,0 +1,443 @@
+/*
+                        _______
+                       /       \
+                      .==.    .==.
+                     ((  ))==((  ))
+                    / "=="    "=="\
+                   /____|| || ||___\
+       ________     ____    ________  ___    ___
+       |  ___  \   /    \   |  ___  \ |  |  /  /
+       |  |  \  \ /  /\  \  |  |  \  \|  |_/  /
+       |  |   )  /  /__\  \ |  |__/  /|  ___  \
+       |  |__/  /  ______  \|  ____  \|  |  \  \
+_______|_______/__/ ____ \__\__|___\__\__|___\__\____
+|  ___  \ |  ____/ /    \   |  ___  \ |  ____|  ___  \
+|  |  \  \|  |___ /  /\  \  |  |  \  \|  |___|  |  \  \
+|  |__/  /|  ____/  /__\  \ |  |   )  |  ____|  |__/  /
+|  ____  \|  |__/  ______  \|  |__/  /|  |___|  ____  \
+|__|   \__\____/__/      \__\_______/ |______|__|   \__\
+                https://darkreader.org
+*/
+
+/*! Dark reader generated CSS | Licensed under MIT https://github.com/darkreader/darkreader/blob/master/LICENSE */
+
+/* User-Agent Style */
+html {
+    background-color: #181a1b !important;
+}
+html {
+    color-scheme: dark !important;
+}
+html, body, input, textarea, select, button {
+    background-color: #181a1b;
+}
+html, body, input, textarea, select, button {
+    border-color: #736b5e;
+    color: #e8e6e3;
+}
+a {
+    color: #3391ff;
+}
+table {
+    border-color: #545b5e;
+}
+::placeholder {
+    color: #b2aba1;
+}
+input:-webkit-autofill,
+textarea:-webkit-autofill,
+select:-webkit-autofill {
+    background-color: #404400 !important;
+    color: #e8e6e3 !important;
+}
+::-webkit-scrollbar {
+    background-color: #202324;
+    color: #aba499;
+}
+::-webkit-scrollbar-thumb {
+    background-color: #454a4d;
+}
+::-webkit-scrollbar-thumb:hover {
+    background-color: #575e62;
+}
+::-webkit-scrollbar-thumb:active {
+    background-color: #484e51;
+}
+::-webkit-scrollbar-corner {
+    background-color: #181a1b;
+}
+* {
+    scrollbar-color: #454a4d #202324;
+}
+::selection {
+    background-color: #004daa !important;
+    color: #e8e6e3 !important;
+}
+::-moz-selection {
+    background-color: #004daa !important;
+    color: #e8e6e3 !important;
+}
+
+/* Invert Style */
+.jfk-bubble.gtx-bubble, .captcheck_answer_label > input + img, span#closed_text > img[src^="https://www.gstatic.com/images/branding/googlelogo"], span[data-href^="https://www.hcaptcha.com/"] > #icon, #bit-notification-bar-iframe, ::-webkit-calendar-picker-indicator {
+    filter: invert(100%) hue-rotate(180deg) contrast(90%) !important;
+}
+
+/* Variables Style */
+:root {
+   --darkreader-neutral-background: #131516;
+   --darkreader-neutral-text: #d8d4cf;
+   --darkreader-selection-background: #004daa;
+   --darkreader-selection-text: #e8e6e3;
+}
+
+/* Modified CSS */
+ul,
+ol {
+    list-style-image: none;
+}
+.u-sha1 {
+    background-color: rgb(31, 34, 35);
+    color: rgb(232, 230, 227);
+}
+.u-lineNum {
+    border-right-color: rgb(52, 56, 58);
+    color: rgb(168, 160, 149);
+}
+.Site {
+    background-color: rgb(24, 26, 27);
+    background-image: none;
+    color: rgb(232, 230, 227);
+}
+.Site-header,
+.Site-footer {
+    background-color: rgb(34, 36, 38);
+    background-image: none;
+}
+.Site-header--withNavbar {
+    background-color: rgb(24, 26, 27);
+    background-image: none;
+}
+.Header-anchor {
+    color: rgb(168, 160, 149);
+    text-decoration-color: currentcolor;
+}
+.Header-nav {
+    background-color: rgb(34, 36, 38);
+    background-image: none;
+}
+.Header-menuItem {
+    color: rgb(61, 132, 255);
+}
+.Header-menuItem--noAction {
+    color: inherit;
+}
+.Breadcrumbs-crumb {
+    color: rgb(61, 132, 255);
+}
+.Breadcrumbs-crumb:last-child {
+    color: rgb(232, 230, 227);
+}
+.Footer {
+    color: rgb(168, 160, 149);
+}
+.RepoList-item:link,
+.RepoList-item:visited {
+    text-decoration-color: currentcolor;
+}
+.RepoList-item:hover {
+    background-color: rgb(34, 36, 38);
+    background-image: none;
+}
+.RepoList-item--header:hover {
+    background-color: rgb(24, 26, 27);
+    background-image: none;
+}
+.RepoList-itemName {
+    text-decoration-color: currentcolor;
+}
+.RepoList-item--header > .RepoList-itemName {
+    text-decoration-color: currentcolor;
+}
+.RepoList-itemDescription {
+    color: rgb(232, 230, 227);
+}
+.RepoMirroredFrom {
+    color: rgb(168, 160, 149);
+}
+.CloneRepo {
+    background-color: rgb(34, 36, 38);
+    background-image: none;
+}
+.CloneRepo-command {
+    border-color: rgb(62, 68, 70);
+}
+.RepoIndexDoc {
+    border-top-color: rgb(58, 62, 65);
+}
+.CommitLog-item--oneline:hover {
+    background-color: rgb(34, 36, 38);
+    background-image: none;
+}
+.CommitLog-time {
+    color: rgb(168, 160, 149);
+}
+.CommitLog-branchLabel {
+    color: rgb(224, 89, 73);
+}
+.CommitLog-tagLabel {
+    color: rgb(97, 255, 150);
+}
+.MetadataMessage {
+    background-color: rgb(27, 29, 30);
+    border-color: rgb(62, 68, 70);
+    color: rgb(232, 230, 227);
+}
+.DiffTree-action--add {
+    color: rgb(133, 255, 133);
+}
+.DiffTree-action--delete {
+    color: rgb(255, 133, 133);
+}
+.DiffTree-action--rename,
+.DiffTree-action--copy {
+    color: rgb(143, 184, 255);
+}
+.FileList-item:hover {
+    background-color: rgb(34, 36, 38);
+    background-image: none;
+}
+.FileContents-line {
+    border-color: currentcolor;
+}
+.FileContents-lineNum::before {
+    color: rgb(178, 172, 162);
+}
+.FileContents-lineContents:target {
+    background-color: rgb(43, 53, 58);
+    background-image: none;
+}
+.InlineReadme {
+    border-top-color: rgb(58, 62, 65);
+}
+.InlineReadme-path {
+    color: rgb(168, 160, 149);
+}
+.Blame-region--bg1 {
+    background-color: rgb(24, 26, 27);
+    background-image: none;
+}
+.Blame-region--bg2 {
+    background-color: rgb(31, 34, 35);
+    background-image: none;
+}
+.Blame-lineNum:hover {
+    text-decoration-color: currentcolor;
+}
+.Diff-fileIndex {
+    color: rgb(189, 183, 175);
+}
+.Diff-unified {
+    border-bottom-color: rgb(58, 62, 65);
+    border-top-color: rgb(58, 62, 65);
+}
+.Diff-hunk {
+    color: rgb(82, 145, 255);
+}
+.Diff-delete {
+    color: rgb(255, 61, 61);
+}
+.Diff-insert {
+    color: rgb(109, 255, 109);
+}
+.doc hr {
+    border-color: rgb(72, 78, 81) currentcolor currentcolor;
+}
+.doc a {
+    text-decoration-color: currentcolor;
+}
+.doc a:link {
+    color: rgb(96, 161, 225);
+}
+.doc a:visited {
+    color: rgb(132, 105, 182);
+}
+.doc a:hover {
+    text-decoration-color: currentcolor;
+}
+.doc a.h:link,
+.doc a.h:visited {
+    color: rgb(189, 183, 175);
+}
+.doc a.h:focus {
+    outline-color: currentcolor;
+}
+.doc a.h:hover {
+    text-decoration-color: currentcolor;
+}
+.doc h1:hover a.h span::before,
+.doc h2:hover a.h span::before,
+.doc h3:hover a.h span::before,
+.doc h4:hover a.h span::before,
+.doc h5:hover a.h span::before,
+.doc h6:hover a.h span::before {
+    color: rgb(178, 172, 162);
+}
+.doc h1:hover a:hover.h span::before,
+.doc h2:hover a:hover.h span::before,
+.doc h3:hover a:hover.h span::before,
+.doc h4:hover a:hover.h span::before,
+.doc h5:hover a:hover.h span::before,
+.doc h6:hover a:hover.h span::before {
+    text-decoration-color: currentcolor;
+}
+.doc h1:hover a:visited.h span::before,
+.doc h2:hover a:visited.h span::before,
+.doc h3:hover a:visited.h span::before,
+.doc h4:hover a:visited.h span::before,
+.doc h5:hover a:visited.h span::before,
+.doc h6:hover a:visited.h span::before {
+    color: rgb(178, 172, 162);
+}
+.doc img {
+    border-color: currentcolor;
+}
+iframe.noborder {
+    border-color: currentcolor;
+}
+.doc strong {
+    color: inherit;
+}
+.doc blockquote {
+    background-color: rgb(49, 45, 0);
+    border-left-color: rgb(180, 132, 0);
+}
+.doc pre {
+    background-color: rgb(27, 29, 30);
+    border-color: rgb(62, 68, 70);
+}
+.doc code {
+    background-color: rgb(30, 32, 33);
+    border-color: transparent;
+}
+.doc th,
+.doc td {
+    border-color: rgb(53, 57, 59);
+}
+.doc th {
+    background-color: rgb(30, 32, 33);
+}
+.toc-aux {
+    background-color: rgb(27, 30, 31);
+    background-image: none;
+    border-color: rgb(52, 56, 58);
+}
+.toc ul li {
+    list-style-image: none;
+}
+.toc ul ul li {
+    list-style-image: none;
+}
+.note,
+.promo,
+.aside {
+    border-color: currentcolor;
+}
+.note {
+    background-color: rgb(50, 43, 0);
+    background-image: none;
+    border-color: rgb(87, 80, 24);
+}
+.promo {
+    background-color: rgb(27, 29, 30);
+    background-image: none;
+    border-color: rgb(30, 44, 79);
+}
+.aside {
+    background-color: rgb(27, 30, 31);
+    background-image: none;
+    border-color: rgb(52, 56, 58);
+}
+
+/* Override Style */
+.vimvixen-hint {
+    background-color: #7b5300 !important;
+    border-color: #d8b013 !important;
+    color: #f3e8c8 !important;
+}
+::placeholder {
+    opacity: 0.5 !important;
+}
+#edge-translate-panel-body,
+.MuiTypography-body1 {
+    color: var(--darkreader-neutral-text) !important;
+}
+gr-main-header {
+    background-color: #0f3a48 !important;
+}
+.tou-z65h9k,
+.tou-mignzq,
+.tou-1b6i2ox,
+.tou-lnqlqk {
+    background-color: var(--darkreader-neutral-background) !important;
+}
+.tou-75mvi {
+    background-color: #032029 !important;
+}
+.tou-ta9e87,
+.tou-1w3fhi0,
+.tou-1b8t2us,
+.tou-py7lfi,
+.tou-1lpmd9d,
+.tou-1frrtv8,
+.tou-17ezmgn {
+    background-color: #0a0a0a !important;
+}
+.tou-uknfeu {
+    background-color: #231603 !important;
+}
+.tou-6i3zyv {
+    background-color: #19576c !important;
+}
+embed[type="application/pdf"] { filter: invert(100%) contrast(90%); }
+
+/* Merged from file viewer */
+.tag {
+    color: rgb(122, 171, 255) !important;
+}
+
+.atn {
+    color: rgb(255, 133, 255) !important;
+}
+
+.pun {
+    color: rgb(255, 255, 133) !important;
+}
+
+.atv {
+    color: rgb(109, 255, 109) !important;
+}
+
+.pln {
+    color: rgb(232, 230, 227) !important;
+}
+
+.str {
+    color: rgb(109, 255, 109) !important;
+}
+
+.com {
+    color: rgb(255, 109, 109) !important;
+}
+
+.kwd {
+    color: rgb(122, 171, 255) !important;
+}
+
+.typ {
+    color: rgb(255, 133, 255) !important;
+}
+
+.lit {
+    color: rgb(133, 255, 255) !important;
+}
diff --git a/nginx/git.leafos.org b/nginx/git.leafos.org
new file mode 100644
index 0000000..83b0308
--- /dev/null
+++ b/nginx/git.leafos.org
@@ -0,0 +1,74 @@
+server {
+	listen 80;
+	listen [::]:80;
+	server_name git.leafos.org;
+	return 301 https://$server_name$request_uri;
+        root /var/www/git.leafos.org/;
+
+	access_log /var/log/nginx/access/git.leafos.org.log;
+	error_log /var/log/nginx/error/git.leafos.org.log;
+}
+
+server {
+	listen 443 ssl http2;
+	listen [::]:443 ssl http2;
+
+	include hsts.conf;
+
+	root /var/www/git.leafos.org/;
+
+	# Add index.php to the list if you are using PHP
+	index index.html index.htm index.php;
+
+	server_name git.leafos.org;
+	access_log /var/log/nginx/access/git.leafos.org.log;
+	error_log /var/log/nginx/error/git.leafos.org.log;
+
+	location / {
+		proxy_pass http://localhost:8080/;
+		proxy_set_header Accept-Encoding "";
+		proxy_cookie_domain review.leafos.org $host;
+		# Rewrite Location: headers
+		proxy_redirect https://localhost:8080/ /;
+		sub_filter_types *;
+		sub_filter '/' '/';
+		sub_filter 'LeafOS Git repositories' 'LeafOS Git repositories';
+		sub_filter 'Git repositories on LeafOS' 'Git repositories on LeafOS';
+		sub_filter 'review.leafos.org</a>' 'LeafOS</a>';
+		sub_filter '' '';
+		# Redirect sign in link
+		sub_filter '/login/git.leafos.org%2F' '/login/git.leafos.org%2F';
+		# Remove disallowed repos
+		sub_filter 'href="/All-Users/"' 'href="/All-Users/" style="display: none;"';
+		sub_filter 'href="/All-Projects/"' 'href="/All-Projects/" style="display: none;"';
+		sub_filter 'href="/Leaf-' 'style="display: none;" href="/Leaf-';
+		sub_filter 'href="/OEM-' 'style="display: none;" href="/OEM-';
+		sub_filter 'href="/PROJECT-' 'style="display: none;" href="/PROJECT-';
+		# Inject custom javascript for theme changes
+		sub_filter '<head>' '<head><script type="text/javascript" src="/static/leaf-gitiles.js"></script>';
+		sub_filter_once off;
+	}
+
+	location /static {
+		root /var/www/git.leafos.org;
+	}
+
+	# Gerrit resources
+	location /styles {
+		proxy_pass http://localhost:8080;
+	}
+	location /fonts {
+		proxy_pass http://localhost:8080;
+	}
+	location /favicon.ico {
+		proxy_pass http://localhost:8080;
+	}
+
+	# git clone
+	location ~ ^.*/(HEAD|info/refs|objects/info/.*|git-(upload|receive)-pack)$ {
+		proxy_pass http://localhost:8080;
+	}
+
+	ssl_certificate /etc/letsencrypt/live/leafos.org/fullchain.pem; # managed by Certbot
+	ssl_certificate_key /etc/letsencrypt/live/leafos.org/privkey.pem; # managed by Certbot
+}
diff --git a/nginx/leaf-gitiles.js b/nginx/leaf-gitiles.js
new file mode 100644
index 0000000..765c50c
--- /dev/null
+++ b/nginx/leaf-gitiles.js
@@ -0,0 +1,20 @@
+function getCookie(name){
+    var pattern = RegExp(name + "=.[^;]*")
+    var matched = document.cookie.match(pattern)
+    if(matched){
+        var cookie = matched[0].split('=')
+        return cookie[1]
+    }
+    return false
+}
+
+window.addEventListener('DOMContentLoaded', (event) => {
+	// Dark Theme support, see also leaf.js gerrit plugin
+	if (getCookie("LeafDarkTheme") == "true") {
+		var element = document.createElement("link");
+		element.setAttribute("rel", "stylesheet");
+		element.setAttribute("type", "text/css");
+		element.setAttribute("href", "/static/dark.css");
+		document.head.appendChild(element);
+	}
+});
diff --git a/nginx/review.leafos.org b/nginx/LeafOS
new file mode 100644
index 0000000..60a8213
--- /dev/null
+++ b/nginx/review.leafos.org
@@ -0,0 +1,44 @@
+server {
+	listen 80;
+	listen [::]:80;
+	server_name review.leafos.org;
+	return 301 https://$server_name$request_uri;
+        root /var/www/review.leafos.org/;
+
+	access_log /var/log/nginx/access/review.leafos.org.log;
+	error_log /var/log/nginx/error/review.leafos.org.log;
+}
+
+server {
+	listen 443 ssl http2;
+	listen [::]:443 ssl http2;
+
+	include hsts.conf;
+
+	root /var/www/review.leafos.org/;
+
+	# Add index.php to the list if you are using PHP
+	index index.html index.htm index.php;
+
+	server_name review.leafos.org;
+	access_log /var/log/nginx/access/review.leafos.org.log;
+	error_log /var/log/nginx/error/review.leafos.org.log;
+
+	location / {
+		proxy_pass http://localhost:8080;
+                proxy_set_header Accept-Encoding "";
+		proxy_redirect https://localhost:8080/ /;
+                sub_filter_types *;
+		# Rewrite gitiles path
+                sub_filter '/' 'https://git.leafos.org/';
+		sub_filter_once off;
+	}
+
+	location ^~ /git.leafos.org {
+		# Used for login redirect on git.leafos.org
+		rewrite ^/git.leafos.org?(.*)$ https://git.leafos.org/$1 permanent;
+	}
+
+	ssl_certificate /etc/letsencrypt/live/leafos.org/fullchain.pem; # managed by Certbot
+	ssl_certificate_key /etc/letsencrypt/live/leafos.org/privkey.pem; # managed by Certbot
+}
diff --git a/plugins/leaf.js b/plugins/leaf.js
new file mode 100644
index 0000000..c1f4c2e
--- /dev/null
+++ b/plugins/leaf.js
@@ -0,0 +1,56 @@
+function getSeason() {
+	var month = new Date().toString().split(" ")[1];
+	var date = new Date().toString().split(" ")[2];
+	switch (month) {
+		case "Jan":
+		case "Feb":
+			return "Winter";
+		case "Mar":
+			return date < 20 ? "Winter" : "Spring";
+		case "Apr":
+		case "May":
+			return "Spring";
+		case "Jun":
+			return date < 21 ? "Spring" : "Summer";
+		case "Jul":
+		case "Aug":
+			return "Summer";
+		case "Sep":
+			return date < 22 ? "Summer" : "Autumn";
+		case "Oct":
+		case "Nov":
+			return "Autumn";
+		case "Dec":
+			return date < 22 ? "Autumn" : "Winter";
+	}
+}
+
+Gerrit.install(plugin => {
+	var bgColor = "#90ee90";
+/*	switch (getSeason()) {
+		case "Autumn":
+			bgColor = "#ffee90";
+			break;
+		case "Winter":
+			bgColor = "#eeffee";
+			break;
+	}*/
+
+	const styleEl = document.createElement('style');
+	styleEl.innerHTML = `
+		html, html.darkTheme {
+			--header-background-color: ` + bgColor + `;
+			--header-text-color: var(--gray-900);
+			--header-title-content: 'LeafOS Gerrit';
+		}
+	`;
+	document.head.appendChild(styleEl);
+
+        // Set a dark-theme cookie for use on git.leafos.org
+	// Gerrit is always reloading after switching theme
+        // As of Gerrit v3.7 there is no known way to check if dark theme is enabled
+	var date = new Date();
+	date.setYear(date.getYear() + 1900 + 5);
+	document.cookie = "LeafDarkTheme=true; domain=.leafos.org; path=/; SameSite=Strict; expires=" + date.toGMTString() + ";";
+});
+
diff --git a/structure.yaml b/structure.yaml
new file mode 100644
index 0000000..c48b541
--- /dev/null
+++ b/structure.yaml
@@ -0,0 +1,198 @@
+All-Projects:
+  - All-Users
+  - Leaf-Device-Projects
+  - LeafOS-Blobs/proprietary_external_leaf-fonts
+  - LeafOS-Blobs/proprietary_vendor_gapps
+  - LeafOS-Project/android
+  - LeafOS-Project/android_art
+  - LeafOS-Project/android_bootable_recovery
+  - LeafOS-Project/android_build
+  - LeafOS-Project/android_build_soong
+  - LeafOS-Project/android_device_leaf_sepolicy
+  - LeafOS-Project/android_device_lineage_sepolicy
+  - LeafOS-Project/android_external_ant-wireless_ant_client
+  - LeafOS-Project/android_external_ant-wireless_ant_native
+  - LeafOS-Project/android_external_ant-wireless_ant_service
+  - LeafOS-Project/android_external_ant-wireless_hidl
+  - LeafOS-Project/android_external_chromium
+  - LeafOS-Project/android_external_colorkt
+  - LeafOS-Project/android_external_gptfdisk
+  - LeafOS-Project/android_external_leaf-prebuilts
+  - LeafOS-Project/android_external_setupcompat
+  - LeafOS-Project/android_external_themelib
+  - LeafOS-Project/android_external_tinycompress
+  - LeafOS-Project/android_external_wpa_supplicant_8
+  - LeafOS-Project/android_external_yifan
+  - LeafOS-Project/android_frameworks_av
+  - LeafOS-Project/android_frameworks_base
+  - LeafOS-Project/android_frameworks_libs_net
+  - LeafOS-Project/android_frameworks_libs_systemui
+  - LeafOS-Project/android_frameworks_native
+  - LeafOS-Project/android_frameworks_opt_colorpicker
+  - LeafOS-Project/android_frameworks_opt_timezonepicker
+  - LeafOS-Project/android_hardware_interfaces
+  - LeafOS-Project/android_hardware_libhardware
+  - LeafOS-Project/android_hardware_lineage_interfaces
+  - LeafOS-Project/android_packages_apps_Aperture
+  - LeafOS-Project/android_packages_apps_Bromite
+  - LeafOS-Project/android_packages_apps_Contacts
+  - LeafOS-Project/android_packages_apps_DeskClock
+  - LeafOS-Project/android_packages_apps_Dialer
+  - LeafOS-Project/android_packages_apps_DocumentsUI
+  - LeafOS-Project/android_packages_apps_Etar
+  - LeafOS-Project/android_packages_apps_ExactCalculator
+  - LeafOS-Project/android_packages_apps_FaceUnlock
+  - LeafOS-Project/android_packages_apps_Gallery2
+  - LeafOS-Project/android_packages_apps_Glimpse
+  - LeafOS-Project/android_packages_apps_GrapheneCamera
+  - LeafOS-Project/android_packages_apps_Launcher3
+  - LeafOS-Project/android_packages_apps_LeafBackgrounds
+  - LeafOS-Project/android_packages_apps_Messaging
+  - LeafOS-Project/android_packages_apps_MuPDF
+  - LeafOS-Project/android_packages_apps_Seedvault
+  - LeafOS-Project/android_packages_apps_Settings
+  - LeafOS-Project/android_packages_apps_SettingsIntelligence
+  - LeafOS-Project/android_packages_apps_SetupWizard
+  - LeafOS-Project/android_packages_apps_SimpleDeviceConfig
+  - LeafOS-Project/android_packages_apps_Stk
+  - LeafOS-Project/android_packages_apps_ThemePicker
+  - LeafOS-Project/android_packages_apps_Updater
+  - LeafOS-Project/android_packages_apps_WallpaperPicker2
+  - LeafOS-Project/android_packages_inputmethods_LatinIME
+  - LeafOS-Project/android_packages_modules_Bluetooth
+  - LeafOS-Project/android_packages_modules_Connectivity
+  - LeafOS-Project/android_packages_modules_adb
+  - LeafOS-Project/android_packages_overlays_Leaf
+  - LeafOS-Project/android_packages_resources_devicesettings
+  - LeafOS-Project/android_prebuilts_extract-tools
+  - LeafOS-Project/android_prebuilts_tools-leaf
+  - LeafOS-Project/android_prebuilts_tools-lineage
+  - LeafOS-Project/android_system_core
+  - LeafOS-Project/android_system_sepolicy
+  - LeafOS-Project/android_system_tools_mkbootimg
+  - LeafOS-Project/android_tools_extract-utils
+  - LeafOS-Project/android_vendor_crowdin
+  - LeafOS-Project/android_vendor_lawnicons
+  - LeafOS-Project/android_vendor_leaf
+  - LeafOS-Project/android_vendor_leaf-apps_ThemePickerLeaf
+  - LeafOS-Project/android_vendor_lineage_compat
+  - LeafOS-Project/android_vendor_microg
+  - LeafOS-Project/leaf_build
+  - LeafOS-Project/leaf_crowdin
+  - LeafOS-Project/leaf_devices
+  - LeafOS-Project/leaf_gerrit-config
+  - LeafOS-Project/leaf_ota
+  - LeafOS-Project/leaf_scripts
+  - LeafOS-Project/leaf_www
+Leaf-Device-Projects:
+  - LeafOS-Blobs/proprietary_vendor_firmware
+  - OEM-MediaTek
+  - OEM-Realme
+  - OEM-Samsung
+  - OEM-qcom
+OEM-MediaTek:
+  - PROJECT-MediaTek-hardware
+OEM-Realme:
+  - PROJECT-Realme-RM6785
+OEM-Samsung:
+  - PROJECT-Samsung-exynos9820
+  - PROJECT-Samsung-gta4xl
+  - PROJECT-Samsung-hardware
+  - PROJECT-Samsung-universal7904
+OEM-qcom:
+  - PROJECT-qcom-hardware
+PROJECT-MediaTek-hardware:
+  - LeafOS-Devices/android_device_mediatek_sepolicy
+  - LeafOS-Devices/android_device_mediatek_sepolicy_vndr
+  - LeafOS-Devices/android_hardware_mediatek
+  - LeafOS-Devices/android_vendor_mediatek_opensource_interfaces
+PROJECT-Realme-RM6785:
+  - LeafOS-Blobs/proprietary_vendor_realme_RM6785
+  - LeafOS-Devices/android_device_realme_RM6785
+  - LeafOS-Devices/android_kernel_realme_mt6785
+PROJECT-Samsung-exynos9820:
+  - LeafOS-Blobs/proprietary_vendor_samsung_beyond0lte
+  - LeafOS-Blobs/proprietary_vendor_samsung_beyond1lte
+  - LeafOS-Blobs/proprietary_vendor_samsung_beyond2lte
+  - LeafOS-Blobs/proprietary_vendor_samsung_beyondx
+  - LeafOS-Blobs/proprietary_vendor_samsung_d1
+  - LeafOS-Blobs/proprietary_vendor_samsung_d2s
+  - LeafOS-Blobs/proprietary_vendor_samsung_d2x
+  - LeafOS-Blobs/proprietary_vendor_samsung_exynos9820-common
+  - LeafOS-Blobs/proprietary_vendor_samsung_f62
+  - LeafOS-Devices/android_device_samsung_beyond0lte
+  - LeafOS-Devices/android_device_samsung_beyond1lte
+  - LeafOS-Devices/android_device_samsung_beyond2lte
+  - LeafOS-Devices/android_device_samsung_beyondx
+  - LeafOS-Devices/android_device_samsung_d1
+  - LeafOS-Devices/android_device_samsung_d2s
+  - LeafOS-Devices/android_device_samsung_d2x
+  - LeafOS-Devices/android_device_samsung_exynos9820-common
+  - LeafOS-Devices/android_device_samsung_f62
+  - LeafOS-Devices/android_kernel_samsung_exynos9820
+PROJECT-Samsung-gta4xl:
+  - LeafOS-Blobs/proprietary_vendor_samsung_gta4xl
+  - LeafOS-Blobs/proprietary_vendor_samsung_gta4xl-common
+  - LeafOS-Blobs/proprietary_vendor_samsung_gta4xlwifi
+  - LeafOS-Devices/android_device_samsung_gta4xl
+  - LeafOS-Devices/android_device_samsung_gta4xl-common
+  - LeafOS-Devices/android_device_samsung_gta4xlwifi
+  - LeafOS-Devices/android_kernel_samsung_gta4xl
+PROJECT-Samsung-hardware:
+  - LeafOS-Devices/android_device_samsung_slsi_sepolicy
+  - LeafOS-Devices/android_hardware_samsung
+  - LeafOS-Devices/android_hardware_samsung_slsi-linaro_config
+  - LeafOS-Devices/android_hardware_samsung_slsi-linaro_exynos
+  - LeafOS-Devices/android_hardware_samsung_slsi-linaro_exynos5
+  - LeafOS-Devices/android_hardware_samsung_slsi-linaro_graphics
+  - LeafOS-Devices/android_hardware_samsung_slsi-linaro_openmax
+  - LeafOS-Devices/android_hardware_samsung_slsi_libbt
+  - LeafOS-Devices/android_hardware_samsung_slsi_scsc_wifibt_wifi_hal
+  - LeafOS-Devices/android_hardware_samsung_slsi_scsc_wifibt_wpa_supplicant_lib
+PROJECT-Samsung-universal7904:
+  - LeafOS-Blobs/proprietary_vendor_samsung_m20lte
+  - LeafOS-Blobs/proprietary_vendor_samsung_universal7904-common
+  - LeafOS-Devices/android_device_samsung_m20lte
+  - LeafOS-Devices/android_device_samsung_universal7904-common
+  - LeafOS-Devices/android_kernel_samsung_universal7904
+PROJECT-qcom-hardware:
+  - LeafOS-Project/android_device_qcom_sepolicy
+  - LeafOS-Project/android_device_qcom_sepolicy_vndr
+  - LeafOS-Project/android_external_json-c
+  - LeafOS-Project/android_hardware_qcom-caf_common
+  - LeafOS-Project/android_hardware_qcom_audio
+  - LeafOS-Project/android_hardware_qcom_audio-ar
+  - LeafOS-Project/android_hardware_qcom_bootctrl
+  - LeafOS-Project/android_hardware_qcom_bt
+  - LeafOS-Project/android_hardware_qcom_display
+  - LeafOS-Project/android_hardware_qcom_media
+  - LeafOS-Project/android_hardware_qcom_sdm845_data_ipacfg-mgr
+  - LeafOS-Project/android_hardware_qcom_sdm845_display
+  - LeafOS-Project/android_hardware_qcom_sdm845_gps
+  - LeafOS-Project/android_hardware_qcom_sdm845_media
+  - LeafOS-Project/android_hardware_qcom_thermal
+  - LeafOS-Project/android_hardware_qcom_vr
+  - LeafOS-Project/android_hardware_qcom_wlan
+  - LeafOS-Project/android_vendor_codeaurora_telephony
+  - LeafOS-Project/android_vendor_qcom_opensource_agm
+  - LeafOS-Project/android_vendor_qcom_opensource_arpal-lx
+  - LeafOS-Project/android_vendor_qcom_opensource_audio
+  - LeafOS-Project/android_vendor_qcom_opensource_audio-hal_st-hal
+  - LeafOS-Project/android_vendor_qcom_opensource_audio-hal_st-hal-ar
+  - LeafOS-Project/android_vendor_qcom_opensource_core-utils-sys
+  - LeafOS-Project/android_vendor_qcom_opensource_core-utils-vendor
+  - LeafOS-Project/android_vendor_qcom_opensource_data-ipa-cfg-mgr
+  - LeafOS-Project/android_vendor_qcom_opensource_dataipa
+  - LeafOS-Project/android_vendor_qcom_opensource_dataservices
+  - LeafOS-Project/android_vendor_qcom_opensource_display
+  - LeafOS-Project/android_vendor_qcom_opensource_display-commonsys
+  - LeafOS-Project/android_vendor_qcom_opensource_display-commonsys-intf
+  - LeafOS-Project/android_vendor_qcom_opensource_fm-commonsys
+  - LeafOS-Project/android_vendor_qcom_opensource_healthd-ext
+  - LeafOS-Project/android_vendor_qcom_opensource_interfaces
+  - LeafOS-Project/android_vendor_qcom_opensource_libfmjni
+  - LeafOS-Project/android_vendor_qcom_opensource_power
+  - LeafOS-Project/android_vendor_qcom_opensource_thermal-engine
+  - LeafOS-Project/android_vendor_qcom_opensource_usb
+  - LeafOS-Project/android_vendor_qcom_opensource_vibrator
+  - LeafOS-Project/android_vendor_qcom_opensource_wfd-commonsys