-
Notifications
You must be signed in to change notification settings - Fork 41
firebase schema.md
The easiest way to demonstrate the schema is to show real snippets of the database. Let's look at a nightly backup of the database.
❯ cp /Volumes/Public/NAS/Factorio/facorio-blueprints-backups/2025-01-01T04:18:30Z_facorio-blueprints_data.json.gz .
❯ gunzip 2025-01-01T04:18:30Z_facorio-blueprints_data.json.gzFirebase databases are a single enormous json document.
❯ du -sh 2025-01-01T04:18:30Z_facorio-blueprints_data.json
1.5G 2025-01-01T04:18:30Z_facorio-blueprints_data.jsonThe database is too big to share in its entirety. First, let's filter the big collections in sample-entries.jq. We'll filter user data to just my user, "H3QlaVpvadfVuTpGGxs7016oR2K3". We'll filter blueprint data to just two of my blueprints, an old one at "-KYVL2qnlOpHomJAj-eB" which was created by uploading an image, and a newer one "-OAP4_bHqhbjQeqbPjxu" which was created with an Imgur url.
def take_sample_with_keys(keys):
to_entries |
map(select(.key as $k | keys | contains([$k]))) |
unique_by(.key) |
from_entries;
# Sample the first and last key of an object
def sample_nested:
if type == "object" then
to_entries |
map(.value |= if type == "object" then sample_nested else . end) |
.[:1] + .[-1:] |
from_entries
else
.
end;
.byTag |= map_values(sample_nested) |
.blueprints |= take_sample_with_keys(["-KYVL2qnlOpHomJAj-eB", "-OAP4_bHqhbjQeqbPjxu"]) |
.blueprintSummaries |= take_sample_with_keys(["-KYVL2qnlOpHomJAj-eB", "-OAP4_bHqhbjQeqbPjxu"]) |
.blueprintsPrivate |= take_sample_with_keys(["-KYVL2qnlOpHomJAj-eB", "-OAP4_bHqhbjQeqbPjxu"]) |
.thumbnails |= take_sample_with_keys(["-KYVL2qnlOpHomJAj-eB", "-OAP4_bHqhbjQeqbPjxu"]) |
.users |= take_sample_with_keys(["H3QlaVpvadfVuTpGGxs7016oR2K3"])The actual blueprint data appears in the database. They are extremely long strings, so we'll truncate them so we can focus on the schema, in truncate.jq and truncate2.jq.
walk(
if type == "object" then
with_entries(
if .key == "blueprintString" or .key == "thumbnail" then
.value |= (
if type == "string" then
if length > 80 then
.[0:80] + "...<truncated>"
else
.
end
else
.
end
)
else
.
end
)
else
.
end
).thumbnails |= with_entries(
if .value | type == "string" and length > 80 then
.value |= .[0:80] + "...<truncated>"
else
.
end
)The database includes two secrets, Imgur delete hashes and users' email addresses. Display names aren't really secret, but I'll avoid sharing them here. My display name isn't secret (Factorio Prints) and my email isn't secret (factorio.prints@gmail.com) but I'll consistently redact these fields using redact.jq to be safe.
walk(
if type == "object" then
with_entries(
if .key == "deletehash" or .key == "email" or .key == "displayName" or .key == "providerDisplayName" then
.value = "<redacted>"
else
.
end
)
else
.
end
)Let's apply the scripts to the database backup.
❯ jq -f sample-entries.jq 2025-01-01T04:18:30Z_facorio-blueprints_data.json | jq -f truncate.jq | jq -f truncate2.jq | jq -f redact.jq > example.jsonNow we can see the json schema:
{
"blueprintSummaries": {
"-KYVL2qnlOpHomJAj-eB": {
"title": "☀️ MadZuri's Mk3 Solar Build",
"imgurId": "RLRq4nd",
"imgurType": "image/jpeg",
"lastUpdatedDate": 1679692871101,
"numberOfFavorites": 89,
"height": 1728,
"width": 1728
},
"-OAP4_bHqhbjQeqbPjxu": {
"imgurId": "QbepqZa",
"imgurType": "image/png",
"lastUpdatedDate": 1732672006842,
"numberOfFavorites": 3,
"title": "Factorio 2.0 torture test"
}
},
"blueprints": {
"-KYVL2qnlOpHomJAj-eB": {
"favorites": {
"xeBFS9ETsPON41fzFuKhq1Zg9D33": true,
"hQouHB4fCjZGA3npyyiW6MdGmfq2": true,
"gikbOCGvWwY7hiFgsIoZrxMh4x93": true,
"zuzzQ4UJUleX2sWuorCTBET66Tq1": true,
"yEkV5AJi4TdlypuvUIb1yqbiznG3": true,
"7pHjf9fy20XCQDf98Q7gmZMFeVX2": true,
"TO9F2VuZSpNbC7CdnrdbGPm0d0r2": true,
"NzinW3ImrSOidr50COVDjViOqUk2": true,
"EuA0qrMegObNUi83yFVJllIgCAO2": true,
"YZ79eCKXovfsxXD9fmNAuyd9mlc2": true,
"0fGlHnZ5NJYZXl7YtKNGQGTjQAw2": true,
"3iXo1kJA1uMmdAInrBJE5SbZbu93": true,
"IsbhMPeVEKdruws7yqTZeHcMYV73": true,
"PqrgHNLOm6c6v0xcTdZMtLMw3QE2": true,
"9TBNroDEaIeRUNnVmHJhOymNvLy1": true,
"VIjpHWltOIXviHbWTtgleef5yek2": true,
"PhX25s1CD6VRwRZxRNqdd3anLAl2": true,
"oDs7ZPRTUob2eeaRdBX2qXN9LGI2": true,
"AvgfLfpEHASioDLs7N95kY0V12i1": true,
"9O6qYAb980Qe3wE84Ig5CvmQDrI2": true,
"vnZrg9gVKOVNggaZJ9TjIbjILzr2": true,
"Mrz1YNBd8Gb8y9YnUCLBbK88LB93": true,
"YS09FjZlfbdnQvQac5eFyaXMjyZ2": true,
"FgXOManp7FNKzAnxETfZQcO4OWu2": true,
"kX2ghFV7gAVebNBHRokcmXuNG6G2": true,
"dnhUPoukvxWWLVQBm9TmNf1VlJv1": true
},
"image": {
"deletehash": "<redacted>",
"height": 1728,
"id": "RLRq4nd",
"type": "image/jpeg",
"width": 1728
},
"lastUpdatedDate": 1679692871101,
"numberOfFavorites": 89,
"title": "☀️ MadZuri's Mk3 Solar Build",
"descriptionMarkdown": "*Pretty* close to perfect ratios, tileable, 100% space efficient.\n\nYou can remove the roboports and replace them with accumulators to improve the ratio.",
"imageUrl": "https://firebasestorage.googleapis.com/v0/b/facorio-blueprints.appspot.com/o/%E2%98%80%EF%B8%8F%20MadZuris%20Mk3%20Solar%20Build.png?alt=media&token=464ee572-f04d-4f34-ba9f-6c421c6525a4",
"tags": {
"3": "/version/0,15/",
"0": "/power/solar/",
"1": "/general/tileable/",
"2": "/mods/vanilla/"
},
"author": {
"userId": "H3QlaVpvadfVuTpGGxs7016oR2K3"
},
"authorId": "H3QlaVpvadfVuTpGGxs7016oR2K3",
"blueprintString": "0eNqVnc1uG8sRhV/F4JoOpv97tMz+rrJLYASUTThEZFKgpItrXAjIG2SbR8nz5AXyCuGIlm1EdXrqWwk...<truncated>",
"createdDate": 1481232629231,
"fileName": "☀️ MadZuris Mk3 Solar Build.png"
},
"-OAP4_bHqhbjQeqbPjxu": {
"author": {
"userId": "H3QlaVpvadfVuTpGGxs7016oR2K3"
},
"authorId": "H3QlaVpvadfVuTpGGxs7016oR2K3",
"blueprintString": "0eNrtfdmO48iV6K8QuriAPSO2uS+Fzgbs7gvMAGNPX7dncIEsXYGSQhKRFClzyay0kR/QfzEP9o/1l0w...<truncated>",
"createdDate": 1730235750950,
"descriptionMarkdown": "I'm using this blueprint as a test of factorioprints.com and factorio.school. I'll gradually add more features from 2.0 to make sure they all work ok.",
"image": {
"id": "QbepqZa",
"type": "image/png"
},
"imageUrl": "https://imgur.com/QbepqZa",
"lastUpdatedDate": 1732672006842,
"numberOfFavorites": 3,
"tags": {
"0": "/version/2,0/"
},
"title": "Factorio 2.0 torture test",
"favorites": {
"ThmGKWuHFvRbykypnsGSTeRQIUm1": true,
"Lt5dRUgbrHaYmGoeIN8K6e2ha3f2": true,
"1LML7TCc7OeMr16aQJRbx2JTjwe2": true
}
}
},
"blueprintsPrivate": {
"-KYVL2qnlOpHomJAj-eB": {
"deletehash": "<redacted>",
"imageUrl": "https://firebasestorage.googleapis.com/v0/b/facorio-blueprints.appspot.com/o/%E2%98%80%EF%B8%8F%20MadZuris%20Mk3%20Solar%20Build.png?alt=media&token=464ee572-f04d-4f34-ba9f-6c421c6525a4",
"thumbnail": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4gHYSUNDX1BST0ZJTEUAAQEAAAHIA...<truncated>"
},
"-OAP4_bHqhbjQeqbPjxu": {
"imageUrl": "https://imgur.com/QbepqZa"
}
},
"byTag": {
"belt": {
"balancer": {
"-KZHkJVwXEomI2oYz0gR": true,
"-OFOtM3JUtZ7aZ8Nm2hF": true
},
"transport belt (yellow)": {
"-KdDy33xxo8bNcEuP7CR": true,
"-OEtXccOmOWLFFgUbrno": true
}
},
"circuit": {
"indicator": {
"-LMM2fE8dI21w8LWy0Ry": true,
"-OF7Nb93Ip6jkg1v6FHu": true
},
"counter": {
"-MRoH3Ym0GLAgOFJsa46": true,
"-OF7Nb93Ip6jkg1v6FHu": true
}
},
"combat": {
"defense": {
"-NpngVxBm0LTFvDv2N-e": true,
"-OFECIbbNQlbS6o8TntG": true
},
"offense": {
"-NrHhFEkVkbka0ZIg9Ks": true,
"-OFECIbbNQlbS6o8TntG": true
}
},
"general": {
"art": {
"-NT8xenoXR_guokVxzja": true,
"-Nm399Ese4tJ6zjlI-Wx": true
},
"ups friendly": {
"-LE-h4IHgdWBkSSmyuv0": true,
"-OBNF7RfBZP9weZkQ5yT": true
}
},
"moderation": {
"add english translation": {
"-Kn-3OCDShPOKF0Re2xB": true,
"-NvxmZ_BKhKhFjr8dVhA": true
},
"duplicate": {
"-OBWb8-6LnADEeCzE0aE": true
}
},
"mods": {
"5dim": {
"-LXTfZxo2lMrWWuu8pn8": true,
"-N11xOxWskpuLDXSEoSL": true
},
"warehousing": {
"-LqXDjtoOn6ZvEf1oCbX": true,
"-Ndc4iUgJ9kHRAzBP_Ot": true
}
},
"planets": {
"aquilo": {
"-OACBs_9PZJoUwg0RGal": true,
"-OFLE8CAd9PjPJ60YngA": true
},
"gleba": {
"-OAGNIBmQFPe8mXMkOFg": true,
"-OFQS_eVW_HP230tKefa": true
}
},
"power": {
"accumulator": {
"-Klak7Q_4a5EBfRX_BB8": true,
"-OFKpJLMAIR81L--j608": true
},
"steam": {
"-KjKk9oQG6o-ZxbPIeNv": true,
"-OEeFVyuLKZuwhKuXphl": true
}
},
"production": {
"advanced circuit (red)": {
"-Kr1HRMdmtj5kAKr-SV7": true,
"-OEoitoKC6UD6HquaY1O": true
},
"uranium": {
"-Kvr99fYRBxry-knIX81": true,
"-OEh-Q8iwm7XA2wm7vGt": true
}
},
"train": {
"crossing": {
"-Lm1mSvdox91H7kPWYq0": true,
"-OFKKrBxWlzQ03Mzp_q5": true
},
"unloading station": {
"-Lrng9O17zeQCAn37dmf": true,
"-OFSqY3dfkPr-JRP46UP": true
}
},
"version": {
"0,14": {
"-KZHTgi4h1mNDTvBGf0E": true,
"-NW_ZpIgWOqt5vXiUvfH": true
},
"unknown": {
"-LVPiumb3bKwb174XeoE": true,
"-ODcmeRnRRf3-TTVOZ0c": true
}
}
},
"moderators": {
"H3QlaVpvadfVuTpGGxs7016oR2K3": true,
"k9zbSt8hH4W5IKR5UnaKrPhEAVw2": true
},
"tags": {
"belt": {
"2": "tap",
"3": "transport belt (yellow)",
"4": "fast transport belt (red)",
"5": "express transport belt (blue)",
"0": "balancer",
"1": "prioritizer"
},
"power": {
"0": "nuclear",
"1": "kovarex enrichment",
"2": "solar",
"3": "steam",
"4": "accumulator"
},
"train": {
"4": "roundabout",
"5": "crossing",
"6": "stacker",
"7": "track",
"9": "right-hand-drive",
"0": "loading station",
"1": "unloading station",
"2": "pax",
"3": "junction",
"8": "left-hand-drive"
},
"mods": {
"6": "other",
"10": "5dim",
"1": "bobs",
"4": "warehousing",
"5": "lighted-electric-poles",
"11": "seablock",
"13": "krastorio",
"14": "transport drones",
"0": "angels",
"8": "ltn",
"9": "aai",
"2": "creative",
"3": "factorissimo",
"7": "vanilla",
"12": "industrial revolution",
"15": "space-exploration",
"16": "space-age",
"17": "quality",
"18": "elevated-rails"
},
"production": {
"10": "smelting",
"14": "modules",
"15": "mall (make everything)",
"17": "guns and ammo",
"19": "other",
"0": "oil processing",
"1": "coal liquification",
"6": "rocket parts",
"7": "science",
"11": "mining",
"16": "inserters",
"21": "logistic (bot) based",
"3": "advanced circuit (red)",
"5": "batteries",
"18": "robots",
"4": "processing unit (blue)",
"12": "uranium",
"9": "belts",
"13": "plastic",
"20": "belt based",
"2": "electronic circuit (green)",
"8": "research (labs)",
"22": "scrap processing"
},
"version": {
"3": "unknown",
"4": "0,17",
"5": "0,18",
"6": "1,0",
"0": "0,14",
"1": "0,15",
"2": "0,16",
"7": "1,1",
"8": "2,0"
},
"circuit": {
"0": "indicator",
"1": "counter"
},
"general": {
"0": "early game",
"5": "compact",
"6": "marathon",
"7": "storage",
"1": "mid game",
"2": "late game (megabase)",
"3": "beaconized",
"4": "tileable",
"8": "chunk aligned",
"9": "ups friendly",
"10": "art",
"11": "scenario"
},
"moderation": {
"0": "scheduled for deletion",
"1": "screenshot missing alt info",
"2": "uncropped screenshot",
"3": "add english translation",
"4": "duplicate"
},
"combat": {
"0": "offense",
"1": "defense"
},
"planets": {
"0": "nauvis",
"1": "gleba",
"2": "fulgora",
"3": "vulcanus",
"4": "aquilo",
"5": "space-platform"
}
},
"thumbnails": {
"-KYVL2qnlOpHomJAj-eB": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4gHYSUNDX1BST0ZJTEUAAQEAAAHIA...<truncated>"
},
"users": {
"H3QlaVpvadfVuTpGGxs7016oR2K3": {
"favorites": {
"-LZY1wBZZ_C8xGihqShH": true,
"-KirzcTXTs8F0kmF97t3": true,
"-Kom7vIXGFDk6OnGnxwc": true,
"-LFIJt4xoswm3w3v2Uie": true,
"-LHU3_dQxXvciLmAsayo": true,
"-LZrA2MkOQYKw5Wklea4": true,
"-MEbTqQQ7og2aoLNB9NY": true,
"-KZIxbfGGbAU8gsAComj": true,
"-KqL01NxGMeXG-5OtMwm": true,
"-Kp6eLXuhwCqXBXr0ltW": true,
"-Lg_tDuWgrU-EcagIUNV": true,
"-LbP47CtKAiwauLskTo2": true,
"-KpX1-lyYhE-3-DfxTba": true,
"-Kv8rBZzEyPORtZh4nz4": true,
"-L5biXRj9KWhGWykcGCd": true,
"-L9i5YbpIL2sBKskFH6b": true,
"-LWY-DinCSVmp1fy3OVa": true,
"-MSxZBtxc29rg0OfAtxl": true,
"-Kj2j-yx09kZtQs9VRk4": true,
"-KkH7gQIEcuri6zZBl_x": true,
"-LACl7rLp9aPqXAv_dQ6": true,
"-LIFZsL0KQWRA-kxiCYq": true,
"-LJOW5psPU7up0e70tH6": true,
"-KoltGTOcRBjmz4tieoA": true,
"-LTBbTA9DZBtWaWGcHIl": true,
"-KYpTULTDIvDOsJfgjeS": true,
"-KkqSHSzoglhvgRVfwkM": true,
"-L1loYqb9chYad0ckXTq": true,
"-LJxNEq5fc_XxobQk9ZW": true,
"-M11Z7Srp7y981iVrebS": true,
"-KjJ5UZV4h2cHSIUU0pF": true,
"-Km1lkj01tpm3xAupmp_": true,
"-MFIYLSH60wmZ-pNvcL_": true,
"-LQ-CPuQp6mSlb07bsjR": true,
"-Ku9vWt1ziiuxYUGBKTl": true,
"-LHJv0mq3EuAoeWPyXz8": true,
"-LhfYgob1FIcIvTKNUtC": true,
"-KjYrExrE7G37qFgncRJ": true,
"-KvBxFfq4ocbn4G6moB6": true,
"-LBmXdOjVpK1gtDRK85T": true,
"-LmtG8BAsNkbjqH5F5h-": true,
"-LrFllkfPIG1IAjKRIF5": true,
"-KkcSxXO4Frc0CMCV_kL": true,
"-KnQ865j-qQ21WoUPbd3": true,
"-LaIPNgh8f16V8EwXXpW": true,
"-KpbH6bzIae1s5eo0g3s": true,
"-L0AA-VH9GlXbgWAffhU": true,
"-LbVEPJboC3QkYCKDU8F": true,
"-Kj93r_vJv1WfD1SIOfU": true,
"-KjcT8FkYRMzsnu9Qguq": true,
"-LJ4t3Mo_wos0_pauYnU": true,
"-MNbT33juix3PWHJ44Ks": true,
"-LGlgiF7mtzxe_WqOH4K": true,
"-KadypAjwMoeyBCRPsWY": true,
"-Kiv3NhwBH4fE2mAx-6q": true,
"-KoqizrS1hTxeWQP9JKD": true,
"-LJ1yGYd0Rex-FPTqnnk": true,
"-LYcavglsqwjxJARy_nK": true,
"-KjYTvoB1LYe4F470yhz": true,
"-KkCImFv4o1c-Z-1QCaK": true,
"-KkulJJaar31G61YdqUQ": true,
"-L9sMnI9prR83xg54NjG": true,
"-MSe6VJ_slR1BSgsLvF6": true,
"-LQbassgmiwkqEVfS0Vf": true,
"-L5LF1_hgqswJ7ZKsJyk": true,
"-LcJg0b8cfoioyLPANQ6": true,
"-LfpQ63zCDlI03H8sH8_": true,
"-KqEl1liCIOhZty7TTfl": true,
"-Kr1N0HkhWzgP6P6pxku": true,
"-LzxvgM4eHDdjm6KSvnl": true,
"-Kkum-Ibmu5-R7ULTAFz": true,
"-KpX1djs7n5xYzmeAytv": true,
"-MNbVD0oWaDgT8HUvNjT": true,
"-Kp0qDX-EMl5TqgFAPVN": true,
"-LJ2A1S7ciqdngYf-HnR": true,
"-Kp6dNEnTZ7BaQaY42iU": true,
"-KpxUat4ZrpUWPS69u4Z": true,
"-Lffm8_s911-lrQLT3tM": true,
"-K_Me61B1oQ_Dmjbde9B": true,
"-KjEMCewunRtmK5dCvyT": true,
"-KjJ6MvDSt-GWrthi9Z4": true,
"-KjYAnqi971rVjBFIJMg": true,
"-LaQE4ZclSJZGlRf9sq0": true,
"-KjZ0Rk_VXbdnxJ9jmUj": true,
"-Km1lMqoXMRF3SBtTIwR": true,
"-LGE-iYK15_699MGsTdL": true,
"-MNOoFMI54rZbF9xrBxB": true,
"-Kp6dxRcQbpr7UrzJC6x": true,
"-MRwUZfJmz4ei1bGaGD-": true,
"-MEwX_Kkwe_x3j6vk7ve": true,
"-KYg56ks0BIqpNvpIHFm": true,
"-LG6lG4ros7_dUCGICUW": true,
"-Lb-tJDy1OPcbJg461j0": true,
"-LwQwRpItPyExs--nj6p": true,
"-Kl_20pb9-jOGrDYzibk": true,
"-Kroion4ELi9I7EiJ9XC": true,
"-LYc_FNSdjQppvTjdc5K": true,
"-L3VemzAMbGPtLOvKClr": true,
"-LXKpp9bZjQA2f2HjAjU": true,
"-LeToocfxpYPF4lubetX": true,
"-M2u_Tr8kYSjKBG8uxfN": true,
"-Kh2AuoZIjaPjde1Ir8E": true,
"-KkpBR-fJ3nVtzBNAokY": true,
"-KmItumMrZRnXq4d0_54": true,
"-KoqgcmWqjJGLf6csjL4": true,
"-LE0_ttF6cJPoiFi5l6u": true,
"-K_jADWYOzVoz7tNRFf0": true,
"-LDlQMrud7HVDYIkCLNK": true,
"-KchGba0-3T6MfY8DPBX": true,
"-Kq5f2hya_bo88b_gSw0": true,
"-Ku29XkaYu1utbw82kaK": true,
"-LlwTbS7OPiK6bqkp2KW": true,
"-LwQzxkjNldW5RF7Z-jW": true,
"-KZGMoiKxO8HsEngq0B7": true,
"-KokIkNBIAQqMufVlmsh": true,
"-LOAVA6Unf_1BxVkbbSk": true,
"-L1vgQ0fBiOlX8RJTvBx": true,
"-LX0DrUrauJqH8cVAq6A": true,
"-LaBW5bbDMIhZqd8-HDT": true,
"-Kgi16PP8mnB_XcUO0Kv": true,
"-LK11Ia95Ae5ETlQ0UvR": true,
"-KpogKKQfbmOMH2yBmfu": true,
"-L_8DyIV76Y2r4WELfly": true,
"-L_iwM-JoVx_qQcBP8xZ": true,
"-LibYRx___wDOSUO32wl": true,
"-LDCTy1HOtQwp7eQVPFP": true,
"-MNtMBLHG4FgqkdvmxPL": true,
"-KabXCwKQ7Dd-xz_G5fv": true,
"-Kp6n2r3DU3cHiwngJaf": true,
"-Ku5n4tLfmkZN8twwx-k": true,
"-Kv98Ua8jl-tzglA7cp6": true,
"-L0YeuRvGzI2Msir-scF": true,
"-KYpWpPzU2MW56wDabTt": true,
"-KpqsLxKjSE-l6QOuQCP": true,
"-L-AH-1ky1OVEvqy8_ti": true,
"-Lb-ZMZd1sQ3iy1_vKdl": true,
"-KYeNAYQVgk2DcbuORde": true,
"-KYpSfx8hRix5nVPBLwS": true,
"-KlhUi32p9g-WK-ABDKB": true,
"-KrAnxu3fGvSLy71To1V": true,
"-LKXklpxxqUmd52D4bW5": true,
"-KZHT0kmt-nElk2jnBoZ": true,
"-Kae4b16Zd0Dz-qyBwzo": true,
"-Km3O-6daMY2OZru9ipg": true,
"-LI0gc-a-2_VLWR-tx1d": true,
"-KvBwAqpMt6Lx3DZS-lU": true,
"-KkGzYI8tNoP3FGung5J": true,
"-KoqhnFNxKU7FZqEi79w": true,
"-LbQ7q3QRGqrkJpNgH0-": true,
"-L__rz-kvFeoJr6KsnHh": true,
"-Lnlz97OfIxXawtlNJoi": true,
"-KuGj0uUTKl8VpIau-_l": true,
"-LKIZarSTTZaO1_YpKXw": true,
"-KjmRXj1uY-0VKIPzJuB": true,
"-Kjcg1sW24lC-juNOFE4": true,
"-L9ULAOB2MrsHEaFuMot": true,
"-KipClGfrJ9Bntuimft_": true,
"-Kithz64hpglt1c8E13L": true,
"-Ko4Un71BhDDTUvorRv5": true,
"-LpN6Yp2O9qB2vNzoR4R": true,
"-MBR5HNT3t0HZUKTxAiN": true,
"-LdMNzyMJ55lfVUMupmP": true,
"-KaN1pFBYXqMIJd32qal": true,
"-KjnB9gSKdPC3cu4Xvjj": true,
"-KpR9g5xwpke0jOV4pQ1": true,
"-Kr03fSKDQqr6dK3e7xU": true,
"-KmIMtB_eb-yw1cPHqpn": true,
"-LZpCwcZo6mMnV7TZdG1": true,
"-LbVFfKRqneY24dTj7aT": true,
"-KmBhjHu957siliKWFy7": true,
"-Kmgi76ZPE3g7nWt2lTU": true,
"-LHxJpPuyYEXqhfxW40f": true,
"-LJ0TJHYi0M-6udXlI-S": true,
"-KjELJNoIpt6pewqi-Fz": true,
"-L1UzzYrh9DHh7iL5mGn": true,
"-L9sLuHUYlFdANTKZKfZ": true,
"-L55NOZFkwWJHjCSGovS": true,
"-MFZBYU1KbCFxdypbKmX": true,
"-KjZIX7kOZQkjNigDi9o": true,
"-LXatze8crbgeIP9kvNR": true,
"-K_lJ5MpCw1gwNCBYugG": true,
"-Kk8AGN4T4jNhFHDORpL": true,
"-LaWb28Xc7IXJDmoSB81": true,
"-Klak7Q_4a5EBfRX_BB8": true,
"-Kr7zJE8fm_kUM2LzXY7": true,
"-L1S7lorEClmf_q7_Hzi": true,
"-LGXhoki0ySlElw1H62N": true,
"-LW6jFklIvbTruKnJHmJ": true,
"-LE6iD_E5eUUyd9LJf14": true,
"-LXbIUFG7ube0oKnTPVM": true,
"-L_AkQ1EHHr7M_x4BuPj": true,
"-Lmttv4WdqMMuy8HaAg7": true,
"-MFCJEOVr6WTuc4sL6Vc": true,
"-KdBoBGOUEls9y-GN1LW": true,
"-KkfdBfOpOJ3Ty-mA5bR": true,
"-MNtOC6qw78QmK3-SPkK": true,
"-Knx4_Nx8mZgbZQfmcdQ": true,
"-LBQ4DJAJ_5aPtIdnm57": true,
"-LE2dRmBW6JxdhmmMRf2": true,
"-MSJtnaSWVU456zeFvtJ": true,
"-KrA8pZ_IlObQRuTeXYQ": true,
"-LECiLPF2thrl9ujXDSq": true,
"-Laacl_XwFQzxFuJy50E": true,
"-L1e7dhrf6BWHXBmCOxm": true,
"-LAmDZ6Mt-usgxGnIxOd": true,
"-L7RYGSpZU_hnqxK4TjB": true,
"-MMBcsdsl3_dnhtr4mle": true,
"-LZqEY3DcOLBx_kiyjim": true,
"-KkfMB9sDjnYEVv2A7h7": true,
"-LV4ZJpfgpKKUkyodKiz": true,
"-KkOMhxwVGemt2uQNpXe": true,
"-M4L50cK-zVXr8QEV4qA": true,
"-L8EWC3eaQfu76kF1K4Y": true,
"-LFSB1nQpv_RiVtP3pMb": true,
"-LJ-4mFkMBF1eUEhMJPp": true,
"-MV9haXkg0dbrvFU_kKk": true,
"-MXf9AqWz0wZ3sS4bF_J": true,
"-LptRp-aqaW9qqHGzR5k": true,
"-ML5RsMXhj7tnbbzs02H": true,
"-M8N1Tl2UoXTE4xKY_6_": true,
"-Mma-ITJcS2X3STQ22RP": true,
"-MK-xIWwMHTIBuSh3ZWQ": true,
"-N1ia5uWUT016PqBaS4P": true,
"-LRJE1kgeesiD8Djqa4C": true,
"-L2y6VQhM7NWukPtSsPv": true,
"-Ld_Aek4jcDsbn8TV7GK": true,
"-LmX7Wv397nenI_lILBD": true,
"-LGHi7ojCPQofDsZb7Ug": true,
"-N2J4MgVL8BCqhkUu38e": true,
"-NDtdz_T0qZyfhMdUvMa": true,
"-NEr0AlVdJxZoB7mY4l9": true,
"-NGufMbXDeP2dBjr_lrk": true,
"-Lr1EMRsMFcK4N-Im6Df": true,
"-LsNsm3bPG3I5y9i56It": true,
"-MKjG_WGMofYRTjqKl97": true,
"-MLEBkcCkOPK0I7GcNLG": true,
"-N5-s6MKiBr9g9oH8Qsv": true,
"-LdLRLLGp5Y2ifQLQ8CN": true,
"-LccPo-ppxTLIbu30I0F": true,
"-NJG040KiPTvS3fE-Zwc": true,
"-N1-ekMYWx_pPmZepQep": true,
"-NMgI94UsnreeRwEvuUo": true,
"-NOcjb9JM9wfyKeerIgk": true,
"-L5F2qiGFzcnPhWeSDtn": true,
"-Ktb4reYTE5yDa34BXBo": true,
"-Lhn8AjBro01pcrdmbIC": true,
"-NQ9T9T2FqhD_1VSRJl7": true,
"-MU7mFF7E6QeTOGUndIG": true,
"-Ln7bpxs1Mmtyv9yx8x5": true,
"-MKMaZ2MpCYf7tMYFKMZ": true,
"-LPg7BaSAJw7kbK7DAln": true,
"-NR7KN5IimmaWpnjjVc-": true,
"-Lf0b4uUCaZIl5TQBiAa": true,
"-Lf0ahHeoyGQ2-voUJSG": true,
"-Lf0bYTLhXmCtdpZsns4": true,
"-Lf0c35FRXPtxyau6-Mf": true,
"-L54aOI7dNzQ9fB_R1kR": true,
"-LgzY48u8PEe8_dxU6Sa": true,
"-NTANIDclxj6058Fium7": true,
"-NRM0ayUKI-90JBEzCqc": true,
"-LZctOX7lLwO8Rcn9IoC": true,
"-LEC_ATSTbwMEneZeHNM": true,
"-L8zcLKIaAbt3nihmij5": true,
"-LZclMpbadvz8P5MxpWr": true,
"-NfTYT_f1XATK_h5dfoz": true,
"-O062S829UXeMk5vw-7W": true,
"-NbpwV60x70HXqjwugHG": true,
"-L_03eJDny3Oir_K2sv-": true,
"-L1Cr41JsxbtqjTv6I7I": true,
"-NNSIeDYbMJy_6DaibB2": true,
"-O9l7m997ViJR_obxBXK": true,
"-O9VOykV4CirECeCrQdq": true,
"-O9VRJfQs93GnPuihM2B": true,
"-LvWjwX1U25krBg-auKR": true,
"-OA-H3adh7Q6zhzjbkvY": true,
"-OA-LyAyRffo4a6lBXZ0": true,
"-O9upp8CftLA0vajZgd2": true,
"-O9x_8xI0Y9Mw1K-gWO3": true,
"-O9yCmrj3r1RDXJz_NZv": true,
"-OA2ysn1JLKUs32syS-O": true,
"-OA2Y5wpGsBswVdLFBeS": true,
"-OA7UgYKDG0HgpZru3xh": true,
"-O9ol48Km8FeH3RkiEaZ": true,
"-OA7TpLENioalciKNOTr": true,
"-OACMOxFVPfSe7wZiV8G": true,
"-OAB9SWlPpyTTWRrYlUZ": true,
"-OAE_oEuS98AHKOD96zB": true,
"-OAE5NQQkYDUMGovt5dd": true,
"-OADS3jVt4MVBPN_xUs4": true,
"-OAFwU6UNn-uhBY5JJkX": true,
"-OAJv3BH3qChqUg0MJVi": true,
"-OA8A9ML7FEWLrhaRE7t": true,
"-OA49nAXMWrCxr1c5vIC": true,
"-OA7pqw3IABaT1GuOsxp": true,
"-OAFK7WWabOEfuCxkmug": true,
"-M5PZvxZVXEZnmg4V7Hy": true,
"-MJURcCFL-9L_cbihLys": true,
"-O9tU00H1GqEfUehDZYW": true,
"-LZ32cSNYn9_J1PHsVMa": true,
"-MWtHkD-2ATJdVx5KgsN": true,
"-OAA94aHsDaXcxqAAjKo": true,
"-OAFyMVCQy1ZxVYH0vhN": true,
"-OAT0pighcqh0MWqS9ny": true,
"-OAXAPwWWZylCArXeA-S": true,
"-OAW4J9BVnfQ9GnARy4m": true,
"-MoyXC9fdcm8DigXIT33": true,
"-OAeo-Q2LnwdtJrP2CMv": true,
"-OAruo0yj-8JqCELlRTu": true,
"-OAfTiV5p_5PSV_OrSWA": true,
"-OAwBPY2d5ZjI26Twlfy": true,
"-OAtv61-UolIn_C4Q9Ci": true,
"-OA2UzaNshgrFm_0XU7g": true,
"-OAoImOGxX3WGQDm0ox9": true,
"-OBA6ev5gbJk1lGhsmxA": true,
"-OAdOX4kckC-NitbpBrr": true,
"-OBHkOJjppimm2tcUE0r": true,
"-OAdPDSbwdUI3zIuvUze": true,
"-NDrsfTDeKR_hZ1k_-QF": true,
"-OA9_M7J8ilsB47DRsDs": true,
"-OBOWAb7an5T8ak9Gd3m": true,
"-OAjOz4bGjyJdIo5eMRl": true,
"-OBNNkKwGZfO0BX89sDo": true,
"-OBM-LoRxzZKXi8dvphv": true,
"-OBU-bOGO7Yi5uAWlAKj": true,
"-OAOEo9pdmReRKP3Njyi": true,
"-MAVC7F30j19kLOh4cwO": true,
"-OBUHJnkshGV3rGETQZk": true,
"-OBrcQdLsOJHRw-kxLJF": true,
"-OBH8naTGfDlmsNRjxfZ": true,
"-OBm2OMax-6NqrqVUBE_": true,
"-OC-_UpszTAgkyjWkGIS": true,
"-OBdq3vJ2slIWEDAXEeM": true,
"-OAjxHVkwRp6DeQBzEeX": true,
"-OC5u5DqXGeUOiO_SCrd": true,
"-OB5KXE-d0y05K7L1Wt1": true,
"-OBAyDy9PnXey5SMeUra": true,
"-OB_iNUWGUZLHb8sm9ko": true,
"-OAnZodIYZhf7N57SdpC": true,
"-OAYRP4w8X9aG0LlslMV": true,
"-OCKKQl_DmLTGpEgXORM": true,
"-OCcmXigH7iua8lnEYuZ": true,
"-OBYG-xv8_P81wBwG_pA": true,
"-OCWFa772lH2KKUPq9qi": true,
"-OCVzXHfoRwqzUj2g0cV": true,
"-OBglj-IqaWEXKZEgA4g": true,
"-OCk44SfT2n9IqnPfnmi": true,
"-OCh5sRoZLTRfE0sVA0d": true,
"-OCacSzYrhKA-lagb7jl": true,
"-OCrUAy32fm7tM8w37Bs": true,
"-OAlyskVrmzN9CWRFNv2": true,
"-OCA_rLhEF-peJ7-ISpY": true,
"-OCwwCDnl1W1Q3Vj6Cm2": true,
"-OCDxgDZJm3Wq6ADTIrG": true,
"-OBuERtPdm2_2an2RSMS": true,
"-MIMpsZJa9WHxI4H6fcD": true,
"-OAkeD2ofZOoG-2_byXQ": true,
"-ODYO1sZAXRHLTyo01z1": true,
"-OAgszIIxPPz7M7Zi5VE": true,
"-OAct8HtnIjPl4-g26BR": true,
"-OAmQQiFRuJmuxVgLy2C": true,
"-OC8iUzZFEyI1IOocz8a": true,
"-OA_9g0_glVrDzTqT3WK": true,
"-Kn2afLokZdBO-uHcIAF": true,
"-ODmnuKrSPxwGcHXuDYH": true,
"-OAYkVuqnDwsgcEQ2ck0": true,
"-Ncb1TvRoj5Wfz4RCqOn": true,
"-OECgBiW3CEFkjs9-41E": true,
"-OEouOFoD9FjBzspii-9": true
},
"photoURL": "https://lh3.googleusercontent.com/-XdUIqdMkCWA/AAAAAAAAAAI/AAAAAAAAAAA/4252rscbv5M/photo.jpg",
"providerDisplayName": "<redacted>",
"providerId": "google.com",
"blueprints": {
"-KjYZeRSDZ5gJrR46RYy": true,
"-Kl-j3TSb1wV9zvr66LY": true,
"-Kue-bWps_dyCmxGyhBn": true,
"-Kifx85ww99ZWLB-n-9S": true,
"-KufOvAr2WaVc-mVmEn5": true,
"-LZgUrroDctm4vZtwq71": true,
"-Kn1XhlDX1I162XfhLxL": true,
"-Kudx5-85B_iov8YoAgL": true,
"-LZgSIRO1ZZO3AiT3dYi": true,
"-MEs0OccaAQ61Acfr9qT": true,
"-K_VpUtsGAlQeBuZ1oez": true,
"-Kl-UBR-bwCP_K3qFXzf": true,
"-Kl-a5-7hM9UdJQEYzjU": true,
"-Kl-NTpuTXPVfk0N0EMo": true,
"-KueBFbovf7EpMFUr3g0": true,
"-KietyiL1H-mqf01qnxZ": true,
"-KjJ3CtQJvF3lWYrJTXV": true,
"-KjYZyOEXtpW0OyjrC0D": true,
"-KufLIo2-ljdVW6E68eK": true,
"-KYVL2qnlOpHomJAj-eB": true,
"-KihRz97l2eDN-av-BXC": true,
"-KiowDcfTg5Tl9Yj-5wl": true,
"-KududYggxC00_tYS0ku": true,
"-KudzGB86nFE7YTo2Mag": true,
"-MSB8Z0GY_AJjqbUQiKY": true,
"-KioxPCe3zEvkTMzU2KN": true,
"-KjNkrxQS1mrYCg1bE0N": true,
"-KjUiaibx5dJBC9svbMy": true,
"-Kj8bHstSx0LnWi6rqhU": true,
"-KjmZa8RznafImLVCmO1": true,
"-Kl-cSRdWCenc8Q3Qqv4": true,
"-L3VpEZ2-nV5Adh0Qbh1": true,
"-KY_A4qxNbkiBv1yNPI5": true,
"-KY_BySvaQCx8DR0S_NZ": true,
"-K_Vev0GbQVyAe0fteYU": true,
"-LL7qyWtXdVlRPe-Sv2-": true,
"-NR5CebXEP_hJ8qeNN8u": true,
"-NR69PrlC-fp-d-mapq4": true,
"-NRFOPCYzuyttD_OG1sL": true,
"-NRM0ayUKI-90JBEzCqc": true,
"-NRxAdnG9stXsbD-mOVr": true,
"-NY9FWK1C0riHZ5o0Qjz": true,
"-NYALE_zTYegah8amu0h": true,
"-NYAV8n19qoJJIRaAbxD": true,
"-NYAW4t62KK1uRHCvkk2": true,
"-NvvuG0zAgn98B6AUuMY": true,
"-Nvw-FiNomMz2HyY8JiH": true,
"-NvxHKMpv7esFo3hrG10": true,
"-OA7pqw3IABaT1GuOsxp": true,
"-OAP4_bHqhbjQeqbPjxu": true,
"-OBQPM5IcEur_OTfkIv6": true,
"-OBRge22JrbTOc11WuyJ": true,
"-OBVcew0RCgurKXn6PhR": true,
"-OBkfGanhIWhlp69X0k8": true,
"-OCTfI_EKeIvtTZ6CjDX": true,
"-OCTmhGxA7X-ILIW5Xwt": true,
"-OFNGP9uf5GiQuxfyVKV": true,
"-OFODk8NwP-_J18h-alx": true
},
"displayName": "<redacted>",
"email": "<redacted>",
"emailVerified": true
}
}
}