From 815fa068bcec9cfd5e9d5cec61900631eb55626c Mon Sep 17 00:00:00 2001 From: oxalica Date: Fri, 1 Jan 2021 10:21:00 +0800 Subject: [PATCH] Init --- .gitignore | 3 + .vscode/settings.json | 8 + default.nix | 72 +++++++++ fetch.py | 197 +++++++++++++++++++++++ flake.lock | 40 +++++ flake.nix | 40 +++++ manifests/stable/1.48.0.nix | 1 + manifests/stable/1.49.0.nix | 1 + manifests/stable/default.nix | 5 + manifests/targets.nix | 93 +++++++++++ rust-overlay.nix | 301 +++++++++++++++++++++++++++++++++++ 11 files changed, 761 insertions(+) create mode 100644 .gitignore create mode 100644 .vscode/settings.json create mode 100644 default.nix create mode 100755 fetch.py create mode 100644 flake.lock create mode 100644 flake.nix create mode 100644 manifests/stable/1.48.0.nix create mode 100644 manifests/stable/1.49.0.nix create mode 100644 manifests/stable/default.nix create mode 100644 manifests/targets.nix create mode 100644 rust-overlay.nix diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000000..2f3b8dd4e0d --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +result +result-* +*.tmp diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000000..153794dea02 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,8 @@ +{ + "[nix]": { + "editor.tabSize": 2, + "files.trimFinalNewlines": true, + "files.insertFinalNewline": true, + "files.trimTrailingWhitespace": true + } +} diff --git a/default.nix b/default.nix new file mode 100644 index 00000000000..7648cbf7a33 --- /dev/null +++ b/default.nix @@ -0,0 +1,72 @@ +final: prev: +let + inherit (prev.lib) filter hasAttr attrNames mapAttrs concatMap mapAttrs' replaceStrings; + + targets = import ./manifests/targets.nix // { _ = "*"; }; + + distServer = "https://static.rust-lang.org"; + + # Extensions for mixed `rust` pkg. + components = [ + "rustc" + "rust-std" + "cargo" + ]; + singleTargetExtensions = [ + "clippy-preview" + "miri-preview" + "rls-preview" + "rust-analyzer-preview" + "rustfmt-preview" + "llvm-tools-preview" + "rust-analysis" + ]; + multiTargetExtensions = [ + "rust-std" + "rustc-dev" + "rustc-docs" + "rust-src" # This has only one special target `*` + ]; + rustPkgExtra = pkgs: target: let + singleTargetTups = map + (pkg: { inherit pkg target; }) + (filter (p: hasAttr p pkgs && hasAttr target pkgs.${p}.target) singleTargetExtensions); + multiTargetTups = concatMap + (pkg: map (target: { inherit pkg target; }) (attrNames pkgs.${pkg}.target)) + (filter (p: hasAttr p pkgs) multiTargetExtensions); + in { + components = map (pkg: { inherit pkg target; }) components; + extensions = singleTargetTups ++ multiTargetTups; + }; + + # version -> { pkgName = { _1 = "..."; } } -> { pkgName = { x86_64-unknown-linux-gnu = fetchurl { .. }; } } + uncompressManifest = version: { date, ... }@manifest: rec { + inherit date; + pkg = + mapAttrs (pkgName: { v, ... }@hashes: { + version = v; + target = + mapAttrs' (targetIdx: hash: let + target = targets.${targetIdx}; + pkgNameStripped = replaceStrings ["-preview"] [""] pkgName; + targetTail = if targetIdx == "_" then "" else "-" + target; + in { + name = target; + value = { + xz_url = "${distServer}/dist/${date}/${pkgNameStripped}-${version}${targetTail}.tar.xz"; + xz_hash = hash; + } // (if pkgName == "rust" then rustPkgExtra pkg target else {}); + }) (removeAttrs hashes ["v"]); + }) (removeAttrs manifest ["date"]); + }; + + uncompressManifestSet = set: let + ret = mapAttrs uncompressManifest (removeAttrs set ["latest"]); + in ret // { latest = ret.${set.latest}; }; + + manifests = { + stable = uncompressManifestSet (import ./manifests/stable); + }; + +# in { inherit manifests; } +in import ./rust-overlay.nix final prev manifests diff --git a/fetch.py b/fetch.py new file mode 100755 index 00000000000..c568efa476b --- /dev/null +++ b/fetch.py @@ -0,0 +1,197 @@ +#!/usr/bin/env nix-shell +#!nix-shell -i python3 -p "python3.withPackages (ps: with ps; [ toml requests ])" +import base64 +import json +import re +import string +import sys +import time +from pathlib import Path + +import toml +import requests + +MAX_TRIES = 3 +RETRY_DELAY = 3.0 +SYNC_MAX_FETCH = 5 + +STABLE_VERSION_FILTER = lambda v: parse_version(v) >= (1, 29, 0) + +DIST_SERVER = 'https://static.rust-lang.org' +NIX_KEYWORDS = {'', 'if', 'then', 'else', 'assert', 'with', 'let', 'in', 'rec', 'inherit', 'or'} +MANIFEST_TMP_PATH = Path('manifest.tmp') +TARGETS_PATH = Path('manifests/targets.nix') + +RE_STABLE_VERSION = re.compile(r'^\d+\.\d+\.\d+$') + +def to_base64(hash: str) -> str: + assert len(hash) == 64 + return base64.b64encode(bytes.fromhex(hash)).decode() + +def is_valid_nix_ident(name: str) -> bool: + return name not in NIX_KEYWORDS and \ + (name[0] == '_' or name[0].isalpha()) and \ + all(c in "_-'" or c.isalnum() for c in name) + +def escape_nix_string(s: str) -> str: + return '"' + s.replace('\\', '\\\\').replace('"', '\\"') + '"' + +def escape_nix_key(name: str) -> str: + if is_valid_nix_ident(name): + return name + return escape_nix_string(name) + +def parse_version(ver: str) -> tuple: + return tuple(map(int, ver.split('.'))) + +def version_less(a: str, b: str): + return parse_version(a) < parse_version(b) + +target_map = dict((line.split('"')[1], i) for i, line in enumerate(TARGETS_PATH.read_text().strip().split('\n')[1:-1])) +def compress_target(target: str) -> str: + assert '"' not in target + if target == '*': + return '_' + if target in target_map: + return f'_{target_map[target]}' + idx = len(target_map) + target_map[target] = idx + + with open(str(TARGETS_PATH), 'w') as f: + f.write('{\n') + for i, target in sorted((v, k) for k, v in target_map.items()): + f.write(f' _{i} = "{target}";\n') + f.write('}\n') + return f'_{idx}' + +def retry_with(f): + i = 0 + while True: + try: + return f() + except requests.exceptions.RequestException as e: + i += 1 + if i >= MAX_TRIES: + raise + print(e) + time.sleep(RETRY_DELAY) + +def translate_dump_manifest(manifest: str, f): + manifest = toml.loads(manifest) + date = manifest['date'] + version = manifest['pkg']['rustc']['version'].split()[0] + strip_tail = '-preview' + + f.write('{') + f.write(f'date={escape_nix_string(date)};') + for pkg_name in sorted(manifest['pkg'].keys()): + pkg = manifest['pkg'][pkg_name] + pkg_name_stripped = pkg_name[:-len(strip_tail)] if pkg_name.endswith(strip_tail) else pkg_name + pkg_targets = sorted(pkg['target'].keys()) + + pkg_version = version + for target_name in pkg_targets: + target = pkg['target'][target_name] + if not target['available']: + continue + url = target['xz_url'] + target_tail = '' if target_name == '*' else '-' + target_name + start = f'https://static.rust-lang.org/dist/{date}/{pkg_name_stripped}-' + end = f'{target_tail}.tar.xz' + assert url.startswith(start) and url.endswith(end), f'Unexpected url: {url}' + pkg_version = url[len(start):-len(end)] + + f.write(f'{pkg_name}={{') + f.write(f'v={escape_nix_string(pkg["version"])};') + for target_name in pkg_targets: + target = pkg['target'][target_name] + if not target['available']: + continue + url = target['xz_url'] + hash = to_base64(target['xz_hash']) # Hash must not contains quotes. + target_tail = '' if target_name == '*' else '-' + target_name + expect_url = f'https://static.rust-lang.org/dist/{date}/{pkg_name_stripped}-{pkg_version}{target_tail}.tar.xz' + assert url == expect_url, f'Unexpected url: {url}, expecting: {expect_url}' + f.write(f'{compress_target(target_name)}="{hash}";') + f.write('};') + f.write('}\n') + +def fetch_stable_manifest(version: str, out_path: Path): + tmp_path = out_path.with_suffix('.tmp') + print(f'Fetching {version}') + manifest = retry_with(lambda: requests.get(f'{DIST_SERVER}/dist/channel-rust-{version}.toml')) + manifest.raise_for_status() + manifest = manifest.text + MANIFEST_TMP_PATH.write_text(manifest) + with open(tmp_path, 'w') as fout: + translate_dump_manifest(manifest, fout) + tmp_path.rename(out_path) + +def update_stable_index(): + dir = Path('manifests/stable') + versions = sorted( + (file.stem for file in dir.iterdir() if file.stem != 'default' and file.suffix == '.nix'), + key=parse_version, + ) + with open(str(dir / 'default.nix'), 'w') as f: + f.write('{\n') + for v in versions: + f.write(f' {escape_nix_key(v)} = import ./{v}.nix;\n') + f.write(f' latest = {escape_nix_string(versions[-1])};\n') + f.write('}\n') + +def sync_stable_channel(*, stop_if_exists, max_fetch=None): + GITHUB_RELEASES_URL = 'https://api.github.com/repos/rust-lang/rust/releases' + + page = 0 + count = 0 + try: + while True: + page += 1 + print(f'Fetching release page {page}') + release_page = retry_with(lambda: requests.get(GITHUB_RELEASES_URL, params={'page': page})) + release_page.raise_for_status() + release_page = release_page.json() + if not release_page: + return + for release in release_page: + version = release['tag_name'] + if not RE_STABLE_VERSION.match(version) or not STABLE_VERSION_FILTER(version): + continue + out_path = Path(f'manifests/stable/{version}.nix') + if out_path.exists(): + if stop_if_exists: + print('Stopped on existing version') + return + continue + fetch_stable_manifest(version, out_path) + count += 1 + if max_fetch is not None and count >= max_fetch: + print('Reached max fetch count') + exit(1) + finally: + update_stable_index() + +def init_sync_all(): + sync_stable_channel(stop_if_exists=False) + +def main(): + args = sys.argv[1:] + if len(args) == 0: + print('Synchronizing channels') + sync_stable_channel(stop_if_exists=True, max_fetch=SYNC_MAX_FETCH) + elif len(args) == 1: + version = args[0] + assert RE_STABLE_VERSION.match(version), 'Invalid version' + fetch_stable_manifest(version, Path(f'manifests/stable/{version}.nix')) + update_stable_index() + else: + print(f''' +Usage: {sys.argv[0]} [version] + Run without arguments to auto-sync new versions from channels. + Run with version to fetch a specific version. +''') + exit(1) + +if __name__ == '__main__': + main() diff --git a/flake.lock b/flake.lock new file mode 100644 index 00000000000..c8051f5342c --- /dev/null +++ b/flake.lock @@ -0,0 +1,40 @@ +{ + "nodes": { + "flake-utils": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1609079092, + "narHash": "sha256-KhyKfxBHtZlAgudpZ0EJVzeuqROjKfVOwj8j0cuhU50=", + "path": "/nix/store/5pmay8rdvgw5ml1xi6189xhdbygc850k-source", + "rev": "2f47650c2f28d87f86ab807b8a339c684d91ec56", + "type": "path" + }, + "original": { + "id": "nixpkgs", + "type": "indirect" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 00000000000..a301021a927 --- /dev/null +++ b/flake.nix @@ -0,0 +1,40 @@ +{ + description = '' + Pure and reproducible overlay for binary distributed rust toolchains. + A better replacement for github:mozilla/nixpkgs-mozilla + ''; + + inputs = { + flake-utils.url = "github:numtide/flake-utils"; + }; + + outputs = { self, nixpkgs, flake-utils, ... }@inputs: let + inherit (nixpkgs) lib; + overlay = import ./default.nix; + + allSystems = [ + "aarch64-linux" + "armv6l-linux" + "armv7a-linux" + "armv7l-linux" + "x86_64-linux" + "x86_64-darwin" + # "aarch64-darwin" + ]; + + in { + overlay = final: prev: overlay final prev; + + } // flake-utils.lib.eachSystem allSystems (system: let + pkgs = import nixpkgs { inherit system; overlays = [ overlay ]; }; + in rec { + defaultApp = { + type = "app"; + program = "${defaultPackage}/bin/rustc"; + }; + defaultPackage = packages.rust-stable; + packages = { + rust-stable = pkgs.latest.rustChannels.stable.rust; + }; + }); +} diff --git a/manifests/stable/1.48.0.nix b/manifests/stable/1.48.0.nix new file mode 100644 index 00000000000..beae01da6c4 --- /dev/null +++ b/manifests/stable/1.48.0.nix @@ -0,0 +1 @@ +{date="2020-11-19";cargo={v="0.49.0 (65cbdd2dc 2020-10-14)";_2="nqRAcJz1HPKBEIR/12nn/JN6AdA1AO3sUjJAjERZ/IA=";_3="hGnlIsUS0DpBBGLy76y8W1cb+21s6CTx3uvsJv0CPsk=";_4="Vn9hbN0I+bXZu7UXX9kF+sQ0PudOwKcfa3TzVrSBt5k=";_5="/NvGt8s9FA20yUJKA/Wco931tbhp3aWzz2jDdiV/734=";_6="AU87oodQFmM2IBWBGwh6vi6RBCt3keA9u96UHmEL2hY=";_7="jgkLCSEYKtW718BNjaXF5L/XDUtac9jklJis4uv40qE=";_8="wcMcFRnFTu7+5cq4+6orfOvkySyr5pcD2Zd0OjYYN1k=";_9="Hqt235HocZhjJgV1LQ3Wbz2EtQLL0fmC9ts9DY2UPNs=";_10="MdJ3Bh1Nvg8eZoB8DlhQFbFWRN24+BCtg6E+USG/qV8=";_11="4poBkn4VZ9PDwhgs0REwdoGDWp/Cc49cgnxKYi7ORQY=";_12="8yRBzd9zdm+2PjjFYgTH1Y0IwHmEbG4TQ5fzlj9X8Lw=";_13="qtdccXRTsUWAxIOYMv9beL37thJFjPS6MRXLeVzSG20=";_14="zepvoTdzI0FZCthWL9ld+BUdbRzBA793RLGcEC74/ks=";_15="HmBpGEfQqVnqs7q2eFBEf0eo+aQ0/L3eB4wYQTdJYYo=";_16="Z1Mhz4EqEyznByYdA6qy9f9keIrma0XQO8KBUU9dU+w=";_17="Hee2TiCgnx6+kEkstZVXv4KEFPfCyRAqiP7fgFDACIw=";_18="uxubCSJYdPPrchIS+s816M+QmSshk0iGZfUvJdyNFZk=";_19="icfW1hSpIHHT0SZlCGaarC7J914q73gSHwr0h1VINSw=";_20="biEiDmstOzn7mRg2yKp3DYUW9dMD52rB7SFPXVHTH/8=";_21="CKBw2Lgq9pdk+WPIKqa8f30Y7arAqO+EYI9yhL/1Woc=";_22="L5jiY8PNu+IqkxZY6/BXqvwezJJy1vCX67E0deP0Vyg=";_23="Ac01orPY55Qz+oAQYhNlELQ3BHQFAHeO22TSNku/jQw=";_24="sR1ZVYHiWAwGm1A5IU4QMaDk+H/2SQrDn5L3eFfjcFU=";_25="hyjLdRXlk/b888evuoJqks0iejW46Ta66JK5VILU+5A=";_26="u98xLRfrc0CgO2Aj7PanAp0FuDoFHhLCsnPbBF1U6Tg=";};clippy-preview={v="0.0.212";_2="/1/E07TxthR/eC0oZp+g6EezZgGF+hR+Tr9Nms5hzU4=";_3="eCJ34RyFCKATPG09eKDvlYKlo/bbQwz0/BVYOmmoBP4=";_4="96qIfJ5QQqN9C5wZGepaavj1CJXq+eK9bsoT/jD5rKk=";_5="O8UutkML69diVDlfYajNkD1DrmrdxKCjKy0rc/5y4bQ=";_6="ewsK4xge2t8/11VLldfPq+TJ5eUHHbm/TkKYRnVcDfw=";_7="Q2gIxolJe84+BBMWHKndGOg4ULbTD/2GvuG5JZ6j5Ps=";_8="OAma/6Y5dZ1KjSbiw/m9Tqg1sKRs1ndNFMgYXVE4W4U=";_9="JsoZ9lGg9gmpuQUCNfNErXjN3CCAv2JE+gzY/Zdw/30=";_10="unH40dn4ir9Zgj7Ycgg76zmFRbrvnIr3pSyDnal/myY=";_11="RBBqz44ZsjnWozqSsHWUXbSqJ+94yIBR2AYMY+sZUOc=";_12="ZVHXHNg+6Ze3pn1OB9bBE35k6Bq8uyRLcY28CRqjBq0=";_13="BKPZ9lYrc3matvE0KjGrilkk67QMV5yr0qHqe/w2sCU=";_14="qyoAjzxVuB5X+gtHccQje5jrTlNW3aMK6boSgMFqHrs=";_15="4hVCnQ5VOqJWy2+ilPjWbSF9G8scJ5ahLNDl3HbWl+c=";_16="Sj4rq+ODaqpNx8NTg4WCgvfgfSjLU+hh0ZOLV+PuXcg=";_17="ZLlhVm1BZJ5RYQjBSpZtjFpLyJSwUtecgwMI2s34EVc=";_18="GmKB6eDEeHa5ZdJJV6ESdaW8MmRaM56nR7DSaFokd1s=";_19="HuF2axEpct47W3ofNCTwcu+einG4FtEYfuLrdE8+7Hw=";_20="6an6101LhyQTHaGmEWitm9i4pEXvNLahwNwEQ1zfvIY=";_21="lWpzABKS/5+YocwR8YMSIHmFM7SxP0hTICPJ7nu2Ajo=";_22="JUq8L5I/3nwlOVUHaf7YhKRwfDumkp+VdiS3QA1klg8=";_23="sZPpq7YW+nrB96tAKTTBi9P3hIIoyGgzNhVeKCm6oSI=";_24="hNZs609g6gy4Zzlkj5cu83MmxWI4aslJe5gR1YjzBGk=";_25="Q0Zu+NmbjZ0BE2tfRS8YxMIAMmLqTZgVPgnp7+75AYA=";_26="pHRbC5qS6MSHilDSl+XX+UjGVDXboZbjZqVrGpK5qZ0=";};llvm-tools-preview={v="1.48.0 (7eac88abb 2020-11-16)";_2="ASY9/0JtzsLMdsWJ/Da0l2p/WtQi6VMDCTtRimzqeLc=";_3="kskBOUV2graWDg+4HpJPEGVr9g+/odSAbMICGv6KwvE=";_4="py6D9DC2m4DE47hSe8yrYqJTu27WxMZaqa3bmxs8LkA=";_5="KUhvcGJUR5/qshqD1ndamnC8sDUgseC0FygHO1o5P7A=";_6="FnSsOYqtInoF10NoMxDOzREpks8GDWPgfFDinPmxd2U=";_7="RtlrjGrht2E598jVXY0wJ3igfCFXpNbDDTMCBPyQRqY=";_8="Hm0mOW2Il6GwD+Kgakdr7PwofM+4AHaiF1buetEELr8=";_36="/K5ITw5h5RdUSB7PqjBBifRMkmbO2RgS8JJPbeAa/cg=";_9="ScXX+O56xL20R5cVBmvIOzej/8KTyO2VbasMdSjXBLM=";_10="20IHg2fk24Da1rai/1J3XwoN/cpPbcE1aZpmq+B1wMc=";_11="eOWxvaLj9PtrOTQlnv5GeE+vmk87r0NTfjOvJL4/3XM=";_12="AMlmQIcz3QHMXfhWcuS6h/AbGUZrkugwmMe2yvDYkqU=";_13="cvZhY4IyqwMms0Jq2kxw+06y8kDCYURs6Ae70SQxdXs=";_14="QQMpLL+zFAa1JhG2sUJkrdisJc4vKQznNvwWeODDk0c=";_15="As/R2exlktnPvxgQoXrg0zeJ8qqtT/DL3mraf2NlcOk=";_16="/R9B+FHZlTqBP1K9uYQ1/YNnU1HhpGHGR4ejN/Z7ZWQ=";_17="jcwG1u2Ii3Nqd16fTROUatkCus55oCjbPDbbReUZNPQ=";_18="9ZU2HL8PXAr8504KH0UwMxGO0sAwzL7cTduWg2DUHJ4=";_19="8fm3gsJQPjCwJ0H1++PRi9cng0N52lSiOdVOPcJMPPM=";_20="593d93t8y2PFZS+RMmBjoRXa/L5LmnUSVirZxHL7nys=";_21="YgfFtGF3kofghJ8fRZzquADpwxzoHz8Sb3I/jet8tG8=";_22="ZqQCQ8mfrQSofuPny5sfuhT2d91UrIj4AEPTKHcIgIQ=";_23="/KuokHSsnfYp4YtIx0v3sbU55WyR2QjotEPLhV7VhwQ=";_24="4wVhLDzgvh8endeI0VRV8QcZOEG4RNZ/7CstbirSKNA=";_25="iMw3vg2SK4BR0PV/OJuZLwVY5+vYdRhPwYEJiPKFvu0=";_26="+4rA52BG/fmtOgtkVR4vyu9k7UBoIX3OrDCUwYCPASY=";};miri-preview={v="";};rls-preview={v="1.41.0 (dab1468d6 2020-11-06)";_2="XL2RndXfS6tIQEkpupHwnLXC46NxnKgD0ttqkgLmWLI=";_3="bH0f+AqI/G4uBMApXjgpaToS+MIAGL8K0G9e9eE0+WQ=";_4="+jKUYBcrniC5BpZc4+E3TdMA0dJsqbCY086y+aAT1zY=";_5="VZ7maMyctV5A/gUgsxPvlV+0vktW/h7Jw626GmDpi6c=";_6="W3rGWEBFe1AVijhRgpqTc2sd7DJqv7DtKboPzNayMe0=";_7="RTH8fGNn/aASAg7fq9DaoLzX8QrY7wIhr2SYT7QjW7Y=";_8="dibJnYx2UMUw1C4yXX+ULtJ7EfHsnCdV/MXywhr0akM=";_9="XZl0QyJHu/ecF5mSXu7laLlL9aQRULxdk6H3ZLHyXUk=";_11="V4DrbUs9vXlRoNp7/0egk2/rapi3H0mWR7AI0juNIbY=";_12="IM/jkAeU2tASOejVtESEc68gX9UbOzuvCv/P49AibiA=";_15="+YMWAcp6iETQXoYeClChALUVwDaHmFyPmChibEDoKL0=";_16="zSuu61YjkfYMmNDK1tbrbyYoqRGFztU7LgrhvhRr4/w=";_17="y6x3KNpCiOtIzfnJ6t03iRJtJ2btZJT27h6XFyRiKxc=";_18="gydwlBJHOETOQY0q/6AQ8q2j3FlSHe8ngDTYOV9m+uU=";_19="NWaUsiI6UAKV9PpThJYva60k41DNFUYNEnwZ3POmRa8=";_20="GjLrfd35tJ8To/LmZTTbOBjrBjo/qYoYOyx/FtzyF74=";_21="x2mYNUDV/TdZzhNIQIrV1cB5lK1fOCQobyPP9Rg/nKs=";_22="VcVRV192QNSkKv8F1ax3eQlq1Ya+O7JHfSy+eNfVqQ4=";_23="wxZ7oBlvaqhKq1M+l+qlzyyUN9VdyHtfdMxEHc7TQTY=";_24="RM1v2xrC/D7jf9e03GJ9thHTHdpvjLqloM2OZtSKVFo=";_25="Ew0UroZpRLl8jCWv7IAKmasTnvx81LCUJ+B09ZRaK/g=";_26="HrP1t2NJLfXwo6PGV4f1fVr33lvs86+220F9Zff5sGU=";};rust={v="1.48.0 (7eac88abb 2020-11-16)";_2="vVqLTIkcH1aTgcDEKmGh9cWqCzTTTWzT7W5dN/JMANQ=";_3="rc0GYWiGlZ2hyxjGRpEvnOZbH0WylFhdrl79/Caebn0=";_4="wsNcbAxfkXhtFEOvqjT/CWl5U06wNmqmPwMUtnuqELk=";_5="ViOjC32jm/B1Qq/fVPIstf557bqH4tQtIrVcaDjqSKA=";_6="yMFO/JjkhkxnWcQnUSR6sJw8hoDwHBAhcNrsl6C3FiM=";_7="9e7SAWxM0Bbd+wLFe94iGygPFQz9H0c+Q1+u0WP5s90=";_8="rsaA290L4ivK5Yq/OTj9LwAo+MraVzmMdgVfyUtO39E=";_9="3b+1rxzSy2rnnW8/lc8pwAV+Y4fq2os5defXZY4xWq4=";_10="xzaOU8U542GZQEL++i25mSQ50L77Kq/rDMDHU0rlTsE=";_11="Hk8+ktBNK3CxeNEAJfgTeXuLvvFWijbmKqg+R0mmx3Y=";_12="mEPS05v++6hzY5mOd8LRnnf5cnd6Sr/XdUK237Q7GdQ=";_13="lx4qH0v/CMAmblq7FEG0bQXjrg3xmWs7evKELOLdiFo=";_14="PLWEQQ/lUjUo3BX38yHcN55tMEn2isURF90BzjN+RYo=";_15="6kPTM6BG4TI0zFIPvzokIYYfj6wgs8pvm2zOogznZsc=";_16="uC2ADKSTOv7bu9g/ReGzmq6ilVbv31z9vcV3RrMrfF4=";_17="SOw+S5C+PaO6dJP+mHnbq7RH3pGHb6rvNW21RLGBxIw=";_18="ZV655VoA45UDu2oZJLlG7T0R+SyQlV7Xc7aDqkLzCNQ=";_19="M9q65R++AQYcbvC//dxYWjRRZUPlH//x4J6AtiRc7hs=";_20="L8i0OYC7S/WsF7ETfbMYjwu2Di0YWh2mgShs/mPqqzQ=";_21="4QWAG0DSrkUZCq49LxXyvjI0KU2tjVIrWcjCdznUz2Y=";_22="ErNW/qI/BfSnJLtBPYFG0nmgyJumBnL1wqAnq8wQuMY=";_23="l85R3IT911Xp9Nm/2iWCxdsl+v8N47yFOufFm67sgyU=";_24="WCcNjhD3LhcSugjba4+P/KZKY9GnsiBoi1n7BWVbOEM=";_25="nE59ng3LCNCEMvtbwWcu4m9Oci3bHdWlSN/leUoa3r4=";_26="aL013HdalOLwxopsTZ7Z7TyAXuq1DhTURazrjyu3dGQ=";};rust-analysis={v="1.48.0 (7eac88abb 2020-11-16)";_27="eccOe5aiMJKr0SbMz42bsTka2jLNW+N+eSYvglIwW1I=";_28="Yxu/pW/oWht1LtLvVoUQ+VrQ440DK6MxMXUq34gjKAM=";_29="C1KbcyPjQqEqrMC4aexyaYXPWt4rgvvDLcnzvoT+arQ=";_1="es2H8uF7a5wcNbyzdZ6ENvMhDnoB4UcWJxhdWaDyOe0=";_2="d6VMk4AM8Ih62dDDTKnDtAtl12al41PTVynTBG2AWR8=";_3="gJB7K+U6cZLZmrn6CypqaSs4GuVgGQ91EKg/5hA8RjI=";_30="5sGjlrNKSfRfya66jfxJ6FmPPIdY2Q7wYfYJriy6LlE=";_4="FBL+m9n7HqSP1+2UyP/3BaB+5+dydPisVGUMm6UZJEc=";_5="momCfLZPoc/SvXVDZjkhtTbj4zWMIxjk+9gpzbMpHcQ=";_31="76lll+WwJF5tkijeoYRmSuEtUnWk84JQ0knO8ZnPoL0=";_32="5POFYKvy+qfkK8JOUIf2udYNT6mRiWzhO8pxPOx+XgU=";_6="pujG9UjsdeEhfQMFmGMKbwpAslDDu8XBxc+Z+6yr4pU=";_33="CeKWPb9MeesWk3qrkd6JLZfCbzrmdglGVJ4UNLlxymE=";_34="jur8avpNaZxAu58WppwIStwalAu++oqKOucFGXYvUSM=";_35="0q2gpX0+V7Lph3qiHTA4ulgoD6zRgw9LBkm8Mowb7Kk=";_7="rZ/kesRvOgI420wgA7wJAJ4v/bh90ckPhmpE7QDNhcc=";_8="a0XbETVHPiYap4tlRYDNuj27CAwGTbYSftp1x8JTjRs=";_36="XLM7UMVWvB/bNoOxTxF+aMEGMmZl5+bg0HIrMgfszIk=";_9="wMMkmkc73+1gii9zQNFyQl7Nk6U5MqmBKPsobvD2e2I=";_10="TiLzpjXCPq5BmE4eRLlX1iiEzhJVnRogBlw4agsI6H8=";_11="3OKWi2+whovHLPFVS+He8GPbsLP7QzmDwtfl3h4WXhE=";_12="fcziuT1zO5rYcr/Os2NuYu492oenZdmvoR9W0Z0pjno=";_13="wpc0zgqw57nVQ+ptGeXrHVJZlw+S+ROg5DBHnTG/48o=";_37="mAhyZYm822x8RVYMFpzs5Opy7/saYKP7WaOl7PsOVv0=";_14="4xrScObnV+RQmOoEv1lAq+OlXrqXl3x6ILAT+k2EQxQ=";_15="o2iG8qP64erwF0QLFkDJxnlU8kr3E2sZktgAnXDuN7s=";_16="qyT8+lYhLiKH+0Cy1ezdmxzNrFWhk1w3DoNqIzX80tM=";_17="L3lBv2tb4sDdUco2cuhQcurMgp0hSMRtP0pCma9p9pA=";_18="OJ99JTmhyaSPpkfmXnzI+qK884ZjsTgL45P7k6bJ9tk=";_38="rr8N650LbxPkNCM6DjJaRRHLdy/NH44NGhwd/5w1LZs=";_39="gyGpPUt9varScfJUhzbtURWYjprfJy1TE1Gk+9zETcY=";_40="djXQpLXteQz32obJ9yZhoGmASzWqN4vDAO4FuNDVnIA=";_41="RGFwzv2CCnEzR5prN8fKntryJT/TtlAsd6rveQ2G7Fg=";_19="LBQ5vUaLVhAsJkcQAoFsqN7IZz2q5C6/2irur/GpMpY=";_42="SvKryje40MsawgCZF5bXYR00fALbZlmUFqAKuNCDprE=";_43="QFLma5vCS82uKGg62Bt2k74j1MAsYvtAIxzBGubAfVg=";_44="W0JUV7XOSCCAppbirkDgm3SqReGiLCz+d+b2UDiPxmQ=";_45="Wm6rq0GPnCYSx6DjeW32Xy82EiCquGW7LA17EVf61w0=";_20="E8TrudLLuoU+cjaPthNcn4S3lZ1eoYtbBzEB/k/PXNY=";_21="LUbrkWoV/JeEgGPSbhL8Fz4QHULXhwoo0dxke3jvkdY=";_46="V71j2M47M/sUsJ6GI2lVLFT6XegkgeTxCiBodbLNC7w=";_22="2Z/lHSB27qHIFD0uu4PCUDE4HW4yCFFR7ltoZZpsHPE=";_23="9/cIAFI+rYbp058LVxf5ENqHt5GRYtf1iI09LWQL01c=";_24="DGDkxQy2Z2fNJNWb/SxrPPQfeg1VGUxGITiI1GhGNEE=";_47="a3AQEkzcITFPGclqF5xDBTey1H76id8pLAZHaHB0DPE=";_25="ZirCZm52qI6urSoyldz3d4lMkJgJNwcHqazWPtzlDSI=";_26="m7/wtNVkK4S5L/aDcujqZ6rsprdaQZ/gNtLRenWneWc=";};rust-analyzer-preview={v="0.0.0 (0d03fe6ef 2020-09-13)";};rust-docs={v="1.48.0 (7eac88abb 2020-11-16)";_7="w5bsIyqdhpnewEBoU3J4/huL4FQFjAPwdPwJpTd/llM=";_8="qgNnJOkebXr3A3st+qbx624LKoHEOkVwR+FlX4+/koY=";_9="nKQa3qlcBBk9FH7NSvdWqBO+OkQf9znG+2RWip0aChU=";_19="i1BrrNmhI2ERdza+X7/vn7P1cFCamTgneEWdCmhc1o4=";_20="T77rM8vNfq2uLzH6Acivt8dFID0fsck1zu3YRDayXGQ=";_21="+IGNk+VYWifoiON0A0u9J6XoEm0yNuCMebdQdJ0NXHM=";_24="xlfEbUuwNB2dZ5ZUb1Yk7kd3UNsiFkUFoycYoliaJbI=";_25="89aowcJ0Uqp5guc6SrO9Clu22f3L6f0vb+2DKNac4qA=";};rust-mingw={v="1.48.0 (7eac88abb 2020-11-16)";_7="7ST/Ab40bESLrohdf42UzAPsS5J49Y2bv33D8KZY+Qo=";_20="xxK/U8IMRrKgPk2REFwLqyKiiZFzWbOrJIZn5BWj9lo=";};rust-src={v="1.48.0 (7eac88abb 2020-11-16)";_="Gr1IuQwS6Z5VGW6YVBnaSvu+d+7INb3mjRw1OPFJdYk=";};rust-std={v="1.48.0 (7eac88abb 2020-11-16)";_27="EfUlnKG4h5/cEAM2DOw1fgTtHtKHqddBsMeKAN7Uqlc=";_28="PGUTvSmcRk54+ADEYlDP4J+i62khxZkfMUs6ThSEAqU=";_29="sCifWwLfgpvsivVxck2o8HXSq32Vf3AHAkW5IfWYfqo=";_1="kmPX/6yVn2ieU8+UmLPt/pGSbsW9dA1GcmZserQa0y0=";_2="OlDutkpjoJ95vuSeAfckENRVua4cfwfr223A1A6aoLw=";_3="9VENXXwBEsODc4AFHsJObkg2va1mhIry11RS6DsuhWc=";_48="vNIycYAiaIw30KvUkbskKPeF4xyYj8e0+/JKlk3nlPc=";_49="we7CjfEzjTbQrNzqBujUKW5OBNEfS+AFZAaTRgWAM5Q=";_30="gpDQATx5DerD0a0oLEiXFTJLgjgEtZZU1pb0ghnLtlM=";_4="9RJpa1QUKr2j1osrohOuEV1eiYlSpQofo9H+a073HTw=";_5="W8bF38ycNFw/evUZ34rHfCsJOOoyqnlJ9Ym+wsfNOiI=";_50="I6D4dMYoYzNfHy8/a8QODZF+znSiPxoSYz+olDiIKqQ=";_51="M0UIpRZSpdaUoqcGHSKgiyls0/Ga8JeCV6LgjJdq7Fo=";_52="mRaTGID1PPjpL7U9AOtL4EzrkXDiavDNMqCjnRiCF+4=";_53="lTuTLLQ78DIHAhPrVAQeP3sCQ/uP9lEF9pLrgWNkwnY=";_54="/3NSO0xg4j0CsOuGCBiM2vaxIcswkyBAhYWqQm0pSoY=";_55="+12mJ4kgwwLvqibZNFF5ISnWviV5BcM2AtAFy8vKSrQ=";_31="/6KSzVYUS/cXYWGFxsVm1KFivpJc3JmjSwdny+UqmBU=";_32="kuqle2foo7IE7KXPegx0Svh5NX8j+Xt5LOeyWCq1qxw=";_6="2nHsgpc+tv32feJbWjnZy0uUPsLEPeVw9HhaOnkDZDA=";_33="cw56AUp8IZoYGMAWLQhnkmjh9Q3VYyU4WzRY3MDg4i8=";_56="ptBH+w+8nMBcRwgBie4NzORoOHznkA9uGDr4wWRm+xw=";_57="mQHsl2AYT/SZxlAkkm8kuWCez9Hv79sBffg8Jgwvq3A=";_58="YYh9zotLv8kxLAWDgAmLcPTQ74jW9hCVleny+8sbKHM=";_59="JAuL9ZXPF8M+UF/3JlC9pg8zSdLs3Ksr45uG5hQRXJE=";_60="m5kgSaq9OuGy9X5vj7oaVEOD70wg5RjhAoQJYg7qT/U=";_34="Ui89rktgreW/lPNbp01lX0Nmkj9ncARqp6yJ80axkK0=";_61="1wB1F1bZtueIHdOl9nvsG5mLPieKET9N4hJfQoHer1w=";_62="KQeNLHbfSfyXVPPb9LbhMagknkzhYBPeu7d8WKys/II=";_35="HwvcX0G/tQBhWMdJ//XwVyBhfKrvq0PM0IlSAW8Xuwc=";_7="RV3C9rO/aZ3pQ18sa3dM+wDp96NfCXS3KYP4Bn1/ctU=";_8="EOtxllbT/2SJAyMj4TIV44pNuYs0YPdAZDyFAO4grGY=";_36="wuGzR8Hhocd7Xw9Hw9PTCDnZ437z++jS2h5XlCPyxYA=";_9="1OpcpvnI+QkrUMh58dmiYgSG8IAg+kysIndDoZ9ujN8=";_63="hzOZnCfdCUOW/NffWWFRK9wPbFrSqYHZfX9BTji+prM=";_10="XE1Jy9FqyJ45w8v64SeWEomvNBlDXyuQ4XMql9kyazU=";_64="hnyxtcEEgQyBrilmS39YHGMmz3q9+eVLnIUiBCOa8Vw=";_11="P9cZSruPUcPK8JwiLBJwDN3vc0SdOJU8axrbBKidzDE=";_65="iTDDqO+slmZfhSrmW6JULGesTmjdn+esmwsYhMzD13I=";_12="kgD5UkFkiLxohXmJvBAjnlm0SmxVFTywY/oD8o9QFvg=";_66="o+C7DIzcdZDxCcmRRHGVTAUf5qIL3mDhBVZ95UvVST4=";_13="eSAI9snqaNs55ZMS/Dcr9kmYDPZ2wBpx2n2zmd5Jlmw=";_67="hIwKh5RSWvFsMOXhPBrujpmeAPBjMvXMMK/kllt/1BE=";_37="2pISNrx6qaQ+m9ttC0AxmSRd+vIsEIf68mW3j3YVkOM=";_14="WNDaNpv9caF9J4B+98BSVWp3HPIJvuBo1EUE9VS/Kow=";_15="EDRmNUh7FKpLgrrq4C7lpL/+kwCQxsVRCDJi6YEXVfA=";_16="5CtkxXENOYLyLtdE6iHvLwGW35CMamc7bfVQkEWDscM=";_68="3lNqhW3SDc6N4Z7WcFXzbP6oLRR0gQ/MzqsFC2tm5C4=";_69="1DKPQvGrHnvnvWRlcgmgmQcgKEC8kABhBY0JPAaeEhY=";_70="T/DkvVzItMUmfRgLcfulm2mwb5GwLIzSs9Lqd1P7zek=";_17="kDpmSoTpboKP7+Dv3pKYYSfEgCL86Z4BgZ1V2+/6ZuA=";_71="tnpRZVOqC4NvVgPzSwrmWpykeagdN3c3zqF8//w1lUU=";_72="b1XtnFvv6347FVQ2vULnrVeS58KgJn5fFqR8sb7VZyA=";_18="5bZr0GCJXnpVBxekAi4h//vywJ3Ho/eBaKblY2Lpihs=";_73="NG9foBqI5ySDrmfCgVjSdJmS6739DbJrpdqjCwjnyB4=";_38="DX/fQ3LedOGmLovNixaNI/IG9ZBuyaMMG99GgSlLw9M=";_74="I2nHdmJQm018J1vkE+TqFbn+RDMmJ6TO/YBZjBKXisk=";_75="Le1G5QmyFyzy5LUmVh+c8Kr8GE8nw98NJ6Vsf3VKDUI=";_76="aMIf/hMEhhp11gCINs1uTNJVRpXOaBbkvukfLWueyBM=";_77="XYebWaB8QnDLJGprfjHhQgREl2uitPSivSO2JGCRkoU=";_39="Bs/OVm2TjGolisNcoHPWced6Zrjih6kUKtA2g/6xO00=";_78="hJQZX/ibw//FKnFwme/aQO7d3qlR5jXZcQWWvI9Asz4=";_79="NNdurhYgvSBkY8rTFdBoPgwgKDIesItuooVlRbmdTNU=";_80="Mxh0fJIYLDyJSiI9R12lXl9/jrfXSVe+mI9qq/m+bQc=";_81="wJSP2YVSK9PsVFMnCfOEfArjFgpQ0a1b/RlI62Hic5o=";_82="SsJZ1WojzN+nSa95ZWJEg6SJVOKuf8Ds607vJ1d0TEk=";_40="fQaFhTDmo6QpIDQIOnEHW7LzVOp6ZulGtNg0RmRU7LE=";_41="KPKzrJ8evu0MMDagabRDvi+b0hRjMe6k9vf7W2PbA0s=";_19="DYr2XWlm5MU7cCVxrZAwdKjBBJDMVJkFhoWCnwdZvI4=";_42="Ozax1EdCdub7B+A2GqDw7YgO22qYdtUHJH8mMtsp1G0=";_43="HKbY+XGSBUJfVewUwq7/rxSAHKuxGK0rECradQKLEa0=";_44="6DGLIIzZyJLGNyaiFceZIIXA92CmTpK9cDE/Xxy5OHc=";_45="nrA/oYkzg6/bns7cRgFrr6urR3aUVoiV6OA4cfEaGTA=";_20="Hwu7MamhgeXLHtEvHTDGX5gLj9ZMRZzjpCn29eqmhtc=";_21="z+fr/PVbvlPQQs8oNhher4QnSveXkkf/+D8ts6UFzzs=";_83="mvOw/d6muyhDaDoHmvEIWrPzWXtmQj5J0tCKdqKiU2s=";_46="9rqA224RJ7x18ouqqZMcUXmaPFhiR3c1Zan+XNVS5jM=";_22="02v6uoUeZynlA+iYYtZhUcJqb32TEQb2fFg8YiHy3OA=";_23="bUk/oW2SWEHe/0U24KFkrEPjIq+gRybo7pCGIctq6Ws=";_24="HACmoNq79ikHKLCfkwfZ+mzJhUh/cnB1xorNSmAO8/g=";_47="tY4ozlWR3dNo4MSRcLNgGJzxkXwiI9tNrvyztBqeiaw=";_25="T0hdiAD5CJhwVoa4c3ZaTA/pCdESfVsJGgGXm8MvAcA=";_26="bJunclM0SIw07qdycsz4592Abt3C1DjLWj7HJbd1v0A=";_84="zRt4lBkGgHL+qNETOQD3GMZlcC3LiGs216ijlrn+bHE=";};rustc={v="1.48.0 (7eac88abb 2020-11-16)";_2="rSykcrSr8iiv0o4WhAUkpPCKXvrqrh0Eb/GFXADzmU0=";_3="cvuvhIjACXJncj8+8vQTG/IYA+XEmn6ulXKAVWA6dJk=";_4="MK8Dyf4t/4u3uL8UhycZG4KlY3vkQwhab7BiP8pjAoc=";_5="c2m3JOLUxSeGl72AoyBTm3RFguxMvFph7HusvDUbMY4=";_6="i+UsJN7Al62SR1TiTHHnu3XIGpFDVNVJZRX+1N+7ycA=";_7="JRLDjewwiUs8oHsyLGR9uxUuJJZ1q9VagWnHAaBT7fc=";_8="CgP82Vmi814Dz7xsz4icsDUzpdhj0XHXTkNqk7jWE8M=";_9="wkFAU1C/b4giTbcEABLOJTUbMy1t7/7AeptalYqxmig=";_10="T6gzjOixX0sKclP07RKqr/S0I8Xdd65Yz6zvxPr7+VA=";_11="MItMo5NzoaUrLoTuiv9OWyWQm1c2hsoFVnaFKMlOeR8=";_12="K3Nib2/ELJ3Le33PEW/di6yYgif6cAbM7Qa4RO44kxk=";_13="VF2iRDiKZfXVFuw894DZvcQliCcsx/DTHT+IGqUxTkQ=";_14="/9AMtseXEKDkMT47vAdDR1l/gb2EycGS0zbqjxelZsM=";_15="xgQkRsLdaFQkD4VC5Vn+J8grxRL99+Dp7UxNi2IFP8Y=";_16="vwbCDgnGY5HBneQxneZGIcgnh+XkSkDsJftWWkxsryg=";_17="0RP7hgEeXcGmlvdSC/+bf4tytwvLLyFfcaV8Vky5F4E=";_18="gCEEGubIGITQhe630pzStTnGkbD0+Owv9Ctjj/74MpM=";_19="r8JCsZc9LYN2D8GvUR23D7lG0DR+KiAF1Jg6vTqfzZY=";_20="Goay5/SGENUuSywNXERmR/hSH/ToRcMkJFw3PQ/7FuU=";_21="fgVBlsWQa/9ByuGntIVo1chjpsWkRmONUquHHy5IcRU=";_22="REmQ6l1ilOEKOrD+mTVpw78gae3QSRuMsfLmDNIYaKg=";_23="Q4F3AXM4f54O/MAvG/i1sOnYX16VtGsD/028tiAiDgo=";_24="/E0pKlLLtrhPufBl0NdZYGSpuVc4HWOdWnUNbivwJIM=";_25="UMKQTbd5RACYdIfqNkOScUgw8ofz5Zap+Oqd90jfqKM=";_26="dHdRoFa++fju3vOrCvyuZ9Au4rfXAyKnyeo4zuITLK4=";};rustc-dev={v="1.48.0 (7eac88abb 2020-11-16)";_2="8NUlYw6VcjeHIut0HQM3VACxr1474kxGUcu1jUsPboM=";_3="xrWOba7wb8zl2I5JQ+55RGkc7K+nGrz3muRPWAN0sck=";_4="9Ire04bHgULR+Qjt0/bmdoq4rzw3avzQN1IEb5toNns=";_5="gwO6BzG90mIDIzO9OTOpua/COpeeI7+CYtLvd9AgWeQ=";_6="bV1alcwp3PJ1X116pZyCyH6KSvdP2PiOjRVDzVgzRXE=";_7="XjZ4VZNo2dsC5wtbkJuBMjuAJnt1XL2UJI+QXYJmclI=";_8="o1IXJsPP/FT3mPwH6pLxwUAOsw2wJj4r9mLXgNhcqSo=";_9="bKj6Z5YfCW4Ir4XeQJrN8AavClfTqloOn+Uc6ULo4yc=";_10="YDY11gDMslSVw+Dhb/8M2ykX+WPdyJOJA81/4O7jCPc=";_11="y49q0PbmLzzlXzMjFsgHTVMwg4WMTI22ciLU5KnRrig=";_12="6CCsL3HfF9zOQHVeRiU0DjGFQaUiYYsjiNsCJLgV5Zg=";_13="JLHqBC94b8y1joTlRmH17znZ9UK4A6WcFTfRFIC6Vmo=";_14="NgeYD+D0lN6ffLHzdf4uC+s3+WpZwxl+XeirUlmiQGU=";_15="QmnLMxr8vOa8Se/ozSkN25A+9TRs0g4HO723Gl7iACs=";_16="Vg/oR6T4n2Bne0/iIT2sGyyIYvHbQf7quAbUg85ecAQ=";_17="D5e2syzOqE0m4eBfIZBqQzrAm9D+6M2OjhAU4s6nrWc=";_18="4Tmd40JQAoJ6my98Qixojll1MWFxV2v8TdqHR8I2kSo=";_19="Y88Nb0R32PEBrn1tEiSRdLZ1nod+c2vkFkcyUBo67Cg=";_20="fbqV5RVcmZmSFbRzr0tMeegpJcNzB/BP+M047Ot7DIk=";_21="qMKgpFPZJl0yd5xjLpCiwPu6WlxyCubkDAJmrz4YWe4=";_22="0u9YFizyPYh0f6RRap1eWce9a6GsleG34yeueCvqf04=";_23="t2BmAQ1bytA+q5EJECOdy80AjIGpETu1qjXOWIVIbAs=";_24="+PMSp/Zu+vNCppx5eKYfTr7SWh0QfgTpe96Xl1vI4G4=";_25="MZxEdtb2UUOU5WSFum6mK7K8mq7qQiHNtjX01Nx8pek=";_26="ofN3jnVEagIaCIznPd4LfXFVaQsW8DbaUfbWJdQThh4=";};rustc-docs={v="1.48.0 (7eac88abb 2020-11-16)";_24="c1VFTenkS/bxknH82mW9KzEhPqx7hg1n9Q6ObSHM2+Y=";};rustfmt-preview={v="1.4.24 (eb894d537 2020-11-05)";_2="JPXjIhPNgbu4VPg2xNpE4xZStPbf86m1RV1UM7/6z58=";_3="dXnbZf1uapoiczR6HT8uOtV3WSxWVVInAmVXHObT81U=";_4="hdWAHG9beSqmk8/7iXqKwI652GoNXFSRIW3G/eaA29U=";_5="ryK7k8NqntKsZF0WivucyH3c6yykKSZAVOElZdk6z3o=";_6="3i/WTDsE/YoK5sUvvwH88J/vllQEZmK8Pa49jKpTjsg=";_7="sf5gIW+WZtJogBaUHeHTWcGksBi4keOvIRpR7AfBCUU=";_8="u/YFvBrshQoIlOupy98lL+eSojhZdIcbtrUeDSjakD0=";_9="mn2RGLnXFcGSjQYOwCO3CeuCvfW8N8kzKQ4iH9/mgHg=";_10="Fvu3HbFXIzuywHa6ll/57bGq9VT54kSTvIidmhlw4UY=";_11="t37bBDAis8tGI9oLw0ilegO7xliVCZidtBTZla1bi1E=";_12="+ZJJNNVgROe8zjeVe3szUf9+5F1lF+IghwitYOjvW+M=";_13="gULwwHEWbp9QiS2/pUsAIgVdadqZXv+vV8mIXdWEDus=";_14="UEeOFYeI78hH0MpIu98nJJwjr6qviS90cePXouGSl8k=";_15="j+3xbNapJjby7nSCcUpIYO8rRHK40WQmKp8vVccjjyE=";_16="bRVPzAPsk9Dv4dGdaTsb+zRn+x5Z0hD3JGKqViCX0Zs=";_17="vVCt20ambj7Xw+UXS7638yUFNRVIF2QhTRk/y+DCMGw=";_18="kMhCskEF665BG6qVkgD2fCfovQzLLDFWpPqZljz9QdE=";_19="vGfwRQM2QAb4WFW6cjGuZXzJN8wKuShpE/WkWux9qUQ=";_20="uhaEMdgu6NUKSCCYqPSVGlJ21s6kbt5Jc+m9yfjawdc=";_21="uwW5Ut1NwPLJIvG44QGFqwYwpjVhbq2+hgPL9sjKo6k=";_22="H7ZIZKfQ0hjupOQeQHL0nH51VK0zV1HHGXg49ni0NMk=";_23="wsGCnczcrBeoMr+afXVyP8rId82UwBFajXoYqa1l8/0=";_24="eZJcimtlH7v6FZui8oh1xrYcttow0UUOes8EHLqDvKM=";_25="SC4bhdH6soeuaqy6pRCOMQgn7nAHw5F870AeBPilDtU=";_26="+lQ89+xxQ4WhoCbUTbAQdpq2D8pWpNs5lgtadnfaTJ4=";};} diff --git a/manifests/stable/1.49.0.nix b/manifests/stable/1.49.0.nix new file mode 100644 index 00000000000..3a48e22b3e6 --- /dev/null +++ b/manifests/stable/1.49.0.nix @@ -0,0 +1 @@ +{date="2020-12-31";cargo={v="0.50.0 (d00d64df9 2020-12-05)";_0="1rzv6j8k+YQ6sZwIl0Hzc5NijvFXzdULmEzk4y3wArk=";_1="Xz17ClRGfeZQuUQK66VbOTvjjx8FlX1Jp+/VZ7Hvqss=";_2="eCtjXbum64jgU/W8QP9UpNz3qOBBn7T2hMt1j51Tpt0=";_3="JMmKqXMChqZSlve5Meo7/51bgVg8suKGIm0I8FiWoIk=";_4="/gV/R2uUpoajSRUQjA8dGBzCwhnyPI4jY8X2PAzb/SI=";_5="TjDh24WVaKCQcGbi41NLojntpZEGtylTyw5wrjUMUMo=";_6="kzhoekb6fgDvNUs17OeozTGXbNhGsTitTdAOrN9MW8M=";_7="x2R0Fbp28AZ/5EslJcslIBNy8EfJdnmd2dezYLRLtVs=";_8="+YuKtKscFGUuZZheO9T7FNpiy+PA5DyU35qiWTi4Tg4=";_9="dmKwN3eDGlQhF+pCystFSwPcOdMES4Rx3qEtM+dlJEk=";_10="4LidFjpwEXyuMYJVTBmxQ3X9UDON1sMPTVQcFpoKsAQ=";_11="DTVgSUlN5F0O7peypQMA0MUJLKD+5ocQhQw11vIV9pk=";_12="MR9nXvYR8pE9SngW+J5fsEMAXaibr9rhkpHcs8ZIst8=";_13="Es1zfmWGvo5lnjebxf2bCdUlb3yo/lJPCdJ2H8PSteE=";_14="yCwq5OeyVXLrF8pvK/CzYNXk8waV2e58dZnAd5TOHTs=";_15="BdQB/lixxHk3AP9Njq+Ai1uhG8sJROAlgXf2sn7Sb2A=";_16="lrRWOkaXrUwDjgIBRvrB94tZFd5acPoIbv4yLSwv0G4=";_17="cyhdCB04G4Wt8HdAB5FGBdEkwcXXdC1mRu4gdDuxr1A=";_18="Rr18aFOy6LCP8bhrVyT2PyHni192S6MvCd58elE6O68=";_19="2Z1jbVdSR8rvLSbpa6wIL3Kmo5xAjD48TK09R95CAgs=";_20="AWduRe6qCrE4J5Rx/q2rz2IcYixqZjR+DP2PVxDWyto=";_21="k3Zy+rczqNmL/YolqDEB/UQz8CY5XAUTJq4AbQBTurk=";_22="V7+SFm8ojnMwx0GShmh1Uvd0buplz+bggV29+weKr0U=";_23="6wZ+/jN6cTa/6y+ndwIuCAyjsOna0tOKjOXiVXkF++s=";_24="Ax6z5NiMbFPdbxneUksVN35/y9J0QwJljPfSr7umt4E=";_25="CE3CJZN5tQKr1Ty61gRKw4wLfmH3rV6xPMmIrQAPsJM=";_26="MrCL54DMYG6a+jx9bmRkI/GPQQyVbmfoVUDoOjowkm4=";};clippy-preview={v="0.0.212";_0="Z3hioBcz9xvNMq0N0mHWif9PCikt2Et9+yPvt7T9HiY=";_1="h5LjwsKGqR9pn53CT98Sbra+7bqSEcP8XIvAWPraVZo=";_2="aXz+z2499vJVu6mL0x2Qmz4O98Xai+TcA8rdVDRD46g=";_3="x66SrVkeQ0CunkpE3/3qzLArDjpDMdbUfQ2utqrvrwg=";_4="dzwT8mv/YJk3jNwKKieLqkl0LyI8fJq7Co2dZ2VLvws=";_5="pk8fCyCglS/vUteRav0/laE02D//fM8xAx+4ngk7NlA=";_6="6jKFR7SuOHYXP8k/G4JXEX6i6WTbMAc62p47ZqTlBAk=";_7="RGEDn8yBcBFD/rrHx/IGfIdTa7eaOoF+NDWdtANEOOk=";_8="0BcKOAJBalB5omz4NEx2QnmKkP8tUCiLMehKuNGeAWE=";_9="4cCxxKzRrUkz5IHNFLuttYmAFBUVc33xNTi2fIw5kso=";_10="hwl17Ptnu6UauDQs46mUqhD6/rLI6z1eMHMxbFWJaxE=";_11="jQ9ngtzV3iX6rl0zS25COLEfyCHrlxEQNwXToce67ss=";_12="RZmYRxg9q/w1B8s5y4Ib7caT++qEVVgmigLKPasjkHs=";_13="wTAdcq9XoxM8p2t8Z5FxWlVDEBWzDWsYMNt1qPP91hA=";_14="59SOtdDZqxz0E9qXcWhmdpTyEYcJLdRyPnbY43UOcyM=";_15="tCTSWtoqj/uhYzBo5Ja9hNQI3UB3onE1gme6aXK/ZIg=";_16="2/QjTlX7nHViEQdAj4rKuQYtwaP3NZ9stizhBP8AKro=";_17="XoUZt6n0t2EHpgJilfarcQZamANTwLWvyaq0pm04dOQ=";_18="m6F+Hku7RvM9gNR/Nbn4Ez0VXZCwTBnH7HGmQrxEn3o=";_19="n7upVA7++t2A7xL/OiVSODR2JHaqz93GgEshVVh9OFg=";_20="vCMKVwxMpPhQO8XEUnAvPVinN4f+y7o25H1ZADlNupk=";_21="fgxqyIX97Pg4ekhM7pKAMs4Jzf5iZAhhf3CYnzI4VO8=";_22="rRspG/TabK6yr7C1ssDdr6e6l7Lk4rIlxFiilqlSl8s=";_23="aK1hcFC2KvsfqgJtE8ZJtLFuZtKmQrSyIOsRj3YczeM=";_24="kgOqejcvgliWPhP2Ya6S8iambuZyJVG7wR4rh+hnBwc=";_25="eTQWxkKJPkFz353tlXf8+nNoj0HHg0B/fWtnMnAJ6Gc=";_26="VZ8qApKs5MOwjVYoxPIE7OuSnAT0clMT2NxRypuC3VQ=";};llvm-tools-preview={v="1.49.0 (e1884a8e3 2020-12-29)";_0="ryDEEWVKuHJxovqdhMYqPEw0laYf2JAtI/q8CWZtke8=";_1="uIxUGG9xO+A8ER/hxusVZH++LwYM8CIw7azqjZYjC+0=";_2="zAGk0vbPVChPAQZpWUAg8z+XnKcF31mUNBdO7YTCMYU=";_3="Wo69cxHbIWNNPTcpK0YNZ8E/CCM0ccSfkOdIV8G1XJo=";_4="8RYp3YUDHPDHtT4WK24fafXO2nlXg4X5SlOYzu8PChw=";_5="8tsHYbVkRi1C6eKb8/X6RV1P895r4YPnIu9Ud4E3VNk=";_6="qgFt2ubgBjQcXjhyhFgqnIYjGKPDqdssjs00pUd48MQ=";_7="7aTvxj523HfgylAZ7c4Q64SVTeHDI265ZwWS102xD88=";_8="O73FikyouW6tfgg7jYuo3OgZ4D13oKdCq6vqs0bB4tg=";_9="c6hqol63MrcWzFcMpotFdjy/cksKUcp8vrFzTUd7LiI=";_10="KCtyEovG1vr9EwFX9o6ZZMFpaoEQjXc18lRn3u6v9gs=";_11="xkHiwTjV4csPIx1orsAkebIdbmew7dGBNIRtkF6Qz/Q=";_12="bOK3JkRyTqAcYK5+jbzCr0eOl99/Z+tm+c3pdppOCaU=";_13="RWn/ENgt1FCMkh2er1HX836EpuZsibyMChhrZQoUMzQ=";_14="rPREN77U8beY1kq6hplfACKPIFD4KUIgQ6Z3J1BojhE=";_15="CbtW6HD1yEx0n/2eRq9YwfMptPV0v+Eo4S1cVCUVf4o=";_16="gPigrFKyC6JUT4X8nTFSlnJY18SfCmUyl9LOrrtNApI=";_17="6GXMKFpxoQE813IXDBHpMTF2HUutuKM5KqX01UYQcfE=";_18="8V03zUgqpWnuSEph3Z9mpdgxcRlekncGPIF2A9K+Q/o=";_19="Cz3yHUlinRSnI6wxFmlZPt/4D4gbU0+4xtJV64Od2NY=";_20="3TmkO15yE0Kdi4E3D/mZjRBaGeKHWqqHe5BHAigNbeE=";_21="0ety0ZsXjP43aETpyH9m6khbVln6aSrGksh7DHnERRM=";_22="GvOFS691+tZNbMsCyBb2n46Ec+Ho29LlHB8Mo5SxeQ8=";_23="MqiRUxUhQ4Mcbp+BQKM2hcK3sqYJCzA5VcRIAeYUihM=";_24="RBTJIS6r9g87F3uC5fKEnPCCiTE/tLjKgdoyE8K1g30=";_25="XKGVs4Kx/rp++rIHmW3+WL/3cws60qa3DiZw4qMBy6s=";_26="bK4H/nQu9mT7gltfBeghwlFn88ENf9Q9v8HlFJLpwjI=";};miri-preview={v="";};rls-preview={v="1.41.0 (dab1468d6 2020-11-06)";_0="p547Mv670rY/5LY/IWB0qRW8qd2Hg+Gf4UgN+J1eiNg=";_2="v9sEzF6RXoh8RdUZXUVTwoxNASy+kd4J0aRRvbpJnNI=";_3="CeJlq5tzU3SXtNpjT8guLpxQWJdukT4cDta0Q3jQ+l8=";_4="giO95J1++B1RpwJ0m+jsrpDjiEw4x51nyiFSyEUPOQI=";_5="ai7vsYlBhTirg773KHVusjneJnpXiR1q/Gjd0hF68k0=";_6="AwOTQ9on4rZZf+XNKwk8JNi8w9E4UA00X87wWrC7CNI=";_7="+RCNpQ2UK546gq6ATOBQxlGGCuyAuM2iS2ulknbPN3Q=";_8="EuJazQSGrG31+BeoRmoFE2Tao3/qi5pI/pu8nDS8j/g=";_9="s7BW0j2qsYoZlqAteytFpeGCr3OSh9HO7uTIVYL23PA=";_11="xfeEwLZG/tuxKeddIrLdVBDwzhkMdBlbnRO/Y4A5oTc=";_12="ynTf9JEUhWuzIXntWd2btpwA3Y+Tte3O0RjM2PKysnw=";_15="gnFsc2M3Tagfdztd60Gx+/gLpNvKJpSOqIbwLq8fLKM=";_16="3CL76D6xRnZZEiNpniWGhnmJZc4HfTuHIZMADW6ASAQ=";_17="thWbnxfHMhsh/1DRdIwW1XJVv7/fh4b5dLJyD7XXk0c=";_18="GuIOgzWH3XDMZTR09EivkDeZ1VqRSmnJHiLqEPykmWQ=";_19="xmVWfap328tAGYiBfSUbmOX2MSWOkv2DlfXJN0UbjSs=";_20="gOrhb994PxEk3Gymu0xGgJEQgsrGqAFRMnl2+RNDVzU=";_21="ashEses+DQiwFvFciF8x6YhFHsR5hkVHPXx1QPMXLs4=";_22="AXpTJoRGCm6CgH3PEA1Ts+FOYX66epr1CScSVcOGrz4=";_23="ZY4u1P7NDZR4ZO/R3/NRYk71P2nvCo/rtnl8BDqb8is=";_24="StO3QuDEN4MxfMaugu8HnhJ6S1dxyyYtWKxP0VoSd+0=";_25="fP4y1Xw1BpgpR3S6xBx3qgJdjFZyuzjcmV4RIJCfDFk=";_26="Ufjti1793ikllMmnN11Ywg9VapmajVEs+RUe6qIp3n4=";};rust={v="1.49.0 (e1884a8e3 2020-12-29)";_0="uRx+9SFErxj56/56w9H/ski7QRMLsIU+GnrCgtNNJvs=";_1="IiuSZFWXIE0tbcKjdWKttJC0ibhBXBBxZ4xvV9KXlvg=";_2="DYhzRKbQSN25+azCFQVOL+nVcjuy2JBNr3egZ2GEe2k=";_3="RMd+H4ydXHyZN94eIrWph4uFNY74giJLLafe73ncfWY=";_4="ytulGFuSh8U2rLY0gUNckavCjvfa6T5u0+By5c9TiqM=";_5="8memX/54Wdj4I89mSO9q7e2gs7q9G7g4fWwHKLwc5Js=";_6="vEmcXyTwBcaHhC3kWS2rVph38hhbKikFZ33dFn/yfXA=";_7="+D4Ey+W9u+w74GYAd7IPtepAeIs+Z1NzgpnzlC3BEH8=";_8="zqDqS0x+zqfK79e8Zy36NJdhxJJZ8j3TlmJGCXZoi88=";_9="ovvWmfgVn+AQAQ0XtKhNEglYXY5VkkANf3p41vZr894=";_10="90Iv/ywY3zvuIcSKgSvvDW/Wh4w5oNiHTq7yXnWAuV0=";_11="kS8QoIRfgP/zqvh/O9yTf3wKq9PsstAYYnvEZcNTkCM=";_12="O8n1EHtS8xWS70ZZiaipXcn9+pwrFnBeW6vU9tqovRM=";_13="6iP+kCfajFHKlaoL24dunOzYrYZ/tvPNaBpb5Uawbg0=";_14="ndQSS26sEj+7IAMIf/t8eimiikR2wZJ72U08VVKxt9g=";_15="TczXQbSmf9Hosh7EmZ0O7jQ38VZYzCEje4adThuGp/8=";_16="Dnp3GbtOWTLaFOQZbmvsmLHEtO4+JCb0dpLqT8cihfE=";_17="eh7IZlsi34o1nq6D2fnqtzGx1BOXhinD4YJiVnwmxrw=";_18="AArb0NWeOXAoyvB9uEf2K6q8sGXB2OMXZ3dZKCZlXSM=";_19="cJkYClhCkxc4KZpe4zJrOt5HftGsW0bhr1v1FdYCJGA=";_20="zwDkbFeCsQRL49d880Bu++4/E59f1OrXLbZYMZ2Rbic=";_21="giQnIyUPzkbY2bKdZ/8kH+GJIAxcry1udQvqazrmxbw=";_22="jkKmDhemANHFVhHSMTVcCKdYVblxJ8mYkdhvKvfwzkA=";_23="+S4B/l2wGVYAa+8TzG8JUs7E3F456vA2rvGnQeqWeAg=";_24="T3zDKCMeGoU+DSjS/qlgxgVbfS7vnQbn4shUguULI+8=";_25="6Yr5Q2anCybN88VCsKXe1dlHUsjvAq3i7GuUDxARPxI=";_26="swngZjyfm8c33x32EV8ZYlLacKli/o5J6b3x2LId7SE=";};rust-analysis={v="1.49.0 (e1884a8e3 2020-12-29)";_0="vArsrCtbw7nfPEzASVxxvR9IfX7AIDXnL7PTpNBzvsk=";_27="wqDUtZZKuQ0VdIlupk8hTjHQWp8YplHlLmLkvTbmsk4=";_28="INM1PEV6g4adWeOZOcSavb/XYcGr/pZ3BXeqSCYfFMI=";_29="cn0bsDoeaZ7tAKSpWWU0Na76h3FCsE0sS2jzYcSlk+k=";_1="m9AmUt4AZzD3YyJrvTdXTEs/Ax5XH+sDfLY+qoNjOV0=";_2="gaJZN6vqiNhZOuNec5y9EbGMZ17cU/V6il/mPQpxwM8=";_3="rHW00aAj1vc9ghNxsWwLVlt8Nw58y3UWzEtJ+214dOc=";_30="EISJR5YuCRKv8sptHU1tZISF7obLqaLnp4UAtTeEvqw=";_4="MqrMo1iOVinYBu/5as5DWSE8CC+iwhpfr9wCux2DZYM=";_5="iBLSHamTpgLNY60Ks10Rh4iugrgdTd4EW74dHcY5Xoo=";_31="WpaQbQE8xN4b0zYXcPDWNIJzwXAy5IHUFIqXShrXFBw=";_32="/UV9gcilguGwf18oIa4N0CfyZj62ZXk3k4Ht83KmUaw=";_6="9T0altpJaosGGcGaCag8yRa8D+wUh0FSZT0A3db6pzM=";_33="o8qjgxZIKKmhHz6HrNIlVfqAko9pa0YzT9mFoPKjWSM=";_34="Og5wAJi8glM77xh3qQmrU4V5IEgZ7zCSw3cmAagtlK8=";_35="qry3csLOZfhBN6iTHRfpdNqEWiZiprKULqH3rkV2D1s=";_7="osihhs5B8uHRcAbuA1orYPDYw+gzrRVpaw5ECV30gWU=";_8="OjmU4wKWZEaSpUCCTPhUU6DSDit2HWOuo5WYSabiEdM=";_36="nqiVPZr2zLUlXiYgQGGfbvknasSqRird3HK+SFpGASQ=";_9="Acq3vrFB7Q4Yg4DSyd+ZrbEY3E7TeVLR6OasGtN7WPI=";_10="F6Z4HNluYtRF4Ntcl+d+Sgw1x2+QQMzgNCz8Zi5Lh2Y=";_11="LRyNzEyKceC8Jzx2hWVPobyj5KpzmuOHKbgy9f5aQLs=";_12="hzDSPZj1R2M9NKw6XFIiPtuQqGQKmaGDrY9+J6b14y8=";_13="QV9K/Bl63Wo3EruPNrNgJJtfSsBpAaSxUsuRsVLyYA4=";_37="jouxazUA9KK+ab7w1Rz61aMGn2N3vb7rnpovtoL72oM=";_14="URHT8WzIpA7AG2a6ZF4a4LANrDs9K6zYlTgkSfH2fsQ=";_15="7IEOvKEcWrGf/8JbgTevrIAtADpOxm3IDFWBxgiGC8Y=";_16="Yvd45K6TbFj0FmVgnLhBHAlHeTEexiQzNusqaKZvdlg=";_17="il07wYxD/8Xi4SNGFxzjgTzRJWNlfzUh26r82jRQAp8=";_18="S6gj1o11FZpYWU4pBtlHZl5YxgOb3kHoStaldvQynwE=";_38="D51Ncqx0ubwAhcEOXiJVl4IMftdM8W2ynYtXMRoQGTo=";_39="sD+1BobbQkvlbW9UYubii2YhYLYAEtNiwj0NqB1Xfs8=";_40="DhGPhp1cWyZXOKd3RBuxzCReofefml55b/xta3w+WIo=";_41="D/E4MUFqaDJy/QcE38KSiuG2sWU0KIM62EEHwCj8oAw=";_19="Z+p4UtYkq1CH28bRXNIiiYTT51IZRV6IOxFDcz2TtQk=";_42="YO5XQHN18jDX1YP3cUmP8wTgtV9WTV4P8JDupV3nbUk=";_43="7jd4Q39Og3QeJfP3laUx+8h4mJgYbCOYx9jDdo9h8sE=";_44="YEA6MtlWd8G7Awh9Bh6QSPYqv6+iJVjg3trHj6ivhcY=";_45="yVefS3ZQQ8LFCCQt1dST7gcu3rtV15lue5sm7GCfQAE=";_20="CqbF1ZABIEoOJJVF6R2VYBHtD+UUjFqoopFxvoUXvOY=";_21="OH7NwQeA310XrAKx13iMjn1AX9u3DiT30ewdlYVYtLE=";_46="zda1PBGQnxc/QP7AZjk8OhYwARiV4TWPE6fFBIEjA6k=";_22="u/j2A3HGvRObTskexMzPSvdQuZowqi1QfLiGZ6cKmDE=";_23="K8X5HYzuCuWUiDFuupp1mWtMzP8DD+qyIsM1M6wk+4U=";_24="6lCsGAUOmSPnyoShM1FmohTIunUB49NuCSCNNIhA+Tk=";_47="cAWU02YMVmFMmphdEd6+UqHquvpb/stJrCXQpQNfYsk=";_25="7u3yI3GI/m+UIRZEQSlI7J4QtPFRz1Ui6H0PKIvSgkk=";_26="BiKVJSkiHDMdAK2tb6mFejzed49tRu0qZdfWbK/HWH4=";};rust-analyzer-preview={v="0.0.0 (0d03fe6ef 2020-09-13)";};rust-docs={v="1.49.0 (e1884a8e3 2020-12-29)";_2="Kgl8tpYKJxWdNrFh7niKDIN2T4evIAzKWtwfGqPe1Mw=";_7="oF0H90jnfHOx0qYA1CgWeUrS1blp22nnP/mB2z7/BkM=";_8="rALT+PQwDREZgl5cLhI4dJRaEdNpvd2hpPJm2Qv+eoo=";_9="5qibR8adNjw+5a1q8ksXBYc/aU1suVAsN4pUJ7nBJQ4=";_19="FJ/DAOn7lR+Mww+sbLM62r/DgsXEDO+0Qu9RxwrqbOY=";_20="O0j4jYhYjcghYHY0WlznHsDW2wtysnVTWJbaKoI0864=";_21="TJRGRhuf7gu1OJm2J7Q+9kIFJnif7Wv8YBVPmXktmx8=";_24="c3SbTqqeDsAjAWlBYO56yEd5jRzFEt55vXqKHB0tYqg=";_25="Z79C4i6hGHH7fmk1sZwCQfx8gX5GdZ+WLt7QVMR3yOY=";};rust-mingw={v="1.49.0 (e1884a8e3 2020-12-29)";_7="B8xAc+ECTSDW96K+v7TO1thvzb/eznr9BVze59EMvNU=";_20="NCN2NWs7kwORt8h5DlQWXqvahrD2lNlVURr6oMatIx0=";};rust-src={v="1.49.0 (e1884a8e3 2020-12-29)";_="aIs0X7ybIqoZcpeiKPTnVvLAu4+x7epuJyOR7TFK80g=";};rust-std={v="1.49.0 (e1884a8e3 2020-12-29)";_0="UJzV0PqiFsRoZkyn4Mib5wp2mQgPbuTI7HJwMCMx5D8=";_27="Jgp5pQgx+JO1i/ryCIiEZkqMR8RW/jp8clnt7o/W54E=";_28="Q1uvFhthl2448DVUv6uY+4fby58008JJMvxo2awicSc=";_29="GI6niUb4xPjA6eVRztgPXdA6FLODl9wl3Bu+oiUNn2w=";_1="4xyUTeN9t39WtXm793fxIrQzu+lIOreiYG3IMDd8f00=";_2="acmj1W/o/Lt0uYheRR3Th8kxZROg2o9hjdoGZZcBElY=";_3="Pi3b5tBoO5MihGdmOiui+A9Yj+DO4mfXMwi+jusLQ/8=";_48="LSwAAJCllu5rvq7xsDRMFlsO6/MOJfUdLc1EFPPv6cw=";_49="ufyJRtjSchkDKkb9EE4IHn2J4mtLrWvtsdKZLTGyMUc=";_30="mJS/EIZ4QLpO89PBsfoEFl1BggRFWskUEUnqLZSA9/A=";_4="KRr1Q/SRbr8R1qgH3hJmGxQuAxjhmh6XUfqSG8PAmXg=";_5="FF2OC0viJ5HfkLeUDrVjDUorKBix7s3JKzMzBPbDARA=";_50="Hb3ltLt6t/dOqs6bF4K+7RbclaRzXkb8MjufDd1g+JU=";_51="IXS+bMr7OzqsQnoFpLOuICTkL9dWU3oxw7HFsOxGZqw=";_52="nSAkF0dp2j7Q0V6izMcUfAYCqnAvUZyEq/EEJCpGN5I=";_53="YdURfus6VndLWpjWXzSpeC6/yRY38DwMl9c0M79a1JU=";_54="zdgTLXd+xLRyHduOILMt7J5IH5xcuqhS4LLiFlWYUJM=";_55="pXw1mqMGK8pA4nY9DrOcQ0PXiusOwfSlaxcDHY9j3GA=";_31="ryPI4bCBUGb52bc0k3kbE0goP34k0m6xtKrUyPG+0l4=";_32="TYXrpj49uU5lNR97eogou724rv6eO9/a2fHlXi4At9Y=";_6="/PYZ+nGFEt3AJBIk3dVOGmFxAalbdu5AvwXrT5LLigM=";_33="XrUEvEtmk28KyWZ9C6JWmEAD0RSUjvj4H8i8AtYk4Gw=";_56="JZeeZPVjJFeG+j/FpBV9mKhGbzySMuktSXrrsX/n6OU=";_57="skesVjI4SCZUVBhfgVepXi/anzbs3YEHePtR/mqVBb4=";_58="xg4FASWvF/8adspTgTnGb712UgFKpJxslEAAXwqyvS4=";_59="fR0QXcKepijKjLa3CTDb4atUYWX8iJXQdbS6lNLBmHc=";_60="mPkVqzu02pUgNNOh/lFYGX9KIsIDYen/LpG5MrVmISs=";_34="IDEOFihbtJQuzPGFK7wkWUdBoLXRed8bzG3A3mco3NQ=";_61="2T7ZaUe9ESIHEQDsoomtyEATYNwCSHmHEXlleD2/BBE=";_62="UCAltbOn+2nKLWRwN2ZUSnzA16h5unweyeEOPirtjK0=";_35="5zAjl5ZT/JjVNa9+J6ACSco5G3pKR1DX1yMfNYmK/EY=";_7="esFN4GPEnPOIUUDYZMIxalVIoskBKhevulUa+fYxRNk=";_8="0I2/YEI4jojvSl1Oyf+jad7jGI80c4HoIcJHhi9Lpl8=";_36="9Lu2kNX6pNJYzfrZz1HYcaoynwNfU9hm9Gfx0+ADYJU=";_9="RZl/3FI4g1YmN38E+oFSWg/1f85UEuyZ98R/9JJm5dk=";_63="/hAWeTExE67Uk0ymHMl1OsyK9QuLAai0HYe9J6xHxnI=";_10="L5RNeKj83Ct+HRxM7G/kG37Cw9sIegU3rm3e7YYO3mE=";_64="cAtg+bWjJPtm3+NxQLfW1zpZe5a29Vo9U95dsshy24o=";_11="c7/HqPCdoSAOr/kwVXwbSmGRaRNox6hwxiCAnLsC5so=";_65="SPlAf9gUV7RsZxnT9JonXmcztvDpnKF7zC2kZWOZn68=";_12="AZXkPwNUtvsOJNzcYXsL7CxfMLiqdEL7DzgKZ80lHtE=";_66="GJ7V/O+S55n+41uiYyxomIdq3BR9Vjwmh0OnLOyBIpw=";_13="ZzyqJvVYhYIIHAUx1bfcavVz4G5VQUUTkkdcMEm87q8=";_67="gfVWy3pqeWJCb/E1SAixAX4XMwaFECBh63uS/bhGx2o=";_37="jX4kqqR1vMqU83mu6seQq9hJ7uwuc1OC/0rWoeHhcl4=";_14="SpKpRQIeaaof75Syy5oLX8la1rTPFtOO9L9cF4StntI=";_15="YvPSxXc9vwCncIq/M9EjQeJ3QGi9C8biqR6N5Xh11f8=";_16="JTHrTusnz6ZlY4WRYdZ3e/3KQYe0YFiXppK0ecmU3IQ=";_68="geUZ6+mN7Zdnx3Rnw1ivjQC3sS4QZlrZldzkh10KG3c=";_69="TzR7cf3U7UiGm5D9w1DZxum4/1s5L0gWouZBUjFOKpQ=";_70="1KoDIMDkbtNmhg0m4CNj0Y0p/auNR/C3z3AbggHvFK4=";_17="v9QOgBVXpUFVRzSzgxZNvNoJuKkUzMf5CVuZKjeJh40=";_71="2DUF/Mjlq7aFUMm6CuLBH/ckMFyQkf473OHImfH6z0w=";_72="s4O1LGjfr67j5su8YZzew7+hnxBGfIz3iV1zgoGnd14=";_18="uf/SzoO5lLFh43GiQHuNXr1rSgMPd9F1WFLLvqVA0QI=";_73="mKz/OxkxMxZMcAi4HLc9spMEnf/cNcc5S7ROxYQaGl8=";_38="VCMGDzViefHNuTThyUHtUOWmYCG0SGAqLAVt9oaH6EY=";_74="5d5glsaM3o3YXzvWSnHFh7o1i13n0AxtLIECvTPRJi4=";_75="9pm7cRPNFDc5WSv2c+OIceIl7u2txzi0/KSZv7l2cH8=";_76="ctU5Ufx1lZRYhLojJP7jm37FkEf/6+9A2TKL2t9Zv/U=";_77="oLYMtNtpdGyH25SZlwAZ8ANfCSHFEMq8EOGUj6I/qec=";_39="HxaNYokvNzjuZb2slomLyXf6kIJ8Wr8T5NkkTJm7x/E=";_78="as38nzvkLEmTEpSb7qsyQTHOO1S4RCLOmxZh1eaqWgk=";_79="6mHWvV9GGcfFBDrUhE3g55dxtjTBPseFJzPcCqeOmuE=";_80="nzGbZTh68lbGFYsna+4Ry5xAvl/LV+WTKsQPOFWDPsU=";_81="zbMGxUikzhD0/NPYQMjjeDUizyLauQN1aqoVjlJo7Q8=";_82="WfpHeUO/IcNo7mSj/hinzVn+HVfRfPMVVDFR3tP0yY8=";_40="dWlRYYQsBIRhB9TiuogMRe5KQfz+leli/qmJfrTzSqA=";_41="wB+e4mL1UPUf/hn5JTRT2TvvDx8C4ro5H62gLFTf0Jw=";_19="0GTsVvjU+IAJiSLbs0ZCzL+ny6DTM72SQhXSAuDwzZU=";_42="oEQF7K469XJ2e1uHkk/bE7npRwEgK3hONdI/aiC3K+c=";_43="MRowH8/9+qjUW2uhnFtEZkLlDJlOcE6ruEFLEzy5Pi4=";_44="yvTVizHx2rOPXgN74yKyDyE5Ic1FVrQYopFEF2bo8m8=";_45="ZkeKIMvcMkpHghTyjSfEH3fYhXk8M6KJ04p48Pn1iuA=";_20="WApTb96C7ZmF2i9E/2jKmW3u6qrHsplqtJBAqPpqgho=";_21="JAzOM/hwTRYcoACX8vrst8wP/ADO9/lPrVkuOFO8qbQ=";_83="GYL34WDArj8LgZJaubWHX0quO47JAEiA717LQZFoxSI=";_46="oGyUckEJNEMTj8ofIfej9vsLiHuDLT9bChHi4FQ7Sps=";_22="a6NPWe8u4OLwFg4Tck3GxmsKSSbE20ZNfxghAncakLU=";_23="5ELiXOyQwH0V/9y0PJnZCmoaR9g1iUdfZ69/y0oscMo=";_24="Y4w5g60g+bnh9J2hxkrGge7Fz3Bf7hCJ8FLeTAmwXCs=";_47="BXQmbHsOMbChsPGvvnLJvlJUYJ8m29j+J8Qkk0zxn9E=";_25="G27BBMz7C3gt5Lc9Rg2yKmt8pJVnPVSLHoVUzduX+s8=";_26="0RqgvI5BzBJppYQUoRLoaUpr4uQ8H9fiZZ0wqeMI8Cc=";_84="Vh5KkKl9rZdJfDnwsUs9DkAVDr911a0pe8JTD/Qv7eI=";};rustc={v="1.49.0 (e1884a8e3 2020-12-29)";_0="xQLKm79K4zVukeHhpb8P+0/9U6YRKqDF2/LThjgQLMs=";_1="l0i9vsq7iG/j9VNr6YIp+j7ZbU3qOf0i4AIPaKHuZn0=";_2="mFDLJKjMhrmtbg6pXvLkc0SORTRYF7+6Uao9BUQRq2g=";_3="2IXYYKE4VZeQdNGIPat9TOHcFRf2rpgVjmyy4I01PKg=";_4="CVo9Tu2fZ999SofXTmoy/5YrIesP7TewhNpH5gJ/hCA=";_5="OIVqF48uN9fnVtauYYtApoOhnXGDxf5iPLNyLgByBxI=";_6="Oq6wr8kJvU53qcBFVtyIgivshD34jXNyWqPEHPiFj0M=";_7="y/OnnNTVw7rnUScKEVIek1GE9sxkNM2HyhK48Q+X3ZU=";_8="VUgiF18chcJwx9gcBo+cbv4ylYw9yi2OnFEn8Y6BI3c=";_9="1MboKFEbVLNS3Zfo+kZixu5g8EUwlWiEUd6C/3AABes=";_10="z0dfwcmB9I3jS4WtHs/diWDnbj8T7DMigZ2SfL+hvdQ=";_11="tIpsgfzCmEjbeLaeXQET9OespUYhmaJM+8ncUZxe4uw=";_12="rh2HPdcF1ofj34QyAkZjcv+0JkGqWkNbQJ9+Enrol7Y=";_13="mHOTYrilVD1jsQWfmFZ0iO3NjPvW+QCcftZ/HlY+F3g=";_14="2wQBoazts7tjso9HLp2gODcds+0vwkuxwanUp/eOeDo=";_15="K79sUrhl1rSe/Q/8vWbaz2cvgdIAiXfYgfrGFf6UpnA=";_16="L7YmA19C38vmhp9ZdqlhvuAt/QLJwKlt6JNVbOuSDFQ=";_17="w6HkkcWSJqiVYn233GTdSmYyL/IbPs6y9gq3hAx+xgA=";_18="JgGQcaLTFS7M0GxNeBqpQlYaiOTc27PAbMmJSTHYkWU=";_19="1EsNn1OT5Xdzlq1jGT9k8UnK3jBmd/9tqUzunpbubwg=";_20="Uje9UfY71erZwycvsZdx07KBIQcZ+2Keo0hdXwvtDh0=";_21="L0EHmVp+xp3C/v+lwYqUq+KIS5UP0UYIT1ms4rfYFog=";_22="s9W+hSfK1T2egIn8as5JPHWlVIzS9EHNi4CoKQV8VLI=";_23="8kJvjZlVPBS+P/kCyXyZJeclOX3gTs739svQ+sEjsgE=";_24="+qbHxHcoT04O+H4ZzVaWhEsbB5+/FM7+Np6rqEcN2GE=";_25="64EbaAsM3Mc7uWQ+gR8qhCNbm1gc7jXG0B70OUbmh80=";_26="o2vWqY5frps3+lMAGM+EKdM+1AdjkoKbKSXFTSmsm7A=";};rustc-dev={v="1.49.0 (e1884a8e3 2020-12-29)";_0="yj+mA2qlEGwJVQKMG11Jgb4Q/OLzBZBBqHD0FpSOcKM=";_1="9i9414e+8sm+Ts3Vx1SYMn4GotOstqvEV2LwIjedb8I=";_2="3S2gMWlKi8vgtpq/M+Afx4SwmgJGMtoOc2poIUK/GZk=";_3="P/G5ICBAjj8ddMd/ylXR1j9IFY0eJliNDxkw2j+zXGE=";_4="UBAZeZE5KZIMIRKawImciIkmJuDhF/2Flr/VfZtvpCg=";_5="UXXzfG/pCI+gmp+a4daZSY6jN3KEioCWF61hK13MI5I=";_6="XikzwS0wRFS5UDFWbFF7Uxcx/NN80nFRuzFpeOVJ0kI=";_7="575rRVhgI3c5Qf5d3Hg6uaVvTpd8rWorLlowGenhq6w=";_8="fFG+i9KYu8kwZwjTS2iycz2K5BoSHlvmUdNaCLg8ZgU=";_9="azUZQdzGIgZ3oWKb/QbF58t3RauYkB/5Wt+DtNU3bnk=";_10="dZU53fZoJKtZj2tfG6dVetrCX9+y+dAxTgzihhgHR+g=";_11="P17bPA5eKa6w06Oh8762n3lXUs/6W5IItj64wwqLMaQ=";_12="0lRqcxXvdk45WhWt5G5c123CAnIKl0GqS8Ec2VvgK7s=";_13="KFbPpBKorNAPd1fPMkhYvaggUr/xQgvzxJmPJJyKAOI=";_14="QeNHlyvXeWSAN6jRTxIKJp1SP3hcdShPcaum7HyZL18=";_15="MP4y9qfUqeZuGtylJctxcf3l3DYpPe4x5ZQ43gtnfpk=";_16="8fly1zkFV2xa/H/PnvNaXfJ+RTS3TZRh/zHRkcqEvNE=";_17="Ct8jnQG+oMTOPP4o9S5Ae6DLJXjf0B7P6Ljk8lw34P4=";_18="74lv3aR9uZcdBW3kwBECvILy9vDOl2z/lqD5b8f5AAg=";_19="eBtLzwxAnKX8GiLB5z3TTnfJJbe7gIVAbdDHD4dwUUg=";_20="lWzVvREZcNmJLqI8l9BsweOEwJc/GEWB2gkFRfmHgVk=";_21="3sPO5g6sVrnxZA4n7tV9CPZfQtb29Mar43BchnlJY/w=";_22="FhJyu+UpsJAHSk+xq6zq29D4K0INU2VHOck5t3V+s3U=";_23="xCisO2OFOGk/QwEC/V5O5t7JLsnrpM47S9zOIhbdb04=";_24="kSuVgwVa4jPAyyRrmeY64Lmx0/P1Qic3a+NrBcYixd4=";_25="lIW/1ZeEzQF/nLvcFI3RVef2pX396VXGilWspjkf4Mk=";_26="fMvq4YahGZlPCL8GryEw7PmHf/kCabuONnnZPOn89gs=";};rustc-docs={v="1.49.0 (e1884a8e3 2020-12-29)";_24="GvE/gGFvyB6NOB/hNWNqF17IOQEt087gDVuuAxCBhb4=";};rustfmt-preview={v="1.4.25 (0f29ff6da 2020-11-11)";_0="5EyMGqEz2xidN7PgtGu7UgdQmbUJQVFcBMnufcxVOJk=";_1="2eAtd2ZXaZSZhEitJdBR8N+ShMDyGLKOd7z2bQR0Zuw=";_2="doVFlnx1sresjeP9IqniqhOeTyLrzDjP0MTgvWcqz28=";_3="C+oKtf3bOO2cYvmuNT9jPGm8GYiPiBZAnmlwM/qHCYE=";_4="jY24frChA1PgpDlj+MMdfBgW0ldfqjYskODRgjQWIbw=";_5="s4FoT1veVqw8YRKFn0/JI53JnYqmT7e5ks82tgjkCog=";_6="+axLUn39OVjkBZTvbMSYccWL/yh89DKMBWm6ofRyebY=";_7="eWqoJvLtzr03aXuVfVSOQXg9Vn3/7JLPzV2Gkus8uw0=";_8="SiQCGEp91BvNUI+m22HTk42dBug1fMHMqnTzuKvPrk4=";_9="wU/vF6glvljhYkC3uaH6nLgqhhK1qfIL5lSqoIeEdRY=";_10="ORufMuOoczKVAjmXzPIQLVjFJLtszgNZN060BYdc2hw=";_11="uc+M5vfjPTUSI0g6YWj/M+2dP2gienk8jWcwyaMXfW0=";_12="fvQygpslRrK0bjY7DMJZjJBNGeBF91PzLo/cCpsKmSY=";_13="8p8cRbh/UtdZ4V4+Y/ciL2UjSDtRHgr2eUkNsgnJlB0=";_14="kraK9/9QsGkCFHQWApDjSrrJPp/PHKYv3i5k33T9YvQ=";_15="cqGz0aNcsXnVSi+VXoz53OssoTwkUZjeUsq5w4LQBLA=";_16="uxH190ciBIm4eBayu0UxjT5LKq8s9LXg4KAzKSiQWSc=";_17="s6jUee8r2UocRz1W9DA6IFfZEyIFdv7d3dYQx7mqfZQ=";_18="5xL4Qnk8mMwqmS5iR0ve9Ebt13MJ29ReoRLFZlPN2tc=";_19="iWGFK2HcK6hpHpx1ED6ffThNi2bzEisR5/KmwzI354w=";_20="s67dPgNFwVKGT+9YsTKQXY1UNxgWCnPzyc9xyvkeEWM=";_21="8q+IqpkoBvmVK8LsRB+XV4hyNwv++yIcVZhnL+rLHTE=";_22="G/M56Rm95DHede/s/5Zi0GPYIZh4NRg7x8QRcp+tnxQ=";_23="RQg6CRyZSiSQC41MfigBoO/PlyHBDBJRo+MhdohGieg=";_24="fCeFg2cWSkHVSgnGJBG2yzfHTNGwCUTJH8Ao5hqnhbo=";_25="oMrFbrc7+c5jXl5XibBUn1uGQhyFGIoSWkQ4xZpYvX0=";_26="KnpRMnrEbQUtX+ZTJdtDSJV4NGeGkyyYxu8vPpCrv9Y=";};} diff --git a/manifests/stable/default.nix b/manifests/stable/default.nix new file mode 100644 index 00000000000..cfb0b1269ab --- /dev/null +++ b/manifests/stable/default.nix @@ -0,0 +1,5 @@ +{ + "1.48.0" = import ./1.48.0.nix; + "1.49.0" = import ./1.49.0.nix; + latest = "1.49.0"; +} diff --git a/manifests/targets.nix b/manifests/targets.nix new file mode 100644 index 00000000000..a4bcb73e48a --- /dev/null +++ b/manifests/targets.nix @@ -0,0 +1,93 @@ +{ + _0 = "aarch64-apple-darwin"; + _1 = "aarch64-pc-windows-msvc"; + _2 = "aarch64-unknown-linux-gnu"; + _3 = "aarch64-unknown-linux-musl"; + _4 = "arm-unknown-linux-gnueabi"; + _5 = "arm-unknown-linux-gnueabihf"; + _6 = "armv7-unknown-linux-gnueabihf"; + _7 = "i686-pc-windows-gnu"; + _8 = "i686-pc-windows-msvc"; + _9 = "i686-unknown-linux-gnu"; + _10 = "mips-unknown-linux-gnu"; + _11 = "mips64-unknown-linux-gnuabi64"; + _12 = "mips64el-unknown-linux-gnuabi64"; + _13 = "mipsel-unknown-linux-gnu"; + _14 = "powerpc-unknown-linux-gnu"; + _15 = "powerpc64-unknown-linux-gnu"; + _16 = "powerpc64le-unknown-linux-gnu"; + _17 = "riscv64gc-unknown-linux-gnu"; + _18 = "s390x-unknown-linux-gnu"; + _19 = "x86_64-apple-darwin"; + _20 = "x86_64-pc-windows-gnu"; + _21 = "x86_64-pc-windows-msvc"; + _22 = "x86_64-unknown-freebsd"; + _23 = "x86_64-unknown-illumos"; + _24 = "x86_64-unknown-linux-gnu"; + _25 = "x86_64-unknown-linux-musl"; + _26 = "x86_64-unknown-netbsd"; + _27 = "aarch64-apple-ios"; + _28 = "aarch64-fuchsia"; + _29 = "aarch64-linux-android"; + _30 = "arm-linux-androideabi"; + _31 = "armv7-linux-androideabi"; + _32 = "armv7-unknown-linux-gnueabi"; + _33 = "armv7-unknown-linux-musleabi"; + _34 = "i586-pc-windows-msvc"; + _35 = "i686-linux-android"; + _36 = "i686-unknown-freebsd"; + _37 = "nvptx64-nvidia-cuda"; + _38 = "sparcv9-sun-solaris"; + _39 = "thumbv7neon-linux-androideabi"; + _40 = "wasm32-unknown-unknown"; + _41 = "wasm32-wasi"; + _42 = "x86_64-apple-ios"; + _43 = "x86_64-fortanix-unknown-sgx"; + _44 = "x86_64-fuchsia"; + _45 = "x86_64-linux-android"; + _46 = "x86_64-sun-solaris"; + _47 = "x86_64-unknown-linux-gnux32"; + _48 = "aarch64-unknown-none"; + _49 = "aarch64-unknown-none-softfloat"; + _50 = "arm-unknown-linux-musleabi"; + _51 = "arm-unknown-linux-musleabihf"; + _52 = "armebv7r-none-eabi"; + _53 = "armebv7r-none-eabihf"; + _54 = "armv5te-unknown-linux-gnueabi"; + _55 = "armv5te-unknown-linux-musleabi"; + _56 = "armv7-unknown-linux-musleabihf"; + _57 = "armv7a-none-eabi"; + _58 = "armv7r-none-eabi"; + _59 = "armv7r-none-eabihf"; + _60 = "asmjs-unknown-emscripten"; + _61 = "i586-unknown-linux-gnu"; + _62 = "i586-unknown-linux-musl"; + _63 = "i686-unknown-linux-musl"; + _64 = "mips-unknown-linux-musl"; + _65 = "mips64-unknown-linux-muslabi64"; + _66 = "mips64el-unknown-linux-muslabi64"; + _67 = "mipsel-unknown-linux-musl"; + _68 = "riscv32i-unknown-none-elf"; + _69 = "riscv32imac-unknown-none-elf"; + _70 = "riscv32imc-unknown-none-elf"; + _71 = "riscv64gc-unknown-none-elf"; + _72 = "riscv64imac-unknown-none-elf"; + _73 = "sparc64-unknown-linux-gnu"; + _74 = "thumbv6m-none-eabi"; + _75 = "thumbv7em-none-eabi"; + _76 = "thumbv7em-none-eabihf"; + _77 = "thumbv7m-none-eabi"; + _78 = "thumbv7neon-unknown-linux-gnueabihf"; + _79 = "thumbv8m.base-none-eabi"; + _80 = "thumbv8m.main-none-eabi"; + _81 = "thumbv8m.main-none-eabihf"; + _82 = "wasm32-unknown-emscripten"; + _83 = "x86_64-rumprun-netbsd"; + _84 = "x86_64-unknown-redox"; + _85 = "i686-apple-darwin"; + _86 = "armv7-apple-ios"; + _87 = "armv7s-apple-ios"; + _88 = "i386-apple-ios"; + _89 = "x86_64-unknown-cloudabi"; + _90 = "wasm32-unknown-wasi"; +} diff --git a/rust-overlay.nix b/rust-overlay.nix new file mode 100644 index 00000000000..2d1e234297c --- /dev/null +++ b/rust-overlay.nix @@ -0,0 +1,301 @@ +# Modified from: https://github.com/mozilla/nixpkgs-mozilla/blob/8c007b60731c07dd7a052cce508de3bb1ae849b4/rust-overlay.nix + +# This file provide a Rust overlay, which provides pre-packaged bleeding edge versions of rustc +# and cargo. +self: super: +manifests: + +let + + # Manifest selector. + fromManifest = { channel }: { stdenv, fetchurl, patchelf }: let + inherit (builtins) match; + byVersion = match "([0-9]+\\.[0-9]+\\.[0-9]+)" channel != null; + + manifest = + if channel == "stable" then manifests.stable.latest + else if byVersion then manifests.stable.${channel} or (throw "Version ${channel} is not available") + else throw "Unknown channel: ${channel}"; + + in fromManifestFile manifest { inherit stdenv fetchurl patchelf; }; + + getComponentsWithFixedPlatform = pkgs: pkgname: stdenv: + let + pkg = pkgs.${pkgname}; + srcInfo = pkg.target.${super.rust.toRustTarget stdenv.targetPlatform} or pkg.target."*"; + components = srcInfo.components or []; + componentNamesList = + builtins.map (pkg: pkg.pkg) (builtins.filter (pkg: (pkg.target != "*")) components); + in + componentNamesList; + + getExtensions = pkgs: pkgname: stdenv: + let + inherit (super.lib) unique; + pkg = pkgs.${pkgname}; + rustTarget = super.rust.toRustTarget stdenv.targetPlatform; + srcInfo = pkg.target.${rustTarget} or pkg.target."*" or (throw "${pkgname} is no available"); + extensions = srcInfo.extensions or []; + extensionNamesList = unique (builtins.map (pkg: pkg.pkg) extensions); + in + extensionNamesList; + + hasTarget = pkgs: pkgname: target: + pkgs ? ${pkgname}.target.${target}; + + getTuples = pkgs: name: targets: + builtins.map (target: { inherit name target; }) (builtins.filter (target: hasTarget pkgs name target) targets); + + # In the manifest, a package might have different components which are bundled with it, as opposed as the extensions which can be added. + # By default, a package will include the components for the same architecture, and offers them as extensions for other architectures. + # + # This functions returns a list of { name, target } attribute sets, which includes the current system package, and all its components for the selected targets. + # The list contains the package for the pkgTargets as well as the packages for components for all compTargets + getTargetPkgTuples = pkgs: pkgname: pkgTargets: compTargets: stdenv: + let + inherit (builtins) elem; + inherit (super.lib) intersectLists; + components = getComponentsWithFixedPlatform pkgs pkgname stdenv; + extensions = getExtensions pkgs pkgname stdenv; + compExtIntersect = intersectLists components extensions; + tuples = (getTuples pkgs pkgname pkgTargets) ++ (builtins.map (name: getTuples pkgs name compTargets) compExtIntersect); + in + tuples; + + getFetchUrl = pkgs: pkgname: target: stdenv: fetchurl: + let + pkg = pkgs.${pkgname}; + srcInfo = pkg.target.${target}; + in + (super.fetchurl { url = srcInfo.xz_url; sha256 = srcInfo.xz_hash; }); + + checkMissingExtensions = pkgs: pkgname: stdenv: extensions: + let + inherit (builtins) head; + inherit (super.lib) concatStringsSep subtractLists; + availableExtensions = getExtensions pkgs pkgname stdenv; + missingExtensions = subtractLists availableExtensions extensions; + extensionsToInstall = + if missingExtensions == [] then extensions else throw '' + While compiling ${pkgname}: the extension ${head missingExtensions} is not available. + Select extensions from the following list: + ${concatStringsSep "\n" availableExtensions}''; + in + extensionsToInstall; + + getComponents = pkgs: pkgname: targets: extensions: targetExtensions: stdenv: fetchurl: + let + inherit (builtins) head map; + inherit (super.lib) flatten remove subtractLists unique; + targetExtensionsToInstall = checkMissingExtensions pkgs pkgname stdenv targetExtensions; + extensionsToInstall = checkMissingExtensions pkgs pkgname stdenv extensions; + hostTargets = [ "*" (super.rust.toRustTarget stdenv.hostPlatform) (super.rust.toRustTarget stdenv.targetPlatform) ]; + pkgTuples = flatten (getTargetPkgTuples pkgs pkgname hostTargets targets stdenv); + extensionTuples = flatten (map (name: getTargetPkgTuples pkgs name hostTargets targets stdenv) extensionsToInstall); + targetExtensionTuples = flatten (map (name: getTargetPkgTuples pkgs name targets targets stdenv) targetExtensionsToInstall); + pkgsTuples = pkgTuples ++ extensionTuples ++ targetExtensionTuples; + missingTargets = subtractLists (map (tuple: tuple.target) pkgsTuples) (remove "*" targets); + pkgsTuplesToInstall = + if missingTargets == [] then pkgsTuples else throw '' + While compiling ${pkgname}: the target ${head missingTargets} is not available for any package.''; + in + map (tuple: { name = tuple.name; src = (getFetchUrl pkgs tuple.name tuple.target stdenv fetchurl); }) pkgsTuplesToInstall; + + installComponents = stdenv: namesAndSrcs: + let + inherit (builtins) map; + installComponent = name: src: + stdenv.mkDerivation { + inherit name; + inherit src; + + # No point copying src to a build server, then copying back the + # entire unpacked contents after just a little twiddling. + preferLocalBuild = true; + + # (@nbp) TODO: Check on Windows and Mac. + # This code is inspired by patchelf/setup-hook.sh to iterate over all binaries. + installPhase = '' + patchShebangs install.sh + CFG_DISABLE_LDCONFIG=1 ./install.sh --prefix=$out --verbose + setInterpreter() { + local dir="$1" + [ -e "$dir" ] || return 0 + header "Patching interpreter of ELF executables and libraries in $dir" + local i + while IFS= read -r -d ''$'\0' i; do + if [[ "$i" =~ .build-id ]]; then continue; fi + if ! isELF "$i"; then continue; fi + echo "setting interpreter of $i" + + if [[ -x "$i" ]]; then + # Handle executables + patchelf \ + --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" \ + --set-rpath "${super.lib.makeLibraryPath [ self.zlib ]}:$out/lib" \ + "$i" || true + else + # Handle libraries + patchelf \ + --set-rpath "${super.lib.makeLibraryPath [ self.zlib ]}:$out/lib" \ + "$i" || true + fi + done < <(find "$dir" -type f -print0) + } + setInterpreter $out + ''; + + postFixup = '' + # Function moves well-known files from etc/ + handleEtc() { + local oldIFS="$IFS" + # Directories we are aware of, given as substitution lists + for paths in \ + "etc/bash_completion.d","share/bash_completion/completions","etc/bash_completions.d","share/bash_completions/completions"; + do + # Some directoties may be missing in some versions. If so we just skip them. + # See https://github.com/mozilla/nixpkgs-mozilla/issues/48 for more infomation. + if [ ! -e $paths ]; then continue; fi + IFS="," + set -- $paths + IFS="$oldIFS" + local orig_path="$1" + local wanted_path="$2" + # Rename the files + if [ -d ./"$orig_path" ]; then + mkdir -p "$(dirname ./"$wanted_path")" + fi + mv -v ./"$orig_path" ./"$wanted_path" + # Fail explicitly if etc is not empty so we can add it to the list and/or report it upstream + rmdir ./etc || { + echo Installer tries to install to /etc: + find ./etc + exit 1 + } + done + } + if [ -d "$out"/etc ]; then + pushd "$out" + handleEtc + popd + fi + ''; + + dontStrip = true; + }; + in + map (nameAndSrc: (installComponent nameAndSrc.name nameAndSrc.src)) namesAndSrcs; + + # Manifest files are organized as follow: + # { date = "2017-03-03"; + # pkg.cargo.version= "0.18.0-nightly (5db6d64 2017-03-03)"; + # pkg.cargo.target.x86_64-unknown-linux-gnu = { + # available = true; + # hash = "abce..."; # sha256 + # url = "https://static.rust-lang.org/dist/....tar.gz"; + # xz_hash = "abce..."; # sha256 + # xz_url = "https://static.rust-lang.org/dist/....tar.xz"; + # }; + # } + # + # The packages available usually are: + # cargo, rust-analysis, rust-docs, rust-src, rust-std, rustc, and + # rust, which aggregates them in one package. + # + # For each package the following options are available: + # extensions - The extensions that should be installed for the package. + # For example, install the package rust and add the extension rust-src. + # targets - The package will always be installed for the host system, but with this option + # extra targets can be specified, e.g. "mips-unknown-linux-musl". The target + # will only apply to components of the package that support being installed for + # a different architecture. For example, the rust package will install rust-std + # for the host system and the targets. + # targetExtensions - If you want to force extensions to be installed for the given targets, this is your option. + # All extensions in this list will be installed for the target architectures. + # *Attention* If you want to install an extension like rust-src, that has no fixed architecture (arch *), + # you will need to specify this extension in the extensions options or it will not be installed! + fromManifestFile = pkgs: { stdenv, fetchurl, patchelf }: + let + inherit (builtins) elemAt; + inherit (super) makeOverridable; + inherit (super.lib) flip mapAttrs; + in + flip mapAttrs pkgs.pkg (name: pkg: + makeOverridable ({extensions, targets, targetExtensions}: + let + version' = builtins.match "([^ ]*) [(]([^ ]*) ([^ ]*)[)]" pkg.version; + version = if version' == null then pkg.version else "${elemAt version' 0}-${elemAt version' 2}-${elemAt version' 1}"; + namesAndSrcs = getComponents pkgs.pkg name targets extensions targetExtensions stdenv fetchurl; + components = installComponents stdenv namesAndSrcs; + componentsOuts = builtins.map (comp: (super.lib.strings.escapeNixString (super.lib.getOutput "out" comp))) components; + in + super.pkgs.symlinkJoin { + name = name + "-" + version; + paths = components; + postBuild = '' + # If rustc or rustdoc is in the derivation, we need to copy their + # executable into the final derivation. This is required + # for making them find the correct SYSROOT. + for target in $out/bin/{rustc,rustdoc}; do + if [ -e $target ]; then + cp --remove-destination "$(realpath -e $target)" $target + fi + done + ''; + + # Add the compiler as part of the propagated build inputs in order + # to run: + # + # $ nix-shell -p rustChannels.stable.rust + # + # And get a fully working Rust compiler, with the stdenv linker. + propagatedBuildInputs = [ stdenv.cc ]; + + meta.platforms = stdenv.lib.platforms.all; + } + ) { extensions = []; targets = []; targetExtensions = []; } + ); + +in + +rec { + lib = super.lib // { + rustLib = { + inherit fromManifest fromManifestFile; + }; + }; + + rustChannelOf = manifest_args: fromManifest + manifest_args + { inherit (self) stdenv fetchurl patchelf; }; + + # Set of packages which are automagically updated. Do not rely on these for + # reproducible builds. + latest = (super.latest or {}) // { + rustChannels = { + nightly = rustChannelOf { channel = "nightly"; }; + beta = rustChannelOf { channel = "beta"; }; + stable = rustChannelOf { channel = "stable"; }; + }; + }; + + # Helper builder + rustChannelOfTargets = channel: date: targets: + (rustChannelOf { inherit channel date; }) + .rust.override { inherit targets; }; + + # For backward compatibility + rustChannels = latest.rustChannels; + + # For each channel: + # latest.rustChannels.nightly.cargo + # latest.rustChannels.nightly.rust # Aggregate all others. (recommended) + # latest.rustChannels.nightly.rustc + # latest.rustChannels.nightly.rust-analysis + # latest.rustChannels.nightly.rust-docs + # latest.rustChannels.nightly.rust-src + # latest.rustChannels.nightly.rust-std + + # For a specific date: + # (rustChannelOf { date = "2017-06-06"; channel = "beta"; }).rust +}