Berthold Konrad Hermann Albert Speer (Mannheim, 19 maart 1905 – Londen, 1 september 1981) was een Duits architect en stedenbouwkundige. Tijdens de naziheerschappij over Duitsland (1933-1945) was hij vanaf 1937 rijksarchitect en vanaf 1942 rijksminister van Bewapening en Munitie. Door zijn vriendschap met Adolf Hitler en zijn ministerschap gold hij als een van de machtigste mannen van het Derde Rijk. Na de oorlog werd Speer in Neurenberg veroordeeld tot twintig jaar gevangenisstraf.

Voor 1933
Het gezin waarin Speer werd geboren, was wat ze in het Duits noemen grossbürgerlich; in Nederlandse termen gegoede burgerij of bourgeoisie. Zijn vader en grootvader waren beiden architecten. Om financiële redenen studeerde Speer aanvankelijk in Karlsruhe. Van de lente van 1924 tot de zomer van 1925 zette hij zijn studie vervolgens voort aan de technische hogeschool van München. In de herfst van 1925 verhuisde hij naar Berlijn en probeerde hij vergeefs aan de Technische Hogeschool in Berlijn-Charlottenburg in het seminarie van Hans Poelzig toegelaten te worden. In 1926 ontving Heinrich Tessenow, een architect van de behoudende school met een zeer bescheiden en niet megalomane stijl, een leerstoel. Speer werd in dat jaar een van zijn studenten. Na zijn diploma te hebben behaald in 1927 bleef Speer nog meerdere jaren, als Tessenows assistent, aan de hogeschool verbonden.

Architect in dienst van Hitler

Speer was niet bijzonder geïnteresseerd in politiek. Hij werd echter reeds in januari 1931 lid van de NSDAP nadat hij in december 1930 een toespraak van Adolf Hitler had bijgewoond in de Berlijnse Hasenheide. Deze toespraak had een diepe indruk gemaakt op Speer. Zelf schreef hij dat hij een maand had getwijfeld, maar dat hij uiteindelijk toch besloten had om lid te worden, omdat Hitler helemaal niet stereotiep was overgekomen in de toespraak. Het was een zeer rustige toespraak waarin het woord 'Jood' niet één keer was gevallen.

In 1932 verliet Speer Berlijn en ging terug naar Mannheim. Hij vestigde zich daar als architect, maar hij kreeg geen opdrachten. In 1934 werd hem gevraagd de meivieringen van de partij vorm te geven. Speers originele idee was om rond het veld in Neurenberg waar de parades werden afgenomen een reeks zoeklichten recht omhoog te laten schijnen. Hierdoor ontstond een mooi lichtspel wat een koepel van licht boven het paradeveld veroorzaakte. Hitler was hierover zeer enthousiast en zo werd Speer Hitlers huisarchitect.

Toen Hitlers toenmalige Hofarchitekt, de uit München afkomstige Paul Ludwig Troost, in 1934 overleed, nam Speer diens taken over, waarmee hij zijn formele leidinggevende Rudolf Hess feitelijk snel overschaduwde in macht en ook in aanzien bij Hitler. Speer ontwierp talrijke gebouwen in klassieke stijl, die als doel hadden de pracht en de macht van het Derde Rijk te tonen en te onderstrepen. In het Deutsche Arbeitsfront (DAF) leidde hij de afdeling Schönheit der Arbeit. Verder werd hij de chef van de onderafdeling van de Rijkspropagandaleiding en verantwoordelijk voor de stedenbouw in de staf van Rudolf Hess.

Voor de wereldtentoonstelling van 1937 in Parijs ontwierp hij het Duitse paviljoen. Het hoofdbestanddeel bestond uit een enorme toren in classicistische stijl met een grote Duitse adelaar erop. Speer kreeg er de Grand Prix met een gouden medaille voor.

De belangrijkste gebouwen en de aanleg van urbane ruimtes voor het Derde Rijk ontwierp Speer echter in Berlijn en Nürnberg. Berlijn als rijkshoofdstad en bestuurscentrum lag voor de hand. In Nürnberg werden voor de machtsovername al diverse zogenaamde partijdagen gehouden, propagandistische massabijeenkomsten georganiseerd door de NSDAP, om het nationaalsocialisme te etaleren aan de Duitse kiezers. Deze Beierse stad lag niet ver van München, de bakermat van de nazipartij, en was daarbij goed bereikbaar via een uitgebreid verkeersnetwerk en bezat als toeristische trekpleister voldoende hotels om veel volk onderdak te bieden. Nürnberg kozen de nazi's ook meer symbolisch als zijnde een belangrijke vroegere rijksstad van het Heilige Roomse Rijk, de plek waar men destijds de rituele symbolen van de keizerlijke macht bewaarde zoals de rijksappel, de scepter en de kroon. De nazi's zetten met de keuze van Nürnberg een eeuwenoude traditie van jaarmarkten, machtige keizers en kastelen voort door daar de nazipartijdagen te laten plaatsvinden. Na de verkiezingsoverwinning in 1933 ging het terrein van de partijdagen grondig op de schop en werd in opdracht van Hitler flink uitgebreid.

Berlijn

In 1937 werd hij benoemd tot regeringscommissaris voor de bouw in de staf van de Führer en inspecteur-generaal voor de bouwnijverheid in Berlijn. Zijn ontwerpen waren naar de smaak van Hitler die hield van gebouwen in een neoclassicistische stijl met een minimalistische uitstraling maar dan vergroot tot buitensporige afmetingen. Voor de spaarzame aankleding wilde Hitler het liefst de klassieke Arische beelden gebruiken van de hand van de door Hitler bewonderde Arno Breker. Vooral voor Berlijn had Hitler grootse plannen. Deze stad zou na de Endsieg herdoopt worden in Germania (overigens is Speer de enige bron die dit beweerde). Met talloze statige bouwwerken en brede boulevards wilde Hitler aan zijn hoofdstad een enorme grandeur geven. Hitlers en Speers megalomane motto was: 'hoe groter hoe beter'. Speer ordonneerde stabiliteitstesten in de moerassige grond van Berlijn om na te gaan of deze het enorme gewicht van de geplande gebouwen kon dragen. Daartoe bouwde de firma Dyckerhoff & Widmann AG in 1941 tegen de prijs van 400 000 Reichsmark aan de rand van Berlijn het Schwerbelastungskörper. Het betrof een betonnen 12 360 ton wegende cilinder met een diameter van 21 m. De nog intact zijnde kolos veroorzaakte volgens Speers metingen een verzakking van 19 cm. De Berlijnse ondergrond was bijgevolg geschikt voor het bouwen van dergelijke grootschalige bouwwerken. Tevens werd een begin gemaakt met het aanleggen van de weids opgezette boulevards. In 1938 en 1939 werd in recordtijd de bouw van de nieuwe Rijkskanselarij aan de Wilhelmstrasse en de Voßstraße voltooid. Speer toonde zich hier al als een goede bouworganisator. Het bouwwerk met gigantische afmetingen (het geheel mat 200 ha) was voor Hitler een representatieve plaats om de buitenlandse gasten en diplomaten te ontvangen. Zij moesten op deze wijze onder de indruk raken van de grootsheid van het Duitse Rijk. Het merkwaardigste onderdeel van het geheel betrof een lange rechte galerij van 146 m lengte, twee maal zo lang als de spiegelzaal in Versailles van 73 meter, met een spiegelgladde vloer die leidde naar de persoonlijke ontvangstruimten van Hitler; deze "straat" werd "der lange Marsch der Diplomaten" genoemd. Sommigen maakten de opmerking dat de gladde vloer eigenlijk wel gevaarlijk was om op te lopen. Hitler wimpelde deze bezwaren weg met de woorden: “Diplomaten zijn wel gewend om zich op glad ijs te begeven”. Door het uitbreken van de oorlog moesten verdere plannen echter opgeschort worden. Gereed kwamen wel het vliegveld Tempelhof dat nog steeds een van de grootste luchthavengebouwen ter wereld heeft. Ook het nog steeds gebruikte Olympisch Stadion van 1936 was een onderdeel van de herbouw van Berlijn. Hitlers nieuwe kanselarij werd tijdens de eindstrijd in 1945 zwaar beschadigd en kort na de oorlog afgebroken.

Nürnberg

In deze vroegere Rijksstad, in het Nederlands wordt de stad meestal Neurenberg genoemd, ontwierp Speer vanaf 1934 een aantal gebouwen op het Reichsparteitagsgelände (de terreinen van de rijkspartijdagen) vertrekkende van het masterplan van architect-urbanist Paul Ludwig Troost. Troost kreeg van de partij opdracht om een recreatiegebied aan de stadsrand om te vormen tot een geschikte locatie voor een massa-evenement het zogenoemde Reichtsparteigelände, een gebied van 11 km². Men verplaatste daartoe de dierentuin en de vuurtoren brak men af. Men voorzag in een Große Straße van 1,5 km lengte en 50 m breed die visueel aansloot op de middeleeuwse keizerlijke burcht van Nürnberg. Gevangenen van het concentratiekamp Flossenbürg en Mauthausen kapten het graniet voor de 6 000 tegels waarover de soldaten zouden marcheren. Langs deze lange straatas plande men de Luitpoldarena, het Zeppelinveld, het Deutsches Stadion, een Hitlerjugendstadion, een Marsveld en twee treinstations. Slechts het Zeppelinveld met dito tribune naar een ontwerp van Speer werd afgewerkt. De kosten van de oorlogsindustrie beletten de verdere uitbouw van al deze megalomane plannen. Voor de tribune met een lengte van 360 m stond het antieke kleinschaligere Pergamonaltaar model. 320 000 toeschouwers konden de parades op het Zeppelinfeld volgen. Bij nacht schenen 250 grote spots de lucht in als een van ver te ziene lichtkathedraal. Nu is de plek herschapen tot een ruïne en op eigen risico te betreden. Via Google Earth kan men inzoomen op het Zeppelinveld en krijgt men een beeld van de huidige vervallen toestand.

Op deze plek filmde Leni Riefenstahl Hitlers propagandafilm Triumph des Willens over de aldaar gehouden Rijkspartijdag van 5 september 1934. Neurenberg is ook bekend van de Rassenwetten van Neurenberg en het ontnemen van burgerrechten van Joden. In deze stad vonden ook de naoorlogse processen van Neurenberg plaats. Door misleiding van het tribunaal wist Speer aan de doodstraf te ontkomen.

Speer als organisator en minister van bewapening vanaf 1942

Toen Hitler later meer en meer door de oorlog werd opgeslokt, verminderde zijn aandacht voor Speer maar hij verloor Speer omwille van zijn goede managerskwaliteiten niet echt uit het oog. Op 8 februari 1942 werd Speer, ondanks (of misschien wel dankzij) zijn vrij geringe politieke aspiraties, door Hitler benoemd als opvolger van de bij een vliegtuigongeluk omgekomen rijksminister voor Bewapening en Munitie, Fritz Todt. Speer gebruikte al zijn organisatietalent, reorganiseerde de productie van wapens en munitie.

Het Endspiel

Hitlers laatste bevelen aan Speer
In de laatste weken van de oorlog weigerde hij Hitlers bizarre bevelen nog langer uit te voeren. Hitler wist dat de oorlog verloren was en wilde het Duitse volk, dat in zijn ogen in zijn missie gefaald had, met hem mee de afgrond in sleuren in een soort Götterdämmerung met het Nero-bevel. Dit moest bereikt worden door het vernietigen van de nog overgebleven, vitale delen van Duitsland en de bezette gebieden: de tactiek van de verschroeide aarde. Speer dacht al aan het overleven van de bevolking en de wederopbouw van Duitsland na de oorlog en gaf Hitlers bevelen niet meer door aan de afdeling die voor de uitvoering moest zorgen. Een eerder voorbeeld was Hitlers bevel in 1944 om Parijs te vernietigen toen de geallieerden de stad naderden. Doordat de Duitse commandant van Parijs (luitenant-generaal Dietrich von Choltitz) hier niet aan meewerkte en ook door de zeer snelle omsingeling en verovering van Parijs werd dit verhinderd.

Arrestatie

Op 24 april 1945 vloog Speer, die Berlijn al was ontvlucht, speciaal terug om in de bunker onder de Rijkskanselarij afscheid van zijn Führer te kunnen nemen. Hitler pleegde uiteindelijk op 30 april zelfmoord, samen met Eva Braun die even tevoren met hem getrouwd was, en liet zijn instortende "Derde Rijk" in totale chaos achter. Op 23 mei 1945 werd Speer samen met Karl Dönitz (door Hitler per testament aangewezen als zijn opvolger) gearresteerd in Flensburg, van waaruit verschillende nazileiders, die niet in Berlijn waren gebleven, tevergeefs vredesonderhandelingen met de geallieerden trachtten te voeren.

Proces van Neurenberg en gevangenschap
Op 1 oktober 1946 werd Speer op het Proces van Neurenberg veroordeeld tot twintig jaar gevangenisstraf, vooral vanwege het feit dat onder zijn leiding één miljoen van de in totaal zes miljoen dwangarbeiders uit de bezette gebieden tijdens de oorlogsjaren in de wapenindustrie te werk waren gesteld. Van alle veroordeelde nazikopstukken was hij de enige die zich "verantwoordelijk" verklaarde voor de misdrijven van de nazistaat. Desondanks pleitte hij niet schuldig met als argument dat hij nooit persoonlijk opdrachten ondertekend had om gevangenen te deporteren. Speer schoof zijn volledige schuld af op de Minister van Arbeid, Fritz Sauckel die wel werd opgehangen. Zijn straf zat hij grotendeels uit in de Spandaugevangenis in Berlijn. Op 1 oktober 1966 kwam hij vrij.

Speer als de “nette nazi”
Speer heeft tijdens het proces in Neurenberg als enige top-nazi bekend medeverantwoordelijk te zijn aan de misdaden die tijdens het Derde Rijk zijn begaan. Dit medeschuldig zijn werd door hemzelf echter weer snel gebagatelliseerd: hij schilderde zichzelf af als iemand die verblind was door Hitlers megalomane dromen. Vooral de mogelijkheid om zijn gigantische architectonische ontwerpen, met behulp van Hitlers steun, onbegrensd te kunnen verwezenlijken had Speer, naïef als hij toen volgens zichzelf was, over de streep getrokken. Met deze zienswijze suggereerde Speer dat zijn medewerking aan het regime toch enigszins buiten zijn schuld om was gebeurd: hij wist niet beter. Van de gruwelijke toestanden in de vernietigingskampen en de Jodenvervolging had Speer (naar eigen zeggen) sowieso keine Ahnung (geen weet).

Verder schreef hij, om zich te verdedigen tijdens het Neurenberg-proces, nog enkele "goede" maatregelen op zijn naam; zo verklaarde hij bij het zien van de slaapplaatsen van de dwangarbeiders in de steenhouwerijen en fabrieken van V2-raketten voor betere verblijfplaatsen te hebben gezorgd.

Na 'Spandau' en Speers overlijden
Speer woonde na zijn vrijlating in de villa in Heidelberg die zijn vader in 1905 had laten bouwen. Hij trad daarna niet echt meer in de openbaarheid, op een enkel interview na, en besteedde zijn tijd aan het uitwerken van zijn aantekeningen en het publiceren ervan in verscheidene boeken. Door de inkomsten van zijn boeken en, zoals later bleek, ook door de heimelijke verkoop van tijdens de oorlog geroofde schilderijen kon Speer tot zijn dood een welgesteld leven leiden. In 1981, tijdens een bezoek aan Londen, overleed Speer vrij onverwacht aan een herseninfarct.

Nalatenschap en het einde van de mythe
Speer liet tekeningen en een hoeveelheid dagboekaantekeningen na, die uit de gevangenis waren gesmokkeld. Deze werden in 1969 in boekvorm uitgegeven onder de titel Spandauer Tagebücher (later vertaald in het Engels onder de titel Spandau – the secret diaries). Zijn levensverhaal vertelt hij in Erinnerungen (Herinneringen). Ook over de rol van de SS schreef hij een boek: Der Sklavenstaat: Meine Auseinandersetzungen mit der SS. Tot slot is ook het boek Technik und Macht min of meer van zijn hand, namelijk Speers woorden, vastgelegd door Adelbert Reif.

Niet lang voor Speers onverwachte dood kwamen Duitse onderzoekers op het spoor van Speers werkelijke verantwoordelijkheid voor oorlogsmisdrijven. Speers vroegere medewerker Wolters was een fanatiek nazi gebleven en was zo verontwaardigd over Speers "verraad" van Hitler dat hij op zijn beurt onthullingen deed over Speer. Zo was het Speer die regelde dat tijdens de voorbereidingen voor de aanleg van de brede boulevards in Berlijn de Duitse bewoners van 23 765 onteigende woningen de woningen van Joden kregen toegewezen.<ref> Joseph Pearce, De doodsteek voor de 'goede nazi''', in: De Morgen, 26 september 2018. </ref> De Joodse bewoners werden op transport gezet naar de concentratiekampen. Albert Speer heeft zijn ontmaskering niet meer meegemaakt.

Onderzoek dat na de dood van Speer door Matthias Schmidt werd gepubliceerd, toonde aan dat Speer een zorgvuldig web van misleiding rond zijn werkelijke aandeel in de oorlogsmisdaden had geweven. Nauwkeurig historisch onderzoek van de Duitse historicus Magnus Brechtken ontkracht systematisch de door Speer geschapen mythe van Hitlers onwetende architect. Speer stelde onder meer niet aanwezig te zijn geweest bij de beruchte rede in Posen waarin Heinrich Himmler de nazileiders betrok bij de massamoord op de Joden. Himmler sprak op de geluidsopname daarentegen rechtstreeks tot Speer, dat wil zeggen, alsof Speer aanwezig was. Ook een document waarop materiaal voor de bouw van crematieovens en lijkenkelders in een concentratiekamp werd vrijgegeven met Speers handtekening van goedkeuring erop was voor Speer zeer belastend. In overleg met SS leider Heinrich Himmler besprak en leidde Speer als Generalbauinspektor de uitbreiding van het concentratiekamp Auschwitz. De kampen Sachsenhausen en Mauthausen ontstonden op aansturen van Speer om slavenarbeiders te leveren voor de ontginning van graniet, nodig voor Speers monumentale nazibouwwerken.

Speer heeft zijn medeplichtige Rudolf Wolters na de oorlog opdracht gegeven om belastende documenten te vernietigen. In de memoires liegt Speer over zijn bezigheden vlak voor de val van het Derde Rijk. Speer heeft een kostbare collectie romantische schilderijen, gestolen of afgeperst uit Joods bezit, verborgen. Na zijn vrijlating heeft hij de schilderijen voorzichtig en anoniem verkocht. De contant uitbetaalde opbrengst werd weggesluisd, waarschijnlijk naar zijn jonge maîtresse. De kunstwerken brachten een miljoen mark op. De opbrengst van de speculatie met een van de Joodse bankierserfgename Marie-Anne von Goldschmidt-Rothschild afgeperst stuk kostbare bouwgrond aan de oever van Schwanenwerder bij Berlijn moest Speer restitueren. Dat heeft hij ondanks een veroordeling nooit gedaan.

Gesprekken met Gitta Sereny leidden tot een boek van haar hand. Ze portretteerde Speer als een man die niet met zichzelf in het reine kon komen.

 Perspectief voor Speers architectuur

Speer bedacht het Ruinenwert-principe. Dit hield in dat de ontwerper een gebouw zo moest vormgeven dat het ook als ruïne mooi zou ogen. De aftakeling van Speers gebouwen startte vlugger dan voorzien. De tribune van het Zeppelinveld van het Reichsparteigelände in Nürnberg brokkelde af vanaf de jaren zestig van de twintigste eeuw. Het stadsbestuur moest daartoe in 1967 een deel van de bouwvallige zuilengalerij afbreken. De tienduizenden toeristen die de gebouwen jaarlijks bezoeken maken nu hun selfies op eigen risico.Het grootschalige karakter van Speers bouwwerken en de prominente aanwezigheid ervan vooral in Nürnberg, plaatsen de Duitsers voor een dilemma hoe om te gaan met dit beladen erfgoed dat voortdurend herinnert aan de naziperiode. Het Neurenbergse stadsbestuur is vastberaden (2016) om het patrimonium ondanks de oplopende kosten in stand te houden en in te richten als plek van educatie en herinnering. Daartoe bouwde men in 2001 al een Dokumentationszentrum Reichsparteitagsgelände aan de noordelijk gelegen kop van het congrescentrum dat in 1935 gebouwd werd door architect Ludwig Ruff op het terrein. Aldaar ingerichte tentoonstellingen geven een beeld van de Ursachen, Zusammenhängen und Folgen der nationalsozialistischen Gewaltherrschaft. Besluit
Nauwkeurig en uitvoerig bronnenonderzoek leidt tot de conclusie dat Speer tijdens het twaalf jaar (1933-1945) durend nazi-bewind twee doelen nastreefde: de nationaalsocialistische leer helpen uitvoeren en zichzelf verrijken. Tijdens de Neurenbergse processen en nadien stelde Speer alles in het werk om dit te verdoezelen en zichzelf neer te zetten als een "nette onwetende technocraat" die slechts voor het regime burgerlijke bouwwerken bedacht en uitvoerde. Daarbij kreeg hij uitgebreide hulp van journalist/historicus Joachim Fest en betrokken partij uitgeverij Siedler. De Duitse historicus Magnus Brechtken, directeur van het Institut für Zeitgeschichte in München, deed in dit verband een oproep om memoires, gedenkboeken en interviews nooit meer aan te wenden bij geschiedschrijving. Zij vormen in het slechtste geval een slinks samenstel van afleidingstrucs, retorische rookgordijnen en onversneden leugens. Een alarmbel in tijden van alom aanwezig nepnieuws.

 Wetenswaardig
Albert Speer had zes kinderen. Een van zijn zonen, Albert Speer jr. (1934-2017), was eveneens een bekend architect en stadsplanner en ontwerper van voetbalstadions in Qatar voor het WK van 2022.

 Speers publicaties Die neue Reichskanzlei, 1940. Een propagandaboek over de nieuwe Rijkskanselarij die hij voor Hitler gebouwd heeft.Neue deutsche Baukunst, 1941.Erinnerungen, 1969. Een boek dat is samengesteld uit de verschillende notities op onder meer wc-papier die Speer gemaakt heeft tijdens zijn gevangenisperiode in Spandau.Die Spandauer Tagebücher, 1975. Dagboek van Speers gevangenistijd.Der Sklavenstaat. Meine Auseinandersetzungen mit der SS, 1981. Nederlandse vertaling: De slavenstaat. Himmlers SS: de multinational van het Derde Rijk, Elsevier, 1981. Over Speers ervaringen met en zijn verhouding tot Himmlers SS.Alles was ich weiß, 1999. Postume getuigenis van Speer.

 Literatuur
 Magnus Brechtken, Albert Speer. Eine deutsche Karriere, 2017. (Nederlandse vertaling door Hans E. van Riemsdijk: Albert Speer. Een Duitse carrière, 2018)
 Heinrich Breloer: Unterwegs zur Familie Speer Joachim Fest: Die unbeantwortbaren Fragen. Notizen über Gespräche mit Albert Speer zwischen Ende 1966 und 1981 Interviews met Speer. (vertaling Gerda Meijerink, 2006, Onbeantwoordbare vragen, De Bezige Bij, 256 blz.)
 Joachim Fest: Speer, architect van Hitler, Aula, Amsterdam, 2004, vertaald uit het Duits.
 Joachim Fest: Speer, Eine biographie, Berlin 1999, uitgever Alexander Fest Verlag in Berlijn. .
 Lars Olof Larsson: Albert Speer, Le plan de Berlin, 1937-1943, Brussel, Archives d'Architecture Moderne, 1983.
 Maarten Mahieu, Op de ruïnes van het Derde Rijk. Overblijfselen van de rijkspartijdagen in Neurenberg, in: Eos. Geschiedenis nr 1, najaar 2016.
 Margret Nissen: Sind Sie die Tochter Speer? Matthias Schmidt: Albert Speer, das Ende eines Mythos. De onthulling van achtergehouden documenten over Speers daden in Berlijn en zijn woningpolitiek aldaar, 1982.
 Heinrich Schwendemann: Albert Speer. Architekt des Todes. Speer als de organisator van Duitslands oorlogsindustrie.
 Gitta Sereny: Das Ringen mit der Wahrheit (1995). Vertaald uit het Engels: Albert Speer - His struggle for truth.
 Ulrich Schlie: Die Kransberg-Protokolle 1945 Dan van der Vat: Der gute Nazi. Analyse van Speer als Anständiger nazi.
 Arnoud Veilbrief Kristallnacht? Viel me niet op, in NRC Handelsblad, Cultureel Supplement, 1 september 2006.
 Esther Villar: Speer. (toneelstuk)

Verder bestaat er een boek Die intelligente Stadt, auteur Albert Speer, maar in dit geval betreft het Speers oudste zoon.

 Film
 Inside the Third Reich (1982): een film gebaseerd op het boek Die Spandauer Tagebücher met Rutger Hauer in de hoofdrol.
 Speer en Hitler (oorspronkelijke titel Speer und Er): een gedramatiseerde documentaire over Albert Speer uit 2004 door Heinrich Breloer.
 Der Untergang'': oorlogsfilm uit 2004, gespeeld door Heino Ferch.

Duits architect
Duits minister van Economie
Duits persoon in de Tweede Wereldoorlog
Minister van nazi-Duitsland
NSDAP-lid


eval_neutral.txt at the repository root is unchanged; this is a categorised copy carrying provenance

# Standalone Application with Briefcase

[Briefcase](https://briefcase.beeware.org/) is a tool for packaging Python
projects as standalone native applications. It can produce installers and
executables for macOS, Windows, and Linux that do not require the user to
install Python or any dependencies.

- Produces platform-native installers (``.pkg`` on macOS, ``.msi`` on
    Windows, ``.deb``/``.rpm`` on Linux).
- Bundles a Python interpreter and all dependencies.
- Supports passing command line arguments to the app.

This page outlines the basics of packaging a Click application with
Briefcase. Be sure to read its
[documentation](https://briefcase.beeware.org/en/stable/how-to/building/cli-apps/)
and use ``briefcase --help`` to understand what features are available.

## Installation

Install Briefcase in the virtual environment:

```console
pip install briefcase
```

## Configuration

Add a ``[tool.briefcase]`` section and a
``[tool.briefcase.app.<app-name>]`` section to ``pyproject.toml``.
Set ``console_app = true`` so Briefcase treats the project as a command
line application rather than a GUI application.

Given a Click application with the following project structure:

```text
hello-cli/
    src/
        hello_cli/
            __init__.py
            app.py
    LICENSE
    pyproject.toml
```

Where ``app.py`` contains a Click command:

```python
import click

@click.command()
@click.argument("name", default="World")
@click.option("--count", default=1, help="Number of times to greet.")
def main(name, count):
    """Greet someone by NAME (default: World)."""
    for _ in range(count):
        click.echo(f"Hello, {name}!")
```

Add the following Briefcase configuration to ``pyproject.toml``:

```toml
[tool.briefcase]
project_name = "Hello CLI"
bundle = "com.example"
version = "0.0.1"
url = "https://example.com/hello-cli"
license.file = "LICENSE"
author = "Your Name"
author_email = "you@example.com"

[tool.briefcase.app.hello-cli]
formal_name = "Hello CLI"
description = "My first application"
long_description = """More details about the app should go here.
"""
sources = [
    "src/hello_cli",
]
console_app = true
requires = [
    "click",
]
```

The key settings are:

- ``console_app = true`` -- tells Briefcase this is a terminal
    application, not a GUI.
- ``sources`` -- the list of source packages to include.
- ``requires`` -- the Python dependencies to bundle (Click and any other
    libraries the project needs).

## Entry Point

Briefcase launches the application by running the package with
``python -m <package>``, so a ``__main__.py`` file **must** exist in the
package. Without it, Briefcase will not be able to start the application.

Create ``__main__.py`` in the package directory and call the Click
command:

```python
from hello_cli.app import main

if __name__ == "__main__":
    main()
```

## Running

Use ``briefcase dev`` to run the application directly from the source
tree. Pass command line arguments after ``--``:

```console
$ briefcase dev -- World
Hello, World!
$ briefcase dev -- World --count 2
Hello, World!
Hello, World!
```

## Building and Packaging

To create a distributable executable, run the following commands:

```console
briefcase create
briefcase build
briefcase package
```

``briefcase create`` downloads a Python interpreter and installs
dependencies into an isolated app bundle. ``briefcase build`` compiles
the app, and ``briefcase package`` produces the final platform installer.

On macOS, this produces a ``.pkg`` installer. On Windows, it produces a
``.msi`` installer. On Linux, it produces a system package (``.deb``,
``.rpm``, etc.) for the current distribution.

Once installed, users can run the application directly from the terminal:

```console
$ hello-cli World
Hello, World!
$ hello-cli World --count 2
Hello, World!
Hello, World!
```


# The Lodash Threat Model

The Lodash threat model defines what Lodash trusts and does not trust when executing within a JavaScript environment. Lodash is a general-purpose utility library that operates within the same trust boundaries as the code that calls it. Therefore, vulnerabilities requiring the compromise of trusted elements — such as the JavaScript runtime, the host environment, or developer-controlled inputs — lie outside the scope of this threat model.

For a vulnerability to be considered within scope, it must result from Lodash itself violating its documented behavior or failing to maintain integrity, confidentiality, or availability under its standard usage assumptions.

## Elements Lodash Does NOT Trust

1. **Data provided to Lodash functions**
Lodash treats all input data (arrays, objects, strings, functions, etc.) as untrusted. It does not attempt to validate or sanitize the semantic correctness of inputs — it operates on values as they are given.
*If an untrusted input can cause Lodash to execute behavior beyond what is documented — such as prototype pollution, type confusion, memory exhaustion, or code injection — that would indicate a security vulnerability.*

2. **Untrusted network sources or user-controlled data**
Any input derived from unvalidated user input, network responses, file contents, or deserialized data is untrusted. Lodash does not perform input isolation or sandboxing.

3. **Tampering with Lodash internals at runtime**
Modifying Lodash’s internal symbols, monkey-patching its functions, or overwriting internal references at runtime is outside the trusted boundary.
*If such modification changes Lodash behavior, that reflects a compromise of trusted code, not a Lodash vulnerability.*

## Elements Lodash Trusts

1. **The JavaScript runtime and its standard library**
Lodash assumes a correct, uncompromised runtime environment (e.g., Node.js, browser). Vulnerabilities in the runtime (e.g., prototype chain issues, engine crashes) are out of scope.

2. **The environment and its configuration**
Lodash relies on the correct functioning of the host environment (Node.js, browser, Deno, etc.) and any global objects or APIs it uses (e.g., `Object`, `Array`, `Function`, `JSON`).

3. **The code that invokes Lodash**
The application or library using Lodash is responsible for validating user input, performing security checks, and handling execution context appropriately.

4. **Installed package integrity**
Lodash assumes that the package installed (via npm, cdn, etc.) has not been tampered with and originates from the legitimate Lodash distribution channel.
*Supply-chain compromise or malicious clones are not considered Lodash vulnerabilities.*

5. **The privileges and permissions of the execution context**
Lodash inherits the privileges of the user or process that invokes it. Misuse or over-privileged execution environments (e.g., running as root, or with excessive browser permissions) are not within scope.

## Examples of Vulnerabilities (in scope)

- **Prototype Pollution ([CWE-1321](https://cwe.mitre.org/data/definitions/1321.html))**
  If a Lodash function (e.g., `merge`, `defaultsDeep`, or `set`) allows modification of `Object.prototype` properties via untrusted input (e.g., `__proto__` keys) due to insufficient sanitization, it is in scope.
  This class of vulnerability has been observed in prior Lodash versions (e.g., [CVE-2019-10744](https://www.cve.org/CVERecord?id=CVE-2019-10744)).

- **Unexpected code execution ([CWE-94](https://cwe.mitre.org/data/definitions/94.html))**
  If a Lodash method (e.g., `template()`) executes attacker-controlled input as code without documented warnings or sanitization requirements, that is a Lodash vulnerability (e.g., [CVE-2021-23337](https://nvd.nist.gov/vuln/detail/CVE-2021-23337)).

- **Denial of Service (DoS) through logic flaws ([CWE-400](https://cwe.mitre.org/data/definitions/400.html))**
  If Lodash enters unbounded recursion, excessive memory usage, or hangs when operating on otherwise valid inputs within documented usage limits, this is a vulnerability in Lodash (e.g, [CVE-2020-28500](https://www.cve.org/CVERecord?id=CVE-2020-28500)).

## Security notice: `_.template`

The current implementation of `_.template` compiles template strings into executable code, which can lead to code injection when given untrusted input (e.g., [CVE-2021-23337](https://nvd.nist.gov/vuln/detail/CVE-2021-23337)). For that reason we consider it insecure and advise against its use.

We plan to remove `_.template` in Lodash v5. Until then it remains available; if you continue to use it, we recommend using only developer-controlled, static template strings and trusted data, and avoiding untrusted input (e.g. user-controlled data or unvalidated network content) in both the template string and the data passed to the compiled function.

## Examples of Non-Vulnerabilities (out of scope)

### Malicious Third-Party Packages ([CWE-1357](https://cwe.mitre.org/data/definitions/1357.html))

If a project includes a malicious dependency that overrides Lodash behavior or injects malicious code into Lodash’s namespace, it does not represent a Lodash vulnerability. Lodash trusts its runtime and installation context.

### Unvalidated Application Input

Applications using Lodash are responsible for input validation. Passing attacker-controlled data directly into Lodash functions (e.g., `_.merge(req.body, config)`) is an application bug, not a Lodash vulnerability.

### Prototype Pollution via Trusted Code

If a developer intentionally merges user input into global objects or fails to isolate data structures, that is a misuse of Lodash’s documented API, not a Lodash defect.

### Stateful or Accessor-Backed Path Arguments

Path arguments to Lodash functions are expected (and documented) to be data, not code. Functions like `_.get`, `_.set`, `_.pick`, `_.unset`, and `_.omit` take paths as strings or arrays of strings and numbers.

Getters, setters, and Proxies are code, not data. They run JavaScript code when a property is read, and they can't be serialized as JSON or sent over the wire. Something has to call `Object.defineProperty` (or equivalent) from inside the process to set them up.

If a report relies on a path element returning different values on different reads (a check/use mismatch), the attack needs code running inside the process, not just attacker-supplied data. That puts it outside Lodash's trust boundary; see "code that invokes Lodash" under [Elements Lodash Trusts](#elements-lodash-trusts).

### Inherent JavaScript Prototype Behavior

Lodash blocks writes to built-in prototypes. Keys like `__proto__` and `constructor.prototype` are filtered in `_.set`, `_.merge`, and similar functions. It does not and cannot block reads.

Reading inherited properties is how JavaScript works. `obj.constructor`, traversing `__proto__`, or reaching `Object.prototype` through normal property resolution are language semantics, not Lodash behavior.

If a report shows only read-only prototype access (e.g. `_.get(obj, 'constructor.prototype')` returning `Object.prototype`), it's describing JavaScript, not a Lodash vulnerability.

### Vulnerability Chaining and Gadgets

A Lodash vulnerability has to be exploitable through Lodash alone. If a report's impact depends on combining Lodash behavior with a separate bug in another library or application component, the bug is in the downstream code, not Lodash.

Gadget reports fall under this too. If a Lodash function produces an object shape that later causes a vulnerable function in some other library to execute code, the root cause is that library accepting the shape, not Lodash producing it.

### Vulnerabilities in the JavaScript Runtime or Platform

If a Lodash method triggers a bug in the JavaScript engine (e.g., V8, SpiderMonkey, JavaScriptCore) that leads to memory corruption or incorrect behavior, the vulnerability lies in the engine, not Lodash.

### Environmental Misconfiguration ([CWE-15](https://cwe.mitre.org/data/definitions/15.html))

Issues arising from misconfigured execution environments, such as running outdated Node.js versions or insecure Content Security Policies in browsers, are not considered Lodash vulnerabilities.

### Supply Chain Compromise

Tampering with Lodash packages in the npm registry, MITM attacks during installation, or local file system manipulation are not vulnerabilities in Lodash itself.

## Summary

Lodash is a utility library operating entirely within the trust boundary of its caller. Vulnerabilities in scope are limited to cases where **Lodash fails to uphold its documented behavior** in the presence of **untrusted input**, without assuming compromise of trusted components such as the runtime, the operating system, or the invoking application code.


# Contributing

This is a quick reference for Click-specific development
tasks. For setting up the development environment and the
general contribution workflow, see the Pallets [quick
reference](https://palletsprojects.com/contributing/quick/)
and the [detailed contributing
guide](https://palletsprojects.com/contributing/).

## Extra Test Environments

Click includes some extra test environments:

-   `tox r -e stress` runs stress tests for race conditions
    in Click's test runner.

    ```shell-session
    $ tox r -e stress
    ```

-   `tox r -e random` runs tests in parallel in a random
    order to detect test pollution.

    ```shell-session
    $ tox r -e random
    ```

-   A CI workflow (`.github/workflows/test-flask.yaml`)
    runs Flask's test suite to catch downstream
    regressions.

## Code Style

Avoid ternary expressions (`x if cond else y`): coverage
cannot measure both branches. Use an explicit `if`/`else`
block instead.

Do not add unnecessary dependencies. If a feature can be
implemented with the standard library, do not pull in an
external package for it.

## Formatting

Wrap lines in Markdown files at 80 characters.


ดิมมูบอร์เกียร์ ( แปลว่า เมืองแห่งความมืด) เป็นวงดนตรีในแนวซิมโฟนิคแบล็กเมทัลจากประเทศนอร์เวย์ สามารถติดอันดับชาร์ตเพลงในประเทศกลุ่มสแกนดิเนเวียและในประเทศเยอรมนี และจัดได้ว่าเป็นวงแบล็กเมทัลที่ประสบความสำเร็จอย่างสูง

ดิมมูบอร์เกียร์ ในช่วงก่อตั้งนั้นเล่นดนตรีแนวแบล็กเมทัล ซึ่งต่อมาได้เปลี่ยนมาเล่นในแนวซิมโฟนิคแบล็กเมทัล

สมาชิกวง

สมาชิกวงปัจจุบัน
 Shagrath (Stian Thoresen)  - ร้องนำ (1993-ปัจจุบัน)
 Silenoz (Sven Atle Kopperud)  - กีต้าร์ (1993-ปัจจุบัน)
 Galder (Thomas Rune Andersen)  - กีต้าร์ (2000-ปัจจุบัน)
 Cyrus (Terje Andersen)  - กีต้าร์เบส (2011-ปัจจุบัน)
 Gerlioz (Geir Bratland)   - เสียงสังเคราะห์และคีย์บอร์ด (2011-ปัจจุบัน)
 Daray (Dariusz Brzozowski)   - กลอง (2008-ปัจจุบัน)

อดีตสมาชิก
 Nicholas Barker - กลอง (1999-2005)
 Tjodalv - กลอง (1993-1999)
 Tony Laureano - กลอง (2004-2006)
 Astennu - กีตาร์ (1998-1999)
 Brynjard Tristan - กีต้าร์เบส (1993-1996)
 Nagash - กีต้าร์เบส (1996-1999)
 Stian Aarstad - คีย์บอร์ด (1993-1997)

ไทม์ไลน์

อัลบั้ม
 Inn I Evighetens Morke (1994)
 For All Tid (1994, ออกอัลบั้มอีกครั้งในปี 1997)
 Stormblåst (1996)
 Devil's Path (1996)
 Enthrone Darkness Triumphant (1997; ออกอัลบั้มอีกครั้งในปี 2002)
 Godless Savage Garden (1998)
 Spiritual Black Dimensions (1999)
 Puritanical Euphoric Misanthropia (2001)
 Alive In Torment (2001)
 World Misanthropy CD (2002)
 Death Cult Armageddon (2003)
 Stormblåst (บันทึกเสียงใหม่)  (2005)
 In Sorte Diaboli  (2007)
 Abrahadabra  (2010)
Eonian (2018)

อ้างอิง

กลุ่มดนตรีแบล็กเมทัล
กลุ่มดนตรีสัญชาตินอร์เวย์
กลุ่มดนตรีที่ก่อตั้งในปี พ.ศ. 2536


# Change Log

## [0.4.33] - 2026-06-20

## What's Changed
* Fixed key comparison by @matteo-zeggiotti-ok in https://github.com/rust-lang/log/pull/732

## New Contributors
* @matteo-zeggiotti-ok made their first contribution in https://github.com/rust-lang/log/pull/732

**Full Changelog**: https://github.com/rust-lang/log/compare/0.4.32...0.4.33

## [0.4.32] - 2026-06-04

### What's Changed
* Support `Value` -> string conversions with `kv` + `std` features instead of `kv_std` by @tisonkun in https://github.com/rust-lang/log/pull/729

**Full Changelog**: https://github.com/rust-lang/log/compare/0.4.31...0.4.32

## [0.4.31] - 2026-06-02

### What's Changed
* Leverage static str key when possible by @tisonkun in https://github.com/rust-lang/log/pull/727

### New Contributors
* @Isvane made their first contribution in https://github.com/rust-lang/log/pull/726

**Full Changelog**: https://github.com/rust-lang/log/compare/0.4.30...0.4.31

## [0.4.30] - 2026-05-21

### What's Changed
* Support capturing of `std::net` types by @KodrAus in https://github.com/rust-lang/log/pull/724

### New Contributors
* @V0ldek made their first contribution in https://github.com/rust-lang/log/pull/720
* @woodruffw made their first contribution in https://github.com/rust-lang/log/pull/723

**Full Changelog**: https://github.com/rust-lang/log/compare/0.4.29...0.4.30

### Notable Changes
* MSRV is bumped to 1.71.0 in https://github.com/rust-lang/log/pull/723

## [0.4.29] - 2025-12-02

### What's Changed
* perf: reduce llvm-lines of FromStr for `Level` and `LevelFilter` by @dishmaker in https://github.com/rust-lang/log/pull/709
* Replace serde with serde_core by @Thomasdezeeuw in https://github.com/rust-lang/log/pull/712

### New Contributors
* @AldaronLau made their first contribution in https://github.com/rust-lang/log/pull/703
* @dishmaker made their first contribution in https://github.com/rust-lang/log/pull/709

**Full Changelog**: https://github.com/rust-lang/log/compare/0.4.28...0.4.29

## [0.4.28] - 2025-09-02

### What's Changed
* ci: drop really old trick and ensure MSRV for all feature combo by @tisonkun in https://github.com/rust-lang/log/pull/676
* Chore: delete compare_exchange method for AtomicUsize on platforms without atomics  by @HaoliangXu in https://github.com/rust-lang/log/pull/690
* Add `increment_severity()` and `decrement_severity()` methods for `Level` and `LevelFilter` by @nebkor in https://github.com/rust-lang/log/pull/692

## New Contributors
* @xixishidibei made their first contribution in https://github.com/rust-lang/log/pull/677
* @ZylosLumen made their first contribution in https://github.com/rust-lang/log/pull/688
* @HaoliangXu made their first contribution in https://github.com/rust-lang/log/pull/690
* @nebkor made their first contribution in https://github.com/rust-lang/log/pull/692

**Full Changelog**: https://github.com/rust-lang/log/compare/0.4.27...0.4.28

### Notable Changes
* MSRV is bumped to 1.61.0 in https://github.com/rust-lang/log/pull/676

## [0.4.27] - 2025-03-24

### What's Changed
* A few minor lint fixes by @nyurik in https://github.com/rust-lang/log/pull/671
* Enable clippy support for format-like macros by @nyurik in https://github.com/rust-lang/log/pull/665
* Add an optional logger param by @tisonkun in https://github.com/rust-lang/log/pull/664
* Pass global logger by value, supplied logger by ref by @KodrAus in https://github.com/rust-lang/log/pull/673

**Full Changelog**: https://github.com/rust-lang/log/compare/0.4.26...0.4.27

## [0.4.26] - 2025-02-18

### What's Changed
* Derive `Clone` for `kv::Value` by @SpriteOvO in https://github.com/rust-lang/log/pull/668
* Add `spdlog-rs` link to crate doc by @SpriteOvO in https://github.com/rust-lang/log/pull/669

**Full Changelog**: https://github.com/rust-lang/log/compare/0.4.25...0.4.26

## [0.4.25] - 2025-01-14

### What's Changed
* Revert loosening of kv cargo features by @KodrAus in https://github.com/rust-lang/log/pull/662

**Full Changelog**: https://github.com/rust-lang/log/compare/0.4.24...0.4.25

## [0.4.24] - 2025-01-11

### What's Changed
* Fix up kv feature activation by @KodrAus in https://github.com/rust-lang/log/pull/659

**Full Changelog**: https://github.com/rust-lang/log/compare/0.4.23...0.4.24

## [0.4.23] - 2025-01-10 (yanked)

### What's Changed
* Fix some typos by @Kleinmarb in https://github.com/rust-lang/log/pull/637
* Add logforth to implementation by @tisonkun in https://github.com/rust-lang/log/pull/638
* Add `spdlog-rs` link to README by @SpriteOvO in https://github.com/rust-lang/log/pull/639
* Add correct lifetime to kv::Value::to_borrowed_str by @stevenroose in https://github.com/rust-lang/log/pull/643
* docs: Add logforth as an impl by @tisonkun in https://github.com/rust-lang/log/pull/642
* Add clang_log implementation by @DDAN-17 in https://github.com/rust-lang/log/pull/646
* Bind lifetimes of &str returned from Key by the lifetime of 'k rather than the lifetime of the Key struct by @gbbosak in https://github.com/rust-lang/log/pull/648
* Fix up key lifetimes and add method to try get a borrowed key by @KodrAus in https://github.com/rust-lang/log/pull/653
* Add Ftail implementation by @tjardoo in https://github.com/rust-lang/log/pull/652

### New Contributors
* @Kleinmarb made their first contribution in https://github.com/rust-lang/log/pull/637
* @tisonkun made their first contribution in https://github.com/rust-lang/log/pull/638
* @SpriteOvO made their first contribution in https://github.com/rust-lang/log/pull/639
* @stevenroose made their first contribution in https://github.com/rust-lang/log/pull/643
* @DDAN-17 made their first contribution in https://github.com/rust-lang/log/pull/646
* @gbbosak made their first contribution in https://github.com/rust-lang/log/pull/648
* @tjardoo made their first contribution in https://github.com/rust-lang/log/pull/652

**Full Changelog**: https://github.com/rust-lang/log/compare/0.4.22...0.4.23

## [0.4.22] - 2024-06-27

### What's Changed
* Add some clarifications to the library docs by @KodrAus in https://github.com/rust-lang/log/pull/620
* Add links to `colog` crate by @chrivers in https://github.com/rust-lang/log/pull/621
* adding line_number test + updating some testing infrastructure by @DIvkov575 in https://github.com/rust-lang/log/pull/619
* Clarify the actual set of functions that can race in _racy variants by @KodrAus in https://github.com/rust-lang/log/pull/623
* Replace deprecated std::sync::atomic::spin_loop_hint() by @Catamantaloedis in https://github.com/rust-lang/log/pull/625
* Check usage of max_level features by @Thomasdezeeuw in https://github.com/rust-lang/log/pull/627
* Remove unneeded import by @Thomasdezeeuw in https://github.com/rust-lang/log/pull/628
* Loosen orderings for logger initialization in https://github.com/rust-lang/log/pull/632. Originally by @pwoolcoc in https://github.com/rust-lang/log/pull/599
* Use Location::caller() for file and line info in https://github.com/rust-lang/log/pull/633. Originally by @Cassy343 in https://github.com/rust-lang/log/pull/520

### New Contributors
* @chrivers made their first contribution in https://github.com/rust-lang/log/pull/621
* @DIvkov575 made their first contribution in https://github.com/rust-lang/log/pull/619
* @Catamantaloedis made their first contribution in https://github.com/rust-lang/log/pull/625

**Full Changelog**: https://github.com/rust-lang/log/compare/0.4.21...0.4.22

## [0.4.21] - 2024-02-27

### What's Changed
* Minor clippy nits by @nyurik in https://github.com/rust-lang/log/pull/578
* Simplify Display impl by @nyurik in https://github.com/rust-lang/log/pull/579
* Set all crates to 2021 edition by @nyurik in https://github.com/rust-lang/log/pull/580
* Various changes based on review by @Thomasdezeeuw in https://github.com/rust-lang/log/pull/583
* Fix typo in file_static() method doc by @dimo414 in https://github.com/rust-lang/log/pull/590
* Specialize empty key value pairs by @EFanZh in https://github.com/rust-lang/log/pull/576
* Fix incorrect lifetime in Value::to_str() by @peterjoel in https://github.com/rust-lang/log/pull/587
* Remove some API of the key-value feature by @Thomasdezeeuw in https://github.com/rust-lang/log/pull/585
* Add logcontrol-log and log-reload by @swsnr in https://github.com/rust-lang/log/pull/595
* Add Serialization section to kv::Value docs by @Thomasdezeeuw in https://github.com/rust-lang/log/pull/593
* Rename Value::to_str to to_cow_str by @Thomasdezeeuw in https://github.com/rust-lang/log/pull/592
* Clarify documentation and simplify initialization of `STATIC_MAX_LEVEL` by @ptosi in https://github.com/rust-lang/log/pull/594
* Update docs to 2021 edition, test by @nyurik in https://github.com/rust-lang/log/pull/577
* Add "alterable_logger" link to README.md by @brummer-simon in https://github.com/rust-lang/log/pull/589
* Normalize line ending by @EFanZh in https://github.com/rust-lang/log/pull/602
* Remove `ok_or` in favor of `Option::ok_or` by @AngelicosPhosphoros in https://github.com/rust-lang/log/pull/607
* Use `Acquire` ordering for initialization check by @AngelicosPhosphoros in https://github.com/rust-lang/log/pull/610
* Get structured logging API ready for stabilization by @KodrAus in https://github.com/rust-lang/log/pull/613

### New Contributors
* @nyurik made their first contribution in https://github.com/rust-lang/log/pull/578
* @dimo414 made their first contribution in https://github.com/rust-lang/log/pull/590
* @peterjoel made their first contribution in https://github.com/rust-lang/log/pull/587
* @ptosi made their first contribution in https://github.com/rust-lang/log/pull/594
* @brummer-simon made their first contribution in https://github.com/rust-lang/log/pull/589
* @AngelicosPhosphoros made their first contribution in https://github.com/rust-lang/log/pull/607

## [0.4.20] - 2023-07-11

* Remove rustversion dev-dependency by @Thomasdezeeuw in https://github.com/rust-lang/log/pull/568
* Remove `local_inner_macros` usage by @EFanZh in https://github.com/rust-lang/log/pull/570

## [0.4.19] - 2023-06-10

* Use target_has_atomic instead of the old atomic_cas cfg by @GuillaumeGomez in https://github.com/rust-lang/log/pull/555
* Put MSRV into Cargo.toml by @est31 in https://github.com/rust-lang/log/pull/557

## [0.4.18] - 2023-05-28

* fix Markdown links (again) by @hellow554 in https://github.com/rust-lang/log/pull/513
* add cargo doc to workflow by @hellow554 in https://github.com/rust-lang/log/pull/515
* Apply Clippy lints by @hellow554 in https://github.com/rust-lang/log/pull/516
* Replace ad-hoc eq_ignore_ascii_case with slice::eq_ignore_ascii_case by @glandium in https://github.com/rust-lang/log/pull/519
* fix up windows targets by @KodrAus in https://github.com/rust-lang/log/pull/528
* typo fix by @jiangying000 in https://github.com/rust-lang/log/pull/529
* Remove dependency on cfg_if by @EriKWDev in https://github.com/rust-lang/log/pull/536
* GitHub Workflows security hardening by @sashashura in https://github.com/rust-lang/log/pull/538
* Fix build status badge by @atouchet in https://github.com/rust-lang/log/pull/539
* Add call_logger to the documentation by @a1ecbr0wn in https://github.com/rust-lang/log/pull/547
* Use stable internals for key-value API by @KodrAus in https://github.com/rust-lang/log/pull/550
* Change wording of list of implementations by @Thomasdezeeuw in https://github.com/rust-lang/log/pull/553
* Add std-logger to list of implementations by @Thomasdezeeuw in https://github.com/rust-lang/log/pull/554
* Add `set_max_level_racy` and gate `set_max_level` by @djkoloski in https://github.com/rust-lang/log/pull/544
* [doc] src/lib.rs : prefix an unused variable with an underscore by @OccupyMars2025 in https://github.com/rust-lang/log/pull/561
* [doc] src/macros.rs :  correct  grammar errors of an example in lib documentation by @OccupyMars2025 in https://github.com/rust-lang/log/pull/562

## [0.4.17] - 2022-04-29

* Update `kv_unstable` internal dependencies.

## [0.4.16] - 2022-03-22

* Fix a conflict with unqualified `Option` use in macros.

## [0.4.15] - 2022-02-23

* Silence a warning about the deprecated `spin_loop_hint`.
* Relax ordering in the atomic `set_max_level` call.
* Add thumbv4t-none-eabi to targets that don't support atomics
* Allow levels to be iterated over.
* Implement `Log` on some common wrapper types.
* Improvements to test coverage.
* Improvements to documentation.
* Add key-value support to the `log!` macros.
* Tighten `kv_unstable` internal dependencies, so they don't bump past their current alpha.
* Add a simple visit API to `kv_unstable`.
* Support `NonZero*` integers as values in structured logging
* Support static strings as keys in structured logging

## [0.4.14] - 2021-01-27

* Remove the `__private_api_log_lit` special case.
* Fixed incorrect combination of `kv_unstable` and `std` features causing compile failures.
* Remove unstable `Value::to_*` conversions that were incorrectly using `as`.
* Rename unstable `Value::to_error` to `Value::to_borrowed_error`.

## [0.4.13] - 2021-01-11

* This is the same as `0.4.11`, except with a `kv_unstable_std` feature added to aid migrating current dependents to `0.4.14` (which was originally going to be `0.4.13` until it was decided to create a patch from `0.4.11` to minimize disruption).

## [0.4.12] - 2020-12-24

### New

* Support platforms without atomics by racing instead of failing to compile
* Implement `Log` for `Box<T: Log>`
* Update `cfg-if` to `1.0`
* Internal reworks of the structured logging API. Removed the `Fill` API
and added `source::as_map` and `source::as_list` to easily serialize a `Source`
as either a map of `{key: value, ..}` or as a list of `[(key, value), ..]`.

### Fixed

* Fixed deserialization of `LevelFilter` to use their `u64` index variants

## [0.4.11] - 2020-07-09

### New

* Support coercing structured values into concrete types.
* Reference the `win_dbg_logger` in the readme.

### Fixed

* Updates a few deprecated items used internally.
* Fixed issues in docs and expands sections.
* Show the correct build badge in the readme.
* Fix up a possible inference breakage with structured value errors.
* Respect formatting flags in structured value formatting.

## [0.4.10] - 2019-12-16 (yanked)

### Fixed

* Fixed the `log!` macros, so they work in expression context (this regressed in `0.4.9`, which has been yanked).

## [0.4.9] - 2019-12-12 (yanked)

### Minimum Supported Rust Version

This release bumps the minimum compiler version to `1.31.0`. This was mainly needed for `cfg-if`,
but between `1.16.0` and `1.31.0` there are a lot of language and library improvements we now
take advantage of.

### New

* Unstable support for capturing key-value pairs in a record using the `log!` macros

### Improved

* Better documentation for max level filters.
* Internal updates to line up with bumped MSRV

## [0.4.8] - 2019-07-28

### New

* Support attempting to get `Record` fields as static strings.

## [0.4.7] - 2019-07-06

### New

* Support for embedded environments with thread-unsafe initialization.
* Initial unstable support for capturing structured data under the `kv_unstable`
feature gate. This new API doesn't affect existing users and may change in future
patches (so those changes may not appear in the changelog until it stabilizes).

### Improved

* Docs for using `log` with the 2018 edition.
* Error messages for macros missing arguments.

## [0.4.6] - 2018-10-27

### Improved

* Support 2018-style macro import for the `log_enabled!` macro.

## [0.4.5] - 2018-09-03

### Improved

* Make `log`'s internal helper macros less likely to conflict with user-defined
  macros.

## [0.4.4] - 2018-08-17

### Improved

* Support 2018-style imports of the log macros.

## [0.4.3] - 2018-06-29

### Improved

* More code generation improvements.

## [0.4.2] - 2018-06-05

### Improved

* Log invocations now generate less code.

### Fixed

* Example Logger implementations now properly set the max log level.

## [0.4.1] - 2017-12-30

### Fixed

* Some doc links were fixed.

## [0.4.0] - 2017-12-24

The changes in this release include cleanup of some obscure functionality and a more robust public
API designed to support bridges to other logging systems, and provide more flexibility to new
features in the future.

### Compatibility

Vast portions of the Rust ecosystem use the 0.3.x release series of log, and we don't want to force
the community to go through the pain of upgrading every crate to 0.4.x at the exact same time. Along
with 0.4.0, we've published a new 0.3.9 release which acts as a "shim" over 0.4.0. This will allow
crates using either version to coexist without losing messages from one side or the other.

There is one caveat - a log message generated by a crate using 0.4.x but consumed by a logging
implementation using 0.3.x will not have a file name or module path. Applications affected by this
can upgrade their logging implementations to one using 0.4.x to avoid losing this information. The
other direction does not lose any information, fortunately!

**TL;DR** Libraries should feel comfortable upgrading to 0.4.0 without treating that as a breaking
change. Applications may need to update their logging implementation (e.g. env-logger) to a newer
version using log 0.4.x to avoid losing module and file information.

### New

* The crate is now `no_std` by default.
* `Level` and `LevelFilter` now implement `Serialize` and `Deserialize` when the `serde` feature is
    enabled.
* The `Record` and `Metadata` types can now be constructed by third-party code via a builder API.
* The `logger` free function returns a reference to the logger implementation. This, along with the
    ability to construct `Record`s, makes it possible to bridge from another logging framework to
    this one without digging into the private internals of the crate. The standard `error!` `warn!`,
    etc., macros now exclusively use the public API of the crate rather than "secret" internal APIs.
* `Log::flush` has been added to allow crates to tell the logging implementation to ensure that all
    "in flight" log events have been persisted. This can be used, for example, just before an
    application exits to ensure that asynchronous log sinks finish their work.

### Removed

* The `shutdown` and `shutdown_raw` functions have been removed. Supporting shutdown significantly
    complicated the implementation and imposed a performance cost on each logging operation.
* The `log_panics` function and its associated `nightly` Cargo feature have been removed. Use the
    [log-panics](https://crates.io/crates/log-panics) instead.

### Changed

* The `Log` prefix has been removed from type names. For example, `LogLevelFilter` is now
    `LevelFilter`, and `LogRecord` is now `Record`.
* The `MaxLogLevelFilter` object has been removed in favor of a `set_max_level` free function.
* The `set_logger` free functions have been restructured. The logger is now directly passed to the
    functions rather than a closure which returns the logger. `set_logger` now takes a `&'static
    Log` and is usable in `no_std` contexts in place of the old `set_logger_raw`. `set_boxed_logger`
    is a convenience function which takes a `Box<Log>` but otherwise acts like `set_logger`. It
    requires the `std` feature.
* The `file` and `module_path` values in `Record` no longer have the `'static` lifetime to support
    integration with other logging frameworks that don't provide a `'static` lifetime for the
    equivalent values.
* The `file`, `line`, and `module_path` values in `Record` are now `Option`s to support integration
    with other logging frameworks that don't provide those values.

### In the Future

* We're looking to add support for *structured* logging - the inclusion of extra key-value pairs of
    information in a log event in addition to the normal string message. This should be able to be
    added in a backwards compatible manner to the 0.4.x series when the design is worked out.

## Older

Look at the [release tags] for information about older releases.

[Unreleased]: https://github.com/rust-lang-nursery/log/compare/0.4.33...HEAD
[0.4.32]: https://github.com/rust-lang/log/compare/0.4.32...0.4.33
[0.4.32]: https://github.com/rust-lang/log/compare/0.4.31...0.4.32
[0.4.31]: https://github.com/rust-lang/log/compare/0.4.30...0.4.31
[0.4.30]: https://github.com/rust-lang/log/compare/0.4.29...0.4.30
[0.4.29]: https://github.com/rust-lang/log/compare/0.4.28...0.4.29
[0.4.28]: https://github.com/rust-lang/log/compare/0.4.27...0.4.28
[0.4.27]: https://github.com/rust-lang/log/compare/0.4.26...0.4.27
[0.4.26]: https://github.com/rust-lang/log/compare/0.4.25...0.4.26
[0.4.25]: https://github.com/rust-lang/log/compare/0.4.24...0.4.25
[0.4.24]: https://github.com/rust-lang/log/compare/0.4.23...0.4.24
[0.4.23]: https://github.com/rust-lang/log/compare/0.4.22...0.4.23
[0.4.22]: https://github.com/rust-lang/log/compare/0.4.21...0.4.22
[0.4.21]: https://github.com/rust-lang/log/compare/0.4.20...0.4.21
[0.4.20]: https://github.com/rust-lang-nursery/log/compare/0.4.19...0.4.20
[0.4.19]: https://github.com/rust-lang-nursery/log/compare/0.4.18...0.4.19
[0.4.18]: https://github.com/rust-lang-nursery/log/compare/0.4.17...0.4.18
[0.4.17]: https://github.com/rust-lang-nursery/log/compare/0.4.16...0.4.17
[0.4.16]: https://github.com/rust-lang-nursery/log/compare/0.4.15...0.4.16
[0.4.15]: https://github.com/rust-lang-nursery/log/compare/0.4.13...0.4.15
[0.4.14]: https://github.com/rust-lang-nursery/log/compare/0.4.13...0.4.14
[0.4.13]: https://github.com/rust-lang-nursery/log/compare/0.4.11...0.4.13
[0.4.12]: https://github.com/rust-lang-nursery/log/compare/0.4.11...0.4.12
[0.4.11]: https://github.com/rust-lang-nursery/log/compare/0.4.10...0.4.11
[0.4.10]: https://github.com/rust-lang-nursery/log/compare/0.4.9...0.4.10
[0.4.9]: https://github.com/rust-lang-nursery/log/compare/0.4.8...0.4.9
[0.4.8]: https://github.com/rust-lang-nursery/log/compare/0.4.7...0.4.8
[0.4.7]: https://github.com/rust-lang-nursery/log/compare/0.4.6...0.4.7
[0.4.6]: https://github.com/rust-lang-nursery/log/compare/0.4.5...0.4.6
[0.4.5]: https://github.com/rust-lang-nursery/log/compare/0.4.4...0.4.5
[0.4.4]: https://github.com/rust-lang-nursery/log/compare/0.4.3...0.4.4
[0.4.3]: https://github.com/rust-lang-nursery/log/compare/0.4.2...0.4.3
[0.4.2]: https://github.com/rust-lang-nursery/log/compare/0.4.1...0.4.2
[0.4.1]: https://github.com/rust-lang-nursery/log/compare/0.4.0...0.4.1
[0.4.0]: https://github.com/rust-lang-nursery/log/compare/0.3.8...0.4.0
[release tags]: https://github.com/rust-lang-nursery/log/releases