diff --git a/assets/styles/base.scss b/assets/styles/base.scss
index 1be022933..f2430c580 100644
--- a/assets/styles/base.scss
+++ b/assets/styles/base.scss
@@ -6,6 +6,9 @@
--lt-colours-gray: var(--outlinegray) !important;
}
+
+img[alt="overment"] { width: 200px; display: block; margin-inline: auto; }
+
h1, h2, h3, h4, h5, h6, ol, ul, thead {
font-family: Inter;
color: var(--dark);
@@ -15,7 +18,6 @@ h1, h2, h3, h4, h5, h6, ol, ul, thead {
}
p, ul, text {
- font-family: 'Source Sans Pro', sans-serif;
color: var(--gray);
fill: var(--gray);
font-weight: revert;
@@ -154,7 +156,7 @@ td, th {
article {
& > .meta {
- margin: -1.5em 0 1em 0;
+ margin: 1.5em 0 1em 0;
opacity: 0.7;
}
@@ -569,3 +571,5 @@ header {
padding: 0 1em;
}
}
+
+
diff --git a/assets/styles/custom.scss b/assets/styles/custom.scss
index 612b80a61..da1afd96a 100644
--- a/assets/styles/custom.scss
+++ b/assets/styles/custom.scss
@@ -21,4 +21,135 @@
--gray: #d4d4d4 !important;
--lightgray: #292633 !important;
--outlinegray: #343434 !important;
+}
+
+:root {
+ --text-accent: rgb(238, 27, 231);
+ --background-primary-alt: #000;
+}
+.theme-dark {
+ --text-accent: rgb(238, 27, 231);
+ --background-primary-alt: #000;
+}
+
+html {
+ font-size: 24px;
+ font-family: "Poppins", sans-serif;
+}
+
+body, body.theme-dark {
+ color: #fff;
+ width: 100%;
+ height: 100%;
+ margin: 0;
+ padding: 0;
+ font-size: .75rem;
+ background: #111;
+ box-sizing: border-box;
+ font-family: "Poppins", sans-serif;
+ font-weight: 500;
+ line-height: 1em;
+ font-smoothing: antialiased;
+ text-size-adjust: 100%;
+ -ms-text-size-adjust: 100%;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-text-size-adjust: 100%;
+}
+
+#page-title a { display: flex; align-items: center; color: #fff; font-size: .75rem; }
+#page-title img { margin-right: 15px; }
+
+.mainTOC { background: #222; }
+
+article a {
+ color: rgb(238, 27, 231); background: none;
+}
+article a.internal-link { background: none; }
+
+body.theme-dark h1,
+body.theme-dark h2,
+body.theme-dark h3,
+body.theme-dark h4,
+body.theme-dark h5,
+body.theme-dark h6,
+body.theme-dark .page-header {
+ font-family: 'Playfair Display', serif;
+ margin-top: 45px;
+ margin-bottom: 25px;
+}
+
+.page-header {
+ font-size: 2.5rem;
+}
+
+.markdown-preview-view h1 {
+ font-size: 32px;
+ font-family: 'Playfair Display', sans-serif;
+ font-weight: 500;
+ line-height: 1.5;
+}
+
+.markdown-preview-view {
+ font-size: 16px;
+ line-height: 26px;
+ font-family: 'Poppins', sans-serif;
+}
+
+.markdown-preview-view .internal-link.is-unresolved {
+ opacity: .75;
+}
+.published-container.is-readable-line-width .site-body {
+ justify-content: initial;
+}
+
+.site-body-left-column-site-name {
+ padding-left: 60px;
+ position: relative;
+}
+
+.site-body-left-column {
+ flex: 0 0 330px;
+}
+
+.published-container.is-readable-line-width .site-body-center-column {
+ flex: 0 1 940px;
+}
+
+.site-body-left-column-site-name:before {
+ content: '';
+ display: block;
+ width: 30px;
+ height: 30px;
+ background: url(https://overment.com/images/logo-icon.svg);
+ background-size: cover;
+ position: absolute;
+ left: 20px;
+ top: 11px;
+}
+
+.has-navigation .site-body-left-column {
+ background: #000;
+}
+
+img[alt="overment"] { width: 200px; margin: 0 auto; display: block; }
+.logo { width: 50px; margin: 0; }
+
+
+@media (max-width: 1024px) {
+ .site-body-left-column-site-name:before {
+ top: 0;
+ }
+ body.theme-dark {
+ font-size: 1.2rem;
+ }
+
+ h1, h2, h3, h4, h5, h6, {
+ margin-top: 25px;
+ }
+
+ .markdown-preview-view {
+ font-size: 1.3rem;
+ line-height: 1.7rem;
+ }
}
\ No newline at end of file
diff --git a/bin/hugo-obsidian b/bin/hugo-obsidian
new file mode 100755
index 000000000..cf1432c61
Binary files /dev/null and b/bin/hugo-obsidian differ
diff --git a/config.toml b/config.toml
index 5c4dfcb40..7bccb971c 100644
--- a/config.toml
+++ b/config.toml
@@ -1,6 +1,6 @@
-baseURL = "https://quartz.jzhao.xyz/"
+baseURL = "/"
languageCode = "en-us"
-googleAnalytics = "G-XYFD95KB4J"
+googleAnalytics = ""
pygmentsUseClasses = true
relativeURLs = false
disablePathToLower = true
diff --git a/content/Fundamenty/Dziennik.md b/content/Fundamenty/Dziennik.md
new file mode 100644
index 000000000..f3a155d2d
--- /dev/null
+++ b/content/Fundamenty/Dziennik.md
@@ -0,0 +1,34 @@
+---
+title: Dziennik
+---
+
+Dziennik prowadzę na [[Optymalizacja/Sprzęt/iPad]] w aplikacji [[Optymalizacja/Narzędzia/Notability]]. Pierwsze notatki jeszcze zapisywałem w aplikacji [[Bear]] jeszcze w 2016 roku.
+
+## Dlaczego
+To dla mnie sposób na "wyrzucenie śmieci z głowy" (koncepcja od [[Wiedza/Ludzie/Dan Millman]]).
+Oprócz tego pisanie jest ekspresją myśli. Pisząc usprawniamy swój proces myślenia, na czym bardzo mi zależy. Podobną rolę pełnią [[Wiedza/Modele Mentalne/Modele mentalne]]
+
+Oprócz pisania również czytam swój dziennik, co daje mi świetną [[Wiedza/Słownik/Perspektywa]] (np. poprzez spojrzenie na siebie i swoje postawy sprzed lat).
+
+## Zasady
+- Piszę praktycznie codziennie
+- Nie mam ustalonej pory ani struktury
+- Jestem ze sobą szczery w myśl Radykalnej Transparentności z książki [[Wiedza/Ksiazki/Principles]] oraz [[Wiedza/Ksiazki/That Will Never Work]]
+- Nie mam wymagań dotyczących ilości
+- Piszę to, co w danej chwili mam w głowie
+- Czasem piszę w "trzeciej" osobie w celu zyskania dystansu do pisanych słów
+- Często wracam do notatek zapisanych miesiące i lata wcześniej
+
+## Regularność
+Według mnie jednym z największych istniejących mitów i jednocześnie przeszkód, w prowadzeniu dziennika, jest przekonanie i sugestie, że musi się to dziać regularnie.
+
+Dopiero od momentu w którym zdefiniowałem wyżej wymienione zasady, byłem w stanie "dopasować" prowadzenie dziennika do swojego rytmu dnia oraz zmieniających się warunków i nieprzewidzianych sytuacji.
+
+Takie "uwolnienie" ([[Wiedza/Ksiazki/Letting Go]]) się od sztucznych zasad, sprawiło że byłem w stanie wyrobić żelazny nawyk (więcej w [[Wiedza/Ksiazki/Atomic Habits]])
+
+## Powracanie
+Znam wiele osób, które prowadzą dziennik. Ale żadna z nich nigdy nie powiedziała mi, że nie tylko go pisze ale również wraca do notatek sprzed lat.
+
+Nie robię tego regularnie, ale zawsze wtedy gdy mam więcej wolnego czasu. Niemal za każdym razem jest to czas ogromnych refleksji i napływu pomysłów oraz nowej energii.
+
+Najważniejszą wartością z tej czynności jest nowa [[Wiedza/Słownik/Perspektywa]].
\ No newline at end of file
diff --git a/content/Fundamenty/Kierunek.md b/content/Fundamenty/Kierunek.md
new file mode 100644
index 000000000..f47293cb2
--- /dev/null
+++ b/content/Fundamenty/Kierunek.md
@@ -0,0 +1,15 @@
+---
+title: Kierunek
+---
+
+# Czym jest kierunek?
+Kierunek zastąpił mi [[Wiedza/Słownik/Cel]]e. Teraz zamiast określać mniejsze lub większe punkty do których dążę, mam jasno określoną stronę w którą zmierzam.
+
+Kierunek może też być utożasamiany z wizją lub życiową filozofią o której więcej pisałem mówiąc o [[Fundamenty/Wartości]].
+
+Mając tak określony kierunek, dbam o to aby nieustannie optymalizować mój [[Fundamenty/Proces]] dzięki któremu nieustannie poruszam się we właściwą stronę, utrzymując odpowiednie tempo ([[Wiedza/Modele Mentalne/20 mile march]])
+
+## Mój kierunek
+Dążę do tego aby **nieustannie się rozwijać** i **inspirować innych do rozwoju**, robiąc to w **najbardziej skuteczny sposób** i działając na **maksymalnie dostępnej skali**, wykorzystując dźwignię (eng. [[Wiedza/Modele Mentalne/Leverage]]).
+
+Powyższe określenie mojego kierunku urzeczywistniam każdego dnia w niemal każdej podejmowanej przeze mnie czynności. **O tym jest moje życie.**
\ No newline at end of file
diff --git a/content/Fundamenty/Poznawanie siebie.md b/content/Fundamenty/Poznawanie siebie.md
new file mode 100644
index 000000000..b725b729f
--- /dev/null
+++ b/content/Fundamenty/Poznawanie siebie.md
@@ -0,0 +1,95 @@
+---
+title: Poznawanie
+---
+
+> (ltn. Poznaj Samego Siebie)
+
+## Kontekst
+> ⚠️ Testy osobowości to narzędzia. Niczego nie defininują, tylko wskazują przydatne elementy. Ich największą zaletą jest fakt, że zachęcają do refleksji nad samym sobą oraz porównywania ich wyników z rzeczywistością.
+
+> Wykonanie testu niewiele daje. Skuteczność osiągnąłem dopiero po eksploracji załączonych materiałów oraz czytaniu książek na ich temat.
+
+## MBTI
+[[Wiedza/Inne/MBTI]] lub inaczej test 16 osobowości (chociaż według niektórych źródeł MBTI to nie 16 osobowości). Polecany przez [[Wiedza/Ludzie/Ray Dalio]]. W [[Wiedza/Ksiazki/Principles]] napisał, że w oparciu o niego budował zespół rozwijając niemal od zera największy na świecie fundusz inwestycyjny.
+
+> ℹ️ Według niektórych źródeł, test 16 osobowości ma niewiele wspólnego z MBTI.
+
+Mój profil: **INFJ**
+
+W celu eksploracji profilu przeczytałem m.in.:
+- [[Wiedza/Ksiazki/Understanding the INFJ Personality Type]]
+- oraz [ten dokument](https://idigitalcitizen.files.wordpress.com/2011/02/infj-profile-counselor-protector-pdf2.pdf)
+
+**Najważniejsze wnioski:**
+- INFJ to profil sprzeczności
+- Polegam niemal w całości na swojej intuicji ([[Wiedza/Ksiazki/Blink]])
+- Mam raczej ambiwertyczną naturę
+- Sam profil jest bardzo rzadki (1-3% ludzkości w tym 50% to mężczyźni)
+- Potrafię z łatwością czytać nawet subtelne emocje i uczucia
+- Jestem wysoko wrażliwy ([[Wiedza/Ksiazki/Daring Greatly]] pomogła mi zrozumieć ten temat)
+
+## StrenghtsFinder
+[[Wiedza/Inne/StrenghtsFinder]] inaczej test Gallupa. Jeden z najczęściej polecanych narzędzi do rozwoju. Opiera się o odkrywanie swoich naturalnych predyspozycji, które rozwijane mogą stać się mocnymi stronami.
+
+Mój wynik:
+
+
+
+**Mój proces pracy z Gallupem:**
+- Przeczytałem **wszystkie** dołączone materiały na temat wszystkich talentów.
+- Zapisałem najważniejsze sugestie z TOP15
+- Zapisałem obserwacje (czyli jak to wygląda w moim przypadku)
+- Zapisałem wnioski (czyli jak się mają obserwacje do ich sugestii)
+- Zapisałem plan działania (czyli jakie aktywności podejmuję aby rozwijać talenty)
+- Przełożyłem wszystko na realne aktywności. Część z nich realizuję do dzisiaj.
+
+Uważam że StrengthsFinder odegrał w moim życiu ogromną rolę ale tylko dlatego, że bardzo aktywnie pracowałem z informacjami, które tam otrzymałem.
+
+⚠️ Powyższe wyniki testu pochodzą z drugiego wykonania, podjętego kilka lat później po pierwszej. Dla porównania rezultat pierwszej próby umieszczam poniżej:
+
+
+Należy tutaj uwzględnić kilka ważnych elementów, które miały miejsce pomiędzy wykonaniem testów. Mowa m.in. o:
+- całkowitej zmianie otoczenia
+- ogromnej zmiany zawodowej (odejścia z firmy)
+- kilkuletniej terapii u psychologa
+
+Nie oceniam tych zmian, jednak z całą pewnością mogę stwierdzić, że odzwierciedlają one stan obecny. W szczególności mowa o ukierunkowaniu na podejmowanie działania.
+
+## Principles You
+[[Wiedza/Inne/Principles You]] to nowe narzędzie zaprojektowane przez [[Wiedza/Ludzie/Ray Dalio]].
+
+Mój wynik to: [The Quiet Leader](https://principlesyou.com/archetypes/quietleader)
+
+### Styl myślenia
+
+
+### Interakcje z innymi
+
+
+### Stosunek wobec siebie
+
+
+Ze względu na to, że test wykonałem kilka miesięcy temu, na ten moment nie mam konkretnych sugestii ani obserwacji poza jednym: często podejmuję działania które nie są powiązane z efektami na których mi zależy.
+
+## The Big Five
+[[Wiedza/Inne/The Big Five]] to dość ogólny ale według moich informacji bardzo mocno "udokumentowany" test.
+
+
+
+Wykonałem go na stronie [[Peter Peterson]]:
+[https://www.understandmyself.com/personality-assessment](https://www.understandmyself.com/personality-assessment)
+
+## Self Authoring
+Poza nim zrealizowałem również Program Self Authoring do którego wkrótce wracam.
+[https://www.selfauthoring.com](https://www.selfauthoring.com/)
+
+Self Authoring to starannie zaprojektowany i wymagający Program pomagający odkryć przeszłość, teraźniejszość oraz zaplanować przyszłość. W jego kontekście najważniejsze zdanie jakie utkwiło mi w pamięci, mówiło o tym, że w szkole uczą nas tego jak pisać o kimś a nikt nie uczy nas prawdziwie pisać o sobie.
+
+## Disc 3.0
+To badanie jako jedyne wyłącznie wykonałem i pobierznie przejrzałem wyniki. W dużym stopniu pokrywały się z pozostalymi testami ale jednocześnie ich sposób przekazania zupełnie do mnie nie przemówił.
+
+Tutaj warto dodać, że Disc wykonywałem dość dawno temu i nie mam wątpliwości, że od tego czasu wiele mogło się tutaj zmienić.
+
+
+
+
\ No newline at end of file
diff --git a/content/Fundamenty/Proces.md b/content/Fundamenty/Proces.md
new file mode 100644
index 000000000..a43edd73a
--- /dev/null
+++ b/content/Fundamenty/Proces.md
@@ -0,0 +1,149 @@
+---
+title: Proces
+name: Proces
+page_title: Proces omg
+---
+
+Działam w oparciu o autorski [[Wiedza/Słownik/Proces]] zaprojektowany z myślą o mnie. Nieustannie go kwestionuję, modyfikuję oraz ulepszam. Prawdopodobnie **nie zadziała u Ciebie.** Z pewnością znajdziesz tutaj jednak wiele inspiracji oraz źródeł, które pomogą Ci zbudować swój własny.
+
+> Wszyscy nieustannie mówią Ci co jest dla Ciebie dobre. Nie chcą abyś szukał własnych odpowiedzi. Chcą abyś uwierzył w ich. ~ [[Wiedza/Ludzie/Dan Millman]]
+
+## Kontekst
+
+Powszechnie przyjęło się, że wyznaczenie [[Wiedza/Słownik/Cel]]u jest **niezbędne do osiągnięcia rezultatów.** Inni mówią, że lepiej pracować w oparciu o [[Wiedza/Słownik/Proces]].
+
+Sam działam w oparciu o [[Wiedza/Słownik/Cel]] ORAZ [[Wiedza/Słownik/Proces]] (koncepcja [[Wiedza/Modele Mentalne/Genius of The AND]] od [[Wiedza/Ludzie/Jim Collins]]).
+
+W praktyce trudno jest mi określić przyszłość na dłużej niż tydzień do przodu. Nie rzadko nie mam zielonego pojęcia co będę robił kolejnego dnia. Jednocześnie posiadam ogólny zarys tego, dokąd zmierzam.
+
+### Cele
+
+Dobrze wyznaczony [[Wiedza/Słownik/Cel]] określa miejsca i czas realizacji (\([SMART](https://www.mindtools.com/pages/article/smart-goals.htm)\)). W połączeniu z wizualizacją zrealizowanego celu, kształtujemy odpowiednie postawy (np. entuzjazm -> [[Fundamenty/Wartości]]).
+
+W przypadku dużego celu, wystarczy podzielić go na mniejsze aby zmniejszyć "opór" ([[Wiedza/Ksiazki/War of Art]]). Realizacja mniejszych celów nadaje [[Momentum]] poprzez m.in. wykorzystanie dopaminy o której więcej mówi [[Wiedza/Ludzie/Andrew Huberman#Motywacja Drive]]
+
+**W praktyce cele mają wady:**
+- budują [[Wiedza/Przemyślenia/Oczekiwania]], które mogą nie zgodzię się z [[Wiedza/Przemyślenia/Rzeczywistość]] (rezultatem)
+- nigdy nie wiemy CZY naprawdę tego chcemy
+- nigdy nie wiemy co tak naprawdę otrzymamy [[Wiedza/Ludzie/Dan Millman#Oczekiwania wobec celu]]
+- realizacja dużego celu daje efekt **"no dobra, ale co teraz?!"**
+- zrezygnowanie z celu lub modyfikacja nie jest łatwa (np. ze względu na [[Commitment and Consistency Bias]] i/lub [[Wiedza/Modele Mentalne/Status quo bias]]
+
+Między innymi z powyższych powodów, stosuję cele w pojedynczych przypadkach. Wcześniej stosowałem system [[OKR]]. Dziś głównie działam w oparciu o [[Wiedza/Słownik/Proces]] i [[Wiedza/Słownik/Kierunek]].
+
+### Kierunek vs. Cel
+- [[Wiedza/Słownik/Cel]] posiada datę realizacji i warunki jego spełnienia. [[Wiedza/Słownik/Kierunek]] nie.
+- Z definicji w kierunku można podążać ale nie da się do niego dojść.
+- Różnica pomiędzy jednym a drugim ma dużą rolę narracyjną a jak mówi [[Wiedza/Ludzie/David Goggins]], dialog który odbywamy ze sobą jest najważniejszym ze wszystkich.
+
+### Proces
+Działam w oparciu o nieustannie optymalizowany [[Wiedza/Słownik/Proces]] uwzględniający:
+
+* Fundamenty \(sen, dieta, sport, nuda\)
+* Poznawanie siebie \(pisanie dziennika i czytanie go, StrengthsFinder, MBTI, Principles You\)
+* Otoczenie \(ludzie z którymi spędzam czas\)
+* Rozwój \([[Fundamenty/System zdobywania wiedzy]], poznawanie modeli mentalnych, czytanie książek\)
+* Dźwignię ([[Wiedza/Modele Mentalne/Leverage]])) \(moja godzina generuje zwielokrotniony efekt\)
+* Wolność \(nie sprzedaję mojego czasu, unikam planowanych aktywności\)
+
+> Discipline equals Freedom ~ [[Wiedza/Ludzie/Jocko Willink]]
+
+**Przy projektowaniu swojego procesu opieram się o:**
+
+- Ciekawość - bo to ona prowadzi nas w niewyobrażalne miejsca.
+- Otwartość - również na to, że zarówno ja jak i każda inna osoba, zwyczajnie może się mylić a coś, co jest nawet powszechnie uznawane za prawdę, może mieć z nią niewiele wspólnego.
+- W realizacji tego procesu najważniejsze jest dla mnie utrzymanie [[Wiedza/Przemyślenia/Dyscyplina]] o której wiele mówi [[Wiedza/Ludzie/Jocko Willink]] oraz [[Wiedza/Ludzie/David Goggins]] w [[Wiedza/Ksiazki/Cant Hurt Me]].
+- W projektowaniu procesu zwracam uwagę na [[Wiedza/Modele Mentalne/Ergodicity]] oraz siłę dźwigni ([[Wiedza/Modele Mentalne/Leverage]]) i procentu składanego [[Wiedza/Ksiazki/The Compound Effect]]
+- W moim nastawieniu na proces ogromną rolę odegrał [[Wiedza/Ludzie/Dan Millman]] i jego książka [[Wiedza/Ksiazki/Way of The Peaceful Warrior]] oraz [[Wiedza/Ksiazki/How to Fail at Almost Anything and Still Win Big]] i [[Wiedza/Ksiazki/Pound the Stone]]
+- Branie pełnej odpowiedzialności za to co robię ([[Wiedza/Ksiazki/Extreme Ownership]]) i pełne zaangażowanie ([[Wiedza/Ksiazki/Skin in the Game]])
+- Po prostu działanie ([[Wiedza/Ksiazki/Do the Work]], [[Wiedza/Ksiazki/War of Art]])
+- Odpuszczanie ([[Wiedza/Ksiazki/Letting Go]], [[The Dip]])
+- Nieustanne kwestionowanie ([[Wiedza/Ksiazki/Think Again]]) i upraszczanie ([[Wiedza/Ksiazki/Simplify]] i [[Wiedza/Ksiazki/Insanely Simple]] oraz [[Wiedza/Ksiazki/Effortless]])
+- Działanie w oparciu o rzeczywistość ([[Wiedza/Ksiazki/Principles]], [[Wiedza/Ksiazki/Deviate]] i [[Wiedza/Ksiazki/Getting Real]])
+- Dopuszczanie popełniania błędów ([[Wiedza/Ksiazki/Black Box Thinking]] i [[Wiedza/Ksiazki/Think Like a Rocket Scientist]])
+- Poruszanie się na granicy swoich kompetencji
+- Nieustanną naukę i pozostawanie na bieżąco
+- Działanie w oparciu o nawyki ([[Wiedza/Ksiazki/Atomic Habits]] i [[Wiedza/Ksiazki/Deep Work]])
+- Wykorzystanie dźwigni ([[Wiedza/Modele Mentalne/Leverage]] i [[Wiedza/Ksiazki/The Compound Effect]])
+- Działanie długoterminowe ([[Wiedza/Ksiazki/The Infinite Game]], [[Wiedza/Ksiazki/Pound the Stone]], [[Wiedza/Ksiazki/So Good They Cant Ignore You]] oraz [[Wiedza/Ksiazki/How to Fail at Almost Anything and Still Win Big]])
+- Działanie w oparciu o intuicję ([[Wiedza/Ksiazki/Blink]])
+- Działanie w oparciu o rzeczy które mnie wzmacniają ([[Wiedza/Ksiazki/Antifragile]] i [[Wiedza/Ksiazki/Fooled by Randomness]])
+- Nie poddawanie się ([[Wiedza/Ksiazki/Grit]] oraz [[Wiedza/Ksiazki/That Will Never Work]])
+- Uczenie się wszystkiego, o wszystkim ([[Wiedza/Ksiazki/Way of The Peaceful Warrior]], [[Wiedza/Ksiazki/Range]] i [[Wiedza/Ksiazki/Rebel Ideas]])
+- Podejmowanie mądrych decyzji ([[Wiedza/Ksiazki/All I Want to Know is Where Im Going to Die So Ill Never Go There]], [[Wiedza/Ksiazki/The Great Mental Models]], [[Wiedza/Ksiazki/Seeking Wisdom]], [[Wiedza/Ksiazki/Gladiators, Pirates and Games of Trust]])
+- Rozumienie siebie (jest to fundament) ([[Wiedza/Ksiazki/Understanding the INFJ Personality Type]] oraz [[StrenghtsFinder 2.0]])
+- Kwestionowanie autorytetów [[Wiedza/Modele Mentalne/Authority bias]]
+
+## Mój [[Wiedza/Słownik/Proces]]
+
+### Fundamenty
+Fundamentem jest dla mnie zdrowie (fizyczne i psychiczne) oraz sen.
+
+- **Regularny sen** - [[Wiedza/Ludzie/Andrew Huberman#Master Your Sleep]]. Nie stosuję dodatkowych wspomagaczy. Unikam ekranów przed snem.
+- **Dieta** - regularne pory jedzenia + witaminy D, K, Omega 3 i magnez. Raz na kwartał 30 dni pyłku pszczelego rozcieńczonego przez noc w przegotowanej, ostudzonej wodzie (⚠️ UWAGA: pyłek pszczeli jest silnym alergenem.)
+- **Sport** - [3x w tygodniu](https://www.reddit.com/r/bodyweightfitness/wiki/kb/recommended_routine) + codzienne rozciąganie z [[Optymalizacja/Narzędzia/Romwod]]
+- Ćwiczenia oddechowe z [[Optymalizacja/Narzędzia/Oak]] & wskazówki [[Wiedza/Ludzie/Andrew Huberman#Oddychanie]]
+- [[Medytacja]] ~20-30 minut dziennie z [[Optymalizacja/Narzędzia/Headspace]], [[Optymalizacja/Narzędzia/Waking Up]] oraz [[Optymalizacja/Narzędzia/Reveri]]
+- [[Wiedza/Przemyślenia/Nuda]] - kluczowy element pozostawania kreatywnym
+- Ćwiczę umiejętność skupienia na podstawie [[Wiedza/Ksiazki/Deep Work]] i często słucham [[Optymalizacja/Narzędzia/Endel.io]]
+
+### Poznawanie siebie
+Poznawanie siebie to najważniejszy po fundamentach element mojego procesu.
+
+- **Prowadzenie [[Fundamenty/📓 Dziennik]]a**
+- **Testy osobowości** - [[Fundamenty/💛 Poznawanie siebie#MBTI]], [[Fundamenty/💛 Poznawanie siebie#StrenghtsFinder]], [[Fundamenty/💛 Poznawanie siebie#Principles You]], [[Fundamenty/💛 Poznawanie siebie#The Big Five]]
+- **Spędzanie czasu sam ze sobą** - bez rozproszeń i Internetu
+- **Pozostawanie otwartym** - staram się pozostawać otwartym na popełnianie błędów ([[Wiedza/Ksiazki/Think Like a Rocket Scientist]] & [[Wiedza/Ksiazki/Black Box Thinking]]) oraz fakt, że mogę się mylić.
+
+### Otoczenie
+Uważam że niemożliwa jest fundamentalna zmiana, natomiast nasze przekonania i nawyki mogą się zmieniać. Największy wpływ ma na nie nie nasze najbliższe otoczenie [[Wiedza/Słownik/Otoczenie]] oraz aktywne działanie ([[Wiedza/Ksiazki/Atomic Habits]])
+
+* **Najbliższe [[Wiedza/Słownik/Otoczenie]]** - Zwracam uwagę na to z kim spędzam najwięcej czasu.
+* **Proaktywność** - Aktywnie utrzymuję kontakt z wybranymi osobami.
+* **Odkrywanie** - Intencjonalnie docieram do osób z którymi "czuję" że chcę mieć kontakt.
+* **Ograniczenie** - Eliminuję spotkania i przebywanie wśród osób, które zabierają mi energię (lub ja im).
+
+> Otaczaj się ludźmi, którzy osiągnęli to, co Ty chcesz osiągnąć i masz z nimi coś wspólnego.
+
+#### 🔗 Źródła:
+- [[Wiedza/Ludzie/Naval Ravikant#Naval Kapil Gupta]]
+- [[Wiedza/Ludzie/Andrew Huberman#Rich Roll]]
+- [Marek Kaczmarzyk na TEDxBydgoszcz](https://www.youtube.com/watch?v=ivLcmB_Gogc&feature=emb_title) - "Skoro do naszego mózgu w każdej sekundzie dociera tak dużo informacji, to w jaki sposób wybierane są te, które są najbardziej istotne? Odpowiedź brzmi: **najważniejszą informacją dla naszego mózgu jest informacja o innym mózgu.**"
+
+### Rozwój
+Realizowanie i rozwijanie mojego [[Wiedza/Słownik/Proces]]u jest dla mnie priorytetem. Niemal w 100% opieram go o źródła anglojęzyczne.
+
+- [[Modele mentalne]] - wiedza na ich temat to supermoc, pomaga w myśleniu oraz podejmowaniu decyzji - a wierzę, że to o nich jest nasze życie.
+- [[Wiedza/Ksiazki/Ksiazki]] - czytanie jest dla mnie jednym z głównych elementów procesu mojego rozwoju
+- [[Wiedza/Podcasty/Podcast]]
+- Specjalizacja i Generalizacja - nie posiadam żadnej specjalizacji. Uczę się wszystkiego o wszystkim ([[Wiedza/Ksiazki/Range]] & [[T-Shape Leader]])
+
+### System zdobywania wiedzy
+Jest to mój sposób na to aby szybko zdobywać nowe umiejętności oraz pozostawać na bieżąco w moim kręgu umiejętności i wiedzy ([[Wiedza/Modele Mentalne/Circle of Competence]]).
+
+Zobacz więcej 👉 [[Fundamenty/📚 System zdobywania wiedzy]].
+
+
+### Dźwignia [[Wiedza/Modele Mentalne/Leverage]]
+
+> Dajcie mi punkt podparcia, a poruszę ziemię. ~ Archimedes
+
+Koncepcja dźwigni ([[Wiedza/Modele Mentalne/Leverage]]) jest jedną z najważniejszych jakie znam. Dzięki niej raz wykonana praca daje mi efekty przez lata.
+
+- Mój czas nie jest na sprzedaż ([[Wiedza/Ksiazki/Principles]]) - od Q2 2020 podjąłem decyzję o tym, że nie będę sprzedawał swojego czasu.
+- Podejmuję działania wykorzystujące skalę oraz pomagające innym przez długi czas.
+- Podejmując działania zadaję sobie pytanie "jak z mojej jednej godziny zrobić 100?" [[Wiedza/Modele Mentalne/Leverage]]
+- [[Optymalizacja/Optymalizacja]] - zwracam uwagę na drobne szczegóły. Eliminuję je lub optymalizuję (np. przez upraszczanie) do granic możliwości (albo rozsądku).
+- [[Optymalizacja/Automatyzacja/Automatyzacja]] - automatyzuję wiele obszarów mojej aktywności. Posiadam armię robotów, która pracuje dla mnie dzień i noc.
+
+> Najbardziej interesującą i najważniejszą formą dźwigni jest idea produktu z minimalnym kosztem replikacji. ~ [[Wiedza/Ludzie/Naval Ravikant]]
+
+### Finanse
+Niemal w całości opieram swoje przychody o asymetryczne źródła przychodu: subskrypcje, prowizje, udziały i inwestycje.
+
+Łącząc to z optymalizacją swojego [[Fundamenty/Proces]]u z każdym kolejnym dniem generowana przeze mnie wartość oraz moje zarobki rosną nieporporcjonalnie do mojego zaangażowania czasowego.
+
+#### 🔗 Źródła:
+
+* [[Wiedza/Ludzie/Naval Ravikant]] o dźwigni [[Wiedza/Modele Mentalne/Leverage]] [https://nav.al/product-media](https://nav.al/product-media)
+* Trends VC o 1-osobowym, milionowym biznesie [https://trends.vc/trends-0065-million-dollar-one-person-businesses/](https://trends.vc/trends-0065-million-dollar-one-person-businesses/)
diff --git a/content/Fundamenty/System zdobywania wiedzy.md b/content/Fundamenty/System zdobywania wiedzy.md
new file mode 100644
index 000000000..0703570dd
--- /dev/null
+++ b/content/Fundamenty/System zdobywania wiedzy.md
@@ -0,0 +1,39 @@
+---
+title: System zdobywania wiedzy
+---
+
+Umiejętność **szybkiego zdobywania wiedzy** postrzegam jako jedną z najważniejszych, szczególnie w obliczu bardzo szybko zmieniającego się świata. W związku z tym, że jest to umiejętność, można ją po prostu rozwijać.
+
+Przykładowo widzę po sobie, że moja pamięć stała się nieporównywalnie lepsza na przestrzeni ostatnich lat. Mogę się mylić ale zakładam, że mają na to wpływ:
+- czytanie [[Wiedza/Ksiazki/Ksiazki]]
+- wiedza z podcastu [[Wiedza/Podcasty/Huberman Lab]]
+- zadbanie o [[Fundamenty/Proces#Fundamenty]] (np. o sen i odpoczynek)
+
+## Jak uczę się nowych tematów?
+To proces oparty o **otaczanie się wybranym tematem** w oparciu o **najlepsze dostępne źródła**, które starannie wybieram. Uważam że to one definiują to jak skutecznie się uczę.
+
+Źródła zwykle skupione są wokół ludzi lub projektów. Wokół nich również pojawiają się osoby, które warto obserwować. Można powiedzieć, że to "sieć powiązań", która pozwala nam docierać do kolejnych źródeł i tym samym kształtować całe nasze otoczenie.
+
+Książki to kolejny element procesu zdobywania wiedzy. Kluczowe jest tylko to aby wybrać odpowiednie tytuły. W tym pomagają wspomniane wyżej źródła.
+
+**Zatem w uproszczeniu:**
+- traktuję cały proces jako zabawę i spędzanie dobrego czasu
+- wszystko co znajdę przyjmuję z otwartością i dystansem
+ - otwartość: zakładam, że informacja jest prawdziwa i wartościowa
+ - dystans: nie ufam jej w 100% i zakładam, że może wprowadzać mnie w błąd
+ - połączenie otwartości i dystansu daje możliwość opracowania **jeszcze lepszych** praktyk niż te rekomendowane przez "najlepszych"
+- docieram do najlepszych możliwych źrodeł (blogi, artykuły, kanały youtube, konta na twitterze, kursy online)
+- poznaję osoby, będące u "źródła" danego tematu (np. twórcy technologii czy wybitni eksperci). Zwykle robię to na Twitterze lub Instagramie
+- odkrywam tytuły polecanych książek oraz takie które mnie zaintrygują
+- zapisuję się na newslettery wyżej wspomnianych osób
+
+## Jak dużo się uczę?
+Nie mierzę tego w żaden sposób, ale uczenie się jest praktycznie nieodłącznym elementem mojego dnia. Oznacza to że praktycznie każdą wolną chwilę wykorzystuję na nauczenie się czegoś nowego. Jednocześnie mam też przestrzeń na totalne niemyślenie, odpoczynek i "ciszę", co również postrzegam jako bardzo ważny element procesu zdobywania wiedzy.
+
+### Źródła
+- https://changingminds.org
+- https://fs.blog
+- https://mindtools.com
+- http://www.paulgraham.com
+- https://www.britannica.com/browse/Science
+- https://www.wealest.com
diff --git a/content/Fundamenty/Wartości.md b/content/Fundamenty/Wartości.md
new file mode 100644
index 000000000..8c5414b10
--- /dev/null
+++ b/content/Fundamenty/Wartości.md
@@ -0,0 +1,36 @@
+---
+title: Wartości
+---
+
+# Wartości
+Moje fundamentalne wartości ułatwiają mi podejmowanie decyzji podczas realizacji [[Fundamenty/Proces]] i dążeniu w wyzaczonym przeze mnie [[Fundamenty/🧭 Kierunek]]
+
+Każda z poniższych wartości jest dla mnie tak samo ważna i niezmienna na przestrzeni całego życia.
+
+## Moja życiowa filozofia:
+**Inspirowanie innych** do rozwoju.
+
+## Moje wartości:
+- **Rozwój:** Jestem ciekawy Świata ([[Ciekawość]])
+- **Wolność:** Dyscyplina daje mi wolność ([[Wiedza/Ludzie/Jocko Willink]])
+- **Entuzjazm:** Pozytywne nastawienie pozwala mi pokonywać przeciwności
+
+## Jak wykorzystuję swoje wartości?
+Podejmując codzienne decyzję, wracam myślami do moich wartości pytając "Czy ta decyzja jest zgodna z nimi i prowadzi mnie w ustalonym przeze mnie kierunku?".
+
+Jeżeli tak, to nie zastanawiam się dwa razy.
+
+Skraca to proces decyzyjny oraz daje niemal pewność, że podjęta decyzja jest właściwa. Należy jednak jeszcze brać pod uwagę nasze postrzeganie [[Wiedza/Przemyślenia/Rzeczywistość]] a w szczególności słowa [[Wiedza/Ludzie/Ray Dalio]], który powiedział, że przed zobaczeniem rzeczywistości chronią nas nasze [[Ego]] oraz [[Blind Spots]]
+
+## Jak określiłem swoje wartości?
+Bardzo pomógł mi w tym program "[Panuj i Posiadaj](https://zenjaskiniowca.pl/programy/panuj-i-posiadaj/)" od Rafała Mazura. Przeprowadza przez proces określania swojej filozofii życiowej oraz misji ([[Fundamenty/🧭 Kierunek]]).
+
+Nie będę tutaj opisywał całego procesu, ze względu na to, że jest on częscią Programu Rafała. Mogę tylko polecić jego zakup i dodać, że wykonałem wszystkie kroki, zgodnie z jego sugestiami.
+
+## Czy wartości ulegają zmianie?
+W moim przypadku stosunkowo niedawno pojawił się na liście "entuzjazm". Powodem był [[moment zrozumienia]], który miał miejsce gdy czytałem [[Wiedza/Ksiazki/Alamanck of Naval Ravikant]]. Jeden z cytatów [[Wiedza/Ludzie/Naval Ravikant]] mówił o tym, że poczucie szczęścia to kwestia naszej decyzji.
+
+Od tego momentu postanowiłem wziąć to na poważnie, wbrew temu co powiedział mi test [[Wiedza/Inne/The Big Five]], sugerujący że pod względem entuzjazmu jestem w 1 percentylu (najniższym).
+
+Jednocześnie książki takie jak np. [[Wiedza/Ksiazki/The Happiness Advantage]], [[Wiedza/Ksiazki/Letting Go]] czy nawet [[Wiedza/Ksiazki/Think Like a Rocket Scientist]] sugerują jednoznacznie ogromną rolę entuzjazmu w osiąganiu czegokolwiek.
+
diff --git a/content/Optymalizacja/Automatyzacja/Automatyzacja.md b/content/Optymalizacja/Automatyzacja/Automatyzacja.md
new file mode 100644
index 000000000..22a29369c
--- /dev/null
+++ b/content/Optymalizacja/Automatyzacja/Automatyzacja.md
@@ -0,0 +1,56 @@
+---
+title: Automatyzacja
+---
+Automatyzacja w moim rozumieniu polega na wykorzystaniu [[API]] do łączenia ze sobą wszystkich usług i serwisów, które je udostępniają. W dużym uproszczeniu chodzi o wymianę informacji pomiędzy aplikacjami, ograniczając zaangażowanie człowieka do minimum.
+
+## White-hat Automation
+Mając w zasięgu możliwość wysyłania tysięcy wiadomości i eliminowania kolejnych aktywności na rzecz automatyzacji, łatwo dojść do miejsca w którym zwyczajnie "przesadzimy".
+
+Sam stosuję prostą zasadę: nie automatyzuję procesu budowania relacji. **Wykorzystuję boty po to aby dawały mi przestrzeń do tego, aby móc poświęcić więcej czasu i uwagi innym.**
+
+## Projektowanie scenariuszy
+Do tworzenia scenariuszy automatyzacji wykorzystuję wszystkie moje umiejętności, zarówno techniczne jak i wiedzę na temat biznesu oraz budowania relacji.
+
+**Najważniejszy stack [[Optymalizacja/Automatyzacja/Narzędzia]]:**
+- [[Optymalizacja/Narzędzia/Airtable]] - bazy danych
+- [[Optymalizacja/Narzędzia/Notion]] - zarzadzanie zadaniami, notatki i panele aktywności
+- [[Optymalizacja/Narzędzia/Integromat]] i [[Optymalizacja/Narzędzia/Zapier]] - łączenie usług
+- [[Optymalizacja/Narzędzia/Buffer]] - publikacja w mediach społecznościowych
+- [[Sendgrid]] - maile transakcyjne i newslettery
+- [[Optymalizacja/Narzędzia/Keyboard Maestro]], [[Better Touch Tool]] i [[Optymalizacja/Narzędzia/Hazel]] - automatyzacja w systemie
+- [[Shortcuts]] - automatyzacja na [[Optymalizacja/Sprzęt/iPhone]]
+- [[Optymalizacja/Narzędzia/Webflow]], [[Systemflow]] i [[Carrd]] - strony www
+- [[Tailwind CSS]] i [[Tailwind UI]] - low-code tworzenie stron
+- [[Slack]] - komunikacja z botami (w obie strony)
+
+## Mój zespół robotów
+Moje automatyzacje ulepszają się wraz z każdą kolejną iteracją. Oznacza to, że co jakiś czas wykorzystuję nowe narzędzia oraz zdobytą wiedzę do tego, aby zastąpić stare scenariusze nowymi.
+
+Aktualnie każdy scenariusz przypisany jest do Avatara - bota posiadającego określone cechy, zdolności i odpowiedzialności. Każdy z nich może podejmować zadania samodzielnie lub w przypadku konieczności skorzystania z pomocy drugiego bota, może poprosić go o pomoc.
+
+
+
+### Claire - Biuro
+
+Odpowiedzialna za scenariusze związane z moim wirtualnym biurem. To ona dba o wystawianie dokumentów, przypomnienia o płatnościach czy organizację narzędzi, które wykorzystuję do codziennych zadań (które również jest mi w stanie sama przydzielić!). Jej najważniejszym narzędziem jest [[Optymalizacja/Narzędzia/Superhuman]] oraz [[Optymalizacja/Narzędzia/Notion]]
+
+### Jenny - Social Media
+
+Jenny pomaga mi w prowadzeniu mediów społecznościowych. Dba o harmonogram, przygotowanie treści oraz przypomnienia o nowych komentarzach. Jej głównym narzędziem jest [[Optymalizacja/Narzędzia/Airtable]] i [[Optymalizacja/Narzędzia/Buffer]]
+
+### Nicky - Designer
+
+Nicky to designer tworzący niemal wszystkie grafiki które pojawiają się w moich wszystkich mediach społecznościowych. Wykorzystuje szablony i [[Projekty/EasyBanner]] do tworzenia kreacji i przekazywania ich do pozostałych botów lub bezpośrednio do mojego schowka z pomocą [[Optymalizacja/Narzędzia/Keyboard Maestro]]
+
+### Ellie - Researcher
+
+Ellie pomaga mi w pozostawaniu na bieżąco z źródłami wiedzy z mojego [[Fundamenty/📚 System zdobywania wiedzy]] Odwiedza blogi, newslettery i strony www, zbierając informacje które mogą być przydatne dla mnie lub na potrzeby tworzonych przeze mnie materiałów. Ellie dodaje też nowe wpisy do mojego projektu [[brain.overment.com]]
+
+### Luke - Studio
+
+Rolą Luke'a jest organizacja plików do nagrań, przesyłanie ich pomiędzy serwisami, tworzenie kopii zapasowych oraz przygotwywanie struktur materiałów. Np. po nagraniu materiału tworzy dla mnie wpis w Airtable, wgrywa pliki np. na YouTube, aktualizuje notatkę w [[brain.overment.com]] i z pomocą Claire dodaje mi zadania zwiazane z uzupełnieniem treści przed publikacją.
+
+## Powiązania
+- [[Optymalizacja/Automatyzacja/Mikroserwisy]]
+- [[Optymalizacja/Automatyzacja/Narzędzia]]
+- [[Optymalizacja/Automatyzacja/Scenariusze]]
\ No newline at end of file
diff --git a/content/Optymalizacja/Automatyzacja/Mikroserwisy.md b/content/Optymalizacja/Automatyzacja/Mikroserwisy.md
new file mode 100644
index 000000000..156a97e99
--- /dev/null
+++ b/content/Optymalizacja/Automatyzacja/Mikroserwisy.md
@@ -0,0 +1,20 @@
+---
+title: Mikroserwisy
+---
+## Generowanie grafik
+Początkowo na własne potrzeby zaprojektowałem mikroserwis, który generuje zoptymalizowane kreacje na podstawie specjalnego szablonu. Później projekt został rozszerzony o moduł w [[Optymalizacja/Narzędzia/Integromat]] oraz teraz jest dostępny dla innych pod nazwą [[Projekty/EasyBanner]].
+
+Z jego pomocą jestem w stanie tworzyć setki grafik w ciągu kilku minut, przesyłając np. dane z [[Optymalizacja/Narzędzia/Airtable]] lub nawet bezpośrednio z mojego komputera (z pomocą [[Optymalizacja/Narzędzia/Keyboard Maestro]]).
+
+Poza tworzeniem grafik na podstawie szablonu HTML, możliwe jest też generowanie ich na podstawie projektu [[Optymalizacja/Narzędzia/Webflow]], który po udostępnieniu zostaje przekazany do [[Projekty/EasyBanner]].
+
+## Licznik na stronę i e-mail
+W kampaniach wykorzystuję liczniki odmierzające czas do zakończenia sprzedaży lub promocji. Początkowo wykorzystywałem sendtric.com do generowania prostego licznika, jednak potrzebowałem mieć nad nim większą kontrolę i dostosowac go do swoich potrzeb.
+
+Tak powstał mikroserwis umożliwiający generowanie timerów w formie pliku .gif. Aktualnie dostępny jest jako [[Projekty/EasyTimer]]
+
+## Carbon.now.sh
+Prosty mikroserwis do którego mogę przesłać ID gista i na jego podstawie zostanie wygenerowana grafika z odpowiednio sformatowanym fragmentem kodu.
+
+## $AHOY
+Mikroserwis symulujący blockchain, umożliwiający zapisywanie historii transakcji, tworzenie portfeli i ich kategorii.
diff --git a/content/Optymalizacja/Automatyzacja/Narzędzia.md b/content/Optymalizacja/Automatyzacja/Narzędzia.md
new file mode 100644
index 000000000..80f069047
--- /dev/null
+++ b/content/Optymalizacja/Automatyzacja/Narzędzia.md
@@ -0,0 +1,16 @@
+---
+title: Narzędzia
+---
+
+# Narzędzia do automatyzacji
+
+## [[Optymalizacja/Narzędzia/Integromat]]
+
+## [[Optymalizacja/Narzędzia/Zapier]]
+
+## [[Optymalizacja/Narzędzia/Airtable]]
+
+## [[Optymalizacja/Narzędzia/Keyboard Maestro]]
+
+## [[Optymalizacja/Narzędzia/Raycast]]
+
diff --git a/content/Optymalizacja/Automatyzacja/Scenariusze.md b/content/Optymalizacja/Automatyzacja/Scenariusze.md
new file mode 100644
index 000000000..3ba95eb67
--- /dev/null
+++ b/content/Optymalizacja/Automatyzacja/Scenariusze.md
@@ -0,0 +1,27 @@
+---
+title: Scenariusze
+---
+
+## Publikacja postów w Social Media
+Publikuję większość postów z pomocą [[Optymalizacja/Narzędzia/Buffer]] do którego dane trafiają automatycznie z [[Optymalizacja/Narzędzia/Airtable]] dzięki [[Optymalizacja/Narzędzia/Integromat]]. Posiadam również automatyzacje [[Optymalizacja/Narzędzia/Keyboard Maestro]], które pozwalają mi wysyłać dane do tych serwisów bezpośrednio z mojego komputera, bez konieczności otwierania przeglądarki.
+
+## Automatyzacja newslettera
+Do wysyłki newslettera w zależności od projektu wykorzystuję [[Sendgrid]], [[Mailchimp]] lub [[GetResponse]]. Proces złożenia szablonu i wysłania dzieje się w pełni automatycznie dzięki [[Optymalizacja/Narzędzia/Integromat]].
+
+Cały proces automatyzacji newlettera pokazuję w paczce Automatyzacji: [[Projekty/zautomatyzowani#Newsletter na Autopilocie]]
+
+## Automatyzacja YouTube
+Wszystkie informacje na temat publikowanych przeze mnie filmów gromadzę w [[Optymalizacja/Narzędzia/Airtable]]. Stamtąd z pomocą [[Optymalizacja/Narzędzia/Zapier]] oraz [[Optymalizacja/Narzędzia/Integromat]] zostają automatycznie wysyłane na mój kanał YouTube.
+
+Cały proces automatyzacji YouTube pokazuję w paczce Automatyzacji [[Projekty/zautomatyzowani#YouTube na Autopilocie]]
+
+## Automatyzacja podcastu
+Podcast [[Projekty/zautomatyzowani]] prowadzony jest niemal całkowicie "na Autopilocie". Informacje na temat odcinków gromadzone są w [[Optymalizacja/Narzędzia/Airtable]] a później automatycznie publikowane z pomocą [[Optymalizacja/Narzędzia/Integromat]] oraz [[Optymalizacja/Narzędzia/Zapier]] przez usługę [[Spreaker]] na wszystkich platformach podcastowych oraz na YouTube.
+
+Cały proces automatyzacji podcastu pokazuję w paczce Automatyzacji
+[[Projekty/zautomatyzowani#Podcast na Autopilocie]]
+
+## Generowanie grafik
+Generuję grafiki na potrzeby mediów społecznościowych z pomocą [[htmlcsstoimage]] i [[BannerBear]] lub [[Placid]]. Najczęściej łączę je poprzez scenariusze w [[Optymalizacja/Narzędzia/Integromat]]
+
+Do generowania grafik najczęściej wykorzystuję włąsny mikroserwis ([[Optymalizacja/Automatyzacja/Mikroserwisy#Generowanie grafik]])
\ No newline at end of file
diff --git a/content/Optymalizacja/Narzędzia/1Password.md b/content/Optymalizacja/Narzędzia/1Password.md
new file mode 100644
index 000000000..697752f72
--- /dev/null
+++ b/content/Optymalizacja/Narzędzia/1Password.md
@@ -0,0 +1,9 @@
+---
+title: 1Password
+---
+
+# Czym jest 1Password?
+
+To płatny manager haseł. Z perspektywy bezpieczeństwa w sieci, posługiwanie się managerem jest bardzo ważne.
+
+Przechowuję na jednym koncie dostępy do wszystkich pozostałych kont. W przypadku najbardziej kluczowych serwisów regularnie zmieniam hasła i stosuję uwierzytelnianie dwuetapowe.
\ No newline at end of file
diff --git a/content/Optymalizacja/Narzędzia/AirBuddy.md b/content/Optymalizacja/Narzędzia/AirBuddy.md
new file mode 100644
index 000000000..65c182b2d
--- /dev/null
+++ b/content/Optymalizacja/Narzędzia/AirBuddy.md
@@ -0,0 +1,7 @@
+---
+title: AirBuddy
+---
+# Czym jest AirBuddy?
+AirBuddy to prosta aplikacja ułatwiająca zarądzanie słuchawkami AirPods. Podłączyłem do niej skrót klawiszowy odpowiedzialny za podłączanie zestawu pod Macbook, co sprawiło że korzystanie z nich jest zdecydowanie bardziej przyjemne.
+
+🔗 [https://v2.airbuddy.app](https://v2.airbuddy.app)
\ No newline at end of file
diff --git a/content/Optymalizacja/Narzędzia/Airtable.md b/content/Optymalizacja/Narzędzia/Airtable.md
new file mode 100644
index 000000000..acb37e3db
--- /dev/null
+++ b/content/Optymalizacja/Narzędzia/Airtable.md
@@ -0,0 +1,14 @@
+---
+title: Airtable
+---
+# Czym jest Airtable?
+To aplikacja do przechowywania danych, przypominająca arkusz Excela. Jej największą zaletą jest budowa zgodnie z podejściem [[API]] first, które świetnie sprawdza się w kontekście [[Optymalizacja/Automatyzacja/Automatyzacja]]
+
+W [[Optymalizacja/Narzędzia/Airtable]] przechowuję praktycznie wszystkie publikowane przeze mnie treści oraz wykorzystuję je jako bazę danych.
+
+Ogromną zaletą jest tutaj:
+- natychmiastowy dostęp do [[API]] + integracje z [[Optymalizacja/Narzędzia/Integromat]] / [[Optymalizacja/Narzędzia/Zapier]]
+- zakładka [[Optymalizacja/Automatyzacja/Automatyzacja]] umożliwiająca uruchamianie własnych skryptów [[Wiedza/Programowanie/JavaScript/JavaScript]] - świetnie łączy się z [webhook]ami i [[Optymalizacja/Narzędzia/Integromat]]em
+- widok formularzy wykorzystuję bardzo często do szybkiego dodawania informacji (np. uzupełniania danych o odcinku nowego podcastu) lub przy współpracy z np. montażystą, który zamiast otrzymywać dostęp do pełnej bazy, wypełnia krótki formularz z onzaczeniem, który materiał został przez niego przygotowany
+
+Istnieje kilka alternatyw dla Airtable, lecz poza [[Google Sheets]] żadna z nich nie sprawdza się porównywalnie dobrze.
\ No newline at end of file
diff --git a/content/Optymalizacja/Narzędzia/Alfred.md b/content/Optymalizacja/Narzędzia/Alfred.md
new file mode 100644
index 000000000..701933ea4
--- /dev/null
+++ b/content/Optymalizacja/Narzędzia/Alfred.md
@@ -0,0 +1,24 @@
+## Czym jest Alfred?
+
+[[Optymalizacja/Narzędzia/Alfred]] to nakładka (lub alternatywa) dla Spotlight. Dzięki płatnemu rozszerzeniu (PowerPack) umożliwia połączenie np. z [[Optymalizacja/Narzędzia/Keyboard Maestro]] czy [[Spotify]].
+
+Największą zaletą Alfreda jest szybkość działania oraz pluginy, które można rozwijać samodzielnie wykorzystując [[Wiedza/Programowanie/JavaScript/JavaScript]] oraz [[Wiedza/Programowanie/Node.js]].
+
+> ℹ️ Dla użytkowników Windowsa istnieje alternatywa w postaci Wox Launcher. Nie miałem jednak okazji z niej korzystać.
+
+## Jak wykorzystuję Alfred?
+
+- Opcja `File Search` pozwala na bardzo szybkie otwieranie plików i katalogów. Wystarczy w oknie Alfreda rozpocząć wyszukiwanie od znaku `'`, np.: 
+- Opcja `Universal Actions` pozwala na bardzo szybkie wykonywanie akcji na plikach (i nie tylko). Głównie wykorzystuję ją do szybkiego przenoszenia plików pomiędzy folderami: 
+
+**Poza tym wykorzystuję rozszerzenia:**
+- [[Spotify]] Mini Player - łatwa kontrola muzyki
+- Alfred Maestro - integracja z [[Optymalizacja/Narzędzia/Keyboard Maestro]]
+- Google Suggest - wyszukiwanie w Google bezpośrednio w Alfredzie
+- Menu Bar Search - **genialne** rozszerzenie umożliwiające uruchamianie dowolnej akcji z menu aktywnego programu. Jest idealne w przypadku aplikacji, które nie dają możliwości pełnej konfiguracji skrótów klawiszowych
+- Password Generator - świetne rozwiązanie do szybkiego generowania haseł. Działa świetnie w połączeniu z [[Optymalizacja/Narzędzia/1Password]]
+- Tailwind CSS Doc - wyszukiwarka dokumentacji [[Tailwind CSS]]
+- Dash - dokumentacja dla ponad 200 technologii. Ja korzystam z około 10
+
+## Mój kurs online: Keyboard Maestro
+Wszystkie techniki pracy z [[Optymalizacja/Narzędzia/Keyboard Maestro]] oraz Alfredem omawiam w moim kursie: [[Projekty/eduweb#Kurs Keyboard Maestro]] dostępnym na [[Projekty/eduweb]].
\ No newline at end of file
diff --git a/content/Optymalizacja/Narzędzia/Anki.md b/content/Optymalizacja/Narzędzia/Anki.md
new file mode 100644
index 000000000..8a190861e
--- /dev/null
+++ b/content/Optymalizacja/Narzędzia/Anki.md
@@ -0,0 +1,10 @@
+# Czym jest Anki?
+
+[[Optymalizacja/Narzędzia/Anki]] to aplikacja ułatwiająca zapamiętywanie. Opiera się o tzw. [[Spaced Repetition]]
+
+## Jak wykorzystuję Anki?
+
+Niemal zawsze mam aktywną aplikację albo w telefonie albo na komputerze. Zawsze wtedy gdy spotkam się z informajcą którą uznaję za wartą zapamiętania, zapisuję ją w formie karty Anki.
+
+## Źródła:
+🔗 https://fs.blog/2018/12/spacing-effect/
\ No newline at end of file
diff --git a/content/Optymalizacja/Narzędzia/Audible.md b/content/Optymalizacja/Narzędzia/Audible.md
new file mode 100644
index 000000000..b4ef8171a
--- /dev/null
+++ b/content/Optymalizacja/Narzędzia/Audible.md
@@ -0,0 +1,7 @@
+# Czym jest Audible?
+To aplikacja z Audiobookami, bezpośrednio od Amazon. W mojej opinii jest to najlepsza aplikacja do słuchania książek, jaka istnieje na rynku.
+
+## Jak wykorzystuję Audible?
+W [[Optymalizacja/Narzędzia/Audible]] słucham wszystkich audiobooków. Od początku sięgam po oryginalne, anglojęzyczne tytuły aby przy okazji czytania, uczyć się języka angielskiego. Bardzo często słuchając książek przeglądam również e-booki na [[Optymalizacja/Narzędzia/Kindle]] oraz zapisuję wybrane framenty książek w formie kart [[Optymalizacja/Narzędzia/Anki]].
+
+Po ukończeniu słuchania książki, zawsze zapisuję ją na moim profilu [[Goodreads]].
\ No newline at end of file
diff --git a/content/Optymalizacja/Narzędzia/BetterTouch Tool.md b/content/Optymalizacja/Narzędzia/BetterTouch Tool.md
new file mode 100644
index 000000000..1a6a564e4
--- /dev/null
+++ b/content/Optymalizacja/Narzędzia/BetterTouch Tool.md
@@ -0,0 +1 @@
+# Czym jest BetterTouch Tool?
\ No newline at end of file
diff --git a/content/Optymalizacja/Narzędzia/Buffer.md b/content/Optymalizacja/Narzędzia/Buffer.md
new file mode 100644
index 000000000..2570526f8
--- /dev/null
+++ b/content/Optymalizacja/Narzędzia/Buffer.md
@@ -0,0 +1 @@
+[[Optymalizacja/Narzędzia/Buffer]] to serwis z pomocą którego publikuję niemal wszystkie posty we wszystkich kanałach społecznościowych. Świetnie łączy się z [[Optymalizacja/Narzędzia/Airtable]] oraz [[Optymalizacja/Narzędzia/Integromat]].
\ No newline at end of file
diff --git a/content/Optymalizacja/Narzędzia/ClickUp.md b/content/Optymalizacja/Narzędzia/ClickUp.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Optymalizacja/Narzędzia/ClickUp.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Optymalizacja/Narzędzia/Dropshare.md b/content/Optymalizacja/Narzędzia/Dropshare.md
new file mode 100644
index 000000000..ba951f7d6
--- /dev/null
+++ b/content/Optymalizacja/Narzędzia/Dropshare.md
@@ -0,0 +1 @@
+[[Optymalizacja/Narzędzia/Dropshare]] umożliwia mi szybkie przesyłanie zrzutów ekranu.
\ No newline at end of file
diff --git a/content/Optymalizacja/Narzędzia/Endel.io.md b/content/Optymalizacja/Narzędzia/Endel.io.md
new file mode 100644
index 000000000..b2823c1ee
--- /dev/null
+++ b/content/Optymalizacja/Narzędzia/Endel.io.md
@@ -0,0 +1 @@
+[[Optymalizacja/Narzędzia/Endel.io]] to aplikacja wykorzystująca [AI] do generowania dźwięków ułatwiających m.in. skupienie. Sięgam po nią niemal każdego dnia.
\ No newline at end of file
diff --git a/content/Optymalizacja/Narzędzia/Fantastical.md b/content/Optymalizacja/Narzędzia/Fantastical.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Optymalizacja/Narzędzia/Fantastical.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Optymalizacja/Narzędzia/Fig.md b/content/Optymalizacja/Narzędzia/Fig.md
new file mode 100644
index 000000000..51eaf2b34
--- /dev/null
+++ b/content/Optymalizacja/Narzędzia/Fig.md
@@ -0,0 +1 @@
+https://fig.io/
\ No newline at end of file
diff --git a/content/Optymalizacja/Narzędzia/Figma.md b/content/Optymalizacja/Narzędzia/Figma.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Optymalizacja/Narzędzia/Figma.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Optymalizacja/Narzędzia/Hazel.md b/content/Optymalizacja/Narzędzia/Hazel.md
new file mode 100644
index 000000000..f3516a922
--- /dev/null
+++ b/content/Optymalizacja/Narzędzia/Hazel.md
@@ -0,0 +1,11 @@
+[[Optymalizacja/Narzędzia/Hazel]] to aplikacja do automatycznej organizacji plików. Pozwala definiować zasady dla poszczególnych folderów. Zgodnie z tymi zasadami możliwa jest zmiana nazw według określonych schematów, przenoszenie pomiędzy folderami czy nawet uruchamianie dowolnych skryptów [[Wiedza/Programowanie/JavaScript/JavaScript]] (!)
+
+## W praktyce
+- Organizacja plików w Downloads (starszych niż jeden dzień) w podfoldery uzależnione od rodzaju pliku
+- Organizacja plików na moim Dysku Google w podfoldery uzależnione od rodzaju pliku
+- Automatyczne przesyłanie plików z nagraniami dla montażysty
+ - Zapisanie na dysku Google
+ - Wysłanie informacji o "drafcie" do montażysty przez [[Optymalizacja/Narzędzia/Integromat]] i [[Sendgrid]]
+ - Dodanie wpisu w [[Optymalizacja/Narzędzia/Airtable]] w tabeli projektu (np. [[Projekty/overment]] / [[Projekty/zautomatyzowani]] / [[Projekty/eduweb]])
+
+## Źródła
\ No newline at end of file
diff --git a/content/Optymalizacja/Narzędzia/Headspace.md b/content/Optymalizacja/Narzędzia/Headspace.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Optymalizacja/Narzędzia/Headspace.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Optymalizacja/Narzędzia/Hyper.is.md b/content/Optymalizacja/Narzędzia/Hyper.is.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/content/Optymalizacja/Narzędzia/Integromat.md b/content/Optymalizacja/Narzędzia/Integromat.md
new file mode 100644
index 000000000..1c9b68250
--- /dev/null
+++ b/content/Optymalizacja/Narzędzia/Integromat.md
@@ -0,0 +1,7 @@
+[Integromat](https://Integromat.com/) to najważniejsze narzędzie automatyzacji z jakiego korzystam. Z jego pomocą łączę wszystkie usługi posiadające [[API]] wykorzystując albo wbudowane moduły albo podłączając się bezpośrednio przez [[API]] przez moduł HTTP.
+
+W niektórych przypadkach tworzę swoje własne [[Optymalizacja/Automatyzacja/Mikroserwisy]] do realizacji zadań, które:
+- nie są możliwe do zrealizowania z pomocą gotowych narzędzi
+- rozszerzają możliwości istniejących narzędzi
+
+Bardzo często scenariusze automatyzacji rozpoczynam Webhookiem, aby uruchamiać je natychmiast z poziomu [[Optymalizacja/Narzędzia/Keyboard Maestro]] lub dowolnego skryptu czy automatyzacji [[Optymalizacja/Narzędzia/Airtable]]
diff --git a/content/Optymalizacja/Narzędzia/Keyboard Maestro.md b/content/Optymalizacja/Narzędzia/Keyboard Maestro.md
new file mode 100644
index 000000000..0c6ab1ad1
--- /dev/null
+++ b/content/Optymalizacja/Narzędzia/Keyboard Maestro.md
@@ -0,0 +1,79 @@
+[[Optymalizacja/Narzędzia/Keyboard Maestro]] to aplikacja którą wykorzystuę do automatyzacji wielu zadań w ramach systemu operacyjnego OSX. Wykorzystuję ją razem z [[Optymalizacja/Narzędzia/Alfred]] oraz [[Optymalizacja/Sprzęt/StreamDeck]].
+
+Regularnie zdarza mi się wykorzystywać skrypty [[Wiedza/Programowanie/JavaScript/JavaScript]] i [[Wiedza/Programowanie/Node.js]] do tworzenia pojedynczych akcji.
+
+## Makra
+
+**Funkcje systemowe**
+- Włączenie / wyłączenie DND
+- Usypianie
+- Restartowanie
+- Security & Privacy
+
+**Pliki & Foldery**
+
+**Komunikatory**
+
+**E-maile**
+
+**Kalendarz**
+
+**Keyboard Maestro**
+
+**Pisanie**
+- text expander
+- markdown
+- szybkie odpowiedzi
+- emoji picker
+
+**Przeglądarka**
+
+**Muzyka**
+
+**Development**
+
+**Automatyzacje zewnętrzne**
+
+## Pojedyncze akcje
+- Szybsza nawigacja w systemie (np. przełączanie aplikacji, czy uruchamianie funkcji)
+- Użyteczne powiadomienia (np. [[Pomodoro]] oraz przypomnienia o codziennych nawykach)
+- Autosave w programacah które nie mają takiej funkcji
+- Przypisanie skrótów klawiszowych do opcji programów, które tego nie umożliwiają (m.in. dzięki rozszerzeniu [Menu Bar Search](https://github.com/BenziAhamed/Menu-Bar-Search))
+- Zarządzanie położeniem okien w sposób niestandardowy (w połączeniu z [[Optymalizacja/Narzędzia/Magnet]])
+- Zarządzanie aplikacjami (np. wyłączanie Messengera po 5 minutach)
+
+## Praca z tekstem
+- Szybsza nawigacja w tekście (skróty klawiszowe)
+- [[Text Expander]] ze wsparciem zewnętrznych skrytpów (np. generowanie daty)
+- Praca ze składnią Markdown
+- Szybkie otwieranie notatek ([[Optymalizacja/Narzędzia/Notion]] / [[Obsidian]])
+- Paleta makr z szybkimi odpowiedziami
+- Dodawanie emotikonek z [Emoji Taco](https://www.packal.org/workflow/emoji-taco) oraz [Rocket](https://matthewpalmer.net/rocket/)
+- Szybkie dodawanie informacji do notatek (nawet bez otwierania edytora)
+
+## Praca z plikami
+- Tworzenie dokumentów na podstawie szablonu (poprzez funkcję Find & Replace w edytorach tekstowych)
+- Automatyczne przenoszenie / zmiany nazw
+- Zmiany nazw i rozszerzeń
+- Zmiany rozmiarów
+- Optymalizacja obrazów
+- Szybkie otwieranie plików z [[Optymalizacja/Narzędzia/Alfred]]
+- Automatyczne przenoszenie plików, w tym wgrywanie na Google Drive z [[Optymalizacja/Narzędzia/Hazel]]
+
+## Zmiana kontekstu
+
+## Przeglądarka
+
+## Spotkania
+
+## Komunikacja
+
+## Skupienie
+
+## Rozrywka
+-
+
+## Automatyzacje zewnętrzne
+- Uruchamianie webhooków przejmowanych przez [[Optymalizacja/Narzędzia/Integromat]], [[Optymalizacja/Narzędzia/Zapier]] lub [[Optymalizacja/Automatyzacja/Mikroserwisy]]
+- Wysyłanie danych przez [[Optymalizacja/Narzędzia/Integromat]] do [[Optymalizacja/Narzędzia/Airtable]]
+- Wysyłanie powiadomień na telefon
\ No newline at end of file
diff --git a/content/Optymalizacja/Narzędzia/Kindle.md b/content/Optymalizacja/Narzędzia/Kindle.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Optymalizacja/Narzędzia/Kindle.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Optymalizacja/Narzędzia/Magnet.md b/content/Optymalizacja/Narzędzia/Magnet.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Optymalizacja/Narzędzia/Magnet.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Optymalizacja/Narzędzia/Mentorist.md b/content/Optymalizacja/Narzędzia/Mentorist.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Optymalizacja/Narzędzia/Mentorist.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Optymalizacja/Narzędzia/MindNode.md b/content/Optymalizacja/Narzędzia/MindNode.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Optymalizacja/Narzędzia/MindNode.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Optymalizacja/Narzędzia/Narzędzia.md b/content/Optymalizacja/Narzędzia/Narzędzia.md
new file mode 100644
index 000000000..bae91e5f6
--- /dev/null
+++ b/content/Optymalizacja/Narzędzia/Narzędzia.md
@@ -0,0 +1,49 @@
+---
+title: Narzędzia
+---
+
+- [[Optymalizacja/Narzędzia/Airtable]] - API first excel na sterydach
+- [[Optymalizacja/Narzędzia/Integromat]] - Najlepsze narzędzie do automatyzacji i szybkiego łączenia API
+- [[Optymalizacja/Narzędzia/Zapier]] - Automatyzacje i szybkie łączenie API
+- [[Optymalizacja/Narzędzia/Keyboard Maestro]] - Automatyzacje w OSX
+- [[Optymalizacja/Narzędzia/Romwod]] - Aplikacja z programem ćwiczeń rozciągających
+- [[Optymalizacja/Narzędzia/Raycast]] - Launcher w którym tworzę własne rozszerzenia w [[Wiedza/Programowanie/Node.js]], [[Wiedza/Programowanie/JavaScript/JavaScript]], [[React.js]] i [[TypeScript]]
+- [[Reeder 5]] - News feed z obserwowanych przeze mnie blogów
+- [[Optymalizacja/Narzędzia/iA Writer]] - Edytor Markdown nastawiony na minimalizm i focus
+- [[Optymalizacja/Narzędzia/Anki]] - Aplikacja do treningu pamięci opartego o [[Spacing Repetition]]
+- [[Optymalizacja/Narzędzia/Buffer]] - Narzędzie do publikowania treści w wielu kanałach Social Media
+- [[Optymalizacja/Narzędzia/ClickUp]] - Zaawansowana aplikacja do zarządzania zadaniami
+- [[Optymalizacja/Narzędzia/ProCreate]] - Najlepsza aplikacja na iPada do rysowania
+- [[Optymalizacja/Narzędzia/Notability]] - Aplikacja do Notowania na iPadzie
+- [[Optymalizacja/Narzędzia/Dropshare]] - Szybkie udostępnianie plików (przez własny serwer FTP)
+- [[Optymalizacja/Narzędzia/Fantastical]] - Fajna aplikacja do kalendarza
+- [[Optymalizacja/Narzędzia/Magnet]] - Aplikacja do zarządzania położeniem okien
+- [[Optymalizacja/Narzędzia/Paste]] - Manager schowka
+- [[Optymalizacja/Narzędzia/TextSnipper]] - OCR czytający zaznaczony fragment ekranu
+- [[Optymalizacja/Narzędzia/Sip]] - systemowy color picker
+- [[Optymalizacja/Narzędzia/Screenflow]] - świetna aplikacja do nagrywania ekranu i edycji w locie
+- [[Optymalizacja/Narzędzia/Audible]] - Audiobooki od Amazon
+- [[Optymalizacja/Narzędzia/MindNode]] - jedna z lepszych aplikacji do tworzenia map myśli
+- [[Optymalizacja/Narzędzia/Oak]] - aplikacja z ćwiczeniami oddechowymi
+- [[Optymalizacja/Narzędzia/Waking Up]] - aplikacja do medytacji od [[Sam Harris]]
+- [[Optymalizacja/Narzędzia/Endel.io]] - aplikacja generująca dźwięki ułatwiające skupienie
+- [[Optymalizacja/Narzędzia/Mentorist]] - wdrażanie wiedzy z książek
+- [[Optymalizacja/Narzędzia/Rocket]] - systemowy emoji Picker
+- [[Optymalizacja/Narzędzia/1Password]] - manager haseł
+- [[Optymalizacja/Narzędzia/Onyx]] - aplikacja optymalizująca / czyszcząca system
+- [[Optymalizacja/Narzędzia/Figma]] - webowa aplikacja do projektowania grafiki wektorowej
+- [[Optymalizacja/Narzędzia/Webflow]] - najlepszy no-code web builder
+- [[Optymalizacja/Narzędzia/PopClip]] - akcje na dowolnym zaznaczonym tekście
+- [[Optymalizacja/Narzędzia/Kindle]] - aplikacja do czytania książek
+- [[Optymalizacja/Narzędzia/Superhuman]] - klient pocztowy nastawiony na produktywność
+- [[Optymalizacja/Narzędzia/Headspace]] - aplikacja do medytacji
+- [[Optymalizacja/Narzędzia/AirBuddy]] - łatwe przełączanie AirPods pomiędzy urządzeniami
+- [[Optymalizacja/Narzędzia/TabNine]] - AI based Intellisense do popularnych IDE
+- [[Optymalizacja/Narzędzia/Hazel]] - automatyzacja zarządzania plikami i folderami
+- [[Optymalizacja/Narzędzia/Reveri]] - aplikacja do autohipnozy
+- [[Optymalizacja/Narzędzia/Yoink]] - aplikacja ułatwiająca przenoszenie plików i przechowywanie ich metodą drag&drop
+- [[Optymalizacja/Narzędzia/Notion]] - aplikacja do notatek z API
+- [[Optymalizacja/Narzędzia/Fig]] - rozszerzenie do terminala podpowiadające składnię i katalogi
+- [[Optymalizacja/Narzędzia/BetterTouch Tool]] - aplikacja rozszerzająca możliwości trackpada
+- [[Optymalizacja/Narzędzia/Hyper.is]] - ~~alternatywa dla terminala napisana w HTML5 / CSS / JS~~
+- [[Warp.dev]] - alternatywa dla terminala
\ No newline at end of file
diff --git a/content/Optymalizacja/Narzędzia/Notability.md b/content/Optymalizacja/Narzędzia/Notability.md
new file mode 100644
index 000000000..5c1b1e529
--- /dev/null
+++ b/content/Optymalizacja/Narzędzia/Notability.md
@@ -0,0 +1,2 @@
+[[Optymalizacja/Sprzęt/iPad]]
+[[Fundamenty/📓 Dziennik]]
\ No newline at end of file
diff --git a/content/Optymalizacja/Narzędzia/Notion.md b/content/Optymalizacja/Narzędzia/Notion.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/content/Optymalizacja/Narzędzia/Oak.md b/content/Optymalizacja/Narzędzia/Oak.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Optymalizacja/Narzędzia/Oak.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Optymalizacja/Narzędzia/Onyx.md b/content/Optymalizacja/Narzędzia/Onyx.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Optymalizacja/Narzędzia/Onyx.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Optymalizacja/Narzędzia/Paste.md b/content/Optymalizacja/Narzędzia/Paste.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Optymalizacja/Narzędzia/Paste.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Optymalizacja/Narzędzia/PopClip.md b/content/Optymalizacja/Narzędzia/PopClip.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Optymalizacja/Narzędzia/PopClip.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Optymalizacja/Narzędzia/ProCreate.md b/content/Optymalizacja/Narzędzia/ProCreate.md
new file mode 100644
index 000000000..223acdcba
--- /dev/null
+++ b/content/Optymalizacja/Narzędzia/ProCreate.md
@@ -0,0 +1 @@
+[[Optymalizacja/Sprzęt/iPad]]
\ No newline at end of file
diff --git a/content/Optymalizacja/Narzędzia/README.md b/content/Optymalizacja/Narzędzia/README.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/content/Optymalizacja/Narzędzia/Raycast.md b/content/Optymalizacja/Narzędzia/Raycast.md
new file mode 100644
index 000000000..289a79c29
--- /dev/null
+++ b/content/Optymalizacja/Narzędzia/Raycast.md
@@ -0,0 +1,8 @@
+Raycast to launcher, który niemal w całości zastąpiło mi [[Optymalizacja/Narzędzia/Alfred]] oraz w dużym stopniu zastępuje [[Optymalizacja/Narzędzia/Keyboard Maestro]].
+
+Jego największą zaletą dla mnie jest:
+- szybkość działania
+- estetyczny interfejs
+- genialne API umożliwiające tworzenie rozszerzeń w JS / TS / Node.js oraz wykorzystania AppleScript i Bash.
+
+
\ No newline at end of file
diff --git a/content/Optymalizacja/Narzędzia/Reveri.md b/content/Optymalizacja/Narzędzia/Reveri.md
new file mode 100644
index 000000000..a22be4e78
--- /dev/null
+++ b/content/Optymalizacja/Narzędzia/Reveri.md
@@ -0,0 +1 @@
+[[Wiedza/Ludzie/Andrew Huberman]]
\ No newline at end of file
diff --git a/content/Optymalizacja/Narzędzia/Rocket.md b/content/Optymalizacja/Narzędzia/Rocket.md
new file mode 100644
index 000000000..c9cd681d6
--- /dev/null
+++ b/content/Optymalizacja/Narzędzia/Rocket.md
@@ -0,0 +1 @@
+t
\ No newline at end of file
diff --git a/content/Optymalizacja/Narzędzia/Romwod.md b/content/Optymalizacja/Narzędzia/Romwod.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/content/Optymalizacja/Narzędzia/Screenflow.md b/content/Optymalizacja/Narzędzia/Screenflow.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Optymalizacja/Narzędzia/Screenflow.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Optymalizacja/Narzędzia/Sip.md b/content/Optymalizacja/Narzędzia/Sip.md
new file mode 100644
index 000000000..5d7376e1e
--- /dev/null
+++ b/content/Optymalizacja/Narzędzia/Sip.md
@@ -0,0 +1 @@
+[[Optymalizacja/Narzędzia/Figma]]
\ No newline at end of file
diff --git a/content/Optymalizacja/Narzędzia/Superhuman.md b/content/Optymalizacja/Narzędzia/Superhuman.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Optymalizacja/Narzędzia/Superhuman.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Optymalizacja/Narzędzia/TabNine.md b/content/Optymalizacja/Narzędzia/TabNine.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Optymalizacja/Narzędzia/TabNine.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Optymalizacja/Narzędzia/TextSnipper.md b/content/Optymalizacja/Narzędzia/TextSnipper.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Optymalizacja/Narzędzia/TextSnipper.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Optymalizacja/Narzędzia/Waking Up.md b/content/Optymalizacja/Narzędzia/Waking Up.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Optymalizacja/Narzędzia/Waking Up.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Optymalizacja/Narzędzia/Webflow.md b/content/Optymalizacja/Narzędzia/Webflow.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Optymalizacja/Narzędzia/Webflow.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Optymalizacja/Narzędzia/Yoink.md b/content/Optymalizacja/Narzędzia/Yoink.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Optymalizacja/Narzędzia/Yoink.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Optymalizacja/Narzędzia/Zapier.md b/content/Optymalizacja/Narzędzia/Zapier.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/content/Optymalizacja/Narzędzia/iA Writer.md b/content/Optymalizacja/Narzędzia/iA Writer.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/content/Optymalizacja/Optymalizacja.md b/content/Optymalizacja/Optymalizacja.md
new file mode 100644
index 000000000..9ed7da80b
--- /dev/null
+++ b/content/Optymalizacja/Optymalizacja.md
@@ -0,0 +1,4 @@
+[[Fundamenty/Proces]]
+[[Optymalizacja/Sprzęt/Sprzęt]]
+[[Optymalizacja/Automatyzacja/Automatyzacja]]
+[[Optymalizacja/Narzędzia/Narzędzia]]
\ No newline at end of file
diff --git a/content/Optymalizacja/Sprzęt/Macbook.md b/content/Optymalizacja/Sprzęt/Macbook.md
new file mode 100644
index 000000000..13ffb1dff
--- /dev/null
+++ b/content/Optymalizacja/Sprzęt/Macbook.md
@@ -0,0 +1,32 @@
+# Kontekst
+MacBook jest dla mnie najważniejszym narzędziem pracy. Przez lata pracowałem na Windowsie ale odkąd kupiłem pierwszego MacBooka, nie wyobrażam sobie powrotu.
+
+Wykorzystuję go nie tylko do programowania ale też projektowania grafiki oraz nagrywania i montażu filmów.
+
+Na każdym kroku wykorzystuję maksimum potencjału (np. z pomocą [[Optymalizacja/Narzędzia/Keyboard Maestro]] czy [[Optymalizacja/Narzędzia/Alfred]]) oraz sięgam po najlepszy aktualnie dostępny dla mnie sprzęt.
+
+## Specyfikacja
+
+> ⚠️ WAŻNE: Poniższa specyfikacja zawiera listę sprzętu, który posiadam obecnie. Przez lata rozwijałem swoje projekty korzystając z narzędzi na które wówczas po prostu nie mogłem sobie pozwolić. Dbałem wyłącznie o to, aby w miarę możliwości aktualizować swój setup, by dawał mi jak największy komfort pracy i jednocześnie był w zasięgu moich możliwości.
+
+
+
+## Komputer
+- MacBook Pro 2021 14"
+- Procesor M1 Max - 10 rdzeni CPU / 32 GPU / 16 NE
+- 64 GB RAM
+- 2 TB SSD
+
+Przez większość czasu pracuję w trybie stacjonarnym z podłączonym monitorem [Apple Pro Display XDR](https://www.apple.com/pl/pro-display-xdr/) oraz klawiaturą Keychron K3 v2 Slim i Trackpadem (Magic Trackpad).
+
+## Sprzęt wideo i oświetlenie
+Nagrywam wideo z pomocą kamery Sony ZV-1 oraz mikrofonem Razer Seiren z uchwytem Rode PSA-1. Obraz przechwytuję z pomocą [[Optymalizacja/Narzędzia/Screenflow]] i edytuję w [[FinalCut Pro]]. Stosuję oświetlenie w postaci lamp [YN-900](https://yongnuo.com.pl/?p=463).
+
+> Mikrofon Razer Seiren kupiłem zaraz na początku rozwoju kanału na YouTube. Zadbanie o wysokiej jakości audio jest kluczowe, aczkolwiek obecnie można dostać znacznie tańszy sprzęt, oferujący większe możliwości.
+
+W celu redukcji pogłosu podczas nagrań, wykorzystuję panele akustyczne z firmy [Addictive Sound](https://addictivesound.pl/), które bardzo polecam.
+
+## Biurko i fotel
+Biurko wspierające opcję pracy na stojąco, pochodzi z firmy [Deskwise](https://deskwise.pl/), natomiast ze względu na to, że dostałem je w prezencie, nie posiadam informacji na temat modelu (nie został nigdzie wskazany).
+
+W trybie pracy siedzącej wykorzystuję fotel [Herman Miller Embody Balance](https://sklep.k-r.pl/pl/p/Herman-Miller-Embody-Balance-C7/12)
\ No newline at end of file
diff --git a/content/Optymalizacja/Sprzęt/Sprzęt.md b/content/Optymalizacja/Sprzęt/Sprzęt.md
new file mode 100644
index 000000000..0ae4e8a96
--- /dev/null
+++ b/content/Optymalizacja/Sprzęt/Sprzęt.md
@@ -0,0 +1,7 @@
+## Kontekst
+Kupując sprzęt uwzględniam przede wszystkim to, jak bardzo wpłynie na moje dotychczasowe funkcjonowanie. Bardzo zgadzam się z opinią [Grzegorza Roga](https://twitter.com/isloggedout/status/1457770727029895176), która jasno pokazuje że w przypadku profesjonalnego zastosowania, warto wybierać najlepszy dostępny sprzęt, który jest w naszym zasięgu finansowym oraz potrzeb.
+
+- [[Optymalizacja/Sprzęt/Macbook]]
+- [[Optymalizacja/Sprzęt/iPad]]
+- [[Optymalizacja/Sprzęt/iPhone]]
+- [[Optymalizacja/Sprzęt/StreamDeck]]
diff --git a/content/Optymalizacja/Sprzęt/StreamDeck.md b/content/Optymalizacja/Sprzęt/StreamDeck.md
new file mode 100644
index 000000000..5fe41bdcf
--- /dev/null
+++ b/content/Optymalizacja/Sprzęt/StreamDeck.md
@@ -0,0 +1,34 @@
+## Czym jest StreamDeck?
+Elgato StreamDeck to rodzaj dodatkowej klawiatury, na której klawiszach można wyświetlać dowolne grafiki, również dynamiczne (automatyczna podmiana zdjęcia i opisu).
+
+Dodatkowo klawisze mogą zmieniać się w zależności od kontekstu (np. otwartego programu) oraz pełnić funkcję "folderów" wewnątrz których mamy do dyspozycji dodatkowe przyciski.
+
+Jest to sprzęt zaprojektowany dla streamerów ale świetnie sprawdza się również do obsługi profesjonalnych programów, wymagających dostępu do wielu opcji oraz oczywiście [[Optymalizacja/Automatyzacja/Automatyzacja]].
+
+## Jak wykorzystuję StreamDeck?
+Od lipca 2021 wykorzystuję [Elgato StreamDeck](https://www.elgato.com/en/stream-deck) jako dodatkową klawiaturę, wykorzystywaną w celu automatyzacji oraz łatwego sterowania makrami zdefiniowanymi w [[Optymalizacja/Narzędzia/Keyboard Maestro]]
+
+Posiadam StreamDeck w wersji XL i dodatkowo wykorzystuję możliwość definiowania folderów.
+
+**Najczęsciej uruchamiane makra z jego pomocą dotyczą:**
+- uruchamiania grup notatek w [[Obsidian]] / [[Optymalizacja/Narzędzia/Notion]]
+- uruchamiania baz [[Optymalizacja/Narzędzia/Airtable]]
+- uruchamiania często otwieranych przeze mnie stron www (i nie tylko)
+- sterowania muzyką, również w całym domu
+- przełączania kontekstów pomiędzy projektami (automatyzacja workflow)
+
+## Automatyzacje
+Lubię odkrywać nowe sposoby korzystania z StreamDeck. Pozornie jest to po prostu nietypowa klawiatura a w praktyce daje bardzo duże możliwości.
+
+### Tryby pracy
+Podczas pracy najwięcej czasu i energii zabiera zmiana kontekstu. Skonfigurowałem przyciski na głównym ekranie, powiązane z aktywnościami, które chcę wykonywać regularnie. Dzięki powiązaniu akcji z [[Optymalizacja/Narzędzia/Keyboard Maestro]], mogę jednym przyciskiem przełączać się pomiędzy projektami i zadaniami.
+
+**Przykłady:**
+- włączenie trybu odpisywania na maile (luźna muzyka, brak DND i aktywacja Superhuman oraz przeglądarki)
+- projekty w które jestem zaangażowany są folderami wewnątrz których znajdują się akcje z nimi powiązane (np. pisanie artykułów na bloga easycart czy tworzenie scenariuszy podcastu dla zautomatyzowanych)
+- przełączanie się pomiędzy trybami pracy (skupiony / luźny)
+- sygnalizowanie, że włączone jest nagrywanie
+
+### Aktywności botów
+Kategoryzuję moje [[Optymalizacja/Automatyzacja/Automatyzacja]] według avatarów botów, które realizują dla mnie określone zadania. Ich scenariusze zaprojektowane są w taki sposób aby dało się je ze sobą łączyć lub wywoływać oddzielnie. Każdy z tych scenariuszy oraz zestawów scenariuszy podłączony jest pod mój
+
diff --git a/content/Optymalizacja/Sprzęt/iPad.md b/content/Optymalizacja/Sprzęt/iPad.md
new file mode 100644
index 000000000..0f7b9db71
--- /dev/null
+++ b/content/Optymalizacja/Sprzęt/iPad.md
@@ -0,0 +1,21 @@
+iPad to moim zdaniem jeden z najlepszych kawałków elektroniki z jakim kiedykolwiek miałem do czynienia.
+
+## Aplikacje
+- [[Optymalizacja/Narzędzia/Kindle]] - jeżeli mam przy sobie tablet, czytam na nim
+- [[Optymalizacja/Narzędzia/Notability]] - niemal codziennie prowadzę [[Fundamenty/📓 Dziennik]] właśnie na iPadzie z wykorzystaniem Apple Pencil
+- [[Optymalizacja/Narzędzia/ProCreate]] - w wolnych chwilach i na wyjazdach rysuję
+
+Poza tym na iPadzie nie mam zainstalowanych praktycznie żadnych aplikacji poza wymienionymi wyżej. Jest to dla mnie urządzenie przeznaczone wyłącznie do pracy kreatywnej oraz czytania. Taki stan pozostaje niezmienny od chwili gdy go kupiłem.
+
+Utrzymywanie małej liczby aplikacji pozwala mi utrzymać skupienie przy pracy kreatywnej.
+
+## Zewnętrzna klawiatura
+Korzystałem z niej kilkanaście razy. W większości przypadków wolę pisać na [[Optymalizacja/Sprzęt/Macbook]]u zamiast iPadzie. W mojej opinii iPad nie jest jeszcze wystarczająco dobry aby mógł sensownie zastąpić komputer, aczkolwiek sytuacja dość szybko się zmienia. Aktualnie świetnie uzupełnia workflow pracy z komputerem (szczególnie w aplikacji [[Optymalizacja/Narzędzia/ProCreate]] i [[Optymalizacja/Narzędzia/Figma]])
+
+## Specyfikacja
+iPad Pro 2017 9.7" 512GB z Apple Pencil gen 1 i klawiaturą Smart Keyboard. Dodatkowo wyświetlacz chroniony jest nakładką [PaperLike](https://paperlike.com/), która sprawia że pisanie na iPadzie z pomocą Apple Pencil oraz czytanie książek są znacznie przyjemniejsze.
+
+## Tryb filtrowania kolorów
+Podobnie jak na [[Optymalizacja/Sprzęt/iPhone]], praktycznie przez cały czas mam włączony tryb filtrowania kolorów (czarno-biały). Powodem tego jest fakt, że ograniczenie liczby kolorów zmniejsza chęć sięgania po iPada bez potrzeby.
+
+Tryb kolorów włączam tylko wtedy gdy ich potrzebuję (np. podczas rysowania) i robię to poprzez skonfigurowany skrót trzykrotnego wciśnięcia przycisku "Home".
\ No newline at end of file
diff --git a/content/Optymalizacja/Sprzęt/iPhone.md b/content/Optymalizacja/Sprzęt/iPhone.md
new file mode 100644
index 000000000..0f6e31c25
--- /dev/null
+++ b/content/Optymalizacja/Sprzęt/iPhone.md
@@ -0,0 +1,20 @@
+Od kilku lat moim głównym telefonem jest iPhone i trudno jest mi wyobrazić sobie powrót do Androida lub alternatyw.
+
+## Aplikacje
+- [[Optymalizacja/Narzędzia/Kindle]] - czytam w każdej wolnej chwili
+- [[Optymalizacja/Narzędzia/Audible]] - jeżeli mam zajęte ręce lub np. prowadzę auto, słucham audiobooków
+- [[Spotify]] - gdy w danej chwili nie mam możliwości czytać, słucham muzyki
+- [[Goodreads]] - tutaj zapisuję wszystkie informacje na temat przeczytanych książek
+- [[Optymalizacja/Narzędzia/Endel.io]] - słucham zamiennie ze Spotify i niemal zawsze przy kreatywnej pracy
+- [[Optymalizacja/Narzędzia/Anki]] - codziennie przerabiam proponowane talie kart
+- [[Optymalizacja/Narzędzia/Superhuman]] - wykorzystuję jako klienta poczty
+- [[Optymalizacja/Narzędzia/Headspace]] - aplikacja do [[Mindfulness]]
+- [[Optymalizacja/Narzędzia/Waking Up]] - aplikacja do [[Mindfulness]] - stosuję zamiennie z [[Optymalizacja/Narzędzia/Headspace]]
+- [[Optymalizacja/Narzędzia/Reveri]] - polecana przez [[Wiedza/Ludzie/Andrew Huberman]] aplikacja do autohipnozy
+
+Poza tym na telefonie mam zainstalowane aplikacje do opłaty na stacji benzynowej (mam [[Optymalizacja/Automatyzacja/Automatyzacja]] przesyłająca wybrane faktury za paliwo bezpośrednio do księgowości) oraz aplikacje do zamawiania jedzenia.
+
+Przez znaczną większość czasu mój telefon jest w trybie czarno-białym zgodnie z instrukcją z [Szary Ekran](https://szaryekran.pl)
+
+## Specyfikacja
+iPhone 13 Pro Max 256GB z nakładką [Anti-Glare](https://www.benks.com/products/anti-glare-matte-screen-protector) oraz skinem [dbrand](https://dbrand.com/)
\ No newline at end of file
diff --git a/content/Projekty/Ahoy!.md b/content/Projekty/Ahoy!.md
new file mode 100644
index 000000000..c713991d7
--- /dev/null
+++ b/content/Projekty/Ahoy!.md
@@ -0,0 +1,15 @@
+## Czym jest Ahoy?
+Ahoy! to społeczność której zawsze chcieliśmy być częścią. W związku z tym, że nie znaleźliśmy takiego miejsca, postanowiliśmy sami je stworzyć. Aktualnie skupiamy się wokoł tematów [[Wiedza/🎨 Projektowanie/UX]]/[[Wiedza/🎨 Projektowanie/UI]], Fotografia oraz [[Optymalizacja/Automatyzacja/Automatyzacja]]. Wkrótce pojawi się również [[Web Development]]
+
+Społeczność oparta jest o platformę Circle.so, Discord oraz szereg naszych pluginów i produktów (np. [[Projekty/EasyCart]]).
+
+## Aktualności
+
+- Q1 2022
+ Ahoy! DAO - rusza pierwszy sezon Ahoy! https://www.ahoy.so/sezon-1
+
+- H2 2021
+ Aktualnie rozwijamy społeczności UI & UX oraz [[Projekty/zautomatyzowani]]
+ Dołączyć można na stronie: [[https://ahoy.so/]].
+
+ Sama społeczność oparta jest o platformę [Circle](https://circle.so/) i początkowo wykorzystywała MemberStack do obsługi dostępów. Aktualnie cały system płatności oraz zarządzania dostępami i treścią opieramy o [[Projekty/EasyCart]], [[Optymalizacja/Narzędzia/Integromat]] oraz [[Optymalizacja/Narzędzia/Airtable]].
diff --git a/content/Projekty/Design Maestro.md b/content/Projekty/Design Maestro.md
new file mode 100644
index 000000000..582192f17
--- /dev/null
+++ b/content/Projekty/Design Maestro.md
@@ -0,0 +1,12 @@
+# Czym jest Design Maestro?
+To zestaw makr do aplikacji [[Optymalizacja/Narzędzia/Keyboard Maestro]], stworzony z myślą o designerach pracujących w [[Optymalizacja/Narzędzia/Figma]] i [[Optymalizacja/Narzędzia/Webflow]] oraz korzystających z możliwości systemu [[MacOS]].
+
+
+
+Aktualnie zawiera około 80 makr przyspieszających pracę z projektami i plikami, oraz automatyzujących powtarzalne czynności. W tej chwili dostęp do projektu jest zamknięty a jego premiera planowana jest na Styczeń / Luty 2022.
+
+## Design Maestro FREE
+Projekt został opublikowany pod koniec marca 2022 w formie bezpłatnej wersji 10 makr:
+https://designmaestro.io
+
+
diff --git a/content/Projekty/EasyBanner.md b/content/Projekty/EasyBanner.md
new file mode 100644
index 000000000..14e05a8f0
--- /dev/null
+++ b/content/Projekty/EasyBanner.md
@@ -0,0 +1,18 @@
+## Czym jest EasyBanner?
+
+EasyBanner to mój mikroserwis, umożliwiający generowanie plików jpg / png / pdf na podstawie kodu HTML / CSS.
+
+Wykorzystuję go w połączeniu z [[Optymalizacja/Narzędzia/Integromat]] do tworzenia [[Optymalizacja/Automatyzacja/Automatyzacja]].
+
+Aktualnie większość grafik, które publikuję w mediach społecznościowych, tworzona jest na podstawie szablonów i generowana z pomocą [[Projekty/EasyBanner]].
+
+## Integromat
+EasyBanner posiada swój własny moduł w Integromacie, aktualnie dostępny wyłącznie dla osób posiadających wykupiony dostęp.
+
+
+
+## Jak uzyskać dostęp?
+EasyBanner dostępny jest aktualnie w abonamencie 39 zł / miesięcznie.
+
+Można go wykupić dzięki [[Projekty/EasyCart]] na stronie:
+https://app.easycart.pl/checkout/zautomatyzowani/easybanner
\ No newline at end of file
diff --git a/content/Projekty/EasyCart.md b/content/Projekty/EasyCart.md
new file mode 100644
index 000000000..7a55da7b7
--- /dev/null
+++ b/content/Projekty/EasyCart.md
@@ -0,0 +1,31 @@
+# Czym jest EasyCart?
+EasyCart to projekt ułatwiający sprzedaż w produktów cyfrowych. Jego największą przewaga konkurencyjną jest UX (np. płatność "one-click") oraz "efekt sieci" (zapamiętanie danych płatności przy zakupie u dowolnego sprzedawcy w sieci EasyCart).
+
+Początkowo EasyCart powstał jako koszyk na potrzeby naszych projektów. Obecnie dzięki technologii Stripe możliwe było udostępnienie go innym.
+
+## Aktualności
+- Grudzień 2021 EasyCart przekracza 700 tys zł transakcji i 4000 klientów w sieci
+- Listopad 2021 EasyCart wkrótce zakończy publiczną betę
+- Sierpień 2021 Pierwszy klient po testach przełącza wszystkie swoje produkty na EC 🎉
+- Sierpień 2021 - EasyCart staje się projektem #buildinpublic
+- Sierpień 2021 - EasyCart jest na etapie zamkniętej bety
+
+---
+
+## Testy koszyka
+Koszyk można testować pod adresami:
+- [https://sandbox.easycart.pl/checkout/ahoy/konsultacje](https://sandbox.easycart.pl/checkout/ahoy/konsultacje)
+- [https://sandbox.easycart.pl/checkout/ahoy/postaw-mi-kawe](https://sandbox.easycart.pl/checkout/ahoy/postaw-mi-kawe)
+- [https://sandbox.easycart.pl/checkout/ahoy/kurs-improwizacji-w-biznesie](https://sandbox.easycart.pl/checkout/ahoy/kurs-improwizacji-w-biznesie)
+
+Możesz także użyć przykładowych kart, z dowolnym 3 cyfrowym CVC oraz datą wygaśnięcia w przyszłości:
+- Bez autoryzacji 3D Secure: **`4242 4242 4242 4242`**
+- Z autoryzacją 3D Secure: **`4000 0027 6000 3184`**
+
+## Publikacje
+- [Jak pomóc Twórcom sprzedawać? Budujemy EasyCart!](https://www.linkedin.com/pulse/jak-pom%25C3%25B3c-tw%25C3%25B3rcom-sprzedawa%25C4%2587-budujemy-easycart-easycartpl/?trackingId=u964yQIP9WE8WCzc61XGeg%3D%3D)
+- [Nieoczywiste automatyzacje po sprzedaży](https://www.easycart.pl/blog/nie-oczywiste-automatyzacje-po-sprzedazy)
+- [Automatyzacje po sprzedaży](https://www.easycart.pl/blog/automatyzacje-po-sprzedazy)
+- [Czym jest MRR i jak pomoże Ci w prowadzeniu biznesu?](https://www.easycart.pl/blog/czym-jest-mrr-i-jak-pomoze-ci-w-prowadzeniu-biznesu)
+- [10 sposobów na zoptymalizowanie procesu zakupowego](https://www.easycart.pl/blog/10-sposobow-na-zoptymalizowanie-procesu-zakupowego)
+- [Siła Subskrypcji](https://www.easycart.pl/blog/sila-subskrypcji)
\ No newline at end of file
diff --git a/content/Projekty/EasyLegal.md b/content/Projekty/EasyLegal.md
new file mode 100644
index 000000000..02a5d2c06
--- /dev/null
+++ b/content/Projekty/EasyLegal.md
@@ -0,0 +1,4 @@
+# Czym jest EasyLegal?
+EasyLegal to narzędzie do generowania Regulaminu oraz Polityki prywatności, niezbędnych do funkcjonowania strony Internetowej oraz sklepu.
+
+EasyLegal stanowi część [[EasyTools]] i jest dostępny tutaj https://app.easytools.pl/easylegal
diff --git a/content/Projekty/EasyLove.md b/content/Projekty/EasyLove.md
new file mode 100644
index 000000000..806ed467e
--- /dev/null
+++ b/content/Projekty/EasyLove.md
@@ -0,0 +1,7 @@
+# Czym jest EasyLove?
+To narzędzie ułatwiające proces gromadzenia oraz udostepniania opinii klientów.
+
+Opinie klientów stanowią jeden z najbardziej istotnych elementów marketingu oraz sprzedaży a pomimo tego często są pomijane lub gubią się pośród maili i komentarzy Social Media.
+
+EasyLove stanowi część [[EasyTools]] i jest dostępny tutaj: https://app.easytools.pl/easylove
+
diff --git a/content/Projekty/EasyTimer.md b/content/Projekty/EasyTimer.md
new file mode 100644
index 000000000..2d3cc3072
--- /dev/null
+++ b/content/Projekty/EasyTimer.md
@@ -0,0 +1,16 @@
+# Czym jest EasyTimer?
+
+To generator liczników, które można wykorzystać w kampaniach mailowych. Aplikacja generuje zegar odliczający czas do wskazanej daty.
+
+W grudniu 2021 EasyTimer został nagrodzony tytułem "Produktu dnia" na [[Product Hunt]]
+
+
+
+Bezpłatna wersja dostępna jest tutaj:
+https://easytimer.app/
+
+A wersja udostępniająca API oraz prywatny moduł w Integromacie, dostępna jest tutaj: https://app.easycart.pl/checkout/zautomatyzowani/easytimer
+
+EasyTimer stanowi część [[EasyTools]] i w momencie pisania tego artykułu znajduje się jeszcze w wersji beta. Oznacza to, że w niektórych przypadkach może nie działać poprawnie i może jeszcze zawierać drobne bugi.
+
+https://app.easytools.pl/easytimer
\ No newline at end of file
diff --git a/content/Projekty/Projekty.md b/content/Projekty/Projekty.md
new file mode 100644
index 000000000..4e5921846
--- /dev/null
+++ b/content/Projekty/Projekty.md
@@ -0,0 +1,14 @@
+---
+title: Projekty
+---
+
+- [[Projekty/eduweb]]
+- [[Projekty/overment]]
+- [[Projekty/zautomatyzowani]]
+- [[Projekty/Ahoy!]]
+- [[Projekty/EasyCart]]
+- [[Projekty/Design Maestro]]
+- [[Projekty/EasyLegal]]
+- [[Projekty/EasyLove]]
+- [[Projekty/EasyTimer]]
+- [[Projekty/EasyBanner]]
\ No newline at end of file
diff --git a/content/Projekty/eduweb.md b/content/Projekty/eduweb.md
new file mode 100644
index 000000000..405a9f697
--- /dev/null
+++ b/content/Projekty/eduweb.md
@@ -0,0 +1,106 @@
+[[Projekty/eduweb]] to projekt w który angażuję się od kwietnia 2020 roku. Ma on dla mnie szczególne znaczenie, ponieważ to właśnie na eduweb zaczynałem poważną naukę programowania.
+
+## Kursy
+
+### Kurs Keyboard Maestro
+Keyboard Maestro to aplikacja dla systemu MacOS, umożliwiająca automatyzację niemal dowolnej akcji wykonywanej na komputerze. W tym kursie znajdziesz praktyczne przykłady oraz inspiracje, które pomogą Ci tworzyć proste i rozbudowane makra, które pozwolą Ci zaoszczędzić wiele godzin pracy.
+
+🔗 [Strona kursu](https://eduweb.pl/marketing-i-biznes/biznes/keyboard-maestro-automatyzacja-macos?ref=overment)
+
+### Kurs TypeScript - Podstawy
+Materiał stanowiący absolutne wprowadzenie do [[TypeScript]] wyjaśniający fundamentalne założenia oraz składnię. Przeznaczony jest dla osób, które znają już [[Wiedza/Programowanie/JavaScript/JavaScript]].
+
+🔗 [Strona kursu](https://eduweb.pl/programowanie-i-www/typescript/typescript-podstawy?ref=overment)
+
+### Kurs TypeScript - Zaawansowany
+Jest to kontyunacja kursu [[Projekty/eduweb#Kurs TypeScript - Podstawy]] w której przechodzę przez bardziej zaawansowane wykorzystanie typów oraz praktyczną konfigurację projektu TypeScript.
+
+🔗 [Strona kursu](https://eduweb.pl/programowanie-i-www/typescript/typescript-techniki-zaawansowane?ref=overment)
+
+### Warsztat: Wszystko o Typach
+Warsztat na temat typów w [[Wiedza/Programowanie/JavaScript/JavaScript]] oraz ich znaczenia w kontekście [[TypeScript]]. Dowiesz się z niego czym jest statyczne i dynamiczne typowanie. Pokazuję w nim również jakie argumenty przemawiają za wykorzystaniem TypeScript.
+
+🔗 [Strona warsztatu](https://eduweb.pl/programowanie-i-www/typescript/wszystko-o-typach?ref=overment)
+
+### Warsztat: Czy warto uczyć się TypeScript'u?
+Z tego materiału dowiesz się kiedy warto nauczyć się [[TypeScript]].
+
+🔗 [Strona warsztatu](https://eduweb.pl/programowanie-i-www/typescript/czy-warto-uczyc-sie-typescript?ref=overment)
+
+### Warsztat: Czy Tailwind zastąpi Bootstrapa?
+Ten warsztat przeznaczony jest dla osób, które chcą zobaczyć jak korzystać z [[Tailwind CSS]] w praktyce na przykładzie kodowania komponentu serwisu [[Projekty/eduweb]]. Dodatkowo zachęcam do przeczytania mojego [wpisu na temat Tailwind](https://blog.eduweb.pl/tailwind-to-rewolucja-jesli/)
+
+🔗 [Strona warsztatu](https://eduweb.pl/programowanie-i-www/html-css/tailwind-css-czy-zastapi-bootstrapa?ref=overment)
+
+### Warsztat: Regex dla Web Developera
+W tym materiale znajdziesz minimum niezbędnej wiedzy na temat [[Regex]], która z pewnością przyda Ci się w codziennej pracy. Poza tym są to umiejętności przydatne w korzystaniu z aplikacji takich jak [[Optymalizacja/Narzędzia/Integromat]], [[Optymalizacja/Narzędzia/Zapier]], [[Optymalizacja/Narzędzia/Keyboard Maestro]] lub [[Optymalizacja/Narzędzia/Hazel]].
+
+🔗 [Strona warsztatu](https://eduweb.pl/programowanie-i-www/javascript/regex-dla-webdevelopera?ref=overment)
+
+### Warsztat: Workflow Web Developera 2021
+W tym materiale dzielę się swoimi sugestiami w kontekście [[Optymalizacja/Optymalizacja]] pracy programisty. Wskazuję w nim
+- z jakiego edytora kodu warto korzystać,
+- jak skonfigurować [[Visual Studio Code]],
+- jak pracować na wielu urządzeniach i przeglądarkach jednocześnie
+- jak skonfigurować środowisko lokalne
+- czy warto sięgać po [[Wiedza/Programowanie/No-Code]]
+- w jaki sposób AI pomaga nam kodować już dziś? ([[Optymalizacja/Narzędzia/TabNine]])
+- dlaczego warto sięgać po debuggery, lintery i automatyzacje?
+- jak szybko i bezpłatnie hostować proste strony www
+- czy warto inwestować w sprzęt i jeżeli tak to jaki?
+
+🔗 [Strona warsztatu](https://eduweb.pl/programowanie-i-www/html-css/nowoczesny-workflow-webdevelopera-edycja-2020-21?ref=overment)
+
+### Warsztat: Przegląd Svelte
+Warsztat w którym pokazuję czym jest [[Svelte]], jakie możliwości oferuje w porównaniu z innymi frameworkami [[Wiedza/Programowanie/JavaScript/JavaScript]] oraz czy warto z niego korzystać?
+
+🔗 [Strona warsztatu](https://eduweb.pl/programowanie-i-www/javascript/svelte-przeglad-frameworka?ref=overment)
+
+### Warsztat: CSS Houdini
+CSS Houdini to stosunkowo nowe API [[CSS]], dające większe możliwości kontroli właściwości CSS, definiowania własnych oraz tworzenia wydajnych i zaawansowanych animacji w połączeniu z [[Wiedza/Programowanie/JavaScript/JavaScript]].
+
+🔗 [Strona warsztatu](https://eduweb.pl/programowanie-i-www/html-css/css-houdini-przeglad-mozliwosci?ref=overment)
+
+### Warsztat: Laravel Livewire
+Osobiście wykorzystuję [[Laravel]] w kilku rozwijanych przeze mnie projektach. Livewire to framework [[Wiedza/Programowanie/JavaScript/JavaScript]] umożliwiający tworzenie wysoko interaktywnych aplikacji bez konieczności wykorzystania framework'ów front-endowych.
+
+W mojej opinii jest to raczej ciekawostka, która może zostać wykorzystana w bardzo wąskiej grupie projektów. Szczególnie przydatny w przypadku [[Rapid Development]].
+
+🔗 [Strona warsztatu](https://eduweb.pl/programowanie-i-www/php/livewire-full-stack-development-w-php?ref=overment)
+
+### Warsztat: Nowości w ES2019 / ES2020
+Nagranie z nowymi funkcjami [[Wiedza/Programowanie/JavaScript/JavaScript]] dostępnymi wraz z [[ES2019]] i [[ES2020]] a w tym:
+- Object.entries() & Object.fromEntries()
+- Array.flat() & Array.flatMap()
+- trimStart() / trimEnd()
+- Optional Chaining & Nullish coalescing
+- String.prototype.matchAll()
+- [[Wiedza/Programowanie/JavaScript/Promise/Promise]].allSettled()
+- globalThis
+- BigInt
+- Symbol.description
+
+🔗 [Strona warsztatu](https://eduweb.pl/programowanie-i-www/javascript/nowosci-w-ecmascript-2019-20?ref=overment)
+
+### Warsztat: Asynchroniczność w JavaScript
+W tym warsztacie wyjaśniam najważniejsze koncepcje dotyczące asynchroniczności w [[Wiedza/Programowanie/JavaScript/JavaScript]] takie jak [[Event Loop]], [[Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Higher-Order Function]], [[Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Currying]], [[Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Pure Functions]], [[Callback]], [[Wiedza/Programowanie/JavaScript/Promise/Promise]], [[Wiedza/Programowanie/JavaScript/Promise/Async Await]] oraz obsługę błędów w JavaScript.
+
+🔗 [Strona warsztatu](https://eduweb.pl/programowanie-i-www/javascript/asynchronicznosc-w-javascript-krok-po-kroku?ref=overment)
+
+### Warsztat: Zaawansowane debugowanie w JavaScript
+Ten warsztat zawiera najważniejsze techniki dotyczące debugowania kodu [[Wiedza/Programowanie/JavaScript/JavaScript]] zarówno z wykorzystaniem Chrome Dev Tools jak i wbudowanego debuggera w [[Visual Studio Code]]. Całość uwzględnia zarówno debugowanie aplikacji po stronie klienta ([[Vue]]) oraz serwera ([[Nest]])
+
+🔗 [Strona warsztatu](https://eduweb.pl/programowanie-i-www/javascript/zaawansowane-debugowanie-javascript-i-nodejs?ref=overment)
+
+### Warsztat: JavaScript bez tajemnic
+Warsztat w którym wyjaśniam kluczowe koncepcje [[Wiedza/Programowanie/JavaScript/JavaScript]], które często sprawiają wiele problemów. Mowa o:
+- Zakres globalny, lokalny i blokowy [[Wiedza/Programowanie/JavaScript/Zakres/Scope]]
+- [[Hoisting]] i Temporal Dead Zone
+- [[Wiedza/Programowanie/JavaScript/Zakres/Closures]]
+- Słowo kluczowe [[this (JavaScript)]]
+- Metody call, apply i bind
+- Moduły
+- Przekazywanie informacji przez wartość i referencję
+- Kopiowanie i zamrażanie obiektów
+
+🔗 [Strona warsztatu](https://eduweb.pl/programowanie-i-www/javascript/javascript-bez-tajemnic?ref=overment)
\ No newline at end of file
diff --git a/content/Projekty/overment.md b/content/Projekty/overment.md
new file mode 100644
index 000000000..e50ca493e
--- /dev/null
+++ b/content/Projekty/overment.md
@@ -0,0 +1,21 @@
+overment to kanał na YouTube dedykowany programistom. Cały projekt oparty jest o najważniejszą dla mnie zasadę jaką jest [[Szacunek do Czasu]] zarówno mojego jak i innych.
+
+## Zasady tworzenia filmów
+- Szanuję czas odbiorców [[Szacunek do Czasu]]
+ - Robię solidny research
+ - Wycinam niepotrzebne elementy
+- Mówię prostymi słowami o rzeczach trudnych
+- Ukrywam zbędne elementy interfejsu
+- Nagrywam filmy na tematy, które sam chcę lepiej poznać lub utrwalić
+
+## Narzędzia
+- Do tworzenia scenariuszy wykorzystuję [[Workflowy]] a od niedawna [[Obsidian]]
+- Nagrywam w [[Optymalizacja/Narzędzia/Screenflow]]
+- Gromadzę informacje o filmach w [[Optymalizacja/Narzędzia/Airtable]]
+- Publikuję i promuję filmy automatycznie [[Projekty/zautomatyzowani#YouTube na Autopilocie]]
+
+## YouTube
+- [[Wiedza/Programowanie/JavaScript/JavaScript]]
+- [[Wiedza/Programowanie/REST/REST]]
+- [[Wiedza/Programowanie/Node.js]]
+- [[Wiedza/Programowanie/git/git]]
diff --git a/content/Projekty/zautomatyzowani.md b/content/Projekty/zautomatyzowani.md
new file mode 100644
index 000000000..860f8153c
--- /dev/null
+++ b/content/Projekty/zautomatyzowani.md
@@ -0,0 +1,23 @@
+[[Projekty/zautomatyzowani]] to projekt, który powołałem wspólnie z [[Grzegorz Róg]] ([[Projekty/eduweb]]) aby pokazać nasze podejście do [[Optymalizacja/Automatyzacja/Automatyzacja]], wykorzystania narzędzi [[Wiedza/Programowanie/No-Code]] oraz szeroko pojętego prowadzenia biznesu w sieci.
+
+🔗 https://zautomatyzowani.pl/
+
+> Strona zautomatyzowani.pl powstała z wykorzystaniem [[Tailwind CSS]] i [[Tailwind UI]] w ciągu kilku dni.
+
+## Produkty
+### YouTube na Autopilocie
+- [YouTube na Autopilocie](https://youtube.zautomatyzowani.pl)
+ - Automatyzacja YouTube jaką wykorzystuję w [[Projekty/overment]] do prowadzenia kanału.
+ - Narzędzia: [[Optymalizacja/Narzędzia/Airtable]], [[Optymalizacja/Narzędzia/Integromat]], [[Optymalizacja/Narzędzia/Zapier]]
+
+### Newsletter na Autopilocie
+- [Newsletter na Autopilocie](http://newsletter.zautomatyzowani.pl)
+ - Automatyzacja Newslettera jaką wykorzystuję w [[Projekty/zautomatyzowani]] i [[Projekty/eduweb]]
+ - Narzędzia: [[Optymalizacja/Narzędzia/Airtable]], [[Optymalizacja/Narzędzia/Integromat]], [[Optymalizacja/Narzędzia/Buffer]] oraz SendGrid / MailChimp / MailerLite / GetResponse
+
+### Podcast na Autopilocie
+- [Podcast na Autopilocie](https://podcast.zautomatyzowani.pl)
+
+### Program zautomatyzowanych
+- [Program Zautomatyzowanych](https://zautomatyzowani.pl/program)
+ - [Szczegółowa Agenda Programu](https://www.notion.so/automatyzacje/Program-Marketing-i-Biznes-na-Autopilocie-571a840aefef4d7e8502fd28a282ad67)
\ No newline at end of file
diff --git a/content/Wiedza/Biznes/Biznes.md b/content/Wiedza/Biznes/Biznes.md
new file mode 100644
index 000000000..adce01d70
--- /dev/null
+++ b/content/Wiedza/Biznes/Biznes.md
@@ -0,0 +1,27 @@
+# Biznes
+Tworzenie firmy jest dla mnie sposobem na realizowanie wszystkich moich pomysłów oraz jest to droga do życia zgodnie z moimi [[Fundamenty/Wartości]]ami
+
+Aktualnie niemal wszystkie swoje projekty realizuję z Grzegorzem Rogiem, Piotrem Palarzem i Mateuszem Wierzbickim. Współtworzę też pojedyncze projekty z Marcinem i Przemkiem z Przeprogramowani.pl oraz posiadam kilka własnych inicjatyw, które stanowią dla mnie dodatkową formę przychodu lub formą ekspresji.
+
+## Moja historia biznesowa
+
+Własne projekty realizuję od czasów gdy miałem 11-13 lat. Początkowo były to gry oraz szkolne radio internetowe.
+
+Mając 16-18 lat realizowałem pierwsze projekty dla klientów a mając 19/20 lat przeprowadziłem się do Krakowa gdzie zacząłem staż w startupie w którym spędziłem kolejne 8 lat życia.
+
+Tam w roli CTO rozwijałem m.in produkty: Notatek.pl, Skillveo oraz Talent Place.
+
+Od 2017 rozwijam overment a od 2020 eduweb i wszystkie pozostałe [[Projekty/Projekty]]
+
+## Książki
+
+- [[Wiedza/Ksiazki/Getting Real]]
+- [[Wiedza/Ksiazki/Alamanck of Naval Ravikant]]
+- [[Wiedza/Ksiazki/Anything You Want]]
+- [[Wiedza/Ksiazki/MAKE]]
+- [[Wiedza/Ksiazki/Hard Things About Hard Things]]
+- [[Wiedza/Ksiazki/Creativity Inc]]
+- [[Wiedza/Ksiazki/Shape Up]]
+- [[Wiedza/Ksiazki/Principles]]
+- [[Wiedza/Ksiazki/Good to Great]]
+- [[Wiedza/Ksiazki/The Infinite Game]]
diff --git a/content/Wiedza/Biznes/Leadership.md b/content/Wiedza/Biznes/Leadership.md
new file mode 100644
index 000000000..b775e5f4a
--- /dev/null
+++ b/content/Wiedza/Biznes/Leadership.md
@@ -0,0 +1,12 @@
+Uważam że każdy z nas jest lub powinien być liderem dla siebie i innych. Niewiele wspólnego ma z tym nasze stanowisko czy pozycja społeczna. Dodatkowo nawet najwięksi liderzy powinni być gotowi na to aby podążyć za innymi w chwili gdy jest to konieczne.
+
+Więcej o byciu liderem dla samego siebie napisałem w jednym z moich artykułów: [Jakim liderem jesteś...dla samego siebie?](https://www.linkedin.com/pulse/jakim-liderem-jeste%C5%9Bdla-samego-siebie-adam-gospodarczyk-/)
+
+Leadershipu uczę się aktywnie każdego dnia. Dużą rolę w tym obszarze odegrały osoby takie jak [[Wiedza/Ludzie/Jocko Willink]] czy [[Simon Sinek]] a nawet filmy takie jak A Faster Horse czy Ocean Ognia.
+
+## Książki
+- [[Wiedza/Ksiazki/Leaders Eat Last]]
+- [[Wiedza/Ksiazki/The Infinite Game]]
+- [[Wiedza/Ksiazki/Extreme Ownership]]
+- [[Dichotomy of Leadership]]
+- [[Wiedza/Ksiazki/Creativity Inc]]
\ No newline at end of file
diff --git a/content/Wiedza/Biznes/Marketing.md b/content/Wiedza/Biznes/Marketing.md
new file mode 100644
index 000000000..fc28bc942
--- /dev/null
+++ b/content/Wiedza/Biznes/Marketing.md
@@ -0,0 +1,7 @@
+## E-mail marketing
+
+## Książki
+- [[Wiedza/Ksiazki/The Brain Audit]]
+- [[Wiedza/Ksiazki/Simplify]]
+- [[Wiedza/Ksiazki/Insanely Simple]]
+- [[Wiedza/Ksiazki/Predictably Irrational]]
diff --git a/content/Wiedza/Biznes/Produkt.md b/content/Wiedza/Biznes/Produkt.md
new file mode 100644
index 000000000..3e8bbcabd
--- /dev/null
+++ b/content/Wiedza/Biznes/Produkt.md
@@ -0,0 +1,5 @@
+## Książki
+- [[Wiedza/Ksiazki/Inspired]]
+- [[Wiedza/Ksiazki/The Mom Test]]
+- [[Wiedza/Ksiazki/MAKE]]
+-
\ No newline at end of file
diff --git a/content/Wiedza/Biznes/Sprzedaż.md b/content/Wiedza/Biznes/Sprzedaż.md
new file mode 100644
index 000000000..e8a947d6c
--- /dev/null
+++ b/content/Wiedza/Biznes/Sprzedaż.md
@@ -0,0 +1,3 @@
+## Książki
+- [[Wiedza/Ksiazki/Never Split the Difference]]
+- [[Wiedza/Ksiazki/The Brain Audit]]
\ No newline at end of file
diff --git a/content/Wiedza/Inne/MBTI.md b/content/Wiedza/Inne/MBTI.md
new file mode 100644
index 000000000..958c7deb9
--- /dev/null
+++ b/content/Wiedza/Inne/MBTI.md
@@ -0,0 +1,18 @@
+# MBTI
+To popularny i bezpłatny test osobowości na którym opieram [[Fundamenty/💛 Poznawanie siebie]] oraz [[Fundamenty/Proces]]
+
+Bardzo często spotykam się z negatywnymi opiniami na jego temat oraz przykładami podważania jego skuteczności. Nie oceniam tego.
+
+Wystarczającym powodem do tego aby brać go na poważnie, jest fakt że to samo zrobił [[Wiedza/Ludzie/Ray Dalio]], wykorzystując go jako jedno z najważniejszych narzędzi w procesie rekrutacji i budowania zespołu. Według niego test pokazuje pewne schematy ale jego rolą jest przede wszystkim zachęcenie do porównywania jego wyniku z rzeczywistością.
+
+**Inaczej mówiąc:** rolą testu jest pokazanie Ci pewnych kierunków oraz skupienie Twojej uwagi na obserwacji siebie i wyciąganiu wniosków.
+
+Dla mnie MBTI to jedno z najważniejszych narzędzi z jakim przyszło mi pracować w kontekście mojego rozwoju.
+
+## Dodatkowe źródła
+- [PDF dla profilu INFJ](https://idigitalcitizen.files.wordpress.com/2011/02/infj-profile-counselor-protector-pdf2.pdf). Na [tej stronie znajdziesz PDFy](https://digitalcitizen.ca/personality-assessment/) dla pozostałych profili.
+- Ksiązka "[The Complete Guide to Understaning the INFJ Personality Type](https://www.goodreads.com/book/show/46252131-the-complete-guide-to-understanding-the-infj-personality-type)"
+
+## Linki
+Test można wykonać tutaj:
+https://www.16personalities.com/pl
\ No newline at end of file
diff --git a/content/Wiedza/Inne/Principles You.md b/content/Wiedza/Inne/Principles You.md
new file mode 100644
index 000000000..677ecd515
--- /dev/null
+++ b/content/Wiedza/Inne/Principles You.md
@@ -0,0 +1,4 @@
+# Principles You
+Test osobowości przygotowany przez [[Wiedza/Ludzie/Ray Dalio]] i [[Wiedza/Ludzie/Adam Grant]]
+
+https://principlesyou.com/
\ No newline at end of file
diff --git a/content/Wiedza/Inne/StrenghtsFinder.md b/content/Wiedza/Inne/StrenghtsFinder.md
new file mode 100644
index 000000000..6a9be3e64
--- /dev/null
+++ b/content/Wiedza/Inne/StrenghtsFinder.md
@@ -0,0 +1,35 @@
+# StrengthsFinder
+To obok [[Wiedza/Inne/MBTI]], [[Wiedza/Inne/The Big Five]] i [[UnderstandMyself]] najważniejsze narzędzie, jakie wykorzystałem w procesie [[Fundamenty/💛 Poznawanie siebie]].
+
+## Dlaczego StrengthsFinder?
+Instytut Gallupa od lat zajmuje się badaniem populacji. Jednym z pytań, które sobie zadał, dotyczyło tego "dlaczego niektóre osoby tak bardzo wyróżniają się z tłumu?".
+
+Po wieloletnich badaniach doszli do wniosku, że jednym z ważniejszych elementów jest rozwijanie swoich mocnych stron, zamiast próbie doprowadzenia słabych na "normalny poziom".
+
+W rezultacie powstał StrenghtsFinder, który w założeniu ma pomóc nam zidentyfikować nasze talenty i dostarczyć wiedzy w jaki sposób możemy zamienić je w nasze mocne strony.
+
+## Talent vs Mocna Strona
+- Talent to naturalny dla nas styl działania.
+- Mocna strona to talent wykonywany w sposób zbliżony do doskonałości
+
+W praktyce StrengthsFinder pomaga nam zidentyfikować nasze Talenty, jednak dopiero praca nad nimi może sprawić, że staną się dla nas mocnymi stronami.
+
+## Jak wykonać "Test Gallupa"?
+Sam korzystałem z instrukcji na [blogu Dominika Juszczyka](https://dominikjuszczyk.pl/2016/03/jak-zrobic-test-strengthsfinder-po-polsku/).
+
+Polecam też całą działalność Dominika w temacie Testu Gallupa.
+
+⚠️ Uwaga: test ma ~180 pytań i warto zarezerwować sobie na jego wykonanie minimum 2 godziny.
+
+## Wersja 5 czy 34?
+Początkowo wykonałem wersję odkrywającą 5 talentów a później odblokowałem pozostałe wyniki.
+
+W mojej opinii jest to dobre podejście aby w pierwszej kolejności odpowiednio skupić swoją uwagę na TOP5, nad którymi warto pracować najbardziej. Dopiero później odblokowanie 34 talentów pozwoli na uzyskanie dodatkowej, bardzo wartościowej perspektywy.
+
+## Ponowne wykonanie testu
+Wykonałem test ponownie po kilku latach. Niektóre talenty pozostały niezmienne a inne całkowicie zmieniły swoją pozycję.
+
+Moje ogólne wrażenie: "Fundament pozostał niezmienny a rzeczy nad którymi bardzo pracowałem, zmieniły swoje znaczenie."
+
+## Linki
+- [CliftonStrengths 34](https://store.gallup.com/p/en-ie/10003/cliftonstrengths-34)
\ No newline at end of file
diff --git a/content/Wiedza/Inne/The Big Five.md b/content/Wiedza/Inne/The Big Five.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/content/Wiedza/Ksiazki/12 Rules for Life.md b/content/Wiedza/Ksiazki/12 Rules for Life.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Ksiazki/12 Rules for Life.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Alamanck of Naval Ravikant.md b/content/Wiedza/Ksiazki/Alamanck of Naval Ravikant.md
new file mode 100644
index 000000000..aa78960a8
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Alamanck of Naval Ravikant.md
@@ -0,0 +1,42 @@
+Autor: Eric Jorgenson
+
+## Kontekst
+[[Wiedza/Ksiazki/Alamanck of Naval Ravikant]] to jedna z książek w przypadku której zaznaczanie wartościowych fragmentów, kończy się zamazaniem całej. Jest to zbiór i interpretacja wypowiedzi [[Navala Ravikant]]a - znanego inwestory z Doliny Krzemowej, który na wczesnym etapie zainwestował w firmy takie jak Notion, Twitter czy Uber.
+
+Naval kładzie ogromny nacisk w tej książce na mechanizm dźwigni (eng. [[Wiedza/Modele Mentalne/Leverage]]) opartą o tworzenie produktów, których koszt replikacji jest marginalny.
+
+Poza zawodowymi sukcesami, Naval wyróżnia się szczególną mądrością oraz faktem, że jest po prostu szczęśliwy a to nie zawsze idzie w parze z sukcesem zawodowym.
+
+> Każdy wielki programista posiada już dziś armię robotów, która pracuje dla niego dzień i noc, nawet wtedy gdy on śpi ([[Optymalizacja/Automatyzacja/Automatyzacja]])
+
+## Koncepcje
+
+### Wealth vs. Money/Status Game
+- Bogactwo ([[Wealth Game]]) to zasoby, które pracują dla Ciebie nawet gdy śpisz.
+- Pieniądze to sposób transformacji czasu i bogactwa
+- Status to Twoja pozycja w hierarchii społecznej
+
+Dobrze jest żyć grając w [[Wealth Game]] zamiast [[Status Game]]. W szczególności warto zrozumieć w jaki sposób kreować w oparciu o etykę oraz ignorować ludzi, którzy funkcjonują w oparciu o Status Game - zyskują go atakując ludzi budujących swoje bogactwo.
+
+### [[Specific Knowledge]]
+[[Specific Knowledge]] to rodzaj wiedzy która nie może być przekazana a jej automatyzacja nie jest możliwa. Jeżeli ktoś może Cię czegoś nauczyć, oznacza to że może nauczyć też kogoś innego.
+
+Taka wiedza w moim przekonaniu płynie z połączenia naturalnych predyspozycji ([[Fundamenty/💛 Poznawanie siebie]]), ciężkiej pracy ([[Wiedza/Słownik/Proces]]) oraz połączenia tego z unikatowymi cechami naszego charakteru.
+
+### [[Wiedza/Modele Mentalne/Leverage]]
+Według Navala dźwignia biznesowa pochodzi z Kapitału, Ludzi i Produktów posiadających niski lub zerowy koszt replikacji (kod i media).
+
+### [[Konkurencja]]
+🚧
+
+
+## Lekcje
+- Naucz się budować i sprzedawać: staniesz się niepowstrzymany
+- Nigdy nie będziesz wart więcej niż myślisz. W kontekście biznesowym, wyznacz sobie swoją stawkę godzinową i pracuj tak, jakbyś rzeczywiście tyle zarabiał
+- Niezależność jest ważniejsza niż to ile zarabiasz. To ona daje przestrzeń i kontrolę.
+- Kiedy ostatnio się nudziłeś? [[Wiedza/Przemyślenia/Nuda]] daje przestrzeń, przestrzeń jest elementem kreatywności
+- Jeżeli nie potrafisz zdecydować, odpowiedź brzmi NIE"
+- Jeżeli podejmujesz decyzję, wybierz opcję która krótkoterminowo jest trudniejsza.
+- Szczęście to kwestia naszej decyzji
+
+I wiele, wiele innych.
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/All I Want to Know is Where Im Going to Die So Ill Never Go There.md b/content/Wiedza/Ksiazki/All I Want to Know is Where Im Going to Die So Ill Never Go There.md
new file mode 100644
index 000000000..0287a1c94
--- /dev/null
+++ b/content/Wiedza/Ksiazki/All I Want to Know is Where Im Going to Die So Ill Never Go There.md
@@ -0,0 +1,7 @@
+Jedna z ciekawszych formą książek jakie przeczytałem. Cała ma formę dialogu pomiędzy [[Wiedza/Ludzie/Warren Buffet]], [[Wiedza/Ludzie/Charlie Munger]], bibliotekarzem oraz Poszukiwaczem.
+
+Ten ostatni wchodząc do biblioteki spotyka pozostałych, którzy pomagają mu znaleźć to czego szuka: Mądrość zdefiniowaną jako umiejętność podejmowania dobrych decyzji.
+
+To książka pełna praktycznego wykorzystania modeli mentalnych oraz zasad, którymi kierują się jej bohaterowie.
+
+Dodam tylko, że ten tytuł jest zdecydowanie mniej wymagający niż wcześniejsza książka autora - [[Wiedza/Ksiazki/Seeking Wisdom]], którą również bardzo polecam.
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Antifragile.md b/content/Wiedza/Ksiazki/Antifragile.md
new file mode 100644
index 000000000..83c71f264
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Antifragile.md
@@ -0,0 +1,11 @@
+Jeżeli pomyślimy o przeciwieństwie kruchości, do głowy przychodzi nam siła lub twardość.
+
+W rzeczywistości jednak nawet, jeżeli wyobrazimy sobie super twardy materiał, jest duża sznasa na to, że będziemy w stanie znaleźć twardszy, wykorzystać słaby punkt lub dźwignię, do tego aby go zniszczyć lub trwale uszkodzić.
+
+A teraz wyobraźmy sobie materiał, który za każdym razem gdy próbujemy go uszkodzić lub zniszczyć, staje się silniejszy niż wcześniej. Taka cecha to [[Antykruchość]] (eng. [[Wiedza/Ksiazki/Antifragile]])
+
+[[Antykruchość]] to potężna koncepcja w kontekście budowania systemów, np. firmy lub naszego życiowego systemu. Sam nieustannie myślę o tym budując mój własny [[Fundamenty/Proces]]. Do tego niezbędne jest nieustannie [[Kwestionowanie]], [[Popełnianie Błędów]] i wyciągnie z nich wniosków.
+
+Podobnie swój system opisuje [[Wiedza/Ludzie/Ray Dalio]], który jego budowę opiera o [[Zasady]] opisane w książce [[Wiedza/Ksiazki/Principles]].
+
+W przypadku [[Nassim Nicholas Taleb]] zdecydowanie polecam sięgnąć jeszcze po książki [[Wiedza/Ksiazki/Black Box Thinking]], [[Black Swan]], [[Wiedza/Ksiazki/Fooled by Randomness]] oraz [[Wiedza/Ksiazki/Skin in the Game]] - każda z nich zawiera koncepcje, które drastycznie ulepszają sposób myślenia, ze szczególnym uwzględnieniem przyszłych wydarzeń.
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Anything You Want.md b/content/Wiedza/Ksiazki/Anything You Want.md
new file mode 100644
index 000000000..8aebd083c
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Anything You Want.md
@@ -0,0 +1,12 @@
+[[Wiedza/Ksiazki/Anything You Want]] to książka która ze mną niesamowicie rezonuje. Mówi o tym że wielka wizja, duże finansowanie i zespół pełen ekspertów nie są niezbędnymi elementami rozwoju biznesu. Wystarczy że skupisz się na tym aby zatroszczyć się o swoich przyszłych klientów.
+
+[[Derek Sivers]] dzieli się swoimi lekcjami i spostrzeżeniami z drogi podczas której zbudował firmę zarabiającą ponad $20M.
+
+## Lekcje
+- Nigdy nie rób czegoś wyłącznie dla pieniędzy
+- Upraszczaj, testuj, iteruj, rozwiązuj realne problemy
+- Nie dowiesz się czy chcesz coś robić zanim tego nie zrobisz
+- Umiejetność mówienia "nie" we właściwych momentach to "supermoc" (więcej w książce [[Wiedza/Modele Mentalne/Essentialism]])
+- Umiejętność wycofania się we właściwym momencie również (więcej w książce [[The Dip]])
+- Zwracaj uwagę na szczegóły. One mają największe znaczenie.
+- Spełniaj swoje marzenia i rób to co kochasz. Nie marnuj życia.
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Atlas Shrugged.md b/content/Wiedza/Ksiazki/Atlas Shrugged.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Atlas Shrugged.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Atomic Habits.md b/content/Wiedza/Ksiazki/Atomic Habits.md
new file mode 100644
index 000000000..e97eea94f
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Atomic Habits.md
@@ -0,0 +1,14 @@
+Autor: James Clear
+
+## Kontekst
+
+## Lekcje
+
+### Siła nawyku
+> Chains of habits are too light to be felt, until they are too heavy to be broken
+
+### Kształtowanie nawyku
+[[Fundamenty/Proces]]
+
+### Compound Effect
+[[Fundamenty/Proces]]
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Black Box Thinking.md b/content/Wiedza/Ksiazki/Black Box Thinking.md
new file mode 100644
index 000000000..2ca7c7974
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Black Box Thinking.md
@@ -0,0 +1,12 @@
+[[Antykruchość]] (eng. [[Wiedza/Ksiazki/Antifragile]]) bardzo jasno tłumaczy nam dlaczego loty samolotem są tak bezpieczne. Jednym z głównych powodów jest to, że każdy popełniony błąd lub katastrofa przyczyniają się do tego aby powstały nowe [[Zasady]] i procedury, które minimalizują ich ponowne wystąpienie oraz wzmacniają cały system.
+
+W takim procesie najbardziej istotne jest to aby wyciągać wnioski z popełnionych błędów i otwarcie się do nich przyznawać.
+
+Problem w tym, że popełnianie błędów często kojarzone jest negatywnie, bo już od najmłodszych lat uczymy się tego, aby najlepiej wcale ich nie popełniać - często pod groźbą kary.
+
+[[Wiedza/Ksiazki/Black Box Thinking]] (podobnie jak [[Wiedza/Ksiazki/Think Like a Rocket Scientist]]) przedstawia zupełnie inną perspektywę, według której popełnienie błędu i wyciągnięcie wniosków na przyszłość, są niezbędnymi elementami nauki i rozwoju.
+
+## Lekcje
+- Przyznawaj się do swoich błędów - również przed sobą samym.
+- Traktuj swoje pomysły i wnioski jako hipotezy - które należy sprawdzić i które mają prawo się nie udać.
+- Traktuj porażkę jako lekcję. Zamień negatywne, w pozytywne.
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Blink.md b/content/Wiedza/Ksiazki/Blink.md
new file mode 100644
index 000000000..82233b271
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Blink.md
@@ -0,0 +1,9 @@
+Odkąd pamiętam [[Wiedza/Przemyślenia/Intuicja]] odgrywa w moim życiu kluczową rolę a odkąd sobie to uświadomiłem, intencjonalnie obserwuję jej obecność oraz eksploruję wszelkie dostępne materiały na jej temat.
+
+Intuicja w swojej definicji określana jest jako zdolność do natychmiastowego podejmowania trafnych decyzji a jej fundament stanowią nasze wcześniejsze doświadczenia. Inaczej mówiąc: im więcej doświadczeń tym bardziej większa szansa na trafność intuicji.
+
+Osobiście się z tym nie do końca zgadzam i wolę określenie "Nieuświadomiona Inteligencja". Wynika to z prostego faktu: od najmłodszych lat podejmuje wybitnie dobre decyzje a wówczas nie było mowy o posiadaniu doświadczenia czy czerpaniu informacji z mojego otoczenia.
+
+Co ciekawe, dostęp do intuicji możemy wzmacniać (np. poprzez patrzenie wgłąb siebie) oraz osłabiać (np. poprzez poddanie się presji społecznej).
+
+Na koniec dnia, jest to "Błysk", który czasem trudno dostrzec a innym razem trudno za nim pójść, przez brak logicznych argumentów. "
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Body Mind Mastery.md b/content/Wiedza/Ksiazki/Body Mind Mastery.md
new file mode 100644
index 000000000..7da4bd01d
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Body Mind Mastery.md
@@ -0,0 +1,12 @@
+Co ma wspólnego umysł i ciało? Wszystko. Mylnie traktujemy nasz umysł i ciało niezależnie, podczas gdy są jednością. Ciekawe jest to, że [[Wiedza/Ludzie/Dan Millman]] przedstawia to sięgając po elementy Buddyzmu, podczas gdy [[Wiedza/Ludzie/Andrew Huberman]] mówi dokładnie TO SAMO z naukowego punktu widzenia.
+
+Czego o życiu może nauczyć poradnik dla gimnastyków?
+
+Wiele. W sporcie ogromną rolę odgrywa psychika...tak jak zresztą w całym naszym życiu.
+
+## Lekcje
+- Doceniaj porażki i wykorzystuj je (ucz się ze swoich błędów - [[Wiedza/Ksiazki/Black Box Thinking]] & [[Wiedza/Ksiazki/Think Like a Rocket Scientist]])
+- Skupienie i konsekwencja [[Wiedza/Ksiazki/Deep Work]] są kluczem do wielu osiągnięć
+- Bądź dla siebie tak samo życzliwy jak dla małego dziecka lub swojego najlepszego przyjaciela
+- Małe kroki, konsekwencja i czas kształtują nowy nawyk (więcej w [[Wiedza/Ksiazki/Atomic Habits]] i [[Wiedza/Ksiazki/The Compound Effect]])
+- Bądź uważny. Bądź tu i teraz.
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Bult to Last.md b/content/Wiedza/Ksiazki/Bult to Last.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Bult to Last.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Cant Hurt Me.md b/content/Wiedza/Ksiazki/Cant Hurt Me.md
new file mode 100644
index 000000000..6f7ef757a
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Cant Hurt Me.md
@@ -0,0 +1,12 @@
+[[Can't Hurt Me]] to autobiografia [[Wiedza/Ludzie/David Goggins]]a który całym swoim życiem pokazuje gdzie może doprowadzić nas [[Wiedza/Przemyślenia/Dyscyplina]] i ekstremalnie ciężka praca.
+
+Ta historia to droga od pełnej przemocy i tyranicznego ojca, do ultramaratonów, rekordu świata w podciąganiu na drążku i dołączenia do [[Navy Seal's]] (kilkukrotnie ukończył Hell Week) oraz TACP Air Force.
+
+## Lekcje
+- Dobre [[Nawyk]]i ([[Wiedza/Ksiazki/Atomic Habits]]) i skuteczny [[Fundamenty/Proces]] są fundamentem rozwoju
+- Nie poddawaj się w chwili gdy jest trudno i masz już dość.
+- Naucz się działać poza swoją strefą komfortu.
+- Większość z nas żyje wykorzystując max. 40% swojego potencjału [[Zasada 40%]] Poziom 60-80% również jest możliwy
+- Nie wszystkie fizyczne i psychiczne ograniczenia są prawdziwe. Część z nich jest tylko w naszych głowach ([[Wiedza/Przemyślenia/Rzeczywistość]])
+
+> Wszystko w życiu jest GRĄ UMYSŁU
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Chop Wood Carry Water.md b/content/Wiedza/Ksiazki/Chop Wood Carry Water.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Chop Wood Carry Water.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Creativity Inc.md b/content/Wiedza/Ksiazki/Creativity Inc.md
new file mode 100644
index 000000000..fbf8bdd56
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Creativity Inc.md
@@ -0,0 +1,14 @@
+[[Creativity.inc]] to książka autorstwa założyciela Pixara. Firmy którą wszyscy doskonale znamy z animowanych hitów kinowych.
+
+Najważniejsza lekcja z książki:
+> Porażka nie zawsze musi być zła o ile wyciągniesz z niej wnioski.
+
+Lekcja znana z książek - [[Wiedza/Ksiazki/Black Box Thinking]] & [[Wiedza/Ksiazki/Antifragile]]
+
+## Lekcje
+Dobry pomysł bez dobrego zespołu jest niczym (o tym pisał również [[Wiedza/Ludzie/Jim Collins]] w [[Wiedza/Ksiazki/Good to Great]] oraz [[Wiedza/Ludzie/Jocko Willink]] w [[Wiedza/Ksiazki/Extreme Ownership]]).
+
+W zespole każdy powinien mieć równe prawo i możliwość wyrażenia swojego zdania oraz dania feedbacku innym. O tym również pisał [[Wiedza/Ludzie/Jim Collins]] omawiając koncepcję [[Level 5 Leadership]].
+
+## Ciekawostki:
+Jeżeli uczycie się rysować, róbcie to do góry nogami oraz skupiajcie się na białej przestrzeni a nie rysowanym kształcie. Np. gdy rysujecie krzesło, rysujcie wszystko to, co nie jest krzesłem. W ten sposób umiejętności rysunku rozwijały pracownicy Pixara.
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Daring Greatly.md b/content/Wiedza/Ksiazki/Daring Greatly.md
new file mode 100644
index 000000000..1d705b0e2
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Daring Greatly.md
@@ -0,0 +1,8 @@
+Ta książka uczy czegoś ważnego:
+**[[Wrażliwość]] jest największą Odwagą.**
+
+Na pierwszy rzut oka może to brzmieć absurdalnie, ponieważ najczęściej wrażliwość utożsamiana jest ze słabością. Gdy się jednak nad tym zastanowimy to nie sztuką jest "podnieść gardę" czy "założyć maskę".
+
+Nagle okazuje się że pozostawanie otwartym na wszystko co nas otacza, jest trudniejsze niż mogłoby się wydawać i rzeczywiście jest to cecha tych najbardziej odważnych.
+
+Dodam jeszcze że rolę jaką odgrywa [[Wrażliwość]], porusza w swoich książkach [[Wiedza/Ludzie/Dan Millman]] i to właśnie w niej pada zdanie z początku tego wpisu.
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Deep Work.md b/content/Wiedza/Ksiazki/Deep Work.md
new file mode 100644
index 000000000..6a28653b2
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Deep Work.md
@@ -0,0 +1,12 @@
+[[Wiedza/Ksiazki/Deep Work]] to jedna z najczęściej polecanych przeze mnie książek. Uważam że praktycznie każdy powinien ją przeczytać.
+
+Żyjemy w świecie pełnym rozproszeń - od powiadomień po złe nawyki sięgania po telefon co kilka minut. Umiejętność skupienia na jednej rzeczy przez dłuższy czas staje się rzadkością. Problem w tym że TYLKO "praca głęboka" pozwala nam działać na granicy naszych możliwości i generować zwykle nieosiągalne rezultaty.
+
+Praca głęboka ([[Wiedza/Ksiazki/Deep Work]]) to: realizacja jednego zadania przez określony czas, z aktywnym skupieniem i brakiem rozproszeń.
+
+Opiera się o zasady:
+- Wysiłku,
+- [[Wiedza/Przemyślenia/Nuda]],
+- braku Social Media i wyznaczenia czasu na pracę płytką (np. odpisywanie na maile).
+
+Jest to umiejętność jak każda inna, którą należy trenować aby z czasem wykonywać ją lepiej. W [[Wiedza/Ksiazki/Deep Work]] znajdziemy wiele bardzo praktycznych porad, które pomogą nam ją rozwijać i kształcić odpowiednie [[Nawyk]]i.
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Deviate.md b/content/Wiedza/Ksiazki/Deviate.md
new file mode 100644
index 000000000..356bba1fe
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Deviate.md
@@ -0,0 +1,7 @@
+Czy to co widzimy to [[Wiedza/Przemyślenia/Rzeczywistość]]? Odpowiedź na to pytanie wydaje się oczywista. Przecież widzimy, możemy dotknąć, usłyszeć, spróbować i to istnieje.
+
+Okazuje się jednak, że nadal nie jest to [[Wiedza/Przemyślenia/Rzeczywistość]]. Każdy z nas tą samą rzecz jest w stanie postrzegać zupełnie inaczej i wpływ na to ma tak wiele czynników, że śmiało można stwierdzić że to nasza rzeczywistość jest w pełni subiektywna.
+
+Więcej o tym mówi m.in. [[Wiedza/Ludzie/Andrew Huberman]].
+
+Deviate to książka wybitnego neurobiologa, który dzieli się wnioskami z wieloletnich badań. W mojej opinii nadal na to co wiemy o mózgu należy nakładać duży filtr i margines błędu, jednak perspektywa którą daje [[Wiedza/Ksiazki/Deviate]] jest warta uwagi. Tym bardziej że przedstawione wnioski w różnych formach istnieją w wielu różnych źródłach.
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Do the Work.md b/content/Wiedza/Ksiazki/Do the Work.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Do the Work.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Effortless.md b/content/Wiedza/Ksiazki/Effortless.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Effortless.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Essentialism: The Disciplined Pursuit of Less.md b/content/Wiedza/Ksiazki/Essentialism: The Disciplined Pursuit of Less.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Essentialism: The Disciplined Pursuit of Less.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Extreme Ownership.md b/content/Wiedza/Ksiazki/Extreme Ownership.md
new file mode 100644
index 000000000..d024595ca
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Extreme Ownership.md
@@ -0,0 +1,12 @@
+[[Wiedza/Ksiazki/Extreme Ownership]] to jedna z książek których nie polecam czytać. Zdecydowanie bardziej polecam przesłuchać oryginalny audiobook, czytany przez autorów!
+
+[[Wiedza/Ksiazki/Extreme Ownership]] to niezwykła lekcja biznesu ale i nie tylko, ponieważ jej przekaz można zastosować w każdym obszarze życia. Dodatkowo bardzo polecam od razu przeczytać drugą część [[Dichotomy of Leadership]], która podkreśla bardzo ważny element [[Wiedza/🎲 Biznes/Leadership]]u jakim jest jego dwuznaczność.
+
+Autorzy to byli komandosi [[Navy Seal's]], którzy po swoich misjach m.in. w Iraku przenoszą swoje doświadczenia z najbardziej ekstremalnych na kontekst biznesowy.
+
+## Lekcje
+- [[Wiedza/Przemyślenia/Dyscyplina]] daje wolność
+- Relax, look around, make a call.
+- Nie ma złych zespołów. Są tylko źli liderzy.
+- Pozwól działać swojemu zespołowi w ramach ustalonego celu i bez Twojego zaangażowania we wszystko.
+- Kluczowy jest przepływ informacji - szeroki kontekst pochodzi z góry a szczegóły operacyjne z dołu
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Find Your Why.md b/content/Wiedza/Ksiazki/Find Your Why.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Find Your Why.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Fooled by Randomness.md b/content/Wiedza/Ksiazki/Fooled by Randomness.md
new file mode 100644
index 000000000..3ad2b1757
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Fooled by Randomness.md
@@ -0,0 +1,7 @@
+Zwykle nawet nie zdajemy sobie sprawy jak ogromny wpływ ma losowość na nasze życie. I ważne jest tutaj słowo "ogromny" a nie całkowity".
+
+Zatem w przypadku osób, które zrobiły coś niezwykłego, raczej jest to połączenie ciężkiej pracy, umiejętności oraz szczęścia niż wyłącznie szczęścia.
+
+[[Wiedza/Ksiazki/Fooled by Randomness]] to książka o prawdopodobieństwie przedstawiająca temat nie z perspektywy matematyki lecz sceptycyzmu. Według Taleba prawdopodobieństwo nie jest wynikiem obliczeń tylko akceptacją braku pewności naszej wiedzy i najlepsze co możemy zrobić to rozwijać metody radzenia sobie z niewiedzą.
+
+W praktyce poza podręcznikami i kasynem, prawdopodobieństwo niemal nigdy nie przedstawia się jako problem matematyczny lub łamigłówka. Wszystko jest bardziej skomplikowane niż nam się wydaje.
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Getting Real.md b/content/Wiedza/Ksiazki/Getting Real.md
new file mode 100644
index 000000000..aa6491a16
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Getting Real.md
@@ -0,0 +1,5 @@
+[[Wiedza/Ksiazki/Getting Real]] to książka która ze mną rezonuje na niespotykanym poziomie i śmiało mogę podpisać się pod niemal wszystkim, co jest tam napisane.
+
+W temacie tworzenia produktów i rozwoju firmy to dla mnie absolutny numer jeden spośród wszystkich książek jakie do tej pory przeczytałem.
+
+Getting Real pokazuje bardzo spójne do mojego podejście realizacji projektów, nastawione na DZIAŁANIE, BUDOWANIE i WERYFIKOWANIE. To wszystko w oparciu o fakty a nie tworzoną przez nas iluzję wynikającą z emocjonalnego przywiązania do naszych pomysłów oraz wykonanej pracy.
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Gladiators, Pirates and Games of Trust.md b/content/Wiedza/Ksiazki/Gladiators, Pirates and Games of Trust.md
new file mode 100644
index 000000000..07f92b802
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Gladiators, Pirates and Games of Trust.md
@@ -0,0 +1 @@
+[[Game Theory]]
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Good to Great.md b/content/Wiedza/Ksiazki/Good to Great.md
new file mode 100644
index 000000000..4dd482931
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Good to Great.md
@@ -0,0 +1 @@
+[[Wiedza/Ludzie/Jim Collins]]
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Great by Choice.md b/content/Wiedza/Ksiazki/Great by Choice.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Great by Choice.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Grit.md b/content/Wiedza/Ksiazki/Grit.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Grit.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Hard Things About Hard Things.md b/content/Wiedza/Ksiazki/Hard Things About Hard Things.md
new file mode 100644
index 000000000..0fa55adf2
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Hard Things About Hard Things.md
@@ -0,0 +1,5 @@
+Jak trudne jest prowadzenie firmy? O tym mogą przekonać się tylko osoby prowadzące firmę. Mowa tutaj nie tylko o zachowaniu zimnej krwi podczas kryzysu ale nieustannym narażeniu na to, że "coś może przestać działać" i odpowiedzialność za to spadnie tylko i wyłącznie na CEO.
+
+Ale gdyby to kryzysy były największym wyzwaniem, chyba nie byłoby tak źle. Sam wiele razy przekonałem się, że w chwilach gdy firma rośnie, pojawiają się nowi klienci i wszystko wydaje się być okey, wystarczy chwila nieuwagi aby zaniedbać pracowników, rodzinę czy siebie samego.
+
+O potrzebie zachowania nieustannego balansu pisał wiele [[Wiedza/Ludzie/Jocko Willink]] w książce [[Dichotomy of Leadership]], którą również bardzo polecam przeczytać.
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/How to Fail at Almost Anything and Still Win Big.md b/content/Wiedza/Ksiazki/How to Fail at Almost Anything and Still Win Big.md
new file mode 100644
index 000000000..81ca2370b
--- /dev/null
+++ b/content/Wiedza/Ksiazki/How to Fail at Almost Anything and Still Win Big.md
@@ -0,0 +1,11 @@
+Jedną z ważniejszych zalet czytania książek jest możliwość wyciągania wniosków z doświadczeń innych, często wybitnych ludzi.
+
+Scott Adams w swojej książce opowiadając historię swojego życia. Po jej przeczytaniu usunąłem ze swojego życia wszystkie cele, w pełni skupiając się na [[Wiedza/Słownik/Proces]], czyli małych krokach które realizuję codziennie. Każdy z nich wspiera dążenie w wyznaczonym przeze mnie [[Wiedza/Słownik/Kierunek]].
+
+W przypadku celów Scott wskazuje na dwie wady:
+- Są osadzone w przyszłości: żyjesz w [[Wiedza/Przemyślenia/Oczekiwania]] do czasu ich realizacji.
+- Są bardzo ściśle określone: dopóki nie dostaniesz tego czego chcesz, zapewne będziesz zawiedziony.
+
+Od siebie dodałbym: [[Wiedza/Przemyślenia/Oczekiwania]] vs[[ Wiedza/Przemyślenia/Rzeczywistość]] (nawet dokładnie zrealizowany [[Wiedza/Słownik/Cel]] może nie być tym czego chcieliśmy) oraz Pułapka Sukcesu (realizując duży cel, często doświadczamy braku poczucia dalszego sensu no bo "co teraz? Większy cel?").
+
+Skupienie się na systemie pozwala na bieżąco dostosowywać swoje plany i działania, usuwając to co niepotrzebne. Oprócz tego mamy tutaj większe pole do tego aby cieszyć się z drogi naszego życia a nie punktu do którego chcemy dojść
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Insanely Simple.md b/content/Wiedza/Ksiazki/Insanely Simple.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Insanely Simple.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Inspired.md b/content/Wiedza/Ksiazki/Inspired.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Inspired.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Ksiazki.md b/content/Wiedza/Ksiazki/Ksiazki.md
new file mode 100644
index 000000000..beb6eefbf
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Ksiazki.md
@@ -0,0 +1,85 @@
+---
+title: Książki
+---
+
+- [[Wiedza/Ksiazki/Way of The Peaceful Warrior]]
+- [[Wiedza/Ksiazki/Alamanck of Naval Ravikant]]
+- [[Wiedza/Ksiazki/Antifragile]]
+- [[Wiedza/Ksiazki/Black Box Thinking]]
+- [[Wiedza/Ksiazki/Cant Hurt Me]]
+- [[Wiedza/Ksiazki/Body Mind Mastery]]
+- [[Wiedza/Ksiazki/Daring Greatly]]
+- [[Wiedza/Ksiazki/Creativity Inc]]
+- [[Wiedza/Ksiazki/Deep Work]]
+- [[Wiedza/Ksiazki/Deviate]]
+- [[Wiedza/Ksiazki/Getting Real]]
+- [[Wiedza/Ksiazki/The Infinite Game]]
+- [[Wiedza/Ksiazki/Good to Great]]
+- [[Wiedza/Ksiazki/Leaders Eat Last]]
+- [[Wiedza/Ksiazki/MAKE]]
+- [[Wiedza/Ksiazki/Never Split the Difference]]
+- [[Wiedza/Ksiazki/Predictably Irrational]]
+- [[Wiedza/Ksiazki/Principles]]
+- [[Wiedza/Ksiazki/Think Like a Rocket Scientist]]
+- [[Wiedza/Ksiazki/Rebel Ideas]]
+- [[Wiedza/Ksiazki/Seeking Wisdom]]
+- [[Wiedza/Ksiazki/Simplify]]
+- [[Wiedza/Ksiazki/So Good They Cant Ignore You]]
+- [[Wiedza/Ksiazki/The Mom Test]]
+- [[Wiedza/Ksiazki/The Brain Audit]]
+- [[Wiedza/Ksiazki/The Compound Effect]]
+- [[Wiedza/Ksiazki/Understanding the INFJ Personality Type]]
+- [[Wiedza/Ksiazki/War of Art]]
+- [[Wiedza/Ksiazki/When Coffee and Kale Compete]]
+- [[Wiedza/Ksiazki/Who Says Elephant's Can't Dance]]
+- [[Wiedza/Ksiazki/Total Recall]]
+- [[Wiedza/Ksiazki/How to Fail at Almost Anything and Still Win Big]]
+- [[Wiedza/Ksiazki/All I Want to Know is Where Im Going to Die So Ill Never Go There]]
+- [[Wiedza/Ksiazki/Blink]]
+- [[Wiedza/Ksiazki/Skin in the Game]]
+- [[Wiedza/Ksiazki/Range]]
+- [[Wiedza/Ksiazki/Insanely Simple]]
+- [[Wiedza/Ksiazki/Inspired]]
+- [[Wiedza/Ksiazki/Personal MBA]]
+- [[Wiedza/Ksiazki/Shape Up]]
+- [[Wiedza/Ksiazki/Hard Things About Hard Things]]
+- [[Wiedza/Ksiazki/Rework]]
+- [[Wiedza/Ksiazki/Fooled by Randomness]]
+- [[Wiedza/Ksiazki/Power vs. Force]]
+- [[Wiedza/Ksiazki/Effortless]]
+- [[Wiedza/Ksiazki/Sources of Power]]
+- [[Wiedza/Ksiazki/Win In The Dark]]
+- [[Wiedza/Ksiazki/Predictably Irrational]]
+- [[Wiedza/Ksiazki/Pale Blue Dot]]
+- [[Wiedza/Ksiazki/Pound the Stone]]
+- [[Wiedza/Ksiazki/Chop Wood Carry Water]]
+- [[Wiedza/Ksiazki/Sprint]]
+- [[Wiedza/Ksiazki/Grit]]
+- [[Wiedza/Ksiazki/Bult to Last]]
+- [[Wiedza/Ksiazki/Great by Choice]]
+- [[Wiedza/Ksiazki/Find Your Why]]
+- [[Wiedza/Ksiazki/Steve Jobs]]
+- [[Wiedza/Ksiazki/12 Rules for Life]]
+- [[Wiedza/Ksiazki/The One Thing]]
+- [[Wiedza/Ksiazki/The Lean Startup]]
+- [[Wiedza/Ksiazki/The Millionaire Fastlane]]
+- [[Wiedza/Ksiazki/The Art of War]]
+- [[Wiedza/Ksiazki/The Hidden School]]
+- [[Wiedza/Ksiazki/Do the Work]]
+- [[Wiedza/Ksiazki/Mastery (Robert Greene)]]
+- [[Wiedza/Ksiazki/Atomic Habits]]
+- [[Wiedza/Ksiazki/The Beginning of Infinity]]
+- [[Wiedza/Ksiazki/That Will Never Work]]
+- [[Wiedza/Ksiazki/Think Again]]
+- [[Wiedza/Ksiazki/The Great Mental Models]]
+- [[Wiedza/Ksiazki/StrenghtsFinder 2]]
+- [[Wiedza/Ksiazki/Working Backwards]]
+- [[Wiedza/Ksiazki/Mastery: The Keys to Success and Long-Term Fulfillment]]
+- [[Wiedza/Ksiazki/The Underdog Paradox]]
+- [[Wiedza/Ksiazki/The Fabric of Reality]]
+- [[Wiedza/Ksiazki/The Happiness Advantage]]
+- [[Wiedza/Ksiazki/Letting Go]]
+- [[Wiedza/Ksiazki/Peak]]
+- [[Wiedza/Ksiazki/Essentialism: The Disciplined Pursuit of Less]]
+- [[Wiedza/Ksiazki/Gladiators, Pirates and Games of Trust]]
+- [[Wiedza/Ksiazki/Lying]]
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Leaders Eat Last.md b/content/Wiedza/Ksiazki/Leaders Eat Last.md
new file mode 100644
index 000000000..ea899c2f2
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Leaders Eat Last.md
@@ -0,0 +1,11 @@
+[[Wiedza/Ksiazki/Leaders Eat Last]] to książka w której [[Simon Sinek]] przedstawia [[Wiedza/🎲 Biznes/Leadership]] w odsłonie z którą sam się utożsamiam. Jest on w dużym stopniu oparty o doświadczenia a z obszarów militarnych z uwzględnieniem jednostek specjalnych takich jak [[Navy Seal's]]. Więcej o tym można przeczytać w książkach [[Wiedza/Ludzie/Jocko Willink]] - [[Wiedza/Ksiazki/Extreme Ownership]] oraz [[Dichotomy of Leadership]].
+
+Cytatem, który pozostaje na długo w pamięci są słowa
+> - Dlaczego ryzykowałeś życie dla kogoś, kogo ledwo znasz?⠀
+> - Bo wiem, że on zrobiłby to samo dla mnie.⠀
+
+Te słowa zwracają uwagę na jeden z fundamentalnych elementów przywództwa oraz każdej relacji - chodzi o [[Zaufanie]]
+
+[[Odpowiedzialność]] jest podstawą [[Zaufanie]] a to stanowi podstawę Relacji. Z kolei Relacje dają poczucie przynależności, której podświadomie szuka każdy człowiek. ⠀
+⠀
+Polecam [[Wiedza/Ksiazki/Leaders Eat Last]] każdemu. W pewnych momentach każdy z nas jest Liderem [[Lead]]. I w pewnych dobry lider, potrafi podążać za innymi.
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Letting Go.md b/content/Wiedza/Ksiazki/Letting Go.md
new file mode 100644
index 000000000..5657342d8
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Letting Go.md
@@ -0,0 +1,9 @@
+## Odpuszczenie
+> Największą przeszkodą w odpuszczeniu jest przekonanie, że utrzymanie obecnego stanu rzeczy pozwoli nam otrzymać to, czego pragniemy.
+
+Dążenie do zachowania aktualnego stanu rzeczy (homeostazy), to jeden z silniejszych mechanizmów naszego umysłu. Więcej znajdziesz pod hasłem:[[Wiedza/Modele Mentalne/Status quo bias]].
+
+Wykorzystuję dążenie do zachowania Statusu Quo, poprzez nieustannie podnoszenie sobie poprzeczki, co jest uwzględnione w moim [[Fundamenty/Proces]]ie.
+
+Jednocześnie warto wiedzieć kiedy powiedzieć "dość". O tym dowiesz się więcej w książce [[The Dip]], która w całości poświęcona jest temu tematowi.
+
diff --git a/content/Wiedza/Ksiazki/Lying.md b/content/Wiedza/Ksiazki/Lying.md
new file mode 100644
index 000000000..0ca974ea5
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Lying.md
@@ -0,0 +1 @@
+**
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/MAKE.md b/content/Wiedza/Ksiazki/MAKE.md
new file mode 100644
index 000000000..45b7b9da2
--- /dev/null
+++ b/content/Wiedza/Ksiazki/MAKE.md
@@ -0,0 +1,28 @@
+# [[Wiedza/Ksiazki/MAKE]]
+
+**Autor:** Pieter Levels
+
+## Kontekst
+[[Pieter Levels]] jest jednym z najbardziej rozpoznawalnych w społeczności [[Wiedza/Słownik/Indie Hackers]]. Stworzył m.in. [https://nomadlist.com/](https://nomadlist.com/), [https://remoteok.io/](https://remoteok.io/) oraz kilkanaście podobnych projektów. W przypadku remoteok cały serwis to JEDEN plik PHP, który obecnie generuje przychód na poziomie $3,5k+ DZIENNIE (stan na połowę 2021 roku).
+
+[[Wiedza/Ksiazki/MAKE]] to książka pokazująca proces tworzenia firmy w pojedynkę lub małym zespole (w duchu [[Wiedza/Słownik/Indie Hackers]]). Kładzie ogromny nacisk na rozwiązywanie realnych [[problem]]ów oraz [[Optymalizacja/Automatyzacja/Automatyzacja]].
+
+## Cytaty
+> Najważniejszą rzeczą jest odkrywanie pomysłów poprzez rozwiązywanie swoich własnych [[problem]]ów. (eng.: "The most important thing is to find ideas from solving your own problems.")
+
+
+> Jesteś największym ekspertem swoich włąsnych [[problem]]ów. (eng.: "## You are the greatest expert at your own problems")
+
+
+> Zawsze zaczynaj od [[problem]]u, nie rozwiązania (eng.: "Always start from the problem, not the solution")
+
+
+> Nisze są bardziej przychodowe niż Ci się wydaje. Jeżeli znajdziesz "tylko" 1000 płacących klientów płacących Ci 83.33 zł miesięcznie, osiągniesz 1 000 000 w jeden rok! (eng.: But niches are much more profitable than you'd think. If you have "just" 1,000 people paying you $83.33/month, that's $1,000,000 in revenue in one year!)
+
+
+> Przestań myśleć o rzeczach wielkich. Zacznij od tych małych. Na wielkie przyjdzie czas. (eng.: Stop. Thinking. Big. Think small first. You'll be big at the end!)
+
+
+> Avoid Hiring, Build Robots.
+
+## Lekcja
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Mastery (Robert Greene).md b/content/Wiedza/Ksiazki/Mastery (Robert Greene).md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Mastery (Robert Greene).md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Mastery: The Keys to Success and Long-Term Fulfillment.md b/content/Wiedza/Ksiazki/Mastery: The Keys to Success and Long-Term Fulfillment.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Mastery: The Keys to Success and Long-Term Fulfillment.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Never Split the Difference.md b/content/Wiedza/Ksiazki/Never Split the Difference.md
new file mode 100644
index 000000000..2be2df996
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Never Split the Difference.md
@@ -0,0 +1,6 @@
+[[Wiedza/Przemyślenia/Negocjacje]] często kojarzą nam się tylko z wybranymi zawodami (np. rolą sprzedawcy) i są ludzie, którzy sądzą że dla nich nie wniosi to żadnej wartości. Jeżeli się chwilę zastanowimy, to zauważymy że negocjacje są nieodłącznym elementem interakcji międzyludzkich, niemal na każdej płaszczyźnie.
+
+## Lekcje
+- [[Wiedza/Przemyślenia/Negocjacje]] zaczynają sie w chwili gdy ktoś mówi "nie" a ich celem jest dojście do punktu w którym druga strona mówi "tak, to prawda"
+- [[Wiedza/Przemyślenia/Negocjacje]] są o "aktywnym słuchaniu"
+- Najważniejsze narzędzia: [[Taktyczna Empatia]], ton głosu, [[Mirorring]], cisza, powtarzanie i etykietowanie (eng. labeling)
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Pale Blue Dot.md b/content/Wiedza/Ksiazki/Pale Blue Dot.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Pale Blue Dot.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Peak.md b/content/Wiedza/Ksiazki/Peak.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Peak.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Personal MBA.md b/content/Wiedza/Ksiazki/Personal MBA.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Personal MBA.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Pound the Stone.md b/content/Wiedza/Ksiazki/Pound the Stone.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Pound the Stone.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Power vs. Force.md b/content/Wiedza/Ksiazki/Power vs. Force.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Power vs. Force.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Predictably Irrational.md b/content/Wiedza/Ksiazki/Predictably Irrational.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Predictably Irrational.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Principles.md b/content/Wiedza/Ksiazki/Principles.md
new file mode 100644
index 000000000..020a081a9
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Principles.md
@@ -0,0 +1,22 @@
+Jakimi zasadami kierujecie się w życiu? Jak podejmujecie decyzje i w jaki sposób wyciągacie wnioski z popełnionych błędów?
+
+Zachęcam do obejrzenia animacji / podsumowania książki:
+
+
+
+[[Wiedza/Ludzie/Ray Dalio]] w książce [[Wiedza/Ksiazki/Principles]] opisuje zasady które kreował na przestrzeni swojego życia. Opierał na nich rozwój firmy Bridgewater Associates, która doprowadziła go do listy jednego z najbogatszych ludzi na ziemi.
+
+Fundamentem budowania tych zasad są:
+- trudna sztuka postrzegania [[Wiedza/Przemyślenia/Rzeczywistość]] taką jaką faktycznie jest a nie taką jak byśmy chcieli aby była.
+- jeszcze trudniejsza [[Radykalna Transparentność]] i [[Szczerość]].
+
+Przykładowo w jego firmie KAŻDY ma dostęp do WSZYSTKICH informacji za wyjątkiem tych z prywatnego życia pracowników, które nie mają związku z funkcjonowaniem firmy.
+
+Według Raya Dalio realizacja dowolnego celu sprowadza się do powtarzalnego procesu:
+1. Wyznaczenia PRIORYTETU (nie priorytetÓW) (więcej również w [[Wiedza/Modele Mentalne/Essentialism]])
+2. Identyfikacji PROBLEMÓW i ich nietolerowania
+3. Odnalezienia ich PRZYCZYNY
+4. Opracowania PLANU
+5. WYKONANIA
+
+Ostatecznie najważniejszą rzeczą nie jest to abyśmy zastosowali zasady przedstawione w książce, lecz opracowali własne, które spójne są z nami i naszymi [[Wiedza/Słownik/Cel]]ami.
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Product-Led Growth.md b/content/Wiedza/Ksiazki/Product-Led Growth.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Product-Led Growth.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Range.md b/content/Wiedza/Ksiazki/Range.md
new file mode 100644
index 000000000..f55cd9b99
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Range.md
@@ -0,0 +1,14 @@
+Świat jest skomplikowany i trudno temu zaprzeczyć. W dodatku w ciągu ostatnich kilkudziesięciu lat, technologia przyspieszyła ogólny rozwój niemal każdego obszaru naszego życia, w mgnieniu oka wprowadzając znaczące zmiany.
+
+W obliczu tego najlepszym rozwiązaniem wydaje się być zasada 10 000 godzin, która pozwala stać się ekspertem w dowolnej dziedzinie (swoją drogą o tym jak to wygląda w praktyce, polecam książkę [[The Outliers]]).
+
+Inaczej mówiąc: zanim próbować odnaleźć się w wielu obszarach, wybieramy jeden w którym stajemy się Ekspertem.
+
+A co powiecie na inne podejście? Zamiast skupiać całą swoją uwagę na wąskiej dziedzinie, nieustannie równolegle rozwijamy wiedzę w wielu różnych obszarach. No ale skoro wszystko zmienia się tak szybko, czy w ogóle jest to możliwe?
+
+Okazuje się że tak i daje nam więcej możliwości niż mogłoby się na pierwszy rzut oka wydawać.
+
+## Lekcje
+- Zbyt wczesna specjalizacja nie zawsze jest dobra
+- Umiejętność szybkiej nauki i zmiany kontekstu daje niezwykłe możliwości
+- Zawód który wykonujesz dziś, nie będzie czymś co będziesz robił przez całe życie.
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Rebel Ideas.md b/content/Wiedza/Ksiazki/Rebel Ideas.md
new file mode 100644
index 000000000..39284d69e
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Rebel Ideas.md
@@ -0,0 +1,13 @@
+ Rozwiązanie wybitnie złożonego problemu ekstremalnie prostym rozwiązaniem, brzmi jak przejaw geniuszu lub szczęścia.
+
+Jak jest w rzeczywistości? Nie wiem. Ale potrafię upraszczać nawet najbardziej skomplikowane zagadnienia i mówić o nich prosto.
+
+W dużym stopniu właśnie o tym jest [[Wiedza/Ksiazki/Rebel Ideas]] - książka podkreślająca to jak ważna jest różnorodność poznawcza w kontekście nieszablonowego myślenia oraz wychodzenia poza wszelkie granice.
+
+Taka różnorodność nie bierze się jednak np. z cech zewnętrznych, lecz z doświadczeń kształtujących różne schematy myślenia.
+
+W kreatywnym rozwiązywaniu problemów kluczowa jest [[Wiedza/Słownik/Perspektywa]] a konkretnie wiele różnych perspektyw. I właśnie z tego powodu różnorodność poznawcza odgrywa tutaj tak ważną rolę.
+
+W chwili gdy patrzymy na ten sam problem, na wiele różnych sposobów, dostrzegamy rozwiązania które w połączeniu ze sobą mogą okazać się wybitne.
+
+W książce zabrakło mi tylko jednego: różnorodność poznawczą można również osiągać w pojedynkę. Wiem to, ponieważ jest to mój domyślny styl myślenia. Ale o tym opowiem innym razem.
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Refactoring UI.md b/content/Wiedza/Ksiazki/Refactoring UI.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/content/Wiedza/Ksiazki/Rework.md b/content/Wiedza/Ksiazki/Rework.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Rework.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Seeking Wisdom.md b/content/Wiedza/Ksiazki/Seeking Wisdom.md
new file mode 100644
index 000000000..4e95eb8ea
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Seeking Wisdom.md
@@ -0,0 +1,20 @@
+Autor: Peter Bevelin
+
+[[Wiedza/Ksiazki/Seeking Wisdom]] absolutnie najlepsza książka jaką czytałem w temacie usprawnienie procesów myślenia i podejmowania decyzji ([[Modele mentalne]]).
+
+Pomimo niecałych 300 stron, zawiera tak dużo wiedzy i konkretów, że potrzebowałem 12 miesięcy aby ją przeczytać a i tak wielokrotnie będę do niej wracał.
+
+Najważniejsza lekcja: Posiadanie zrozumienia koncepcji i mechanik kierujących światem jest krytycznie ważne w każdym obszarze życia. Jednocześnie to zrozumienie nie stawia nas ponad panującymi zasadami bo dalej "gramy" w ramach systemu, ale jesteśmy w tanie bardziej świadomie się w nim poruszać.
+
+Poza tym [[Wiedza/Ksiazki/Seeking Wisdom]] stanowi esencję z wielu przeczytanych przeze mnie książek, szczególnie w obszarach:
+- [[Modele mentalne]],
+- Uprzedzeń (eng. [[Bias]]es),
+- Elementów ekonomii, biznesu
+- oraz ogólnych zasad dotyczących funkcjonowania jednostek oraz społeczeństw.
+
+## Cytaty
+> Testowy cytat.
+
+## Kontekst
+
+## Lekcja
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Shape Up.md b/content/Wiedza/Ksiazki/Shape Up.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Shape Up.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Simplify.md b/content/Wiedza/Ksiazki/Simplify.md
new file mode 100644
index 000000000..30cb09ec7
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Simplify.md
@@ -0,0 +1,11 @@
+> "Coś jest proste nie wtedy gdy ignorujesz niektóre elementy, ale wtedy gdy docierając do źródła, świadomie odrzucasz te niepotrzebne" ~ overment
+
+Richard Koch inwestuje w firmy według zasady "Star". Mówi ona o klasyfikacji firm według: market share oraz tempie wzrostu rynku na którym działają. Te które są najwyżej, określa się mianem "Gwiazd".
+
+Według Kocha kluczowe jest tutaj tytułowe [[Uproszczenie]]: ceny lub oferowanej wartości.
+
+[[Uproszczenie]] ceny uwzględnia jej redukcję nawet o 90% poprzez optymalizację procesu produkcji (patrz IKEA)
+
+Uproszczenie oferowanej wartości uwzględnia stworzenie produktu prostego i przyjemnego w użyciu (najlepszy UX) (patrz Apple).
+
+Które uproszczenie jest lepsze? To nie wybór, lecz dojście do tego, które uproszczenie MOŻE być zastosowane w przypadku Twojego biznesu i Twoich możliwości.
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Skin in the Game.md b/content/Wiedza/Ksiazki/Skin in the Game.md
new file mode 100644
index 000000000..245bac927
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Skin in the Game.md
@@ -0,0 +1,9 @@
+[[Wiedza/Ksiazki/Skin in the Game]] to określenie dla zaangażowania uwzględniającego ryzyko w dążeniu do realizacji ustalonego celu.
+
+Sama książka fenomenalnie przedstawia to, że niczego nie możemy być na 100% pewni. Mówi również o symetrii i ... asymetrii w tematach takich jak uczciwość, sprawiedliwość czy odpowiedzialność, oraz o konsekwencji tej asymetrii.
+
+Jedną z koncepcji, która zwróciła moją uwagę jest proces ergodyczny (eng. [[Wiedza/Modele Mentalne/Ergodicity]]), którego przykładem jest rzut monetą 100 razy przez jedną osobę lub 1 raz przez 100 osób. Rezultat będzie taki sam w przeciwieństwie do odniesienia do gry w rosyjską ruletkę.
+
+Wniosek? W przypadku niektórych gier, najlepszą strategią jest nie rozpoczynanie gry lub pełna świadomość podejmowanego ryzyka.
+
+Z całą pewnością jest to książka, do której będę wracał regularnie.
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/So Good They Cant Ignore You.md b/content/Wiedza/Ksiazki/So Good They Cant Ignore You.md
new file mode 100644
index 000000000..872be695f
--- /dev/null
+++ b/content/Wiedza/Ksiazki/So Good They Cant Ignore You.md
@@ -0,0 +1,11 @@
+---
+title: So Good They Can't Ignore You
+---
+
+Podążaj za swoją pasją" to popularna ale wbrew pozorom bardzo kiepska rada a nawet ... niebezpieczna.
+
+Przede wszystkim [[Cal Newport]] uważa że pasja nie bierze się znikąd, lecz pojawia na z czasem, gdy stajemy się stopniowo lepsi w tym co już robimy.
+
+Poza tym opieranie swojej satysfakcji z pracy o podążanie za pasją i często wyidealizowaną wizją, jest źródłem [[Wiedza/Przemyślenia/Rozczarowanie]] i zamiast dodawać, odbiera nam satysfakcję. W końcu nawet najbardziej wymarzone zajęcie posiada swoje jasne i ciemne strony.
+
+Ale skoro nie pasją to czym mamy kierować się na ścieżce zawodowej i co jest w tym najbardziej istotne? Tzw. "[[Wiedza/Modele Mentalne/Craftsman Mindset]]" - skupienie się na pozyskaniu umiejętności w "której stajemy się tak dobrzy, że nikt nie może nas zignorować".
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Sources of Power.md b/content/Wiedza/Ksiazki/Sources of Power.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Sources of Power.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Sprint.md b/content/Wiedza/Ksiazki/Sprint.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Sprint.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Steve Jobs.md b/content/Wiedza/Ksiazki/Steve Jobs.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Steve Jobs.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/StrenghtsFinder 2.md b/content/Wiedza/Ksiazki/StrenghtsFinder 2.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Ksiazki/StrenghtsFinder 2.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/That Will Never Work.md b/content/Wiedza/Ksiazki/That Will Never Work.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Ksiazki/That Will Never Work.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/The Art of War.md b/content/Wiedza/Ksiazki/The Art of War.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Ksiazki/The Art of War.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/The Beginning of Infinity.md b/content/Wiedza/Ksiazki/The Beginning of Infinity.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Ksiazki/The Beginning of Infinity.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/The Brain Audit.md b/content/Wiedza/Ksiazki/The Brain Audit.md
new file mode 100644
index 000000000..7aff13aaa
--- /dev/null
+++ b/content/Wiedza/Ksiazki/The Brain Audit.md
@@ -0,0 +1,9 @@
+Autor: Sean D'Souza
+
+Jeżeli miałbym przeczytać tylko jedną książkę aby zrozumieć sprzedaż, to byłaby ta książka.
+
+Przy czym nie jest to wyłącznie książka o sprzedaży ale też o tym jak projektować rozwiązania ISTOTNYCH problemów i jak je komunikować aby przyciągnąć uwagę idealnych klientów i zaadresować ich obiekcje wykorzystując np. tzw. ""odwrócone referencje"".
+
+Ta książka stanowi potężne narzędzie, szczególnie w połączeniu z wiedzą z "[[Wiedza/Ksiazki/The Mom Test]]", "[[Wiedza/Ksiazki/Predictably Irrational]]" oraz "[[Wiedza/Ksiazki/Never Split the Difference]]".
+
+Całość stanowi bardzo dobrą podstawę do projektowania produktów i usług. Umożliwia zrozumienie problemów naszych klientów oraz spojrzenie na nie z szerokiej perspektywy.
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/The Changing World Order.md b/content/Wiedza/Ksiazki/The Changing World Order.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Ksiazki/The Changing World Order.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/The Compound Effect.md b/content/Wiedza/Ksiazki/The Compound Effect.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/content/Wiedza/Ksiazki/The Dichotomy of Leadership.md b/content/Wiedza/Ksiazki/The Dichotomy of Leadership.md
new file mode 100644
index 000000000..6e334f011
--- /dev/null
+++ b/content/Wiedza/Ksiazki/The Dichotomy of Leadership.md
@@ -0,0 +1,15 @@
+Pierwsza książka Jocko i Leifa - [[Wiedza/Ksiazki/Extreme Ownership]], przedstawia leadership przez pryzmat skrajności, tak [[Wiedza/Ksiazki/The Dichotomy of Leadership]] rozwija temat zwracając uwagę na kluczowy element całości: BALANS.
+
+## Lekcje
+1. Bierz odpowiedzialność i dawaj odpowiedzialność innym
+2. Dbaj o ludzi i pozwalaj im odejść
+3. Bądź stanowczy i elastyczny
+4. Pomagaj przekraczać granice ale nie przytłaczaj
+5. Bądź agresywny ale nie lekkomyślny
+6. Bądź zdyscyplinowany ale dawaj swobodę
+7. Pociągaj do odpowiedzialności ale nie patrz stale na ręce
+8. Bądź pokorny ale nie pasywny
+9. Patrz wąsko i szeroko (Zoom in & Zoom Out - Jim Collins)
+10. Bądź liderem i naucz się podążać za innymi
+
+Połączenie Extreme Ownership i The Dichotomy of Leadership to druga najlepsza lekcja przywództwa z jaką miałem do czynienia. Pierwszą jest rzeczywistość i praktyka.
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/The Fabric of Reality.md b/content/Wiedza/Ksiazki/The Fabric of Reality.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Ksiazki/The Fabric of Reality.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/The Great Mental Models.md b/content/Wiedza/Ksiazki/The Great Mental Models.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Ksiazki/The Great Mental Models.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/The Happiness Advantage.md b/content/Wiedza/Ksiazki/The Happiness Advantage.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/content/Wiedza/Ksiazki/The Hidden School.md b/content/Wiedza/Ksiazki/The Hidden School.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Ksiazki/The Hidden School.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/The Infinite Game.md b/content/Wiedza/Ksiazki/The Infinite Game.md
new file mode 100644
index 000000000..b6fcf13db
--- /dev/null
+++ b/content/Wiedza/Ksiazki/The Infinite Game.md
@@ -0,0 +1,9 @@
+Istnieją dwa rodzaje gier:
+- takie w które gramy po to aby wygrać
+- oraz takie w których gramy aby pozostać w grze.
+
+Są to fundamentalnie inne podejścia, które możemy stosować w wielu obszarach życia. To pierwsze skupia się na zwykle krótkoterminowym osiąganiu efektów a drugie na długoterminowej wizji.
+
+Pierwsze opiera się o intensywność a drugie o konsekwencję (zobacz [[Wiedza/Modele Mentalne/20 mile march]]).
+
+W praktyce granie w nieskończoną grę jest nieporównywalnie trudniejsze. Powodem jest fakt, że działania nastawione na długoterminowe efekty są ważne ale niemal nigdy nie pilne. To sprawia że po prostu łatwiej jest podjąć aktywności, które dadzą nam efekt tu i teraz niż takie na których rezultaty przyjdzie nam czekać.
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/The Lean Startup.md b/content/Wiedza/Ksiazki/The Lean Startup.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Ksiazki/The Lean Startup.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/The Millionaire Fastlane.md b/content/Wiedza/Ksiazki/The Millionaire Fastlane.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Ksiazki/The Millionaire Fastlane.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/The Mom Test.md b/content/Wiedza/Ksiazki/The Mom Test.md
new file mode 100644
index 000000000..3a053c8db
--- /dev/null
+++ b/content/Wiedza/Ksiazki/The Mom Test.md
@@ -0,0 +1,13 @@
+Mówią że zapytanie własnej matki czy nasz pomysł na nowy biznes jest dobry, nie jest zbyt mądre.
+
+[[Wiedza/Ksiazki/The Mom Test]] mówi o tym, że pytanie kogokolwiek o to czy nasz pomysł jest dobry, mija się z celem - nie usłyszymy prawdziwej odpowiedzi i ma na to wpływ wiele różnych czynników.
+
+W tej książce znajdziesz BARDZO praktyczne porady dotyczące tego jak rozmawiać o swoich pomysłach oraz jak przeprowadzać rozmowy z klientami tak, aby rzeczywiście zrozumieć ich problemy i móc dostarczyć im jak największą wartość (z której często nawet oni nie zdają sobie sprawy).
+
+## Lekcje
+- nie rozmawiaj o swoim pomyśle tylko o klientach
+- skupiaj się na przeszłości i rzeczywistych akcjach które zostały podjęte a nie o opinii na temat przyszłości
+- słuchaj!
+- jeżeli ktoś mówi Ci o swoim problemie zapytaj: jak go teraz rozwiązuje i co ostatnio zrobił aby zmienić aktualne rozwiązanie?
+- ostateczną walidacją jest zakup a nie obietnica zakupu.
+- weryfikuj "krytyczne założenia" stanowiące fundament Twojej firmy. Jeżeli są one błędne lub stały się nieaktualne a Ty o tym nie wiesz - **to masz problem.**
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/The One Thing.md b/content/Wiedza/Ksiazki/The One Thing.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Ksiazki/The One Thing.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/The Syntellect Hypothesis.md b/content/Wiedza/Ksiazki/The Syntellect Hypothesis.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Ksiazki/The Syntellect Hypothesis.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/The Underdog Paradox.md b/content/Wiedza/Ksiazki/The Underdog Paradox.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Ksiazki/The Underdog Paradox.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Think Again.md b/content/Wiedza/Ksiazki/Think Again.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Think Again.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Think Like a Rocket Scientist.md b/content/Wiedza/Ksiazki/Think Like a Rocket Scientist.md
new file mode 100644
index 000000000..0f0346a18
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Think Like a Rocket Scientist.md
@@ -0,0 +1,20 @@
+[[Wiedza/Ksiazki/Think Like a Rocket Scientist]]
+
+Potrafisz myśleć? To chyba potrafi każdy, nie?
+
+A nie wydaje Ci się czasem że inni robią to lepiej od Ciebie? Wydają się szybciej wpadać na lepsze rozwiązania. Ich umysł wydaje się działać na zupełnie innych zasadach i mieć dostęp do obszarów do których Ty nawet się nie zbliżasz.
+
+Tylko dlaczego tak jest skoro wszyscy jesteśmy ludźmi? Chodzi o predyspozycje? Jakiś wrodzony talent, którego nie posiadasz?
+
+Szczerze mówiąc nie mam co do tego pewności. Jednak z dużym przekonaniem mogę powiedzieć że myślenie to umiejętność, której możemy uczyć się jak każdej innej.
+
+A jeżeli mamy się uczyć to od najlepszych - naukowców od rakiet.
+
+## Lekcje
+- trzymając się znanego, nie odkryjesz nieznanego
+- jesteśmy zaprogramowani by obawiać się nieznanego
+- najprostsze rozwiązania często bywają najlepsze [[Wiedza/Modele Mentalne/Occams Razor]]
+- ego i [[Blind Spots]] to największe bariery przed poznaniem prawdy (o tym mówi też [[Wiedza/Ludzie/Ray Dalio]] w [[Wiedza/Ksiazki/Principles]])
+- chodź w nieznane ale pamiętaj o zarządzaniu ryzykiem
+- poznaj modele mentalne (np. [[Wiedza/Modele Mentalne/First Principles]], [[Wiedza/Modele Mentalne/Second Order Thinking]])
+- są rzeczy o których wiesz, o których nie wiesz że wiesz, o których wiesz że nie wiesz i takie o których nie wiesz że nie wiesz ([[Blindspot Matrix]])
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Token Economy.md b/content/Wiedza/Ksiazki/Token Economy.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Token Economy.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Total Recall.md b/content/Wiedza/Ksiazki/Total Recall.md
new file mode 100644
index 000000000..41c162fcc
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Total Recall.md
@@ -0,0 +1,10 @@
+Bez wątpienia jedna z najlepszych biografii jakie do tej pory czytałem.
+
+## Lekcje
+- [[Wiedza/Przemyślenia/Dyscyplina]] jest fundamentalnie ważna...
+- ...aby realizować małe kroki każdego dnia... ([[Wiedza/Ksiazki/The Compound Effect]])
+- ...które prowadzą nas w kierunku jasno określonej wizji... ([[Wiedza/Słownik/Proces]] & [[Wiedza/Słownik/Kierunek]])
+- ...do której droga nie jest łatwa ale nasz entuzjazm oraz odpowiedni ludzie [[Wiedza/Słownik/Otoczenie]] mogą nam w jej pomoc...
+- ...aż w końcu dochodzimy w miejsce gdzie ludzi takich jak my jest naprawdę mało, lub nawet jesteśmy pierwszymi którzy do niego doszli.
+
+Co tu więcej mówić. Tę książkę po prostu trzeba przeczytać. Szczególnie polecam audiobook, który czytany przez [[Arnold Schwarzenegger]]a, dodatkowo wpływa na doświadczenie tej historii.
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Tytul.md b/content/Wiedza/Ksiazki/Tytul.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Tytul.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Understanding the INFJ Personality Type.md b/content/Wiedza/Ksiazki/Understanding the INFJ Personality Type.md
new file mode 100644
index 000000000..b6dbcab07
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Understanding the INFJ Personality Type.md
@@ -0,0 +1,11 @@
+Kilka lat temu usłyszałem o teście osobowości MBTI, natomiast dopiero później po wykonaniu testu "Gallupa", zrozumiałem jak wiele wskazówek dają nam takie narzędzia.
+
+W przypadku MBTI okazało się, że moim profilem jest najrzadziej występujący z wszystkich szesnastu (~1-3% ludzkości).
+
+Szukając dodatkowych materiałów dotyczących poszczególnych profili, trafiłem na wielokrotnie polecaną książkę Megan, która nie tylko pozwoliła mi dokładnie zrozumieć zarówno plusy jak i minusy profilu INFJ ale również wdrożyć szereg aktywności, które pozwalają mi je zaadresować i wykorzystać.
+
+Ciekawostka: W rozdziale ""Jak zrozumieć INFJ"", pierwsze zdanie brzmi: ""Zaakceptuj że nie da się zrozumieć INFJ"" 😅
+
+Wygląda to na bardzo wymijającą ""radę"" ale w rzeczywistości kryje się za nią bardzo konkretny przekaz.
+
+Zachęcam wszystkich do tego aby wykonując testy osobowości poszukać dodatkowych materiałów na ich temat. Jednocześnie ważne jest to aby nie zapominać, że to tylko test reprezentujący bardzo uproszczony model osobowości.
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/War of Art.md b/content/Wiedza/Ksiazki/War of Art.md
new file mode 100644
index 000000000..8b7aefd54
--- /dev/null
+++ b/content/Wiedza/Ksiazki/War of Art.md
@@ -0,0 +1,12 @@
+Autor: Steven Pressfield
+
+Czy zdajesz sobie sprawę o istnieniu pewnej siły, która nieustannie powstrzymuje Cię przed działaniem?
+
+To ukryty pod jedną z wielu mask - strachu, lęku, zmęczenia, wymówek, braku weny czy ważniejszych spraw - [[Opór]], którego podstawowym celem jest destrukcja i całkowite powstrzymanie nas przed działaniem.
+
+[[Steven Pressfield]] w [[Wiedza/Ksiazki/The Art of War]] opisuje na czym polega opór, czym się objawia oraz podkreśla fakt, że czuje go każdy, niezależenie od miejsca i czasu. Zrozumienie tego faktu daje nam przewagę w postaci świadomości problemu.
+
+## Lekcje
+1. Opór dotyczy każdego. Niezależnie od miejsca i czasu.
+2. Aby realizować marzenia, traktuj je poważnie.
+3. Zaakceptuj fakt, że opór nigdy nie mija. To przeciwnik z którym będziesz mierzyć się każdego dnia. Każdego dnia możesz przegrać ... i wygrać.
diff --git a/content/Wiedza/Ksiazki/Way of The Peaceful Warrior.md b/content/Wiedza/Ksiazki/Way of The Peaceful Warrior.md
new file mode 100644
index 000000000..c901af805
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Way of The Peaceful Warrior.md
@@ -0,0 +1,20 @@
+[[Wiedza/Ksiazki/Way of The Peaceful Warrior]] to dla mnie jedna z najważniejszych książek. Jej narracja bardzo ze mną rezonuje i od lat ma na mnie ogromny wpływ. To książka do której wracam kilka razy w roku. Stanowi dla mnie absolutny #1 w mojej kolekcji książek.
+
+Jest to autobiografia Dana Millmana - Mistrza Świata w gimnastyce i z pozoru jest to prosta historia człowieka, który pokonał przeciwności losu w drodze do realizacji swoich celów.
+
+Warto dodać że na podstawie tej książki powstał świetny film "Siła Spokoju". Jeżeli chcesz od czegoś zacząć, zacznij od niego.
+
+## Cytaty
+- _Nie ma zwykłych chwil, zawsze coś się dzieje_
+- _Nieistotne jest to co wiesz, lecz to co z tym robisz_
+- _Never struggle with anyone or anything. When you're pushed, pull; when you're pulled, push_
+
+## Lekcje
+- Zrozumiałem dzięki niej rolę jaką odgrywają [[Wiedza/Przemyślenia/Oczekiwania]]
+- Droga do celu stanowi znaczną część podróży
+- Nie ma zwykłych chwil - doceniaj każdą z nich
+- Dźwignia ([[Wiedza/Modele Mentalne/Leverage]]) zastosowana w odpowiednim miejscu i czasie potrafi zdziałać cuda
+
+## Akcje
+- Zrezygnowałem z wyznaczania [[Wiedza/Słownik/Cel]]ów na rzecz realizacji [[Wiedza/Słownik/Proces]]u, który przybliża mnie do wyznaczonego [[Wiedza/Słownik/Kierunek]]
+- W połączeniu z [[Wiedza/Ksiazki/The Infinite Game]] oraz [[Wiedza/Ksiazki/The Compound Effect]] zmieniłem swoje nastawienie na długoterminowe. Dokładając do tego [[Wiedza/Przemyślenia/Dyscyplina]] z [[Wiedza/Ksiazki/Extreme Ownership]] sprawiłem, że upływający czas stał się moim największym przyjacielem.
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/When Coffee and Kale Compete.md b/content/Wiedza/Ksiazki/When Coffee and Kale Compete.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/content/Wiedza/Ksiazki/Who Says Elephant's Can't Dance.md b/content/Wiedza/Ksiazki/Who Says Elephant's Can't Dance.md
new file mode 100644
index 000000000..c2380ca1b
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Who Says Elephant's Can't Dance.md
@@ -0,0 +1,13 @@
+[[Wiedza/🎲 Biznes/Leadership]] to temat o którym czytałem w wielu książkach. Przez prawie całą swoją dotychczasową karierę, miałem okazję obserwować wielu managerów i leaderów. Nawet ponad rok, sam miałem okazję w roli COO wspólnie z zespołem podejmować duże wyzwania związane z rozwojem produktu.
+
+To wszystko nauczyło mnie wiele i pokazało że jeszcze wiele przede mną pracy, szczególnie że na koniec dnia, spotykały mnie sytuacje w których nawet "Plan B" zawodził razem z "Planem A".
+
+W tej książce miałem okazję zobaczyć w jaki sposób dochodzi do transformacji jednej z największych organizacji w czasach gdy stała nad przepaścią. I to wszystko z najlepszej perspektywy - osoby, która stała na czele tej zmiany.
+
+## Lekcje
+- Prowadzenie firmy (podobnie jak całe życie) jest grą.
+- W tej grze kultura nie jest jednym z elementów, lecz samą grą.
+- Są sytuacje w których wizja nie jest niezbędna a nawet szkodzi.
+- Zasady są ważniejsze niż proces. Proces ważniejszy niż cel.
+- Nie ma złych zespołów. Są źli liderzy. (to akurat cytat z [[Wiedza/Ksiazki/Extreme Ownership]])
+- Kultura tworzy zaangażowanie ludzi a ono stanowi dźwignię rozwoju firmy.
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Win In The Dark.md b/content/Wiedza/Ksiazki/Win In The Dark.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Win In The Dark.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Ksiazki/Working Backwards.md b/content/Wiedza/Ksiazki/Working Backwards.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Ksiazki/Working Backwards.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Ludzie/Adam Grant.md b/content/Wiedza/Ludzie/Adam Grant.md
new file mode 100644
index 000000000..7f1972766
--- /dev/null
+++ b/content/Wiedza/Ludzie/Adam Grant.md
@@ -0,0 +1,3 @@
+Autor m.in. genialnej książki [[Wiedza/Ksiazki/Think Again]] - "Uczenie się jest tak samo ważne jak zdolność ODuczenia". Podobna koncepcja poruszona jest m.in. w książce [[The Code of Extraordinary Mind]] jako "kiedy zmieniłeś/aś jakieś swoje fundamentalne przekonanie?"
+
+https://www.adamgrant.net
diff --git a/content/Wiedza/Ludzie/Adam Wathan.md b/content/Wiedza/Ludzie/Adam Wathan.md
new file mode 100644
index 000000000..cf2d8b5fa
--- /dev/null
+++ b/content/Wiedza/Ludzie/Adam Wathan.md
@@ -0,0 +1,4 @@
+[[Wiedza/Ludzie/Adam Wathan]] to twórca m.in. [[Tailwind CSS]], [[Tailwind UI]] oraz autor świetnego e-booka o zasadach projektowania UI - [[Wiedza/Ksiazki/Refactoring UI]].
+
+### Źródła:
+- [Wnioski z 4 lat prowadzenia swojego biznesu](https://twitter.com/adamwathan/status/1296447318074568704?s=21)
diff --git a/content/Wiedza/Ludzie/Andrew Huberman.md b/content/Wiedza/Ludzie/Andrew Huberman.md
new file mode 100644
index 000000000..d30c5cdcb
--- /dev/null
+++ b/content/Wiedza/Ludzie/Andrew Huberman.md
@@ -0,0 +1,20 @@
+Neurobiolog z Uniwersytetu Stanford. Prowadzi podcast [Huberman Lab](https://hubermanlab.com/) w którym w bardzo przystępny sposób mówi o najnowszych odkryciach nauki, przekładając je na sugestie, które łatwo można wykorzystać w praktyce.
+
+Ta wiedza przydaje się przede wszystkim do tego aby:
+- [zarządzać swoją energią i emocjami](https://hubermanlab.com/the-science-of-emotions-relationships/)
+- [zwiększyć poziom skupienia](https://hubermanlab.com/how-to-focus-to-change-your-brain/)
+- [uczyć się szybciej](https://hubermanlab.com/using-failures-movement-and-balance-to-learn-faster/)
+- [radzić sobie ze stresem](https://hubermanlab.com/tools-for-managing-stress-and-anxiety/)
+- [lepiej spać](https://hubermanlab.com/master-your-sleep-and-be-more-alert-when-awake/)
+
+### Rich Roll
+Bardzo polecam rozmowę dzięki której poznałem Huberman. Jednocześnie jest to jedno ze źródeł do którego regularnie wracam bo nie sposób jest przyswoić wszystko za pierwszym razem.
+
+> "Nasz cały układ nerwowy zaprojektowany jest po to aby realizować jedną i tylko jedną rzecz: połączyć infromacje z otaczającego nasz świata z tymi pochodzącymi z naszego ciała. Inaczej mówiąc: jego rolą jest **dopasowanie** tego co na zewnątrz z tym co wewnątrz."
+
+
+
+## Podcast
+[[Wiedza/Podcasty/Huberman Lab]]
+
+### Źródła
diff --git a/content/Wiedza/Ludzie/Bruce Lee.md b/content/Wiedza/Ludzie/Bruce Lee.md
new file mode 100644
index 000000000..3e01469ba
--- /dev/null
+++ b/content/Wiedza/Ludzie/Bruce Lee.md
@@ -0,0 +1 @@
+[[Wiedza/Podcasty/Bruce Lee Podcast]]
\ No newline at end of file
diff --git a/content/Wiedza/Ludzie/Charlie Munger.md b/content/Wiedza/Ludzie/Charlie Munger.md
new file mode 100644
index 000000000..68ca61ccd
--- /dev/null
+++ b/content/Wiedza/Ludzie/Charlie Munger.md
@@ -0,0 +1 @@
+[[Wiedza/Ksiazki/All I Want to Know is Where Im Going to Die So Ill Never Go There]]
\ No newline at end of file
diff --git a/content/Wiedza/Ludzie/Dan Millman.md b/content/Wiedza/Ludzie/Dan Millman.md
new file mode 100644
index 000000000..93fb12d91
--- /dev/null
+++ b/content/Wiedza/Ludzie/Dan Millman.md
@@ -0,0 +1,37 @@
+# Kim jest?
+Dan Millman to Mistrz Świata w gimnastyce i autor książek w których mocno nawiązuje do filozofii buddyjskiej.
+
+
+## Czego nauczył mnie Dan?
+
+### Nie ma zwykłych chwil.
+Zawsze coś się dzieje.
+
+### Wojownik Spokoju
+Wojownik nie rezygnuje z tego co kocha. Odnajduje miłość w tym co robi.
+
+Takie nastawienie sprawia, że z miłością podchodzę do wszystkiego co robię, niezależnie od tego jak trudne to się wydaje.
+
+### Zasady życia
+Humor, Paradoks i Zmiana
+
+- Humor: Poczucie humoru szczególnie względem siebie to siła ponad miarę ([[Fundamenty/Wartości#Moje wartości]])
+- Paradoks: Życie jest tajemnicą, nie marnuj czasu aby ją rozwikłać.
+- Zmiana: Nic nigdy nie pozostaje takie samo
+
+### Wiedza vs Mądrość
+Wiedza to nie to samo co mądrość. Nieistotne jest to co wiesz, ważne jest to co robisz. Mądrość to wykorzystanie swojej wiedzy.
+
+### Szczęście
+Bądź szczęśliwy tu i teraz, bez powodu. Albo nigdy nie będziesz.
+
+Coś podobnego powiedział [[Wiedza/Ludzie/Naval Ravikant]]. Przeczytanie tego w [[Wiedza/Ksiazki/Alamanck of Naval Ravikant]] było dla mnie przełomowym momentem ze względu na całkowitą zmianę nastawienia względem swojego życia i poczucia szczęścia.
+
+### Oczekiwania wobec celu
+Fragment filmu "Siła Spokoju" pokazujący nieoczekiwany efekt długiej podróży związany z [[Wiedza/Słownik/Cel]]em i [[Wiedza/Przemyślenia/Oczekiwania]]mi.
+
+
+
+### Źródła
+- [[Wiedza/Ksiazki/Way of The Peaceful Warrior]]
+- [[Wiedza/Ksiazki/Body Mind Mastery]]
\ No newline at end of file
diff --git a/content/Wiedza/Ludzie/David Goggins.md b/content/Wiedza/Ludzie/David Goggins.md
new file mode 100644
index 000000000..d98328fbe
--- /dev/null
+++ b/content/Wiedza/Ludzie/David Goggins.md
@@ -0,0 +1 @@
+[[Wiedza/Ksiazki/Cant Hurt Me]]
\ No newline at end of file
diff --git a/content/Wiedza/Ludzie/Elon Musk.md b/content/Wiedza/Ludzie/Elon Musk.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/content/Wiedza/Ludzie/Jim Collins.md b/content/Wiedza/Ludzie/Jim Collins.md
new file mode 100644
index 000000000..52bccbd13
--- /dev/null
+++ b/content/Wiedza/Ludzie/Jim Collins.md
@@ -0,0 +1,4 @@
+---
+title: Jim Collins
+---
+- [Koncepcje](https://www.jimcollins.com/concepts.html)
\ No newline at end of file
diff --git a/content/Wiedza/Ludzie/Jocko Willink.md b/content/Wiedza/Ludzie/Jocko Willink.md
new file mode 100644
index 000000000..b57dbe701
--- /dev/null
+++ b/content/Wiedza/Ludzie/Jocko Willink.md
@@ -0,0 +1 @@
+Autor książek [[Wiedza/Ksiazki/Extreme Ownership]] i [[Dichotomy of Leadership]]
\ No newline at end of file
diff --git a/content/Wiedza/Ludzie/Kapil Gupta.md b/content/Wiedza/Ludzie/Kapil Gupta.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/content/Wiedza/Ludzie/Lex Fridman.md b/content/Wiedza/Ludzie/Lex Fridman.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/content/Wiedza/Ludzie/Ludzie.md b/content/Wiedza/Ludzie/Ludzie.md
new file mode 100644
index 000000000..9a9c1db5c
--- /dev/null
+++ b/content/Wiedza/Ludzie/Ludzie.md
@@ -0,0 +1,15 @@
+Zależy mi na tym aby otaczali mnie ludzie, których obecność ma na mnie pozytywny wpływ. Poniżej znajduje się lista osób, które obserwuję w Internecie.
+
+- [[Wiedza/Ludzie/Naval Ravikant]]
+- [[Wiedza/Ludzie/Dan Millman]]
+- [[Wiedza/Ludzie/Andrew Huberman]]
+- [[Wiedza/Ludzie/Lex Fridman]]
+- [[Wiedza/Ludzie/Jim Collins]]
+- [[Wiedza/Ludzie/Kapil Gupta]]
+- [[Wiedza/Ludzie/Charlie Munger]]
+- [[Wiedza/Ludzie/Warren Buffet]]
+- [[Wiedza/Ludzie/Adam Wathan]]
+- [[Wiedza/Ludzie/Elon Musk]]
+- [[Wiedza/Ludzie/Ray Dalio]]
+- [[Wiedza/Ludzie/Adam Grant]]
+- [[Wiedza/Ludzie/Jocko Willink]]
\ No newline at end of file
diff --git a/content/Wiedza/Ludzie/Naval Ravikant.md b/content/Wiedza/Ludzie/Naval Ravikant.md
new file mode 100644
index 000000000..92c8943b0
--- /dev/null
+++ b/content/Wiedza/Ludzie/Naval Ravikant.md
@@ -0,0 +1,4 @@
+## Naval & Kapil Gupta
+> "Istnieje sposób na to aby rozwiązać wszystkie swoje problemy bez potrzeby ruszenia palcem. Chodzi o ekspozycję." \(30:50\)
+
+
diff --git a/content/Wiedza/Ludzie/Ray Dalio.md b/content/Wiedza/Ludzie/Ray Dalio.md
new file mode 100644
index 000000000..a4ff23e9a
--- /dev/null
+++ b/content/Wiedza/Ludzie/Ray Dalio.md
@@ -0,0 +1,14 @@
+## Zasady
+Ray Dalio w swojej książce [[Wiedza/Ksiazki/Principles]] pomógł mi zrozumieć jak ważne jest posiadanie w swoim życiu zasad, którymi się kierujemy.
+
+Dzięki zasadom usprawniamy proces podejmowania decyzji, co prowadzi nas do osiągania lepszych rezultatów.
+
+Osobiście poza zasadami, wykorzystuję również moje [[Fundamenty/Wartości]] oraz [[Wiedza/Modele Mentalne/Modele mentalne]]. Praca nad lepszym podejmowaniem decyzji jest dla mnie ważnym elementem mojego [[Fundamenty/Proces]]u.
+
+## Radykalna Transparentność
+[[Radykalna Transparentność]] to koncepcja którą poznałem dzięki [[Wiedza/Ludzie/Ray Dalio]]. Jest to bardzo kontrowersyjna zasada, która w moim przekonaniu jest fundamentalnie ważna w dostrzeganiu [[Wiedza/Przemyślenia/Rzeczywistość]] takiej jakiej jest, a nie takiej jaką chcielibyśmy widzieć ([[Iluzja]]).
+
+Osobiście nie mogę powiedzieć, że jestem Radykalnie Transparentny, natomiast robię co w mojej mocy aby być szczerym przede wszystkim sam ze sobą, co nie jest łatwe, ponieważ "jesteśmy osobą którą najłatwiej jest nam oszukać." ~ Richard P. Feynman.
+
+[[Wiedza/Inne/Principles You]]
+[[Wiedza/Inne/MBTI]]
\ No newline at end of file
diff --git a/content/Wiedza/Ludzie/Warren Buffet.md b/content/Wiedza/Ludzie/Warren Buffet.md
new file mode 100644
index 000000000..68ca61ccd
--- /dev/null
+++ b/content/Wiedza/Ludzie/Warren Buffet.md
@@ -0,0 +1 @@
+[[Wiedza/Ksiazki/All I Want to Know is Where Im Going to Die So Ill Never Go There]]
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/ Social comparsion bias.md b/content/Wiedza/Modele Mentalne/ Social comparsion bias.md
new file mode 100644
index 000000000..dd622a266
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/ Social comparsion bias.md
@@ -0,0 +1,12 @@
+## O co chodzi?
+O odczuwanie negatywnych emocji w sytuacji gdy ktoś inny jest w jakiś sposób lepszy od nas.
+
+
+## Jak wykorzystuję [[Social comparsion bias]]?
+Aktywnie zwracam uwagę na to aby nie porównywać się do innych oraz nie uzależniać swojego poczucia własnej wartości od tego, co dzieje się dookoła mnie (ani tego, co dzieje się we mnie).
+
+Odczuwanie negatywnych emocji w tego typu sytuacjach postrzegam jako całkiem naturalne. Zwracam uwagę na to aby ich nie uzewnętrzniać w kierunku osoby, która je wzbudza. W zamian energię którą generują, wykorzystuję do produktywnej akcji, która może mnie rozwinąć.
+
+Aby ułatwić sobie radzenie z tego typu emocjami, wykorzystuję [[Mindfulness]], dzięki któremu m.in. mam więcej przestrzeni pomiędzy akcją a reakcją. Czyli momentem odczuwania emocji oraz akcją jaką w związku z nimi podejmę.
+
+Oczywiście zdarzają się chwile w których nawet nie zauważam działania [[Social comparsion bias]]. Są też takie w przypadku których zupełnie nie występuje. Zwykle ma to związek z szczerą radością i cieszeniem się szczęściem innych.
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/20 mile march.md b/content/Wiedza/Modele Mentalne/20 mile march.md
new file mode 100644
index 000000000..a477b83c9
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/20 mile march.md
@@ -0,0 +1,11 @@
+## O co chodzi?
+[[Wiedza/Modele Mentalne/20 mile march]] to koncept z książki [[Wiedza/Ksiazki/Great by Choice]] ~ [[Wiedza/Ludzie/Jim Collins]]
+
+Na długim dystansie lepsze jest mniejsze, ale regularne tempo niż sprinty.
+
+Inaczej mówiąc: chodzi o poruszanie się w stałym tempie niezależnie od czynników zewnętrznych i wewnętrznych.
+
+## Jak stosuję [[Wiedza/Modele Mentalne/20 mile march]]?
+Dbam o [[Fundamenty/Proces#Fundamenty]] oraz podejmując działania, zawsze myślę długoterminowo mając na uwadze [[Wiedza/Ksiazki/The Infinite Game]].
+
+Np. mógłbym tygodniowo nagrywać 3-4 filmy na [[Projekty/overment]]. W praktyce nagrywam jeden ale za to jestem w stanie to robić regularnie (o ile jest to dla mnie [[Wiedza/Słownik/Priorytet]])
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Absent-mindedness.md b/content/Wiedza/Modele Mentalne/Absent-mindedness.md
new file mode 100644
index 000000000..8b282113b
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Absent-mindedness.md
@@ -0,0 +1,9 @@
+ ## O co chodzi?
+ To stan niskiego poziomu uwagi i częstych rozproszeń.
+
+ ## Jak wykorzystuję [[Wiedza/Modele Mentalne/Absent-mindedness]]?
+W sytuacji gdy tego doświadczam, najczęściej idę na spacer lub po prostu robię sobie przerwę.
+
+Zadaję sobie również pytania, czy ten stan został wywołany przez coś konkretnego. Jeżeli tak, adresuję problem. Jeżeli nie - pasywnie lub aktywnie, czekam aż minie.
+
+Coś takiego zdarza mi się wyjątkowo rzadko i znacznie częściej szukam sposobów do tego aby zredukować swój poziom skupienia, który zwykle jest bardzo wysoki.
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Actor-observer bias.md b/content/Wiedza/Modele Mentalne/Actor-observer bias.md
new file mode 100644
index 000000000..c4f5db2fa
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Actor-observer bias.md
@@ -0,0 +1,17 @@
+ ## O co chodzi?
+O przypisywanie różnych powodów zachowań w zależności od tego czy utożsamiamy się z "aktorem" czy "obserwatorem".
+
+Gdy jesteśmy aktorem, przypisujemy je do czynników zewnętrznych a będąc obserwatorem, wiążemy je z czynnikami wewnętrznymi.
+
+Np. gdy ktoś mówi że powinniśmy więcej ćwiczyć, jako aktorzy wskazujemy zewnętrzny powód, który nas przed tym powstrzymuje.
+
+Jeżeli jednak mówimy komuś aby zaczął ćwiczyć, łatwiej wskazać nam wewnętrzną przyczynę stojącą za brakiem podjętej akcji.
+
+
+ ## Jak wykorzystuję [[Wiedza/Modele Mentalne/Actor-observer bias]]?
+
+Przełączanie pomiędzy aktorem i obserwatorem to nic innego jak zmiana [[Wiedza/Słownik/Perspektywa]] i odgrywa to ogromne znaczenie w moim funkcjonowaniu. Uważam że zarówno jedna i druga może być przydatna o ile narzucimy na to "meta level" i nawet będąc aktorem czy obserwującym, nadal będziemy to robić ze świadomością tego, że nadal "obserwujemy".
+
+W ten sposób zyskujemy dystans niezbędny do zauważenia szczegółów oraz zebrania informacji.
+
+Świadomość tego mechanizmu jest przydatna również przy obserwowaniu innych, których narracja zmienia się w zależności od aktualnie odgrywanej roli.
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Ambiguity bias.md b/content/Wiedza/Modele Mentalne/Ambiguity bias.md
new file mode 100644
index 000000000..89795ab1d
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Ambiguity bias.md
@@ -0,0 +1,8 @@
+ ## O co chodzi?
+To sytuacja w której na podjętą decyzję ma wpływ posiadanie niewystarczającej ilości informacji. Wtedy decyzja zwykle wskazuje na opcję w przypadku której prawdopodobieństwo wyniku jest znane. Jest to po prostu bezpieczniejsza opcja związana z [[Wiedza/Modele Mentalne/Loss aversion]] i z faktem, że to co nieznane wiązane jest domyślnie z czymś negatywnym.
+
+
+ ## Jak wykorzystuję [[Wiedza/Modele Mentalne/Ambiguity bias]]?
+
+Gdy nie mam wystarczającej ilości informacji i mam taką możliwość, wstrzymuję się od podjęcia decyzji. Jeżeli jednak muszę jakąś podjąć opieram się o [[Ciekawość]], [[Wiedza/Przemyślenia/Intuicja]], [[Wiedza/Modele Mentalne/Inversion]] oraz [[Wiedza/Słownik/Perspektywa]]. Dzięki nim mogę nieco lepiej zrozumieć sytuację przed którą stoję i zaburzyć domyślne odruchy na które mocny wpływ mają uprzedzenia takie jak [[Wiedza/Modele Mentalne/Ambiguity bias]].
+
diff --git a/content/Wiedza/Modele Mentalne/Anchoring.md b/content/Wiedza/Modele Mentalne/Anchoring.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Anchoring.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Anecdotal fallacy.md b/content/Wiedza/Modele Mentalne/Anecdotal fallacy.md
new file mode 100644
index 000000000..35ab79d5b
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Anecdotal fallacy.md
@@ -0,0 +1,8 @@
+ ## O co chodzi?
+ Anecdotal Fallacy polega na przekonaniu, że jakieś zdarzenia mają większe prawdopodobieństwo wystąpienia, ponieważ nasze niedawne wspomnienia sugerują, że tak może być.
+
+ Przykładowo jeżeli ktoś nam opowie o tym, że został ostatnio napadnięty, nasze myśli mają tendencję do wyolbrzymiania sytuacji w których my również możemy zostać napadnięci.
+
+ ## Jak wykorzystuję [[Wiedza/Modele Mentalne/Anecdotal fallacy]]?
+ Dzięki nieustannej zmianie [[Wiedza/Słownik/Perspektywa]], często udaje mi się dostrzegać wpływ jaki mają na mnie ostatnie wydarzenia na teraźniejszość. Posiadanie świadomości o tym jak zachowuje się nasz umysł w takiej sytuacji, pozwala mi lepiej oceniać bardziej realne prawdopodobieństwo jakichś zdarzeń.
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Anthropomorphism.md b/content/Wiedza/Modele Mentalne/Anthropomorphism.md
new file mode 100644
index 000000000..1e5a81122
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Anthropomorphism.md
@@ -0,0 +1,8 @@
+ ## O co chodzi?
+ O przypisywanie intencjonalności i stanów mentalnych, charakterystycznych dla żywych stworzeń, stworzeniom które ożywione nie są.
+
+ ## Jak wykorzystuję [[Wiedza/Modele Mentalne/Anthropomorphism]]
+Aktualnie nie potrafię wskazać żadnych sensownych przykładów, poza tym że świadomość takiej tendencji jest łatwo zauważalna w otaczającym świecie. Zwykle po prostu mam do tego pewien dystans.
+
+
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Appeal to Novelty.md b/content/Wiedza/Modele Mentalne/Appeal to Novelty.md
new file mode 100644
index 000000000..94a4ccba2
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Appeal to Novelty.md
@@ -0,0 +1,7 @@
+## O co chodzi?
+To przekonanie, że "nowe jest dobre lub lepsze".
+
+## Jak wykorzystuję [[Wiedza/Modele Mentalne/Appeal to Novelty]]?
+Staram się oceniać przydatność rzeczy nie przez ich datę stworzenia lub odkrycia, lecz faktyczną użyteczność. Przykładowo zdarza mi się korzystać ze starszych języków programowania, bibliotek czy sprawdzonych narzędzi, niż opierać się zawsze o najnowsze technologie, które często bardzo szybko przemijają.
+
+Ogólną zasadą jest spojrzenie na rzeczy z założeniem, że skoro są wykorzystywane od X lat, to jeżeli nic nie wskazuje na to, że jest inaczej, można założyć że są właśnie u szczytu swojej świetności i pozostaną z nami przez kolejne X lat. Aktualnie ta reguła coraz gorzej oddaje rzeczywistość i warto brać poprawkę na szybko zmieniającą świat technologię.
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Appeal to probability fallacy.md b/content/Wiedza/Modele Mentalne/Appeal to probability fallacy.md
new file mode 100644
index 000000000..f51b7ce9c
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Appeal to probability fallacy.md
@@ -0,0 +1,7 @@
+ ## O co chodzi?
+To tendencja do uznawania czegoś za pewne, tylko dlatego że jest prawdopodobne. Inaczej mówiąc: przeceniamy szansę wystąpienia jakiegoś zdarzenia, opierając się na pojedynczych sygnałach, które to potwierdzają.
+
+## Jak wykorzystuję [[Wiedza/Modele Mentalne/Appeal to probability fallacy]]?
+Zwykle zakładam odwrotnie ([[Wiedza/Modele Mentalne/Inversion]]) i zastanawiam się co zrobię gdy coś się **nie wydarzy**. Jednocześnie szukam sposobów oraz wzroców, które mogą realnie zwiększyć prawdopodobieństwo wystąpienia jakiegoś zdarzenia (lub jemu zapobiec).
+
+W chwili gdy przyłapuję się na tym, że uzasadaniam sobie coś podając albo powtarzające się powody albo doszukuję się powodów, oznacza to dla mnie, że w grę wchodzi [[Wiedza/Modele Mentalne/Appeal to probability fallacy]].
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Argument from fallacy.md b/content/Wiedza/Modele Mentalne/Argument from fallacy.md
new file mode 100644
index 000000000..0bb8f051f
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Argument from fallacy.md
@@ -0,0 +1,10 @@
+## O co chodzi?
+O założenie, że argument zawierający błąd logiczny nie może mieć prawdziwego wniosku.
+
+Np. jeżeli w trakcie dysukusji ktoś użyje nielogicznego argumentu, z góry zakładamy, że wszystko co kryje się za przekazem również jest błędne.
+
+## Jak wykorzystuję [[Wiedza/Modele Mentalne/Argument from fallacy]]?
+W przypadku gdy ja używam argumentu, który zawiera logiczny błąd, staram się podejść do wyjaśnienia od drugiej strony. Często też próbuję zrozumieć dokładnie na czym polegał mój błąd i wykorzystać rozwiązanie w wyjaśnieniu motywu który za nim stoi.
+
+W odwrotnej sytuacji, zawsze staram się założyć, że to ja **mogę być w błędzie.** Jest to postawa znana z książek [[Wiedza/Ksiazki/Think Like a Rocket Scientist]] oraz chęć dojścia do prawdy mocno podkreślana przez [[Wiedza/Ludzie/Ray Dalio]] w [[Wiedza/Ksiazki/Principles]].
+
diff --git a/content/Wiedza/Modele Mentalne/Attentional bias.md b/content/Wiedza/Modele Mentalne/Attentional bias.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Attentional bias.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Authority bias.md b/content/Wiedza/Modele Mentalne/Authority bias.md
new file mode 100644
index 000000000..cc2447feb
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Authority bias.md
@@ -0,0 +1,15 @@
+## O co chodzi?
+Authority bias to tendencja do przyznawania wyższej skuteczności opiniom ludzi, posiadających autorytet.
+
+W praktyce takie osoby mylą się równie często, o czym na każdym kroku wspomina [[Nassim Nicholas Taleb]].
+
+## Jak stosuję [[Wiedza/Modele Mentalne/Authority bias]]
+Przede wszystkim nie uznaję koncepcji autorytetu. Jest to skrajne podejście, które chroni mnie przed bezkrytycznym przyjmowamiem sugestii.
+
+**Aby było jasne:** nie ma to nic wspólnego z brakiem szacunku do osób, które czegoś dokonały. Chodzi wyłącznie o podkreślanie faktu, że nadal są to ludzie, którzy mają prawo popełniać błędy (i to robią).
+
+Nadal w moim najbliższym [[Wiedza/Słownik/Otoczenie]] są osoby, które można uznać za autorytet. Jednak sam nie patrzę na to w ten sposób.
+
+Ogólnie koncepcja tego, że ktoś jest "wyżej" lub "niżej" do mnie nie przemawia. Stosuję podejście, że "ludzie są różni" a to sprawia, że mogę "jak równy z równym" rozmawiać z każdym. Warto dodać, że zwykle jest to odbierane bardzo pozytywnie.
+
+Wyjątek stanowią osoby o bardzo wysokich, korporacyjnych stanowiskach lub osoby praujące w branżach w których hierarchia ma duże znaczenie (np. szkolnictwo wyższe). Zwykle jednak unikam kontaktu z takimi ludźmi.
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Automation bias.md b/content/Wiedza/Modele Mentalne/Automation bias.md
new file mode 100644
index 000000000..2a69325b2
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Automation bias.md
@@ -0,0 +1,9 @@
+## O co chodzi?
+Automation bias dotyczy popełniania błędów w wysoce zautomatyzowanym środowisku, w przypadku którego ludzie bardziej ufają maszynom niż własnemu osądowi.
+
+## Jak stosuję [[Wiedza/Modele Mentalne/Automation bias]]?
+Podobnie jak w przypadku [[Wiedza/Modele Mentalne/Authority bias]], nie uznaję autorytetu maszyny. Tym bardziej, że jako programista, jestem świadomy tego jak łatwo popełnić błąd, nawet w przypadku rozwijania oprogramowania o wysokim standardzie jakości.
+
+Z tego powodu w sytuacji gdy mam do czynienia z błędem, zawsze weryfikuję czy system z którym mam do czynienia jest zaprojektowany we właściwy sposób.
+
+Co ciekawe: swoje decyzje również poddaję podwójnej weryfikacji przez inne osoby.
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Availability heurisitc.md b/content/Wiedza/Modele Mentalne/Availability heurisitc.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Availability heurisitc.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Backfire effect.md b/content/Wiedza/Modele Mentalne/Backfire effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Backfire effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Bader-Meinhof Phenomenon.md b/content/Wiedza/Modele Mentalne/Bader-Meinhof Phenomenon.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Bader-Meinhof Phenomenon.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Bandwagon effect.md b/content/Wiedza/Modele Mentalne/Bandwagon effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Bandwagon effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Barnum effect.md b/content/Wiedza/Modele Mentalne/Barnum effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Barnum effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Base rate fallacy.md b/content/Wiedza/Modele Mentalne/Base rate fallacy.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Base rate fallacy.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Belief bias.md b/content/Wiedza/Modele Mentalne/Belief bias.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Belief bias.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Bias blind spot.md b/content/Wiedza/Modele Mentalne/Bias blind spot.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Bias blind spot.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Bike-shedding effect.md b/content/Wiedza/Modele Mentalne/Bike-shedding effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Bike-shedding effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Bizarreness effect.md b/content/Wiedza/Modele Mentalne/Bizarreness effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Bizarreness effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Bullets and Cannonballs.md b/content/Wiedza/Modele Mentalne/Bullets and Cannonballs.md
new file mode 100644
index 000000000..042f8c5f8
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Bullets and Cannonballs.md
@@ -0,0 +1,10 @@
+[[Wiedza/Modele Mentalne/Bullets and Cannonballs]] to koncept z książki [[Wiedza/Ksiazki/Great by Choice]] ~ [[Wiedza/Ludzie/Jim Collins]]
+
+## O co chodzi?
+Najpierw strzelaj małymi pociskami (niskie koszty, niskie ryzyko) aby ocenić co działa a co nie. Mając walidację sięgasz po kule armatnią (inwestycja, zaangażowanie, większe ryzyko).
+
+## Jak wykorzystuję [[Wiedza/Modele Mentalne/Bullets and Cannonballs]]
+Robię to wykorzystując [[Wiedza/Programowanie/No-Code]], [[Rapid Development]] oraz wiedzę z książek takich jak [[Wiedza/Ksiazki/Getting Real]], [[Will it Fly]] czy [[Wiedza/Ksiazki/MAKE]].
+
+Zatem sięgam po najlepsze na rynku rozwiązania i koncepcje, które pozwalają mi szybko walidować moje założenia. Zwracam uwagę na realny feedback a nie moje wyobrażenia i przywiązanie emocjonalne do pomysłu (więcej w [[Wiedza/Ksiazki/The Mom Test]]).
+
diff --git a/content/Wiedza/Modele Mentalne/Cheerleader effect.md b/content/Wiedza/Modele Mentalne/Cheerleader effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Cheerleader effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Choice-supportive bias.md b/content/Wiedza/Modele Mentalne/Choice-supportive bias.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Choice-supportive bias.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Circle of Competence.md b/content/Wiedza/Modele Mentalne/Circle of Competence.md
new file mode 100644
index 000000000..31724d5af
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Circle of Competence.md
@@ -0,0 +1,15 @@
+## O co chodzi?
+Każdy z nas posiada pewien zestaw umiejętności oraz wiedzy. Wiedza o tym, gdzie ten "obszar komptencji" ma swoje granice, pozwala lepiej go wykorzystywać oraz sięgać po pomoc innych wtedy, gdy to potrzebne.
+
+Ta koncepcja przez lata była wymieniana przez [[Wiedza/Ludzie/Warren Buffet]].
+
+
+## Jak stosuję [[Wiedza/Modele Mentalne/Circle of Competence]]?
+Mój obszar komptencji jest szeroki ale nadal logicznie ograniczony. Posiadanie świadomości na jego temat pozwala mi budować [[Fundamenty/Proces]] oraz [[Fundamenty/Proces#System zdobywania wiedzy]]. Po prostu łatwiej jest mi podejmować decyzję o tym, co wymaga mojej uwagi a co nie.
+
+Świadomość mojego "kręgu komptencji" jest też powodem tego, że buduję wokół siebie sieć źródeł oraz osób, do których mogę się zwrócić w razie potrzeby. Dzięki temu potrafię skutecznie odnaleźć się zarówno wewnątrz jak i poza moim kręgiem.
+
+Rozwijam też umiejętności oraz procesy, które pozwalają mi szybko poznawać nowe tematy i tym samym mogę dołączać je do mojego kręgu, gdy tylko tego potrzebuję.
+
+## Źródła
+https://fs.blog/circle-of-competence/
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Clustering illusion.md b/content/Wiedza/Modele Mentalne/Clustering illusion.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Clustering illusion.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Confabulation.md b/content/Wiedza/Modele Mentalne/Confabulation.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Confabulation.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Confirmation bias.md b/content/Wiedza/Modele Mentalne/Confirmation bias.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Confirmation bias.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Congruence bias.md b/content/Wiedza/Modele Mentalne/Congruence bias.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Congruence bias.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Conjunction fallacy.md b/content/Wiedza/Modele Mentalne/Conjunction fallacy.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Conjunction fallacy.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Conservatism.md b/content/Wiedza/Modele Mentalne/Conservatism.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Conservatism.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Constrast effect.md b/content/Wiedza/Modele Mentalne/Constrast effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Constrast effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Context effect.md b/content/Wiedza/Modele Mentalne/Context effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Context effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Continued inflence effect.md b/content/Wiedza/Modele Mentalne/Continued inflence effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Continued inflence effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Craftsman Mindset.md b/content/Wiedza/Modele Mentalne/Craftsman Mindset.md
new file mode 100644
index 000000000..c0a8a3e31
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Craftsman Mindset.md
@@ -0,0 +1 @@
+[[Wiedza/Ksiazki/So Good They Cant Ignore You]]
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Cross-race effect.md b/content/Wiedza/Modele Mentalne/Cross-race effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Cross-race effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Cryptomnesia.md b/content/Wiedza/Modele Mentalne/Cryptomnesia.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Cryptomnesia.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Cue-dependent forgetting.md b/content/Wiedza/Modele Mentalne/Cue-dependent forgetting.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Cue-dependent forgetting.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Curse of knowledge.md b/content/Wiedza/Modele Mentalne/Curse of knowledge.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Curse of knowledge.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Declinism.md b/content/Wiedza/Modele Mentalne/Declinism.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Declinism.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Decoy effect.md b/content/Wiedza/Modele Mentalne/Decoy effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Decoy effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Defense attribution.md b/content/Wiedza/Modele Mentalne/Defense attribution.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Defense attribution.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Delmore effect.md b/content/Wiedza/Modele Mentalne/Delmore effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Delmore effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Denomination effect.md b/content/Wiedza/Modele Mentalne/Denomination effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Denomination effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Disposition effect.md b/content/Wiedza/Modele Mentalne/Disposition effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Disposition effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Distinction bias.md b/content/Wiedza/Modele Mentalne/Distinction bias.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Distinction bias.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Dunning-Kurger effect.md b/content/Wiedza/Modele Mentalne/Dunning-Kurger effect.md
new file mode 100644
index 000000000..e53ed5dba
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Dunning-Kurger effect.md
@@ -0,0 +1,10 @@
+## O co chodzi?
+O iluzję kompetencji wynikają z niewystarczającej wiedzy oraz doświadczenia, w wybranym temacie. Inaczej mówiąc, osoby początkujące uważają się za bardziej kompetentne niż faktycznie są.
+
+Jest to w pewnym sensie odwrócenie [[Imposter Syndrom]].
+
+## Jak stosuję [[Wiedza/Modele Mentalne/Dunning-Kurger effect]]
+Mam przekonanie, że nie ma tematu w którym wiem wystarczająco wiele aby nazwać się (lub aby ktokolwiek mnie nazywał) ekspertem.
+
+**Bardzo utożsamiam się ze słowami Isaaca Newtona:**
+> I do not know what I may appear to the world, but to myself I seem to have been only like a boy playing on the seashore, and diverting myself in now and then finding a smoother pebble or a prettier shell than ordinary, whilst the great ocean of truth lay all undiscovered before me. ~ Isaac Newton
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Duration neglect.md b/content/Wiedza/Modele Mentalne/Duration neglect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Duration neglect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Effort justification.md b/content/Wiedza/Modele Mentalne/Effort justification.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Effort justification.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Egocentric bias.md b/content/Wiedza/Modele Mentalne/Egocentric bias.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Egocentric bias.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Empathy gap.md b/content/Wiedza/Modele Mentalne/Empathy gap.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Empathy gap.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Endowment effect.md b/content/Wiedza/Modele Mentalne/Endowment effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Endowment effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Ergodicity.md b/content/Wiedza/Modele Mentalne/Ergodicity.md
new file mode 100644
index 000000000..b7e97ec67
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Ergodicity.md
@@ -0,0 +1,23 @@
+## O co chodzi?
+Ergodyczność to cecha procesów w przypadku których wystarczy pojedyncza, losowa i wystarczająco duża próba, aby przewidzieć efekt końcowy całości. Jednocześnie **rezultat takiego procesu wykonywanego przez jednostkę jest taki sam jak w przypadku gdyby proces realizowany był przez grupę.**
+
+Dodatkowo w przypadku systemu ergodycznego, wraz z upływem czasu, maleje rola losowości i szczęścia.
+
+**Przykład:**
+- Jedna osoba podrzucająca monetę 100 razy, wygeneruje ten sam wynik co 100 osób, podrzucających monetę jeden raz. Jest to przykład procesu ergodycznego.
+- W przypadku systemu nie-ergodycznego, dla pojedynczej osoby szansa na osiągnięcie tego samego efektu co grupa, zmniejsza się w czasie. Przykładem może być gra w rosyjską ruletkę lub gra w kasynie.
+
+[[Wiedza/Modele Mentalne/Ergodicity]] dowiedziałem się z książki [[Wiedza/Ksiazki/Skin in the Game]] napisanej przez [[Nassim Nicholas Taleb]], który uważa ją za najpotężniejszy model mentalny o jakim kiedykolwiek słyszał.
+
+Wyjaśnienie wideo tej koncepcji:
+
+
+
+## Jak wykorzystuję [[Wiedza/Modele Mentalne/Ergodicity]]
+[[Wiedza/Modele Mentalne/Ergodicity]] wykorzystuję przy projektowaniu mojego [[Fundamenty/Proces]]u.
+
+**Przykłady:**
+- unikam podejmowania skrajnego ryzyka
+- unikam działań krótkoterminowych [[Wiedza/Ksiazki/The Infinite Game]]
+- angażuje się w aktywności przynoszące efekt długoterminowo (treningi, czytanie książek, medytacja) wykorzystując "dyscyplinę która daje wolność" [[Wiedza/Ludzie/Jocko Willink]]
+- projektuję aktywności tak by nawet nie zrealizowanie głównego celu, nadal przyniosło mi wartość (np. jeśli [[Projekty/EasyCart]] nie zostanie przyjęte przez rynek, nadal będę miał świetne narzędzie do sprzedaży własnych produktów)
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Escalation of commitment.md b/content/Wiedza/Modele Mentalne/Escalation of commitment.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Escalation of commitment.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Essentialism.md b/content/Wiedza/Modele Mentalne/Essentialism.md
new file mode 100644
index 000000000..84936786b
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Essentialism.md
@@ -0,0 +1,20 @@
+ ## O co chodzi?
+
+ Esencjalizm to model mentalny omawiany w książce [[Wiedza/Ksiazki/Essentialism: The Disciplined Pursuit of Less]]. Polega na usprawnieniu procesu podejmowania decyzji poprzez [[Eliminacja]] zbędnych elementów oraz [[Upraszczanie]].
+
+Koncepcja esencjalizmu stanowi jeden z elementów fundamentu mojego [[Fundamenty/Proces]] oraz wielokrotnie była przytaczana przez osoby takie jak [[Wiedza/Ludzie/Bruce Lee]] czy [[Wiedza/Ludzie/Dan Millman]].
+
+Esencjalizm opiera się o:
+- Esencja - co jest Twoim fundamentem?
+- Eksploracja - jak odkrywasz to, co najważniejsze?
+- [[Eliminacja]] - jak rezygnujesz z tego co nieistotne?
+- Egzekucja - jak sprawisz by to co najważniejsze, było jak najprostsze?
+
+## Jak wykorzystuję esencjalizm
+Traktuję ten temat jako priorytet poprzez aktywne usuwanie różnych elementów z mojego życia. To co służy mi dziś, jutro może stać się zbędnym obciążeniem (i odwrotnie).
+
+W pratyce opiera się to o nieustanne kwestionowanie wszystkiego, co mnie otacza a w szczególności rzeczy, które dotyczą bezpośrednio mnie.
+
+- usuwam zbędne [[Optymalizacja/Automatyzacja/Narzędzia]] ze swojego codziennego wykorzystania
+- pozbywam się niewykorzystywanego [[Optymalizacja/Sprzęt/Sprzęt]]u
+- ograniczam myślenie do niezbędnego minimum ([[Wiedza/Przemyślenia/Niemyślenie]])
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Expectation bias.md b/content/Wiedza/Modele Mentalne/Expectation bias.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Expectation bias.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Experimenters bias.md b/content/Wiedza/Modele Mentalne/Experimenters bias.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Experimenters bias.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Extrinsic incentive error.md b/content/Wiedza/Modele Mentalne/Extrinsic incentive error.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Extrinsic incentive error.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Fading Affect.md b/content/Wiedza/Modele Mentalne/Fading Affect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Fading Affect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/False consesus effect.md b/content/Wiedza/Modele Mentalne/False consesus effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/False consesus effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/False memory.md b/content/Wiedza/Modele Mentalne/False memory.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/False memory.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Falsification.md b/content/Wiedza/Modele Mentalne/Falsification.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Falsification.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Farming effect.md b/content/Wiedza/Modele Mentalne/Farming effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Farming effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/First Principles.md b/content/Wiedza/Modele Mentalne/First Principles.md
new file mode 100644
index 000000000..fbecc2c57
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/First Principles.md
@@ -0,0 +1,2 @@
+## O co chodzi?
+O myślenie w kategoriach fundamentalnych prawd składających się na wybrane zagadnienie i budowanie rozwiązań w oparciu o nie.
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Focusing effect.md b/content/Wiedza/Modele Mentalne/Focusing effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Focusing effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Forer effect.md b/content/Wiedza/Modele Mentalne/Forer effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Forer effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Frequency illusion.md b/content/Wiedza/Modele Mentalne/Frequency illusion.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Frequency illusion.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Functional fixedness.md b/content/Wiedza/Modele Mentalne/Functional fixedness.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Functional fixedness.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Fundamental attribution error.md b/content/Wiedza/Modele Mentalne/Fundamental attribution error.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Fundamental attribution error.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Generation effect.md b/content/Wiedza/Modele Mentalne/Generation effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Generation effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Genius of The AND.md b/content/Wiedza/Modele Mentalne/Genius of The AND.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/content/Wiedza/Modele Mentalne/Google effect.md b/content/Wiedza/Modele Mentalne/Google effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Google effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Group attribution error.md b/content/Wiedza/Modele Mentalne/Group attribution error.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Group attribution error.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Halo effect.md b/content/Wiedza/Modele Mentalne/Halo effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Halo effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Hard-easy effect.md b/content/Wiedza/Modele Mentalne/Hard-easy effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Hard-easy effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Hedgehog Concept.md b/content/Wiedza/Modele Mentalne/Hedgehog Concept.md
new file mode 100644
index 000000000..345214bd2
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Hedgehog Concept.md
@@ -0,0 +1,2 @@
+[[Wiedza/Ludzie/Jim Collins]]
+[[Wiedza/Ksiazki/Good to Great]]
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Hindsight bias.md b/content/Wiedza/Modele Mentalne/Hindsight bias.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Hindsight bias.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Hot-hand fallacy.md b/content/Wiedza/Modele Mentalne/Hot-hand fallacy.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Hot-hand fallacy.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Humor effect.md b/content/Wiedza/Modele Mentalne/Humor effect.md
new file mode 100644
index 000000000..dd3434e7b
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Humor effect.md
@@ -0,0 +1,8 @@
+## O co chodzi?
+Lepiej zapamiętujemy rzeczy, które postrzegamy jako zabawne / absurdalne.
+
+## Jak wykorzystuję [[Wiedza/Modele Mentalne/Humor effect]]?
+Po pierwsze jedną z moich [[Fundamenty/Wartości]] jest entuzjazm, który pomaga mi pokonywać przeciwności oraz nieustannie działać poza swoją strefą komfortu.
+
+W procesie zapamiętywania powiązuję nowe fakty z istniejącymi, które dobrze znam i dodaję do nich elementy humorystyczne, np. cytat z lubianego przeze mnie filmu lub cechy które mnie bawią.
+
diff --git a/content/Wiedza/Modele Mentalne/Hyperbolic discounting.md b/content/Wiedza/Modele Mentalne/Hyperbolic discounting.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Hyperbolic discounting.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/IKEA effect.md b/content/Wiedza/Modele Mentalne/IKEA effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/IKEA effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Identifable victim effect.md b/content/Wiedza/Modele Mentalne/Identifable victim effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Identifable victim effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Illusion of asymmetric insight.md b/content/Wiedza/Modele Mentalne/Illusion of asymmetric insight.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Illusion of asymmetric insight.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Illusion of control.md b/content/Wiedza/Modele Mentalne/Illusion of control.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Illusion of control.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Illusion of external agency.md b/content/Wiedza/Modele Mentalne/Illusion of external agency.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Illusion of external agency.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Illusion of transparency.md b/content/Wiedza/Modele Mentalne/Illusion of transparency.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Illusion of transparency.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Illusion of validity.md b/content/Wiedza/Modele Mentalne/Illusion of validity.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Illusion of validity.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Illusory correlation.md b/content/Wiedza/Modele Mentalne/Illusory correlation.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Illusory correlation.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Illusory superiority.md b/content/Wiedza/Modele Mentalne/Illusory superiority.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Illusory superiority.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Illusory truth effect.md b/content/Wiedza/Modele Mentalne/Illusory truth effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Illusory truth effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Impact.md b/content/Wiedza/Modele Mentalne/Impact.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Impact.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Implicit associations.md b/content/Wiedza/Modele Mentalne/Implicit associations.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Implicit associations.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Implicit stereotypes.md b/content/Wiedza/Modele Mentalne/Implicit stereotypes.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Implicit stereotypes.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Imposter Syndrome.md b/content/Wiedza/Modele Mentalne/Imposter Syndrome.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Imposter Syndrome.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/In-group bias.md b/content/Wiedza/Modele Mentalne/In-group bias.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/In-group bias.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Information bias.md b/content/Wiedza/Modele Mentalne/Information bias.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Information bias.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Insentivity to sample size.md b/content/Wiedza/Modele Mentalne/Insentivity to sample size.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Insentivity to sample size.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Inversion.md b/content/Wiedza/Modele Mentalne/Inversion.md
new file mode 100644
index 000000000..a8ecaf347
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Inversion.md
@@ -0,0 +1,24 @@
+# [[Wiedza/Modele Mentalne/Inversion]]
+## O co chodzi?
+O myślenie odwrotne.
+
+Za każdym razem gdy podejmujesz decyzję czy rozwiązujesz problem, spróbuj odwracać swoje myślenie na różne sposoby.
+
+- zamiast zastanawiać się co zrobić, pomyśl co możesz przestać robić? (dowiesz się jak optymalizować)
+- zamiast pomagać zastanów się jak możesz zaszkodzić (odkryjesz najbardziej wymagające punkty)
+- zamiast budować, zastanów się jak możesz zniszczyć (odkryjesz słabe punkty)
+- zastanów się co się stanie gdy podejmiesz odwrotną decyzję (lub jej nie podejmiesz)
+
+[[Wiedza/Modele Mentalne/Inversion]] to proste i poteżne narzędzię, które pozwala Ci odkrywać rzeczy o których możesz nie mieć pojęcia, ponieważ dzięki zmianie Twoich założeń, zmienia się również [[Wiedza/Słownik/Perspektywa]]. To może albo doprowadzić Cię do lepszych rozwiązązań lub odkryć słabe punkty Twojego rozwiązania.
+
+[[Wiedza/Ludzie/Warren Buffet]] oraz [[Wiedza/Ludzie/Charlie Munger]] uważają, że inwersja jest dla nich jednym z ważniejszych (o ile nie najważniejszym z modeli mentalnych).
+
+## Jak stosuję inwersję?
+Sięgam po nią dosłownie na każdym kroku. Wyrobiłem w sobie nawyk odwracania myśli oraz emocji. Obecnie proces odwracania dzieje się u mnie niemal natychmiastowo i pozwala szybko ocenić sytuację oraz podejmować lepsze decyzje.
+
+W praktyce gdy staję przed problemem, który wydaje się być trudny lub nawet niemożliwy do rozwiązania, zdarza mi się mówić: "Załóżmy na chwilę, że wszystko co wiem o X nie jest prawdą. I co teraz?"
+
+To sprawia że zmienia się moja [[Wiedza/Słownik/Perspektywa]] i zwykle zaczynam zauważać rzeczy o na które wcześniej nie zwracałem uwagi.
+
+## Źródła:
+- https://www.anup.io/p/invert-always-invert
diff --git a/content/Wiedza/Modele Mentalne/Irration escalation.md b/content/Wiedza/Modele Mentalne/Irration escalation.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Irration escalation.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Just-world hypothesis.md b/content/Wiedza/Modele Mentalne/Just-world hypothesis.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Just-world hypothesis.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Lake Wobegone effect.md b/content/Wiedza/Modele Mentalne/Lake Wobegone effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Lake Wobegone effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Law of Triviality.md b/content/Wiedza/Modele Mentalne/Law of Triviality.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Law of Triviality.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Less-is-better effect.md b/content/Wiedza/Modele Mentalne/Less-is-better effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Less-is-better effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Leveling and sharpening .md b/content/Wiedza/Modele Mentalne/Leveling and sharpening .md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Leveling and sharpening .md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Leverage.md b/content/Wiedza/Modele Mentalne/Leverage.md
new file mode 100644
index 000000000..4bcc7bc26
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Leverage.md
@@ -0,0 +1,19 @@
+## O co chodzi?
+Mechanizm dźwigni (eng. [[Wiedza/Modele Mentalne/Leverage]]) pozawala na wygenerowanie efektu nierproporcjonalnie dużego do włożonej siły.
+
+> Dajcie mi punkt podparcia a poruszę ziemię ~ Archimedes
+
+Obecnie mechanizm ten promowany jest przez [[Wiedza/Ludzie/Naval Ravikant]] w kontekście biznesowym oraz ogólnej efektywności podejmowanych przez nas działań
+
+## Jak wykorzystuję [[Wiedza/Modele Mentalne/Leverage]]?
+Opieram o ten mechanizm niemal wszystkie podejmowane przeze mnie działania w ramach mojego [[Fundamenty/Proces]]u. Nadal nieustannie się go uczę i eksploruję.
+
+- niemal całkowicie eliminuję spotkania online oraz spotkania fizyczne
+- niemal nigdy nie rozmawiam przez telefon
+- projektuję swoje źródła przychodu w taki sposób, aby raz włożony wysiłek zwracał się x1000 razy
+- wkładam większy wysiłek w wykonanie zadania, realizując je w taki sposób, aby jego ponowne wykonanie zajęło mi x10 mniej czasu. Głównie stosuję tutaj [[Optymalizacja/Automatyzacja/Automatyzacja]]
+- regularnie zmieniam stack [[Optymalizacja/Narzędzia/Narzędzia]] z jakich korzystam. Niemal nieustannie pojawiają się nowe rozwiązania, które wnoszą więcej wartości lub pozwalają optymalizować procesy.
+
+Aktywności takie jak spotkania czy rozmowy zabierają nieproporconalnie dużo czasu do wartości jaką dają. Wyjątek stanowią tutaj spotkania z ludźmi których lubię aczkolwiek też zachowuję tutaj zdrowy balans.
+
+Mechanizm dźwigni świetnie łączy się z efektem procentu składanego ([[Wiedza/Ksiazki/The Compound Effect]]). Bardzo istotną rolę w wykorzystaniu obu koncepcji odgrywa [[Wiedza/Przemyślenia/Dyscyplina]] bardzo mocno promowana przez [[Wiedza/Ludzie/David Goggins]] w książce [[Wiedza/Ksiazki/Cant Hurt Me]] oraz [[Wiedza/Ludzie/Jocko Willink]] w książce [[Wiedza/Ksiazki/Extreme Ownership]]
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Levers of processing effect.md b/content/Wiedza/Modele Mentalne/Levers of processing effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Levers of processing effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/List-length effect.md b/content/Wiedza/Modele Mentalne/List-length effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/List-length effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Loss aversion.md b/content/Wiedza/Modele Mentalne/Loss aversion.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Loss aversion.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Magic number 7+-2.md b/content/Wiedza/Modele Mentalne/Magic number 7+-2.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Magic number 7+-2.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Masked man fallacy.md b/content/Wiedza/Modele Mentalne/Masked man fallacy.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Masked man fallacy.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Memory inhibition.md b/content/Wiedza/Modele Mentalne/Memory inhibition.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Memory inhibition.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Mental accounting.md b/content/Wiedza/Modele Mentalne/Mental accounting.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Mental accounting.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Merge exposure effect.md b/content/Wiedza/Modele Mentalne/Merge exposure effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Merge exposure effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Misattribution of memory.md b/content/Wiedza/Modele Mentalne/Misattribution of memory.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Misattribution of memory.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Misinformation effect.md b/content/Wiedza/Modele Mentalne/Misinformation effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Misinformation effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Modality effect.md b/content/Wiedza/Modele Mentalne/Modality effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Modality effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Modele mentalne.md b/content/Wiedza/Modele Mentalne/Modele mentalne.md
new file mode 100644
index 000000000..ceb9ca8af
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Modele mentalne.md
@@ -0,0 +1,213 @@
+[[Modele mentalne]] usprawniają mój proces myślowy, szczególnie w kontekście podejmowania decyzji oraz rozwiązywania problemów.
+
+
+## Źródła
+- https://untools.co/ishikawa-diagram
+-
+
+## Modele mentalne
+- [[Wiedza/Modele Mentalne/Inversion]]
+- [[Wiedza/Modele Mentalne/Occams Razor]]
+- [[Wiedza/Modele Mentalne/First Principles]]
+- [[Wiedza/Modele Mentalne/Second Order Thinking]]
+- [[Wiedza/Modele Mentalne/20 mile march]]
+- [[Wiedza/Modele Mentalne/Bullets and Cannonballs]]
+- [[Wiedza/Modele Mentalne/Leverage]]
+- [[Wiedza/Modele Mentalne/Craftsman Mindset]]
+- [[Wiedza/Modele Mentalne/Circle of Competence]]
+- [[Wiedza/Modele Mentalne/Halo effect]]
+- [[Wiedza/Modele Mentalne/Hedgehog Concept]]
+- [[Wiedza/Modele Mentalne/Ergodicity]]
+- [[Wiedza/Modele Mentalne/Hindsight bias]]
+- [[Wiedza/Modele Mentalne/Survivorship bias]]
+- [[Wiedza/Modele Mentalne/Confirmation bias]]
+- [[Wiedza/Modele Mentalne/Falsification]]
+- [[Wiedza/Modele Mentalne/The Map Is Not the Territory]]
+- [[Wiedza/Modele Mentalne/Via Negativa]]
+- [[Wiedza/Modele Mentalne/Fading Affect]]
+- [[Wiedza/Modele Mentalne/Negativity]]
+- [[Wiedza/Modele Mentalne/Prejudice]]
+- [[Wiedza/Modele Mentalne/Stereotypical bias]]
+- [[Wiedza/Modele Mentalne/Implicit stereotypes]]
+- [[Wiedza/Modele Mentalne/Implicit associations]]
+- [[Wiedza/Modele Mentalne/Spacing effect]]
+- [[Wiedza/Modele Mentalne/Suggestibility]]
+- [[Wiedza/Modele Mentalne/False memory]]
+- [[Wiedza/Modele Mentalne/Cryptomnesia]]
+- [[Wiedza/Modele Mentalne/Source confusion]]
+- [[Wiedza/Modele Mentalne/Misattribution of memory]]
+- [[Wiedza/Modele Mentalne/Less-is-better effect]]
+- [[Wiedza/Modele Mentalne/Conjunction fallacy]]
+- [[Wiedza/Modele Mentalne/Delmore effect]]
+- [[Wiedza/Modele Mentalne/Law of Triviality]]
+- [[Wiedza/Modele Mentalne/Bike-shedding effect]]
+- [[Wiedza/Modele Mentalne/Rhyme as reason effect]]
+- [[Wiedza/Modele Mentalne/Belief bias]]
+- [[Wiedza/Modele Mentalne/Information bias]]
+- [[Wiedza/Modele Mentalne/Ambiguity bias]]
+- [[Wiedza/Modele Mentalne/Status quo bias]]
+- [[ Social comparsion bias]]
+- [[Wiedza/Modele Mentalne/Decoy effect]]
+- [[Wiedza/Modele Mentalne/Reactance]]
+- [[Wiedza/Modele Mentalne/Reverse psychology]]
+- [[Wiedza/Modele Mentalne/System justification]]
+- [[Wiedza/Modele Mentalne/Backfire effect]]
+- [[Wiedza/Modele Mentalne/Endowment effect]]
+- [[Wiedza/Modele Mentalne/Processing difficulity effect]]
+- [[Wiedza/Modele Mentalne/Pseudocertainty effect]]
+- [[Wiedza/Modele Mentalne/Disposition effect]]
+- [[Wiedza/Modele Mentalne/Zero-risk bias]]
+- [[Wiedza/Modele Mentalne/Unit bias]]
+- [[Wiedza/Modele Mentalne/IKEA effect]]
+- [[Wiedza/Modele Mentalne/Loss aversion]]
+- [[Wiedza/Modele Mentalne/Generation effect]]
+- [[Wiedza/Modele Mentalne/Escalation of commitment]]
+- [[Wiedza/Modele Mentalne/Irration escalation]]
+- [[Wiedza/Modele Mentalne/Sunc cost fallacy]]
+- [[Wiedza/Modele Mentalne/Identifable victim effect]]
+- [[Wiedza/Modele Mentalne/Appeal to Novelty]]
+- [[Wiedza/Modele Mentalne/Hyperbolic discounting]]
+- [[Wiedza/Modele Mentalne/Peltzman effect]]
+- [[Wiedza/Modele Mentalne/Risk compensation]]
+- [[Wiedza/Modele Mentalne/Effort justification]]
+- [[Wiedza/Modele Mentalne/Trait ascription bias]]
+- [[Wiedza/Modele Mentalne/Defense attribution]]
+- [[Wiedza/Modele Mentalne/Fundamental attribution error]]
+- [[Wiedza/Modele Mentalne/Illusory superiority]]
+- [[Wiedza/Modele Mentalne/Illusion of control]]
+- [[Wiedza/Modele Mentalne/Actor-observer bias]]
+- [[Wiedza/Modele Mentalne/Self-serving bias]]
+- [[Wiedza/Modele Mentalne/Barnum effect]]
+- [[Wiedza/Modele Mentalne/Forer effect]]
+- [[Wiedza/Modele Mentalne/Optimism]]
+- [[Wiedza/Modele Mentalne/Egocentric bias]]
+- [[Wiedza/Modele Mentalne/Dunning-Kurger effect]]
+- [[Wiedza/Modele Mentalne/Lake Wobegone effect]]
+- [[Wiedza/Modele Mentalne/Hard-easy effect]]
+- [[Wiedza/Modele Mentalne/False consesus effect]]
+- [[Wiedza/Modele Mentalne/Third-person effect]]
+- [[Wiedza/Modele Mentalne/Social desirability bias]]
+- [[Wiedza/Modele Mentalne/Overcofidence effect]]
+- [[Wiedza/Modele Mentalne/Self-consistency bias]]
+- [[Wiedza/Modele Mentalne/Restraint bias]]
+- [[Wiedza/Modele Mentalne/Projection bias]]
+- [[Wiedza/Modele Mentalne/Pro-innovation bias]]
+- [[Wiedza/Modele Mentalne/Time-saving bias]]
+- [[Wiedza/Modele Mentalne/Planning fallacy]]
+- [[Wiedza/Modele Mentalne/Pessimism]]
+- [[Wiedza/Modele Mentalne/Impact]]
+- [[Wiedza/Modele Mentalne/Declinism]]
+- [[Wiedza/Modele Mentalne/Moral luck]]
+- [[Wiedza/Modele Mentalne/Outcome bias]]
+- [[Wiedza/Modele Mentalne/Hindsight bias]]
+- [[Wiedza/Modele Mentalne/Rosy retrospection]]
+- [[Wiedza/Modele Mentalne/Telescopint effect]]
+- [[Wiedza/Modele Mentalne/Illusion of asymmetric insight]]
+- [[Wiedza/Modele Mentalne/Illusion of external agency]]
+- [[Wiedza/Modele Mentalne/Extrinsic incentive error]]
+- [[Wiedza/Modele Mentalne/Spotlight effect]]
+- [[Wiedza/Modele Mentalne/Curse of knowledge]]
+- [[Wiedza/Modele Mentalne/Illusion of transparency]]
+- [[Wiedza/Modele Mentalne/Magic number 7+-2]]
+- [[Wiedza/Modele Mentalne/Denomination effect]]
+- [[Wiedza/Modele Mentalne/Subaddivity effect]]
+- [[Wiedza/Modele Mentalne/Survivorship bias]]
+- [[Wiedza/Modele Mentalne/Zero sum bias]]
+- [[Wiedza/Modele Mentalne/Murphys Law]]
+- [[Wiedza/Modele Mentalne/Normalcy bias]]
+- [[Wiedza/Modele Mentalne/Appeal to probability fallacy]]
+- [[Wiedza/Modele Mentalne/Mental accounting]]
+- [[Wiedza/Modele Mentalne/Well-traveled road effect]]
+- [[Wiedza/Modele Mentalne/Reactive devaluation]]
+- [[Wiedza/Modele Mentalne/Not invented here]]
+- [[Wiedza/Modele Mentalne/Positivity effect]]
+- [[Wiedza/Modele Mentalne/Cheerleader effect]]
+- [[Wiedza/Modele Mentalne/Halo effect]]
+- [[Wiedza/Modele Mentalne/In-group bias]]
+- [[Wiedza/Modele Mentalne/Cross-race effect]]
+- [[Wiedza/Modele Mentalne/Out-group-homogeneity bias]]
+- [[Wiedza/Modele Mentalne/Placebo effect]]
+- [[Wiedza/Modele Mentalne/Bandwagon effect]]
+- [[Wiedza/Modele Mentalne/Automation bias]]
+- [[Wiedza/Modele Mentalne/Authority bias]]
+- [[Wiedza/Modele Mentalne/Argument from fallacy]]
+- [[Wiedza/Modele Mentalne/Just-world hypothesis]]
+- [[Wiedza/Modele Mentalne/Moral credential effect]]
+- [[Wiedza/Modele Mentalne/Functional fixedness]]
+- [[Wiedza/Modele Mentalne/Essentialism]]
+- [[Wiedza/Modele Mentalne/Stereotyping]]
+- [[Wiedza/Modele Mentalne/Ultimate attribution error]]
+- [[Wiedza/Modele Mentalne/Group attribution error]]
+- [[Wiedza/Modele Mentalne/Anthropomorphism]]
+- [[Wiedza/Modele Mentalne/Illusory correlation]]
+- [[Wiedza/Modele Mentalne/Hot-hand fallacy]]
+- [[Wiedza/Modele Mentalne/Recency illusion]]
+- [[Wiedza/Modele Mentalne/Masked man fallacy]]
+- [[Wiedza/Modele Mentalne/Illusion of validity]]
+- [[Wiedza/Modele Mentalne/Anecdotal fallacy]]
+- [[Wiedza/Modele Mentalne/Neglect of probability]]
+- [[Wiedza/Modele Mentalne/Insentivity to sample size]]
+- [[Wiedza/Modele Mentalne/Clustering illusion]]
+- [[Wiedza/Modele Mentalne/Confabulation]]
+- [[Wiedza/Modele Mentalne/Naive realism]]
+- [[Wiedza/Modele Mentalne/Naive cynicism]]
+- [[Wiedza/Modele Mentalne/Bias blind spot]]
+- [[Wiedza/Modele Mentalne/Semmelweis reflex]]
+- [[Wiedza/Modele Mentalne/Continued inflence effect]]
+- [[Wiedza/Modele Mentalne/Subjective validation]]
+- [[Wiedza/Modele Mentalne/Ostrich effect]]
+- [[Wiedza/Modele Mentalne/Expectation bias]]
+- [[Wiedza/Modele Mentalne/Observer effect]]
+- [[Wiedza/Modele Mentalne/Experimenters bias]]
+- [[Wiedza/Modele Mentalne/Observer-expectancy effect]]
+- [[Wiedza/Modele Mentalne/Selective perception]]
+- [[Wiedza/Modele Mentalne/Choice-supportive bias]]
+- [[Wiedza/Modele Mentalne/Post-purchase rationalization]]
+- [[Wiedza/Modele Mentalne/Congruence bias]]
+- [[Wiedza/Modele Mentalne/Confirmation bias]]
+- [[Wiedza/Modele Mentalne/Weber-Fechner law]]
+- [[Wiedza/Modele Mentalne/Money illusion]]
+- [[Wiedza/Modele Mentalne/Farming effect]]
+- [[Wiedza/Modele Mentalne/Focusing effect]]
+- [[Wiedza/Modele Mentalne/Distinction bias]]
+- [[Wiedza/Modele Mentalne/Constrast effect]]
+- [[Wiedza/Modele Mentalne/Conservatism]]
+- [[Wiedza/Modele Mentalne/Anchoring]]
+- [[Wiedza/Modele Mentalne/Negativity bias]]
+- [[Wiedza/Modele Mentalne/Self-relevance effect]]
+- [[Wiedza/Modele Mentalne/Picture superiority effect]]
+- [[Wiedza/Modele Mentalne/Von Restorff effect]]
+- [[Wiedza/Modele Mentalne/Humor effect]]
+- [[Wiedza/Modele Mentalne/Bizarreness effect]]
+- [[Wiedza/Modele Mentalne/Base rate fallacy]]
+- [[Wiedza/Modele Mentalne/Omission bias]]
+- [[Wiedza/Modele Mentalne/Empathy gap]]
+- [[Wiedza/Modele Mentalne/Bader-Meinhof Phenomenon]]
+- [[Wiedza/Modele Mentalne/Frequency illusion]]
+- [[Wiedza/Modele Mentalne/Mood-congruent memory bias]]
+- [[Wiedza/Modele Mentalne/Cue-dependent forgetting]]
+- [[Wiedza/Modele Mentalne/Context effect]]
+- [[Wiedza/Modele Mentalne/Merge exposure effect]]
+- [[Wiedza/Modele Mentalne/Illusory truth effect]]
+- [[Wiedza/Modele Mentalne/Attentional bias]]
+- [[Wiedza/Modele Mentalne/Availability heurisitc]]
+- [[Wiedza/Modele Mentalne/Tip of the tongue effect]]
+- [[Wiedza/Modele Mentalne/Google effect]]
+- [[Wiedza/Modele Mentalne/Next in line effect]]
+- [[Wiedza/Modele Mentalne/Testing effect]]
+- [[Wiedza/Modele Mentalne/Absent-mindedness]]
+- [[Wiedza/Modele Mentalne/Levers of processing effect]]
+- [[Wiedza/Modele Mentalne/Suffix effect]]
+- [[Wiedza/Modele Mentalne/Serial position effect]]
+- [[Wiedza/Modele Mentalne/Part-list cueing effect]]
+- [[Wiedza/Modele Mentalne/Recency effect]]
+- [[Wiedza/Modele Mentalne/Primacy effect]]
+- [[Wiedza/Modele Mentalne/Memory inhibition]]
+- [[Wiedza/Modele Mentalne/Modality effect]]
+- [[Wiedza/Modele Mentalne/Duration neglect]]
+- [[Wiedza/Modele Mentalne/List-length effect]]
+- [[Wiedza/Modele Mentalne/Serial recall effect]]
+- [[Wiedza/Modele Mentalne/Misinformation effect]]
+- [[Leveling and sharpening ]]
+- [[Wiedza/Modele Mentalne/Peak-en rule]]
+- [[Wiedza/Modele Mentalne/Imposter Syndrome]]
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Money illusion.md b/content/Wiedza/Modele Mentalne/Money illusion.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Money illusion.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Mood-congruent memory bias.md b/content/Wiedza/Modele Mentalne/Mood-congruent memory bias.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Mood-congruent memory bias.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Moral credential effect.md b/content/Wiedza/Modele Mentalne/Moral credential effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Moral credential effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Moral luck.md b/content/Wiedza/Modele Mentalne/Moral luck.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Moral luck.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Murphys Law.md b/content/Wiedza/Modele Mentalne/Murphys Law.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Murphys Law.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Naive cynicism.md b/content/Wiedza/Modele Mentalne/Naive cynicism.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Naive cynicism.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Naive realism.md b/content/Wiedza/Modele Mentalne/Naive realism.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Naive realism.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Negativity bias.md b/content/Wiedza/Modele Mentalne/Negativity bias.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Negativity bias.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Negativity.md b/content/Wiedza/Modele Mentalne/Negativity.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Negativity.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Neglect of probability.md b/content/Wiedza/Modele Mentalne/Neglect of probability.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Neglect of probability.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Next in line effect.md b/content/Wiedza/Modele Mentalne/Next in line effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Next in line effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Normalcy bias.md b/content/Wiedza/Modele Mentalne/Normalcy bias.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Normalcy bias.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Not invented here.md b/content/Wiedza/Modele Mentalne/Not invented here.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Not invented here.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Observer effect.md b/content/Wiedza/Modele Mentalne/Observer effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Observer effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Observer-expectancy effect.md b/content/Wiedza/Modele Mentalne/Observer-expectancy effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Observer-expectancy effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Occams Razor.md b/content/Wiedza/Modele Mentalne/Occams Razor.md
new file mode 100644
index 000000000..f8ba9976b
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Occams Razor.md
@@ -0,0 +1,12 @@
+## O co chodzi?
+[[Wiedza/Modele Mentalne/Occams Razor]] to model mentalny według którego najprostsze rozwiązania są najlepsze. Nie jest to jednak złota reguła, lecz bardziej "rule of thumb".
+
+Model ten odegrał ogromną rolę m.in. w detektywistyce, ponieważ początkowo przy rozwiązywaniu spraw dotyczących np. morderstwa szukano dowodów wskazujących na sprawcę. Obecnie w przypadku zabójstwa np. żony, pierwszym podejrzanym jest mąż - i odwrotnie.
+
+## Jak wykorzystuję [[Wiedza/Modele Mentalne/Occams Razor]]?
+Jest to kolejny model mentalny po który sięgam niemal na każdym kroku. Świetnie łączy się z umiejętnością zmiany [[Wiedza/Słownik/Perspektywa]].
+
+- Całą swoją działalność opieram o [[Upraszczanie]] i [[Optymalizacja/Optymalizacja]].
+- Tworząc materiały wkładam dużo pracy w to aby końcowy przekaz był możliwie najprostszy (ale nie prostszy niż to wymagane).
+- Rozwiązując problemy często stawiam na rozwiązania które przychodzą mi do głowy jako pierwsze, lub zmieniam [[Wiedza/Słownik/Perspektywa]] w celu zobaczenia prostszych scenariuszy.
+
diff --git a/content/Wiedza/Modele Mentalne/Omission bias.md b/content/Wiedza/Modele Mentalne/Omission bias.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Omission bias.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Optimism.md b/content/Wiedza/Modele Mentalne/Optimism.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Optimism.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Ostrich effect.md b/content/Wiedza/Modele Mentalne/Ostrich effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Ostrich effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Out-group-homogeneity bias.md b/content/Wiedza/Modele Mentalne/Out-group-homogeneity bias.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Out-group-homogeneity bias.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Outcome bias.md b/content/Wiedza/Modele Mentalne/Outcome bias.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Outcome bias.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Overcofidence effect.md b/content/Wiedza/Modele Mentalne/Overcofidence effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Overcofidence effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Part-list cueing effect.md b/content/Wiedza/Modele Mentalne/Part-list cueing effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Part-list cueing effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Peak-en rule.md b/content/Wiedza/Modele Mentalne/Peak-en rule.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Peak-en rule.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Peltzman effect.md b/content/Wiedza/Modele Mentalne/Peltzman effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Peltzman effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Pessimism.md b/content/Wiedza/Modele Mentalne/Pessimism.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Pessimism.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Picture superiority effect.md b/content/Wiedza/Modele Mentalne/Picture superiority effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Picture superiority effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Placebo effect.md b/content/Wiedza/Modele Mentalne/Placebo effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Placebo effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Planning fallacy.md b/content/Wiedza/Modele Mentalne/Planning fallacy.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Planning fallacy.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Positivity effect.md b/content/Wiedza/Modele Mentalne/Positivity effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Positivity effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Post-purchase rationalization.md b/content/Wiedza/Modele Mentalne/Post-purchase rationalization.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Post-purchase rationalization.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Prejudice.md b/content/Wiedza/Modele Mentalne/Prejudice.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Prejudice.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Primacy effect.md b/content/Wiedza/Modele Mentalne/Primacy effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Primacy effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Pro-innovation bias.md b/content/Wiedza/Modele Mentalne/Pro-innovation bias.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Pro-innovation bias.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Processing difficulity effect.md b/content/Wiedza/Modele Mentalne/Processing difficulity effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Processing difficulity effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Projection bias.md b/content/Wiedza/Modele Mentalne/Projection bias.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Projection bias.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Pseudocertainty effect.md b/content/Wiedza/Modele Mentalne/Pseudocertainty effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Pseudocertainty effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Reactance.md b/content/Wiedza/Modele Mentalne/Reactance.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Reactance.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Reactive devaluation.md b/content/Wiedza/Modele Mentalne/Reactive devaluation.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Reactive devaluation.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Recency effect.md b/content/Wiedza/Modele Mentalne/Recency effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Recency effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Recency illusion.md b/content/Wiedza/Modele Mentalne/Recency illusion.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Recency illusion.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Restraint bias.md b/content/Wiedza/Modele Mentalne/Restraint bias.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Restraint bias.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Reverse psychology.md b/content/Wiedza/Modele Mentalne/Reverse psychology.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Reverse psychology.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Rhyme as reason effect.md b/content/Wiedza/Modele Mentalne/Rhyme as reason effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Rhyme as reason effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Risk compensation.md b/content/Wiedza/Modele Mentalne/Risk compensation.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Risk compensation.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Rosy retrospection.md b/content/Wiedza/Modele Mentalne/Rosy retrospection.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Rosy retrospection.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Second Order Thinking.md b/content/Wiedza/Modele Mentalne/Second Order Thinking.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/content/Wiedza/Modele Mentalne/Selective perception.md b/content/Wiedza/Modele Mentalne/Selective perception.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Selective perception.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Self-consistency bias.md b/content/Wiedza/Modele Mentalne/Self-consistency bias.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Self-consistency bias.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Self-relevance effect.md b/content/Wiedza/Modele Mentalne/Self-relevance effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Self-relevance effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Self-serving bias.md b/content/Wiedza/Modele Mentalne/Self-serving bias.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Self-serving bias.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Semmelweis reflex.md b/content/Wiedza/Modele Mentalne/Semmelweis reflex.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Semmelweis reflex.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Serial position effect.md b/content/Wiedza/Modele Mentalne/Serial position effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Serial position effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Serial recall effect.md b/content/Wiedza/Modele Mentalne/Serial recall effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Serial recall effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Social desirability bias.md b/content/Wiedza/Modele Mentalne/Social desirability bias.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Social desirability bias.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Source confusion.md b/content/Wiedza/Modele Mentalne/Source confusion.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Source confusion.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Spacing effect.md b/content/Wiedza/Modele Mentalne/Spacing effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Spacing effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Spotlight effect.md b/content/Wiedza/Modele Mentalne/Spotlight effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Spotlight effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Status quo bias.md b/content/Wiedza/Modele Mentalne/Status quo bias.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Status quo bias.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Stereotypical bias.md b/content/Wiedza/Modele Mentalne/Stereotypical bias.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Stereotypical bias.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Stereotyping.md b/content/Wiedza/Modele Mentalne/Stereotyping.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Stereotyping.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Subaddivity effect.md b/content/Wiedza/Modele Mentalne/Subaddivity effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Subaddivity effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Subjective validation.md b/content/Wiedza/Modele Mentalne/Subjective validation.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Subjective validation.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Suffix effect.md b/content/Wiedza/Modele Mentalne/Suffix effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Suffix effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Suggestibility.md b/content/Wiedza/Modele Mentalne/Suggestibility.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Suggestibility.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Sunc cost fallacy.md b/content/Wiedza/Modele Mentalne/Sunc cost fallacy.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Sunc cost fallacy.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Survivorship bias.md b/content/Wiedza/Modele Mentalne/Survivorship bias.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Survivorship bias.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/System justification.md b/content/Wiedza/Modele Mentalne/System justification.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/System justification.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Telescopint effect.md b/content/Wiedza/Modele Mentalne/Telescopint effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Telescopint effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Testing effect.md b/content/Wiedza/Modele Mentalne/Testing effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Testing effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/The Map Is Not the Territory.md b/content/Wiedza/Modele Mentalne/The Map Is Not the Territory.md
new file mode 100644
index 000000000..ec7f8567d
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/The Map Is Not the Territory.md
@@ -0,0 +1,4 @@
+## O co chodzi?
+[[Wiedza/Modele Mentalne/The Map Is Not the Territory]] to koncepcja mówiąca o tym, że mapa rzeczywistości nie jest rzeczywistością. W sytuacji gdy to co widzisz na mapie nie zgadza się z rzeczywistością, nie warto sugerować się mapą.
+
+## Jak wykorzystuję [[Wiedza/Modele Mentalne/The Map Is Not the Territory]]
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Third-person effect.md b/content/Wiedza/Modele Mentalne/Third-person effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Third-person effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Time-saving bias.md b/content/Wiedza/Modele Mentalne/Time-saving bias.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Time-saving bias.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Tip of the tongue effect.md b/content/Wiedza/Modele Mentalne/Tip of the tongue effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Tip of the tongue effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Trait ascription bias.md b/content/Wiedza/Modele Mentalne/Trait ascription bias.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Trait ascription bias.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Ultimate attribution error.md b/content/Wiedza/Modele Mentalne/Ultimate attribution error.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Ultimate attribution error.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Unit bias.md b/content/Wiedza/Modele Mentalne/Unit bias.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Unit bias.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Via Negativa.md b/content/Wiedza/Modele Mentalne/Via Negativa.md
new file mode 100644
index 000000000..2d73908e0
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Via Negativa.md
@@ -0,0 +1,18 @@
+ ## O co chodzi?
+
+[[Wiedza/Modele Mentalne/Via Negativa]] to proces upraszczania poprzez usuwanie lub unikanie zbędnych elementów.
+
+Według [[Nassim Nicholas Taleb]] w filozofii [[Wiedza/Modele Mentalne/Via Negativa]] to skupianie się na tym, czym coś **nie jest** a w przypadku działania - na tym, czego należy unikać, nie robić lub odejmować.
+
+> It seems that perfection _is_ attained not when _there is nothing more to add_, but when _there is nothing more_ to remove. ~
+
+## Jak wykorzystuję [[Wiedza/Modele Mentalne/Via Negativa]]
+Wykorzystuję tę koncepcję za każdym razem przy optymalizacji [[Fundamenty/Proces]]. Robię to np.:
+- dochodząc do źródeł tematów, które mnie interesują. Zrozumienie prowadzi do [[Upraszczanie]]
+- kwestionując i redefiniując moje, nawet fundamentalne założenia ([[Wiedza/Ksiazki/Think Again]])
+- usuwając rzeczy, które mi już nie służą
+- usuwając narzędzia / aplikacje z których już nie korzystam
+- rezygnując ze źródeł wiedzy, które nie są już (lub aktualnie) dla mnie przydatne
+
+## Źródła
+- https://www.wealest.com/articles/via-negativa
diff --git a/content/Wiedza/Modele Mentalne/Von Restorff effect.md b/content/Wiedza/Modele Mentalne/Von Restorff effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Von Restorff effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Weber-Fechner law.md b/content/Wiedza/Modele Mentalne/Weber-Fechner law.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Weber-Fechner law.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Well-traveled road effect.md b/content/Wiedza/Modele Mentalne/Well-traveled road effect.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Well-traveled road effect.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Zero sum bias.md b/content/Wiedza/Modele Mentalne/Zero sum bias.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Zero sum bias.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Modele Mentalne/Zero-risk bias.md b/content/Wiedza/Modele Mentalne/Zero-risk bias.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Modele Mentalne/Zero-risk bias.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Podcasty/Bruce Lee Podcast.md b/content/Wiedza/Podcasty/Bruce Lee Podcast.md
new file mode 100644
index 000000000..c6fa91514
--- /dev/null
+++ b/content/Wiedza/Podcasty/Bruce Lee Podcast.md
@@ -0,0 +1,47 @@
+Podcast o filozofii [[Wiedza/Ludzie/Bruce Lee]] prowadzony przez jego córkę Shannon Lee. Często wracam do wybranych odcinków. To ponadczasowa wiedza, którą można cały czas na nowo odkrywać i wyciągać kolejne wnioski.
+
+---
+
+## Lekcje
+
+### Be Water, My Friend
+Dostosuj się do sytuacji w najlepszy możliwy sposób. Szczególnie wyrażone całym cytatem:
+
+ > Be Water, My Friend. Empty your mind.
+ > Be formless, shapeless, like water.
+ > You put water into a cup, it becomes the cup.
+ > You put water into a bottle, it becomes the bottle.
+ > You put it into a teapot, it becomes the teapot.
+ > Now water can flow or it can crash.
+ > Be water, my friend.
+
+Jasno widać jak ważne jest oczyszczenie swojego umysłu. O tym samym mówi [[Wiedza/Ludzie/Dan Millman]] i jego "Wyrzucaniu śmieci (z głowy)." Poza tym samo porównanie do wody kojarzy mi się z moją nieustanną zmianą roli i niemal perfekcyjnego dostosowania do zmieniających warunków. Ostatecznie "water can flow, or it can crash" ...
+
+
+### Hack away the unessentials
+W tym wszystkim nie chodzi o codzienne dodawanie, lecz odejmowanie.
+
+Mogłoby się wydawać, że kluczowym elementem rozwoju jest nieustanny wzrost, nieustanne proces osiągania więcej i lepiej. W praktyce sam przekonuję się o tym, że jest totalnie na odwrót!
+
+> An _expert_ is one who _knows more and more_ about less and less until he _knows_ absolutely _everything_ about _nothing_.
+
+---
+
+## Odcinki
+
+### Be Water, my friend
+Podcast o jednej z najważniejszych i zarazem najbardziej rozpoznawalnych lekcji [[Wiedza/Ludzie/Bruce Lee]] dotyczącej umiejętności dostosowania się do otoczenia przy jednoczesnej możliwości utrzymania "flow" lub niszczenia.
+
+https://brucelee.com/podcast-blog/2016/7/20/2-be-water-my-friend
+
+### Hack away the unessentials
+Odcinek o jednym z moich fundamentów, który opisuję w [[Fundamenty/Proces#Rozwój]] - upraszczaniu.
+- "coś jest perfekcyjne nie wtedy gdy już nic nie można dodać, lecz wtedy gdy nic nie można odjąć" ~ Mały Książe
+- "w upraszczaniu nie chodzi o to aby ignorować niektóre elementy, lecz o to aby dochodząc do źródła, świadomie odrzucać te niepotrzebne" ~ ja
+
+https://brucelee.com/podcast-blog/2017/6/28/52-hack-away-the-unessentials
+
+---
+
+## Źródła
+https://brucelee.com/podcast
\ No newline at end of file
diff --git a/content/Wiedza/Podcasty/Huberman Lab.md b/content/Wiedza/Podcasty/Huberman Lab.md
new file mode 100644
index 000000000..48d2b1cf8
--- /dev/null
+++ b/content/Wiedza/Podcasty/Huberman Lab.md
@@ -0,0 +1,19 @@
+[[Wiedza/Podcasty/Huberman Lab]] to podcast Dr [[Wiedza/Ludzie/Andrew Huberman]] w którego odcinkach porusza jeden temat dotyczący codziennego funkcjonowania lub ważnego dla organizmu procesu, dając jednocześnie praktyczne wskazówki, które można łatwo przełożyć na działanie.
+
+Osobiście tę wiedzę opieram niemal cały swój [[Fundamenty/Proces#Fundamenty]] oraz do tego aby utrzymywać odpowiedni poziom skupienia czy niski poziom skupienia.
+
+## Lekcje
+
+### Neuroplastyczność mózgu
+Powszechnie uważa się, że nasza zdolność do szybkiej i trwałej nauki zmniejsza się z wiekiem oraz że jako dorośli ludzie (powyżej 25 lat) nie jesteśmy już w stanie uczyć się tak szybko jak dzieci.
+
+Według Andrew Hubermana jest to tylko po części prawda.
+
+### Kształtowanie nawyków
+[[Wiedza/Ksiazki/Atomic Habits]]
+
+### Cykl okołodobowy
+[[Fundamenty/Proces#Fundamenty]]
+
+### Redukcja stresu
+[[Fundamenty/Proces#Fundamenty]]
diff --git a/content/Wiedza/Podcasty/Lex Fridman Podcast.md b/content/Wiedza/Podcasty/Lex Fridman Podcast.md
new file mode 100644
index 000000000..6c1f37936
--- /dev/null
+++ b/content/Wiedza/Podcasty/Lex Fridman Podcast.md
@@ -0,0 +1 @@
+[[Wiedza/Ludzie/Lex Fridman]] Podcast jest jednym z moich ulubionych głównie ze względu na prowadzącego i jego podejścia do życia z którym bardzo się utożsamiam.
\ No newline at end of file
diff --git a/content/Wiedza/Podcasty/Made You Think.md b/content/Wiedza/Podcasty/Made You Think.md
new file mode 100644
index 000000000..5377b4745
--- /dev/null
+++ b/content/Wiedza/Podcasty/Made You Think.md
@@ -0,0 +1,3 @@
+Made You Think to podcast o ciekawych książkach i przemyśleniach prowadzących na ich temat. Wyróżniają go przede wszystkim bardzo dobrze dobrane tytuły i świetne, głębokie dyskusje dotykające najważniejszych koncepcji poruszonych przez autorów omawianych książek.
+
+https://madeyouthinkpodcast.com
\ No newline at end of file
diff --git a/content/Wiedza/Podcasty/My First Million.md b/content/Wiedza/Podcasty/My First Million.md
new file mode 100644
index 000000000..db27f69e2
--- /dev/null
+++ b/content/Wiedza/Podcasty/My First Million.md
@@ -0,0 +1 @@
+https://podcasts.apple.com/us/podcast/my-first-million/id1469759170
\ No newline at end of file
diff --git a/content/Wiedza/Podcasty/Podcast.md b/content/Wiedza/Podcasty/Podcast.md
new file mode 100644
index 000000000..652e67646
--- /dev/null
+++ b/content/Wiedza/Podcasty/Podcast.md
@@ -0,0 +1,11 @@
+## Podcasty
+Osobiście nie przepadam za podcastami, poza niżej wymienionymi wyjątkami. Znacznie bardziej przemawiają też do mnie podcasty w bardzo zwięzłych formach lub bardzo ściśle określonej tematyce, niż podcasty rozrywkowe lub prowadzone bez wcześniejszego przygotowania.
+
+## Jakich podcastów słucham?
+- [[Wiedza/Podcasty/Huberman Lab]]
+- [[Wiedza/Podcasty/Lex Fridman Podcast]]
+- [[Wiedza/Podcasty/Bruce Lee Podcast]]
+- [[Wiedza/Podcasty/Made You Think]]
+- [[Wiedza/Podcasty/My First Million]]
+- [[Wiedza/Podcasty/TokKast]]
+- [[Wiedza/Podcasty/SyntaxFM]]
\ No newline at end of file
diff --git a/content/Wiedza/Podcasty/SyntaxFM.md b/content/Wiedza/Podcasty/SyntaxFM.md
new file mode 100644
index 000000000..789ec0345
--- /dev/null
+++ b/content/Wiedza/Podcasty/SyntaxFM.md
@@ -0,0 +1 @@
+SyntaxFM to podcast o web developmencie prowadzony przez Wes Bos'a oraz Scotta Tolinskiego.
\ No newline at end of file
diff --git a/content/Wiedza/Podcasty/TokKast.md b/content/Wiedza/Podcasty/TokKast.md
new file mode 100644
index 000000000..6f8403cc8
--- /dev/null
+++ b/content/Wiedza/Podcasty/TokKast.md
@@ -0,0 +1 @@
+ToKast to podcast w całości poświęcony książkom [[Wiedza/Ksiazki/The Beginning of Infinity]] oraz [[Wiedza/Ksiazki/The Fabric of Reality]]. Dość kiepski pod kątem technicznym ale wszystko wynagradza najwyżej klasy merytoryka.
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/JavaScript/Fundamenty/Constructor Functions.md b/content/Wiedza/Programowanie/JavaScript/Fundamenty/Constructor Functions.md
new file mode 100644
index 000000000..ac6fb5f73
--- /dev/null
+++ b/content/Wiedza/Programowanie/JavaScript/Fundamenty/Constructor Functions.md
@@ -0,0 +1,25 @@
+## Definicja
+
+[[Wiedza/Programowanie/JavaScript/Fundamenty/Constructor Functions]] to funkcja zwracająca nowy obiekt, wywołana z pomocą słowa kluczowego **new**. Jej nazwę zapisujemy z wielkiej litery. Rolą constructora jest utworzenie nowej instancji klasy, do której jest przypisany.
+
+> ⚠️ Słowo kluczowe **new** sprawia, że JavaScript tworzy nowy obiekt, przypisuje do niego słowo kluczowe [[this (JavaScript)]] oraz zwraca go z tej funkcji.
+
+**Mówiąc inaczej:**
+Każda klasa posiada constructor. Obiekt utworzony na podstawie tej klasy to tzw. instancja.
+
+```
+const User = function(name) { // Klasa / Constrcutor
+ this.name = name;
+}
+
+const user = new User('Adam'); // Instancja klasy
+```
+
+
+## Constructor vs Factory
+Zarówno constructory jak i factory functions mają na celu tworzenie nowych obiektów.a
+
+Różnica pomiędzy constructorem a [[Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Factory Functions]], polega na sposobie wywołania. Dodatkowo Constructor wymaga słowa kluczowego **new**, zamienia zachowanie [[this (JavaScript)]], niejawnie zmienia zwracaną wartość oraz ustawia prototyp.
+
+## Wyjaśnienie
+
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/JavaScript/Fundamenty/Prototype chain.md b/content/Wiedza/Programowanie/JavaScript/Fundamenty/Prototype chain.md
new file mode 100644
index 000000000..84aec279c
--- /dev/null
+++ b/content/Wiedza/Programowanie/JavaScript/Fundamenty/Prototype chain.md
@@ -0,0 +1,7 @@
+Prototypy umożliwiają tworzenie obiektów, które współdzielą metody w celu oszczędzenia pamięci.
+
+Możliwe jest łączenie ze sobą prototypów w celu dodatkowego zaoszczędzenia pamięci.
+
+Chaining / Inehertitance
+
+🚧
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/JavaScript/JavaScript.md b/content/Wiedza/Programowanie/JavaScript/JavaScript.md
new file mode 100644
index 000000000..8b1378917
--- /dev/null
+++ b/content/Wiedza/Programowanie/JavaScript/JavaScript.md
@@ -0,0 +1 @@
+
diff --git a/content/Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Composition over Inheritance.md b/content/Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Composition over Inheritance.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Composition over Inheritance.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Currying.md b/content/Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Currying.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Currying.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Factory Functions.md b/content/Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Factory Functions.md
new file mode 100644
index 000000000..3584babc5
--- /dev/null
+++ b/content/Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Factory Functions.md
@@ -0,0 +1,6 @@
+## Definicja
+
+[[Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Factory Functions]] to funkcja zwracająca (z założenia) nowy obiekt. Taka funkcja nie jest ani klasą ([[JavaScript Class]]) ani constructorem.
+
+## Wyjaśnienie
+
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Function Composition.md b/content/Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Function Composition.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/content/Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Funktory.md b/content/Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Funktory.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Funktory.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Higher-Order Function.md b/content/Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Higher-Order Function.md
new file mode 100644
index 000000000..2e07a4a70
--- /dev/null
+++ b/content/Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Higher-Order Function.md
@@ -0,0 +1,5 @@
+---
+title: Higher order function
+---
+
+
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Monady.md b/content/Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Monady.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Monady.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Programowanie funkcyjne.md b/content/Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Programowanie funkcyjne.md
new file mode 100644
index 000000000..dfb8848c0
--- /dev/null
+++ b/content/Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Programowanie funkcyjne.md
@@ -0,0 +1,13 @@
+---
+title: Programowanie funkcyjne
+---
+
+- [[Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Higher-Order Function]]
+- [[Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Pure Functions]]
+- [[Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Function Composition]]
+- [[Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Currying]]
+- [[Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Shared State]]
+- [[Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Composition over Inheritance]]
+- [[Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Factory Functions]]
+- [[Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Funktory]]
+- [[Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Monady]]
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Pure Functions.md b/content/Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Pure Functions.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Pure Functions.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Shared State.md b/content/Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Shared State.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Shared State.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/JavaScript/Promise/Async Await.md b/content/Wiedza/Programowanie/JavaScript/Promise/Async Await.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Programowanie/JavaScript/Promise/Async Await.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/JavaScript/Promise/Generatory.md b/content/Wiedza/Programowanie/JavaScript/Promise/Generatory.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Programowanie/JavaScript/Promise/Generatory.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/JavaScript/Promise/Promise API.md b/content/Wiedza/Programowanie/JavaScript/Promise/Promise API.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Programowanie/JavaScript/Promise/Promise API.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/JavaScript/Promise/Promise Chaining.md b/content/Wiedza/Programowanie/JavaScript/Promise/Promise Chaining.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Programowanie/JavaScript/Promise/Promise Chaining.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/JavaScript/Promise/Promise Constructor.md b/content/Wiedza/Programowanie/JavaScript/Promise/Promise Constructor.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Programowanie/JavaScript/Promise/Promise Constructor.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/JavaScript/Promise/Promise.md b/content/Wiedza/Programowanie/JavaScript/Promise/Promise.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Programowanie/JavaScript/Promise/Promise.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/JavaScript/Promise/Pętle Async Await.md b/content/Wiedza/Programowanie/JavaScript/Promise/Pętle Async Await.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Programowanie/JavaScript/Promise/Pętle Async Await.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/JavaScript/Promise/_Promise.md b/content/Wiedza/Programowanie/JavaScript/Promise/_Promise.md
new file mode 100644
index 000000000..e262fc6a5
--- /dev/null
+++ b/content/Wiedza/Programowanie/JavaScript/Promise/_Promise.md
@@ -0,0 +1,11 @@
+---
+title: Promise
+---
+
+- [[Wiedza/Programowanie/JavaScript/Promise/Promise]]
+- [[Wiedza/Programowanie/JavaScript/Promise/Promise Constructor]]
+- [[Wiedza/Programowanie/JavaScript/Promise/Promise Chaining]]
+- [[Wiedza/Programowanie/JavaScript/Promise/Promise API]]
+- [[Wiedza/Programowanie/JavaScript/Promise/Async Await]]
+- [[Wiedza/Programowanie/JavaScript/Promise/Generatory]]
+- [[Wiedza/Programowanie/JavaScript/Promise/Pętle Async Await]]
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/JavaScript/RxJS/RxJS.md b/content/Wiedza/Programowanie/JavaScript/RxJS/RxJS.md
new file mode 100644
index 000000000..30414709c
--- /dev/null
+++ b/content/Wiedza/Programowanie/JavaScript/RxJS/RxJS.md
@@ -0,0 +1,2 @@
+https://www.learnrxjs.io/
+https://rxviz.com/
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/JavaScript/Zakres/Closures.md b/content/Wiedza/Programowanie/JavaScript/Zakres/Closures.md
new file mode 100644
index 000000000..03e8ba2dc
--- /dev/null
+++ b/content/Wiedza/Programowanie/JavaScript/Zakres/Closures.md
@@ -0,0 +1,10 @@
+---
+title: Closures
+---
+
+
+
+**Zobacz również:**
+- [[Execution Stack]]
+- [[Wiedza/Programowanie/JavaScript/Zakres/Lexical Scope]]
+- [[Wiedza/Programowanie/JavaScript/Zakres/Scope]]
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/JavaScript/Zakres/Execution Context.md b/content/Wiedza/Programowanie/JavaScript/Zakres/Execution Context.md
new file mode 100644
index 000000000..a37ad0c9d
--- /dev/null
+++ b/content/Wiedza/Programowanie/JavaScript/Zakres/Execution Context.md
@@ -0,0 +1,10 @@
+To abstrakcyjny koncept środowiska w którym **interpretowany i wykonywany jest kod [[Wiedza/Programowanie/JavaScript/JavaScript]]**. Za każdym razem gdy uruchamiamy kod JS, dzieje się to w [[Wiedza/Programowanie/JavaScript/Zakres/Execution Context]]
+
+Wyróżniamy trzy rodzaje kontekstu wykonania:
+- Globalny - istnieje tylko jeden w programie [[Wiedza/Programowanie/JavaScript/JavaScript]]
+- Funkcyjny - tworzony jest w chwili wykonania funkcji. Każda funkcja posiada swój kontekst wykonania.
+- Eval - kod wykonywany wewnątrz funkcji Eval również posiada swój kontekst.
+
+Konteksty wykonania przechowywane są w tzw. [[Execution Stack]] do którego domyślnie trafia Globalny kontekst a następnie według zasady LIFO (last in, first out), pozostałe konteksty zostają do niego dodawane oraz usuwane.
+
+
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/JavaScript/Zakres/Lexical Scope.md b/content/Wiedza/Programowanie/JavaScript/Zakres/Lexical Scope.md
new file mode 100644
index 000000000..2649891e2
--- /dev/null
+++ b/content/Wiedza/Programowanie/JavaScript/Zakres/Lexical Scope.md
@@ -0,0 +1,5 @@
+---
+title: Lexical Scope
+---
+
+
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/JavaScript/Zakres/Scope.md b/content/Wiedza/Programowanie/JavaScript/Zakres/Scope.md
new file mode 100644
index 000000000..2d1899e01
--- /dev/null
+++ b/content/Wiedza/Programowanie/JavaScript/Zakres/Scope.md
@@ -0,0 +1,17 @@
+---
+title: Scope
+---
+
+
+
+**Zobacz również:**
+- [[Wiedza/Programowanie/JavaScript/Zakres/Lexical Scope]]
+
+Pure Functions
+Function Composition
+Currying
+Shared State
+Composition over Inheritance
+Factory Functions
+Funktory
+Monady
diff --git a/content/Wiedza/Programowanie/JavaScript/Zakres/Zakres.md b/content/Wiedza/Programowanie/JavaScript/Zakres/Zakres.md
new file mode 100644
index 000000000..936f6a725
--- /dev/null
+++ b/content/Wiedza/Programowanie/JavaScript/Zakres/Zakres.md
@@ -0,0 +1,8 @@
+---
+title: Zakres
+---
+
+- [[Wiedza/Programowanie/JavaScript/Zakres/Lexical Scope]]
+- [[Wiedza/Programowanie/JavaScript/Zakres/Scope]]
+- [[Wiedza/Programowanie/JavaScript/Zakres/Execution Context]]
+- [[Wiedza/Programowanie/JavaScript/Zakres/Closures]]
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/JavaScript/_JavaScript.md b/content/Wiedza/Programowanie/JavaScript/_JavaScript.md
new file mode 100644
index 000000000..3c3cdac9c
--- /dev/null
+++ b/content/Wiedza/Programowanie/JavaScript/_JavaScript.md
@@ -0,0 +1,40 @@
+## Zakres w [[Wiedza/Programowanie/JavaScript/JavaScript]]
+Seria filmów o fundamentalnym elemencie [[Wiedza/Programowanie/JavaScript/JavaScript]]'u: Zakresie ([[Wiedza/Programowanie/JavaScript/Zakres/Scope]]).
+
+
+
+### Agenda
+- [[Wiedza/Programowanie/JavaScript/Zakres/Execution Context]]
+- [[Wiedza/Programowanie/JavaScript/Zakres/Scope]]
+- [[Wiedza/Programowanie/JavaScript/Zakres/Lexical Scope]]
+- [[Wiedza/Programowanie/JavaScript/Zakres/Closures]]
+
+## [[Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Programowanie funkcyjne]]
+Seria filmów o programowaniu funkcyjnym w JavaScript
+
+
+
+### Agenda
+- [[Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Higher-Order Function]]
+- [[Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Pure Functions]]
+- [[Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Function Composition]]
+- [[Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Currying]]
+- [[Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Shared State]]
+- [[Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Composition over Inheritance]]
+- [[Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Factory Functions]]
+- [[Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Funktory]]
+- [[Wiedza/Programowanie/JavaScript/Programowanie funkcyjne/Monady]]
+
+## Promise
+Seria filmów o Promise w JavaScript
+
+
+
+### Agenda
+- [[Wiedza/Programowanie/JavaScript/Promise/Promise]]
+- [[Wiedza/Programowanie/JavaScript/Promise/Promise Constructor]]
+- [[Wiedza/Programowanie/JavaScript/Promise/Promise Chaining]]
+- [[Wiedza/Programowanie/JavaScript/Promise/Promise API]]
+- [[Wiedza/Programowanie/JavaScript/Promise/Async Await]]
+- [[Wiedza/Programowanie/JavaScript/Promise/Generatory]]
+- [[Wiedza/Programowanie/JavaScript/Promise/Pętle Async Await]]
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/NestJS/Podstawy.md b/content/Wiedza/Programowanie/NestJS/Podstawy.md
new file mode 100644
index 000000000..2bffd60e0
--- /dev/null
+++ b/content/Wiedza/Programowanie/NestJS/Podstawy.md
@@ -0,0 +1,136 @@
+## Instalacja
+1. Zainstalowanie CLI: `npm i -g @nestjs/cli`
+2. Utworzenie nowego projektu `nest new [nazwa]`
+
+## Struktura projektu
+Podstawową struktury kodu w NestJS są klasy (eng. [[classes]]) oraz dekoratory (eng. [[decorators]]).
+
+## [[Controllers]]
+
+Controllery to klasy, których zadaniem jest obsługa akcji poszczególnych ścieżek ([[routing]]) aplikacji. Przykładowo jeżeli użytkownik wejdzie na adres `https://brain.overment.com` to na pewnym etapie akcja controllera pobierze niezbędne dane i zwróci odpowiedź.
+
+W NestJS controller można powiązać ze ścieżką, wykorzystując parametry przekazane do dekoratora Controllera oraz jego Akcji.
+
+Powiązanie controllera ze ścieżką '/users':
+```
+@Controller('users')
+export class UsersController {}
+```
+
+Powiązanie akcji controllera ze ścieżką /users/:id. Dodatkowo ta akcja przyjmuje również parametr `id`.
+```
+export class UsersController {
+ **@Get('id')**
+ find(@Param('id') id: number) {
+ return `User: ${id}`;
+ }
+}
+```
+
+Akcje kontrolera mogą przyjmować również `request body`.
+```
+export class UsersController {
+ @Post()
+ find(@Body() body) {
+ return `User: ${body.id}`;
+ }
+}
+```
+
+Akcje mogą przyjmować też parametry `query string`
+```
+export class UsersController {
+ @Get()
+ find(@Query() query) {
+ return `User: ${query.id}`;
+ }
+}
+```
+
+Akcje mogą zwracać kod statusu
+```
+export class UsersController {
+ @Post()
+ @HttpCode(HttpStatus.OK)
+ find(@Body() body) {}
+}
+```
+
+### Tworzenie controllerów
+Z pomocą CLI: `nest g co` (lub `nest generate controller`) tworzymy plik controllera i spec.ts.
+- flaga --no-spec umożliwia utworzenie controllera bez pliku spec.ts
+- podając w nazwie katalog, umieścisz go w podkatalogu
+- flaga --dry-run umożliwia przetestowanie polecenia
+
+
+
+## [[Services]]
+Serwisy umożliwiają rozdzielenie logiki naszej aplikacji na mniejsze części, ułatwiając jej organizację.
+
+
+Przykład serwisu:
+```
+@Injectable()
+export class UsersService {}
+```
+
+Dodawanie serwisu np. do controllera odbywa się w konstruktorze:
+```
+@Controller()
+export class UsersController {
+ constructor(private readonly usersService: UsersService)
+ // private declares and initializes field
+}
+```
+
+### Tworzenie serwisów
+Z pomocą CLI `nest g s` (lub `nest generate service`) tworzymy plik serwisu i spec.ts
+
+Serwis to zwykła klasa z dektoratorem @Injectable()
+
+W Nest.js każdy serwis to [[Provider]]. Oznacza to, że serwisy mogą przyjmować zależności np. w postaci innych serwisów.
+
+
+## [[Modules]]
+W NestJS moduły pozwalają na organizowanie logiki biznesowej powiązanych ze sobą fragmentów (np. AuthModule)
+
+Dekorator @Module przyjmuje obiekt zawierający informację o:
+- controllerach (z których korzysta dany moduł)
+- exportowanych providerach, które mają być dostępne tam, gdzie importowany jest moduł
+- importowanych modułach
+- wykorzystywanych providerach, które będą dostępne tylko w tym module
+
+### Tworzenie modułów
+Z pomocą CLI `nest g module` tworzymy nowy moduł aplikacji oraz aktualizujemy główny moduł aplikacji (src/app.module.ts)
+## [[Data Transfer Objects]]
+DTO pozwalają na określenie interfejsów dla danych wejściowych i wyjściowych w aplikacji. Np. z ich pomocą możemy określić kształt wymaganego obiektu.
+
+DTO to proste obiekty, których rolą jest po prostu określenie struktury danych. Nie zawierają żadnej logiki biznesowej ani czegokolwiek, co wymaga testowania.
+
+Przykład:
+```
+export class CreateUserDto {
+ name: string;
+ brand: string;
+ flavors: string[];
+}
+```
+
+### Tworzenie DTO
+Z pomocą CLI `nest g class users/dto/create-user.dto --no-spec`generujemy plik `create-user.dto.ts` eksportujący klasę `CreateUserDto`
+
+## [[Validation]]
+- W pliku main.ts dodaj globalPipe: app.useGlobalPipes(new ValidationPipe())
+- Zainstaluj class-validator class-transformer
+
+import { IsString } from 'class-validator'
+
+```
+export class CreateUserDto {
+ @IsString()
+ readonly name: string;
+
+ @IsString({ roles })
+ readonly roles: string[];
+}
+```
diff --git a/content/Wiedza/Programowanie/NestJS/Upload plików.md b/content/Wiedza/Programowanie/NestJS/Upload plików.md
new file mode 100644
index 000000000..25067e077
--- /dev/null
+++ b/content/Wiedza/Programowanie/NestJS/Upload plików.md
@@ -0,0 +1,4 @@
+
+## Upload plików w Nest.js z Multer
+
+
diff --git a/content/Wiedza/Programowanie/No-Code.md b/content/Wiedza/Programowanie/No-Code.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/content/Wiedza/Programowanie/Node.js.md b/content/Wiedza/Programowanie/Node.js.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/content/Wiedza/Programowanie/Optymalizacja/Optymalizacja front-endu.md b/content/Wiedza/Programowanie/Optymalizacja/Optymalizacja front-endu.md
new file mode 100644
index 000000000..7c2711773
--- /dev/null
+++ b/content/Wiedza/Programowanie/Optymalizacja/Optymalizacja front-endu.md
@@ -0,0 +1,3 @@
+
+## Źródła
+- https://wpostats.com/
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/REST/Adresy URL.md b/content/Wiedza/Programowanie/REST/Adresy URL.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Programowanie/REST/Adresy URL.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/REST/Autoryzacja i uwierzytelnienie REST.md b/content/Wiedza/Programowanie/REST/Autoryzacja i uwierzytelnienie REST.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Programowanie/REST/Autoryzacja i uwierzytelnienie REST.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/REST/Metody HTTP.md b/content/Wiedza/Programowanie/REST/Metody HTTP.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Programowanie/REST/Metody HTTP.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/REST/Paginacja REST.md b/content/Wiedza/Programowanie/REST/Paginacja REST.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Programowanie/REST/Paginacja REST.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/REST/Przykład REST.md b/content/Wiedza/Programowanie/REST/Przykład REST.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Programowanie/REST/Przykład REST.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/REST/REST.md b/content/Wiedza/Programowanie/REST/REST.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Programowanie/REST/REST.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/REST/Resources.md b/content/Wiedza/Programowanie/REST/Resources.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Programowanie/REST/Resources.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/REST/Sortowanie i filtrowanie REST.md b/content/Wiedza/Programowanie/REST/Sortowanie i filtrowanie REST.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Programowanie/REST/Sortowanie i filtrowanie REST.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/REST/Statusy HTTP.md b/content/Wiedza/Programowanie/REST/Statusy HTTP.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Programowanie/REST/Statusy HTTP.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/REST/Wyszukiwanie REST.md b/content/Wiedza/Programowanie/REST/Wyszukiwanie REST.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Programowanie/REST/Wyszukiwanie REST.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/REST/_REST.md b/content/Wiedza/Programowanie/REST/_REST.md
new file mode 100644
index 000000000..7727d7864
--- /dev/null
+++ b/content/Wiedza/Programowanie/REST/_REST.md
@@ -0,0 +1,14 @@
+---
+title: Rest
+---
+
+- [[Wiedza/Programowanie/REST/REST]]
+- [[Wiedza/Programowanie/REST/Resources]]
+- [[Wiedza/Programowanie/REST/Adresy URL]]
+- [[Wiedza/Programowanie/REST/Metody HTTP]]
+- [[Wiedza/Programowanie/REST/Statusy HTTP]]
+- [[Wiedza/Programowanie/REST/Przykład REST]]
+- [[Wiedza/Programowanie/REST/Paginacja REST]]
+- [[Wiedza/Programowanie/REST/Sortowanie i filtrowanie REST]]
+- [[Wiedza/Programowanie/REST/Wyszukiwanie REST]]
+- [[Wiedza/Programowanie/REST/Autoryzacja i uwierzytelnienie REST]]
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/Web3/Źródła.md b/content/Wiedza/Programowanie/Web3/Źródła.md
new file mode 100644
index 000000000..84d23385c
--- /dev/null
+++ b/content/Wiedza/Programowanie/Web3/Źródła.md
@@ -0,0 +1,14 @@
+
+## Źródła
+https://gabygoldberg.notion.site/f7050e62461143d49345e7b46eb5576b?v=c02511c4230c44ce9a1a03c9757da524
+https://immersionden.xyz/
+
+
+## Kursy
+https://www.dappcamp.xyz/
+
+## Newslettery
+- https://twitter.com/thedailygwei
+- https://twitter.com/spencernoon
+- https://twitter.com/coinmetrics
+-
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/git/Branche w git.md b/content/Wiedza/Programowanie/git/Branche w git.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Programowanie/git/Branche w git.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/git/Cofanie zmian w git.md b/content/Wiedza/Programowanie/git/Cofanie zmian w git.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Programowanie/git/Cofanie zmian w git.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/git/Git Hooks.md b/content/Wiedza/Programowanie/git/Git Hooks.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Programowanie/git/Git Hooks.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/git/Komentarze w git.md b/content/Wiedza/Programowanie/git/Komentarze w git.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Programowanie/git/Komentarze w git.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/git/Polecenie stash w git.md b/content/Wiedza/Programowanie/git/Polecenie stash w git.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Programowanie/git/Polecenie stash w git.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/git/Przeglądanie historii w git.md b/content/Wiedza/Programowanie/git/Przeglądanie historii w git.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Programowanie/git/Przeglądanie historii w git.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/git/Przestrzeń robocza i stage w git.md b/content/Wiedza/Programowanie/git/Przestrzeń robocza i stage w git.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Programowanie/git/Przestrzeń robocza i stage w git.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/git/Przywracanie zmian w git.md b/content/Wiedza/Programowanie/git/Przywracanie zmian w git.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Programowanie/git/Przywracanie zmian w git.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/git/Rebase w git.md b/content/Wiedza/Programowanie/git/Rebase w git.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Programowanie/git/Rebase w git.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/git/Rozwiązywanie konfliktów w git.md b/content/Wiedza/Programowanie/git/Rozwiązywanie konfliktów w git.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Programowanie/git/Rozwiązywanie konfliktów w git.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/git/Tagi w git.md b/content/Wiedza/Programowanie/git/Tagi w git.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Programowanie/git/Tagi w git.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/git/Zapisywanie zmian w git.md b/content/Wiedza/Programowanie/git/Zapisywanie zmian w git.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Programowanie/git/Zapisywanie zmian w git.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/git/Zdalne repozytorium w git.md b/content/Wiedza/Programowanie/git/Zdalne repozytorium w git.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Programowanie/git/Zdalne repozytorium w git.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/git/_git.md b/content/Wiedza/Programowanie/git/_git.md
new file mode 100644
index 000000000..fa32ddd55
--- /dev/null
+++ b/content/Wiedza/Programowanie/git/_git.md
@@ -0,0 +1,18 @@
+---
+title: git
+---
+
+- [[Wiedza/Programowanie/git/git]]
+- [[Wiedza/Programowanie/git/Zapisywanie zmian w git]]
+- [[Wiedza/Programowanie/git/Przestrzeń robocza i stage w git]]
+- [[Wiedza/Programowanie/git/Przywracanie zmian w git]]
+- [[Wiedza/Programowanie/git/Przeglądanie historii w git]]
+- [[Wiedza/Programowanie/git/Komentarze w git]]
+- [[Wiedza/Programowanie/git/Polecenie stash w git]]
+- [[Wiedza/Programowanie/git/Branche w git]]
+- [[Wiedza/Programowanie/git/Zdalne repozytorium w git]]
+- [[Wiedza/Programowanie/git/Rozwiązywanie konfliktów w git]]
+- [[Wiedza/Programowanie/git/Rebase w git]]
+- [[Wiedza/Programowanie/git/Tagi w git]]
+- [[Wiedza/Programowanie/git/Cofanie zmian w git]]
+- [[Wiedza/Programowanie/git/Git Hooks]]
\ No newline at end of file
diff --git a/content/Wiedza/Programowanie/git/git.md b/content/Wiedza/Programowanie/git/git.md
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/content/Wiedza/Programowanie/git/git.md
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/content/Wiedza/Projektowanie/Design System.md b/content/Wiedza/Projektowanie/Design System.md
new file mode 100644
index 000000000..e96c3d834
--- /dev/null
+++ b/content/Wiedza/Projektowanie/Design System.md
@@ -0,0 +1,7 @@
+## Design System
+Aktualnie projektuję niemal wyłącznie w oparciu o tzw. Design Systemy, np. [[Tailwind UI]] czy [[Systemflow]]. Dzięki temu łatwo tworzę przejrzysty [[Wiedza/🎨 Projektowanie/UI]], zachowując spójność, co wpływa pozytywnie na ogólny [[Wiedza/🎨 Projektowanie/UX]] aplikacji.
+
+Jednocześnie praca w oparciu o deisgn system narzuca pewne ograniczenia, które warto świadomie przełamywać. Przy projektowaniu pomocne są modele mentalne [[Wiedza/Modele Mentalne/First Principles]], [[Wiedza/Modele Mentalne/Inversion]] czy [[Wiedza/Modele Mentalne/Occams Razor]] oraz tytuły takie jak [[Wiedza/Ksiazki/Refactoring UI]] czy z mniej technicznych [[Wiedza/Ksiazki/Think Like a Rocket Scientist]].
+
+## Źródła wiedzy
+- https://www.figmaster.co
\ No newline at end of file
diff --git a/content/Wiedza/Projektowanie/UI.md b/content/Wiedza/Projektowanie/UI.md
new file mode 100644
index 000000000..b00f74275
--- /dev/null
+++ b/content/Wiedza/Projektowanie/UI.md
@@ -0,0 +1,11 @@
+## Jak projektuję UI?
+
+Do projektowania UI aktualnie wykorzystuję niemal wyłącznie [[Optymalizacja/Narzędzia/Figma]] w połączeniu z biblioteką komponentów [[Tailwind UI]].
+
+W przypadku projektów no-code wykorzystuję [[Optymalizacja/Narzędzia/Webflow]] w połączeniu z frameworkiem [Systemflow.co](https://systemflow.co).
+
+## Źródła wiedzy
+W temacie projektowania interfejsów zawsze polecam
+- [Refactoring UI](https://www.refactoringui.com/) ~ [[Wiedza/Ludzie/Adam Wathan]] (twórca [[Tailwind CSS]]):
+- [Learnux.io](https://learnux.io) ~ [[Grzegorz Róg]]
+
diff --git a/content/Wiedza/Projektowanie/UX.md b/content/Wiedza/Projektowanie/UX.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/content/Wiedza/Przemyślenia/Dyscyplina.md b/content/Wiedza/Przemyślenia/Dyscyplina.md
new file mode 100644
index 000000000..6ee9e2a9e
--- /dev/null
+++ b/content/Wiedza/Przemyślenia/Dyscyplina.md
@@ -0,0 +1 @@
+[[Wiedza/Ludzie/Jocko Willink]] powiedział, że "Dyscyplina daje wolność" i bardzo wyraźnie podkreślił to w książce [[Wiedza/Ksiazki/Extreme Ownership]]. Popatrzenie na dyscyplinę z tej perspektywy i połączenie wiedzy na temat kształtowania nawyków z książki [[Wiedza/Ksiazki/Atomic Habits]] dało
\ No newline at end of file
diff --git a/content/Wiedza/Przemyślenia/Emocje.md b/content/Wiedza/Przemyślenia/Emocje.md
new file mode 100644
index 000000000..e39e64250
--- /dev/null
+++ b/content/Wiedza/Przemyślenia/Emocje.md
@@ -0,0 +1,4 @@
+## Kontekst
+Kilka lat temu dowiedziałem się o tym, że mój układ nerwowy jest nieco bardziej aktywny niż u większości ludzi. Inaczej mówiąc: odczuwam więcej. Początkowo myślałem że to wada. Potem zrozumiałem że jest to źródło kreatywności ale jednocześnie wielu negatywnych doświadczeń o ile nie zadbam o [[Fundamenty/Proces#Fundamenty]].
+
+W temacie emocji polecam odcinek [[Wiedza/Podcasty/Huberman Lab#Emocje]] oraz książkę [[Wiedza/Ksiazki/Daring Greatly]]
\ No newline at end of file
diff --git a/content/Wiedza/Przemyślenia/Intuicja.md b/content/Wiedza/Przemyślenia/Intuicja.md
new file mode 100644
index 000000000..019e83af0
--- /dev/null
+++ b/content/Wiedza/Przemyślenia/Intuicja.md
@@ -0,0 +1 @@
+[[Wiedza/Ksiazki/Blink]]
\ No newline at end of file
diff --git a/content/Wiedza/Przemyślenia/Negocjacje.md b/content/Wiedza/Przemyślenia/Negocjacje.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/content/Wiedza/Przemyślenia/Niemyślenie.md b/content/Wiedza/Przemyślenia/Niemyślenie.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/content/Wiedza/Przemyślenia/Nuda.md b/content/Wiedza/Przemyślenia/Nuda.md
new file mode 100644
index 000000000..fb07b64e9
--- /dev/null
+++ b/content/Wiedza/Przemyślenia/Nuda.md
@@ -0,0 +1,4 @@
+
+
+### Źródła
+https://thriveglobal.com/stories/three-ways-to-reset-your-stress-in-any-situation
\ No newline at end of file
diff --git a/content/Wiedza/Przemyślenia/Oczekiwania.md b/content/Wiedza/Przemyślenia/Oczekiwania.md
new file mode 100644
index 000000000..144707e38
--- /dev/null
+++ b/content/Wiedza/Przemyślenia/Oczekiwania.md
@@ -0,0 +1,18 @@
+---
+title: Oczekiwania
+---
+## Bez oczekiwań
+Żyję bez oczekiwań, będąc przygotowanym na wszystko. Realizuję mój [[Wiedza/Słownik/Proces]] najlpiej jak potrafię i dzięki temu mam przekonanie, że każdego dnia robię coś co mnie rozwija.
+
+Jakiś czas temu zauważyłem, że zbyt wysokie oczekiwania (lub zbyt niskie) są powodem wielu zmartwień i stresu oraz odwracają moją uwagę od tego, co mam.
+
+> _Odczuwamy stres gdy nasz umysł odrzuca to, co jest._
+> (eng. "Stress happens when your mind resists what is." ~ [[Wiedza/Ludzie/Dan Millman]])
+
+## Przywiązanie emocjonalne
+Ostatecznie brak oczekiwań nie oznacza np. braku wyznaczania wskaźników według których oceniam czy jakiś projekt odniósł sukces czy nie. Różnica polega jednak na tym, że intencjonalnie zwracam uwagę na to, aby nie przywiązywać się emocjonalnie do moich pomysłów oraz projektów.
+
+Nie oznacza to również życia bez emocji, które w moim przekonaniu [[Wiedza/Przemyślenia/Emocje]] odgrywają ogromną rolę a naszym zadaniem nie jest to aby nad nimi panować, lecz to aby one nie panowały nad nami.
+
+
+
diff --git a/content/Wiedza/Przemyślenia/Odpuszczanie.md b/content/Wiedza/Przemyślenia/Odpuszczanie.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/content/Wiedza/Przemyślenia/Odwrócenie.md b/content/Wiedza/Przemyślenia/Odwrócenie.md
new file mode 100644
index 000000000..7dd26a309
--- /dev/null
+++ b/content/Wiedza/Przemyślenia/Odwrócenie.md
@@ -0,0 +1,15 @@
+Na każdym kroku zauważam jak dużą rolę odgrywa odwrócenie (eng. [[Wiedza/Modele Mentalne/Inversion]]) i im dłużej z niego korzystam, tym lepiej rozumiem dlaczego osoby takie jak [[Wiedza/Ludzie/Warren Buffet]] tak bardzo go cenią.
+
+## Świat stoi na głowie
+Można odnieść wrażenie, że wiele rzeczy na świecie jest dosłownie odwrócona.
+Dla przykładu:
+- produktywność ma wiele wspólnego z nudą i odpoczynkiem
+- szczęście jest kwestią decyzji i stanem w którym się bywa a nie do którego się dąży
+- często przeszkodą do zdobycia czegoś jest pragnienie posiadania
+- pełne cieszenie się tym co mamy, wymaga tego aby pogodzić się z tym, że możemy to stracić
+
+## Działam "odwrotnie"
+Bardzo często mój przykład wskazuje jak skuteczne jest odwrócenie i wręcz działanie totalnie odwrotnie w porównaniu do większości lub naszych naturalnych reakcji.
+
+## Intencjonalne odwracanie
+Aktualnie intencjonalnie podejmując decyzje zastanawiam się nad rezultatami, które mogę osiągnąć w sytuacji gdy zachowam się dokładnie odwrotnie. Podobnie też przy rozwiązywaniu problemów świadomie odwracam swoje założenia aby móc zobaczyć inną [[Wiedza/Słownik/Perspektywa]] i tym samym często trafić na rozwiązanie, które nie jest widoczne na pierwszy rzut oka.
\ No newline at end of file
diff --git a/content/Wiedza/Przemyślenia/Podejmowanie decyzji.md b/content/Wiedza/Przemyślenia/Podejmowanie decyzji.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/content/Wiedza/Przemyślenia/Przemyślenia.md b/content/Wiedza/Przemyślenia/Przemyślenia.md
new file mode 100644
index 000000000..e9beed6ac
--- /dev/null
+++ b/content/Wiedza/Przemyślenia/Przemyślenia.md
@@ -0,0 +1,13 @@
+---
+title: Przemyślenia
+---
+
+- [[Wiedza/Przemyślenia/Rzeczywistość]]
+- [[Wiedza/Przemyślenia/Intuicja]]
+- [[Wiedza/Przemyślenia/Podejmowanie decyzji]]
+- [[Wiedza/Przemyślenia/Emocje]]
+- [[Wiedza/Przemyślenia/Oczekiwania]]
+- [[Wiedza/Przemyślenia/Rozczarowanie]]
+- [[Wiedza/Przemyślenia/Odpuszczanie]]
+- [[Wiedza/Przemyślenia/Niemyślenie]]
+- [[Wiedza/Przemyślenia/Odwrócenie]]
\ No newline at end of file
diff --git a/content/Wiedza/Przemyślenia/Rozczarowanie.md b/content/Wiedza/Przemyślenia/Rozczarowanie.md
new file mode 100644
index 000000000..53177390e
--- /dev/null
+++ b/content/Wiedza/Przemyślenia/Rozczarowanie.md
@@ -0,0 +1,8 @@
+Rozczarowanie czy bardziej Roz-Czarowanie oznacza dosłownie uwolnienie od zaczarowania, czyli wyrwanie z iluzji.
+
+Inaczej mówiąc moment rozczarowania jest chwilą w której dostrzegamy [[Wiedza/Przemyślenia/Rzeczywistość]] taką jaka jest a nie taką jaka wydaje nam się być.
+
+Powyższą koncepcję przedstawił mi [[Wiedza/Ludzie/Dan Millman]] w swojej książce [[Wiedza/Ksiazki/Way of The Peaceful Warrior]].
+
+## Akcja
+W chwili gdy doświadczam rozczarowania,
\ No newline at end of file
diff --git a/content/Wiedza/Przemyślenia/Rzeczywistość.md b/content/Wiedza/Przemyślenia/Rzeczywistość.md
new file mode 100644
index 000000000..11440d1c4
--- /dev/null
+++ b/content/Wiedza/Przemyślenia/Rzeczywistość.md
@@ -0,0 +1,25 @@
+## Kontekst
+Wiele źródeł (np. [[Wiedza/Ksiazki/Deviate]]) wskazuje na to, że nie mamy możliwości postrzegać rzeczywistość taką i każdy z nas widzi ją inaczej.
+
+**Wynika to z prostego faktu:**
+- wokół nas dzieje się bardzo dużo ale nasze zmysły, odbierają część informacji
+- odebrane przez zmysły informacje są filtrowane przez percepcję (to, na czym aktualnie skupiamy swoją uwagę)
+- ostatecznie garstka odebranych danych filtrowana, i co gorsza, interpretowana jest przez nasze przekonania, uprzedzenia i poddawana wielu pułapkom myślowym.
+
+Wiele wskazuje na to, że jeżeli nasz mózg ma do dyspozycji różne dane, skupi się przede wszystkim na **informacji o drugim człowieku.** Z tego powodu nasze najbliższe [[Fundamenty/Proces#Otoczenie]] jest tak ważne, o czym mówił m.in. [[Wiedza/Ludzie/Kapil Gupta]].
+
+## Akcja
+Przed dostrzeżeniem rzeczywistości według [[Wiedza/Ludzie/Ray Dalio]] chronią nas dwie rzeczy:
+- nasze [[ego]], które zawsze chce mieć rację
+- [[Blind Spots]], czyli rzeczy o których nie wiemy oraz rzeczy o których nie wiemy, że nie wiemy ([[Blindspot Matrix]])
+
+W odkrywaniu rzeczy o których nie wiemy, najbardziej mogą nam pomóc inni ludzie oraz postawa nastawiona na [[Radykalna Transparentność]]. W połączeniu obie te rzeczy dają nam zdolność do zobaczenia innej [[Wiedza/Słownik/Perspektywa]].
+
+O opisanej akcji dowiesz się więcej z książki [[Wiedza/Ksiazki/Principles]]
+
+## Modele rzeczywistości
+Podobnie jak [[Wiedza/Modele Mentalne/Modele mentalne]], istnieją [[Model Rzeczywistości]] o których dowiedziałem się w [[The Code of Extraordinary Mind]].
+
+Zgodnie z opisem znajdującym się powyżej, nie możemy zobaczyć rzeczywistości taką jaka jest, ponieważ jej odbiór jest zniekształcany przez różne czynniki. Tworząc i modyfikując modele rzeczywistości, jesteśmy w stanie kształtować naszą interpretację i tym samym wpływać na to jak widzimy świat.
+
+## Źródła
\ No newline at end of file
diff --git a/content/Wiedza/Słownik/Balans.md b/content/Wiedza/Słownik/Balans.md
new file mode 100644
index 000000000..b83659637
--- /dev/null
+++ b/content/Wiedza/Słownik/Balans.md
@@ -0,0 +1,13 @@
+Według testu [[Wiedza/Inne/MBTI]] posiadam profil INFJ, znany również jako "profil skrajności" lub "profil paradoksu". Z tego powodu zrozumienie i wykorzystanie [[Wiedza/Słownik/Balans]]u jest dla mnie fundamentalnie ważne.
+
+Dodatkowo o balansie mówili m.in. [[Wiedza/Ludzie/Jocko Willink]] w [[Dichotomy of Leadership]] oraz [[Wiedza/Ludzie/Jim Collins]] w [[Wiedza/Ksiazki/Great by Choice]] i koncepcji [[Wiedza/Modele Mentalne/Genius of The AND]].
+
+Według mojego aktualnego zrozumienia balans nie jest dążeniem do pozostawania "w centrum", pomiędzy skrajnościami. Chodzi o umiejętność poruszania się po skrajnościach w zależności od sytuacji i potrzeby.
+
+Przykładem może być [[Wiedza/Przemyślenia/Dyscyplina]] ORAZ [[Kreatywność]]. Z jednej strony podążanie za [[Fundamenty/Proces]]em bez względu na okoliczności, wydaje się być rozsądne, jednak według mnie nie sprawdza się w praktyce.
+
+Powodem tego jest fakt, że nasz kontekst nieustannie się zmienia. Oznacza to że nawet dobrze zaprojektowany proces może być skuteczny dziś ale z czasem może się to zmienić.
+
+Dokładnie o tym pisał [[Simon Sinek]] w książce [[Wiedza/Ksiazki/Leaders Eat Last]]. Powiedział:
+
+> And that's what trust is. We don't just trust people to obey the rules, we also trust that they know when to break them.
\ No newline at end of file
diff --git a/content/Wiedza/Słownik/Cel.md b/content/Wiedza/Słownik/Cel.md
new file mode 100644
index 000000000..8b9ed2576
--- /dev/null
+++ b/content/Wiedza/Słownik/Cel.md
@@ -0,0 +1,16 @@
+---
+title: Dziennik
+date: "2022-04-01"
+lastmod: "2022-04-25"
+---
+
+# Cel
+Cele uznawane są jako niezbędne elementy osiągania wielkich rezultatów.
+
+Osobiście zrezygowałem z ich wyznaczania na początku 2019 roku, gdy robiąc podsumowanie poprzedniego roku, zadałem sobie pytanie "**Czy można inaczej?**"
+
+Potem trafiłem na książki takie jak [[Wiedza/Ksiazki/So Good They Cant Ignore You]], [[Wiedza/Ksiazki/The Compound Effect]] czy [[Wiedza/Ksiazki/How to Fail at Almost Anything and Still Win Big]], które utwierdziły mnie w przekonaniu, że wyznaczanie celów nie jest jedyną drogą.
+
+Co więcej teraz uważam, że wyznaczanie celów po prostu w moim przypadku nie sprawdzało się dobrze (co nie oznacza, że u innych również tak jest).
+
+Obecnie działam wyłącznie w oparciu o [[Fundamenty/Proces]] oraz [[Fundamenty/Wartości]]
\ No newline at end of file
diff --git a/content/Wiedza/Słownik/Indie Hackers.md b/content/Wiedza/Słownik/Indie Hackers.md
new file mode 100644
index 000000000..f8f65c36d
--- /dev/null
+++ b/content/Wiedza/Słownik/Indie Hackers.md
@@ -0,0 +1,12 @@
+[[Wiedza/Słownik/Indie Hackers]] to społeczność zrzeszająca osoby prowadzące poboczne projekty lub rozwijające produkty w pojedynkę lub bardzo małych zespołach. Najczęściej wybierają drogę [[Bootstrappingu]] zamiast zewnętrznego finansowania.
+
+Znani Indie Hackerzy
+- [[Wiedza/Ludzie/Adam Wathan]] ([[Tailwind CSS]] & [[[Tailwind UI]]])
+- [[Pieter Levels]] ([[Wiedza/Ksiazki/MAKE]])
+
+Polecane przeze mnie odcinki podcastu [[Wiedza/Słownik/Indie Hackers]]:
+- [[Grzegorz Róg]] - [Generating Passive Income by Teaching What You Know with Greg Rog of LearnUX ](https://www.indiehackers.com/podcast/149-greg-rog-of-learnux)
+- David Hsu (Retool) - [https://www.indiehackers.com/podcast/181-david-hsu-of-retool](https://www.indiehackers.com/podcast/181-david-hsu-of-retool)
+
+
+
\ No newline at end of file
diff --git a/content/Wiedza/Słownik/Kierunek.md b/content/Wiedza/Słownik/Kierunek.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/content/Wiedza/Słownik/Otoczenie.md b/content/Wiedza/Słownik/Otoczenie.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/content/Wiedza/Słownik/Perspektywa.md b/content/Wiedza/Słownik/Perspektywa.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/content/Wiedza/Słownik/Priorytet.md b/content/Wiedza/Słownik/Priorytet.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/content/Wiedza/Słownik/Proces.md b/content/Wiedza/Słownik/Proces.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/content/Wiedza/Słownik/Słownik.md b/content/Wiedza/Słownik/Słownik.md
new file mode 100644
index 000000000..b9642d8e9
--- /dev/null
+++ b/content/Wiedza/Słownik/Słownik.md
@@ -0,0 +1,11 @@
+---
+title: Słownik
+---
+
+- [[Wiedza/Słownik/Cel]]
+- [[Wiedza/Słownik/Kierunek]]
+- [[Wiedza/Słownik/Proces]]
+- [[Wiedza/Słownik/Otoczenie]]
+- [[Wiedza/Słownik/Perspektywa]]
+- [[Wiedza/Słownik/Indie Hackers]]
+- [[Wiedza/Słownik/Balans]]
\ No newline at end of file
diff --git a/content/_index.md b/content/_index.md
index bd742c4de..f957b05cb 100644
--- a/content/_index.md
+++ b/content/_index.md
@@ -1,27 +1,34 @@
---
-title: 🪴 Quartz 3.2
+title: Co to za miejsce?
+enableToc: true
+openToc: true
---
-Host your second brain and [digital garden](https://jzhao.xyz/posts/networked-thought) for free. Quartz features
+
-1. Extremely fast full-text search by pressing `Ctrl` + `k`
-2. Customizable and hackable design based on Hugo
-3. Automatically generated backlinks, link previews, and local graph
-4. Built-in [[notes/CJK + Latex Support (测试) | CJK + Latex Support]]
-5. Support for both Markdown Links and Wikilinks
+W tym miejscu dzielę się z Tobą wszystkim co wiem. Stworzyłem je przede wszystkim dla siebie, aby móc łatwo wracać do wszystkich zamieszczonych tu materiałów. Jednocześnie pomyślałem że to wszystko może okazać się równie wartościowe dla Ciebie.
-## Get Started
-> 📚 [Setup your own digital garden using Quartz](notes/setup.md)
+## Znajdziesz tutaj
-Not convinced yet? Look at some [community digital gardens](notes/showcase.md) built with Quartz, or read about [why I made Quartz](notes/philosophy.md) to begin with.
+* Mojego procesu ([[Fundamenty/Proces]]) który realizuję codziennie \(i który nieustannie się zmienia\). Dzięki niemu podążam w wyznaczonym przeze mnie [[Wiedza/Słownik/Kierunek]] w oparciu o nazwane [[Fundamenty/Wartości]].
+* [[Wiedza/Modele Mentalne/Modele mentalne]] z których świadomie korzystam
+* Notatki z przeczytanych przeze mnie [[Wiedza/Ksiazki/Ksiazki]]
+* [[Wiedza/Ludzie/Ludzie]] jakich obserwuję w Internecie
+* Moje [[Wiedza/Przemyślenia/Przemyślenia]] i styl działania
+* Moje notatki na temat Programowania, Projektowania, Marketingu i szeroko pojętego Biznesu
+* [[Optymalizacja/Sprzęt/Sprzęt]] z jakiego korzystam
+* Opisy wykorzystywanych przeze mnie [[Optymalizacja/Automatyzacja/Automatyzacja]] i [[Optymalizacja/Automatyzacja/Narzędzia]]
+* Informacje na temat projektów w które jestem zaangażowany ([[Projekty/eduweb]], [[Projekty/zautomatyzowani]], [[Projekty/overment]], [[Projekty/EasyCart]], [[Projekty/EasyBanner]])
+* Moje wszystkie bezpłatne i płatne publikacje
-## Content Lists
-If you prefer browsing the contents of this site through a list instead of a graph, you can find content lists here too:
+## Wyszukiwanie & Obsidian
-- [All Notes](/notes)
-- [Setup-related Notes](/tags/setup)
+Wszystkie zawarte tutaj informacje możesz przeszukiwać na dwa sposoby:
+- z pomocą wyszukiwarki dostępnej na tej stronie
+- lub z pomocą aplikacji [Obsidian](https://obsidian.md/) do której możesz wgrać zawartość tego repozytorium: https://github.com/iceener/brain
-## Troubleshooting
-- 🚧 [Troubleshooting and FAQ](notes/troubleshooting.md)
-- 🐛 [Submit an Issue](https://github.com/jackyzha0/quartz/issues)
-- 👀 [Discord Community](https://discord.gg/cRFFHYye7t)
+## Koncepcja
+
+Cały ten projekt oparty jest o koncepcję tzw. [digital garden](https://joelhooks.com/digital-garden). W moim przypadku testowałem połączenie Notion oraz Super.so oraz integrację Githuba z GitBookiem. Ostatecznie zdecydowałem się na Obisidan Publish z szablonem uwzględniającym moje własne style CSS.
+
+> **Ważne!** Jeżeli w jakichś definicjach znajdziesz błąd lub chcesz zasugerować zmianę, będę Ci za to bardzo wdzięczny. Możesz to zrobić z pomocą Pull Request przesłanym do [tego repozytorium](https://github.com/iceener/brain), [zgłaszając Issue](https://github.com/iceener/brain/issues/new) lub po prostu pisząc do mnie na adam@overment.com
diff --git a/content/notes/CJK + Latex Support (测试).md b/content/notes/CJK + Latex Support (测试).md
deleted file mode 100644
index d6e4ae968..000000000
--- a/content/notes/CJK + Latex Support (测试).md
+++ /dev/null
@@ -1,40 +0,0 @@
----
-title: "CJK + Latex Support (测试)"
----
-
-## Chinese, Japanese, Korean Support
-几乎在我们意识到之前,我们已经离开了地面。
-
-우리가 그것을 알기도 전에 우리는 땅을 떠났습니다.
-
-私たちがそれを知るほぼ前に、私たちは地面を離れていました。
-
-## Latex
-
-Block math works with two dollar signs `$$...$$`
-
-$$f(x) = \int_{-\infty}^\infty
- f\hat(\xi),e^{2 \pi i \xi x}
- \,d\xi$$
-
-Inline math also works with single dollar signs `$...$`. For example, Euler's identity but inline: $e^{i\pi} = 0$
-
-Aligned equations work quite well:
-
-$$
-\begin{aligned}
-a &= b + c \\ &= e + f \\
-\end{aligned}
-$$
-
-And matrices
-
-$$
-\begin{bmatrix}
-1 & 2 & 3 \\
-a & b & c
-\end{bmatrix}
-$$
-
-## RTL
-More information on configuring RTL languages like Arabic in the [config](notes/config.md) page.
diff --git a/content/notes/config.md b/content/notes/config.md
deleted file mode 100644
index d04b1528d..000000000
--- a/content/notes/config.md
+++ /dev/null
@@ -1,67 +0,0 @@
----
-title: "Configuration"
-tags:
-- setup
----
-
-## Configuration
-Quartz is designed to be extremely configurable. You can find the bulk of the configuration scattered throughout the repository depending on how in-depth you'd like to get.
-
-The majority of configuration can be be found under `data/config.yaml`. An annotated example configuration is shown below.
-
-```yaml
-name: Your name here! # Shows in the footer
-enableToc: true # Whether to show a Table of Contents
-enableLinkPreview: true # whether to render card previews for links
-description: Page description to show to search engines
-page_title: Quartz Example Page # Default Page Title
-
-links: # Links to show in footer
- - link_name: Twitter
- link: https://twitter.com/_jzhao
- - link_name: Github
- link: https://github.com/jackyzha0
-```
-
-### Graph View
-To customize the Interactive Graph view, you can poke around `data/graphConfig.yaml`.
-
-```yaml
-enableLegend: false # automatically generate a legend
-enableDrag: true # allow dragging nodes in the graph
-enableZoom: true # allow zooming and panning the graph
-depth: -1 # how many neighbours of the current node to show (-1 is all nodes)
-paths: # colour specific nodes path off of their path
- - /moc: "#4388cc"
-```
-
-
-## Styling
-Want to go even more in-depth? You can add custom CSS styling and change existing colours through editing `assets/styles/custom.scss`. If you'd like to target specific parts of the site, you can add ids and classes to the HTML partials in `/layouts/partials`.
-
-### Partials
-Partials are what dictate what actually gets rendered to the page. Want to change how pages are styled and structured? You can edit the appropriate layout in `/layouts`.
-
-For example, the structure of the home page can be edited through `/layouts/index.html`. To customize the footer, you can edit `/layouts/partials/footer.html`
-
-More info about partials on [Hugo's website.](https://gohugo.io/templates/partials/)
-
-Still having problems? Checkout our [FAQ and Troubleshooting guide](notes/troubleshooting.md).
-
-## Multilingual
-[CJK + Latex Support (测试)](notes/CJK%20+%20Latex%20Support%20(测试).md) comes out of the box with Quartz.
-
-Want to support languages that read from right-to-left (like Arabic)? Hugo (and by proxy, Quartz) supports this natively.
-
-Follow the steps [Hugo provides here](https://gohugo.io/content-management/multilingual/#configure-languages) and modify your `config.toml`
-
-For example:
-
-```toml
-defaultContentLanguage = 'ar'
-[languages]
- [languages.ar]
- languagedirection = 'rtl'
- title = 'مدونتي'
- weight = 1
-```
diff --git a/content/notes/custom Domain.md b/content/notes/custom Domain.md
deleted file mode 100644
index 72cb466eb..000000000
--- a/content/notes/custom Domain.md
+++ /dev/null
@@ -1,17 +0,0 @@
----
-title: "Custom Domain"
----
-
-### Registrar
-This step is only applicable if you are using a **custom domain**! If you are using a `.github.io` domain, you can skip this step.
-
-For this last bit to take effect, you also need to create a CNAME record with the DNS provider you register your domain with (i.e. NameCheap, Google Domains).
-
-GitHub has some [documentation on this](https://docs.github.com/en/pages/configuring-a-custom-domain-for-your-github-pages-site/managing-a-custom-domain-for-your-github-pages-site), but the tldr; is to
-
-1. Go to your forked repository (`github.com//quartz`) settings page and go to the Pages tab. Under "Custom domain", type your custom domain, then click **Save**.
-2. Go to your DNS Provider and create a CNAME record that points from your domain to `
-
-# Commit all changes
-git add .
-git commit -m "message describing changes"
-
-# Push to GitHub to update site
-git push origin hugo
-```
-
-Note: we specifically push to the `hugo` branch here. Our GitHub action automatically runs everytime a push to is detected to that branch and then updates the `master` branch for redeployment.
-
-### Setting up the Site
-Now let's get this site up and running. Never hosted a site before? No problem. Have a fancy custom domain you already own or want to subdomain your Quartz? That's easy too.
-
-Here, we take advantage of GitHub's free page hosting to deploy our site. Change `baseURL` in `/config.toml`.
-
-Make sure that your `baseURL` has a trailing `/`!
-
-[Reference `config.toml` here](https://github.com/jackyzha0/quartz/blob/hugo/config.toml)
-
-```toml
-baseURL = "https:///"
-```
-
-If you are using this under a subdomain (e.g. `.github.io/quartz`), include the trailing `/`.
-
-```toml
-baseURL = "https://.github.io/quartz/"
-```
-
-Change `cname` in `/.github/workflows/deploy.yaml`. Again, if you don't have a custom domain to use, you can use `.github.io`.
-
-Please note that the `cname` field should *not* have any path `e.g. end with /quartz` or have a trailing `/`.
-
-[Reference `deploy.yaml` here](https://github.com/jackyzha0/quartz/blob/hugo/.github/workflows/deploy.yaml)
-
-```yaml
-- name: Deploy
- uses: peaceiris/actions-gh-pages@v3
- with:
- github_token: ${{ secrets.GITHUB_TOKEN }} # this can stay as is, GitHub fills this in for us!
- publish_dir: ./public
- publish_branch: master
- cname:
-```
-
-Have a custom domain? [Learn how to set it up with Quartz ](notes/custom%20Domain.md).
-
----
-
-Now that your Quartz is live, let's figure out how to make Quartz really *yours*!
-
-🎨 [Customizing Quartz](notes/config.md)
-
-Having problems? Checkout our [FAQ and Troubleshooting guide](notes/troubleshooting.md).
diff --git a/content/notes/ignore notes.md b/content/notes/ignore notes.md
deleted file mode 100644
index e0314211d..000000000
--- a/content/notes/ignore notes.md
+++ /dev/null
@@ -1,31 +0,0 @@
----
-title: "Ignoring Notes"
----
-
-### Quartz Ignore
-Edit `ignoreFiles` in `config.toml` to include paths you'd like to exclude from being rendered.
-
-```toml
-...
-ignoreFiles = [
- "/content/templates/*",
- "/content/private/*",
- ""
-]
-```
-
-`ignoreFiles` supports the use of Regular Expressions (RegEx) so you can ignore patterns as well (e.g. ignoring all `.png`s by doing `\\.png$`).
-To ignore a specific file, you can also add the tag `draft: true` to the frontmatter of a note.
-
-```markdown
----
-title: Some Private Note
-draft: true
----
-...
-```
-
-More details in [Hugo's documentation](https://gohugo.io/getting-started/configuration/#ignore-content-and-data-files-when-rendering).
-
-### Global Ignore
-However, just adding to the `ignoreFiles` will only prevent the page from being access through Quartz. If you want to prevent the file from being pushed to GitHub (for example if you have a public repository), you need to also add the path to the `.gitignore` file at the root of the repository.
\ No newline at end of file
diff --git a/content/notes/images/github-actions.png b/content/notes/images/github-actions.png
deleted file mode 100644
index 8e977cb17..000000000
Binary files a/content/notes/images/github-actions.png and /dev/null differ
diff --git a/content/notes/images/github-pages.png b/content/notes/images/github-pages.png
deleted file mode 100644
index 2c606f588..000000000
Binary files a/content/notes/images/github-pages.png and /dev/null differ
diff --git a/content/notes/images/google-domains.png b/content/notes/images/google-domains.png
deleted file mode 100644
index a43826999..000000000
Binary files a/content/notes/images/google-domains.png and /dev/null differ
diff --git a/content/notes/images/obsidian-settings.png b/content/notes/images/obsidian-settings.png
deleted file mode 100644
index 8dfbfdc34..000000000
Binary files a/content/notes/images/obsidian-settings.png and /dev/null differ
diff --git a/content/notes/obsidian.md b/content/notes/obsidian.md
deleted file mode 100644
index 8e5fedd82..000000000
--- a/content/notes/obsidian.md
+++ /dev/null
@@ -1,29 +0,0 @@
----
-title: "Obsidian Vault Integration"
-tags:
-- setup
----
-
-## Setup
-Obsidian is the preferred way to use Quartz. You can either create a new Obsidian Vault or link one that your already have.
-
-### New Vault
-If you don't have an existing Vault, [download Obsidian](https://obsidian.md/) and create a new Vault in the `/content` folder that you created and cloned during the [setup](notes/setup.md) step.
-
-### Linking an existing Vault
-The easiest way to use an existing Vault is to copy all of your files (directory and hierarchies intact) into the `/content` folder.
-
-## Settings
-Great, now that you have your Obsidian linked to your Quartz, let's fix some settings so that they play well.
-
-1. Under Options > Files and Links, set the New link format to always use Absolute Path in Vault.
-2. Go to Settings > Files & Links > Turn "on" automatically update internal links.
-
-*Obsidian Settings*
-
-## Templates
-Inserting front matter everytime you want to create a new Note gets annoying really quickly. Luckily, Obsidian supports templates which makes inserting new content really easily.
-
-**If you decide to overwrite the `/content` folder completely, don't remove the `/content/templates` folder!**
-
-Head over to Options > Core Plugins and enable the Templates plugin. Then go to Options > Hotkeys and set a hotkey for 'Insert Template' (I recommend `[cmd]+T`). That way, when you create a new note, you can just press the hotkey for a new template and be ready to go!
diff --git a/content/notes/philosophy.md b/content/notes/philosophy.md
deleted file mode 100644
index bf04da3b1..000000000
--- a/content/notes/philosophy.md
+++ /dev/null
@@ -1,17 +0,0 @@
----
-title: "Quartz Philosophy"
----
-
-> “[One] who works with the door open gets all kinds of interruptions, but [they] also occasionally gets clues as to what the world is and what might be important.” — Richard Hamming
-
-## Why Quartz?
-Hosting a public digital garden isn't easy. There are an overwhelming number of tutorials, resources, and guides for tools like [Notion](https://www.notion.so/), [Roam](https://roamresearch.com/), and [Obsidian](https://obsidian.md/), yet none of them have super easy to use *free* tools to publish that garden to the world.
-
-I've personally found that
-1. It's nice to access notes from anywhere
-2. Having a public digital garden invites open conversations
-3. It makes keeping personal notes and knowledge *playful and fun*
-
-I was really inspired by [Bianca](https://garden.bianca.digital/) and [Joel](https://joelhooks.com/digital-garden)'s digital gardens and wanted to try making my own.
-
-**The goal of Quartz is to make hosting your own public digital garden free and simple.** You don't even need your own website. Quartz does all of that for you and gives your own little corner of the internet.
diff --git a/content/notes/preview changes.md b/content/notes/preview changes.md
deleted file mode 100644
index 7f12f3055..000000000
--- a/content/notes/preview changes.md
+++ /dev/null
@@ -1,38 +0,0 @@
----
-title: "Preview Changes"
----
-
-If you'd like to preview what your Quartz site looks like before deploying it to the internet, here's exactly how to do that!
-
-Note that both of these steps need to be completed.
-
-## Install `hugo-obsidian`
-This step will generate the list of backlinks for Hugo to parse. Ensure you have [Go](https://golang.org/doc/install) (>= 1.16) installed.
-
-```shell
-# Install and link `hugo-obsidian` locally
-$ go install github.com/jackyzha0/hugo-obsidian@latest
-
-# Navigate to your local Quartz folder
-$ cd
-
-# Scrape all links in your Quartz folder and generate info for Quartz
-$ hugo-obsidian -input=content -output=assets/indices -index -root=.
-```
-
-If you are running into an error saying that `command not found: hugo-obsidian`, make sure you set your `GOPATH` correctly! This will allow your terminal to correctly recognize hugo-obsidian as an executable.
-
-Afterwards, start the Hugo server as shown above and your local backlinks and interactive graph should be populated!
-
-## Installing Hugo
-Hugo is the static site generator that powers Quartz. [Install Hugo with "extended" Sass/SCSS version](https://gohugo.io/getting-started/installing/) first. Then,
-
-```
-# Navigate to your local Quartz folder
-$ cd
-
-# Start local server
-$ hugo server
-
-# View your site in a browser at http://localhost:1313/
-```
diff --git a/content/notes/setup.md b/content/notes/setup.md
deleted file mode 100644
index 495a43b68..000000000
--- a/content/notes/setup.md
+++ /dev/null
@@ -1,58 +0,0 @@
----
-title: "Setup"
-tags:
-- setup
----
-
-## Making your own Quartz
-Setting up Quartz requires a basic understanding of `git`. If you are unfamiliar, [this resource](https://resources.nwplus.io/2-beginner/how-to-git-github.html) is a great place to start!
-
-### Forking
-> A fork is a copy of a repository. Forking a repository allows you to freely experiment with changes without affecting the original project.
-
-Navigate to the GitHub repository for the Quartz project:
-
-📁 [Quartz Repository](https://github.com/jackyzha0/quartz)
-
-Then, Fork the repository into your own GitHub account. If you don't have an account, you can make on for free [here](https://github.com/join). More details about forking a repo can be found on [GitHub's documentation](https://docs.github.com/en/get-started/quickstart/fork-a-repo).
-
-### Cloning
-After you've made a fork of the repository, you need to download the files locally onto your machine. Ensure you have `git`, then type the following command replacing `YOUR-USERNAME` with your GitHub username.
-
-```shell
-$ git clone https://github.com/YOUR-USERNAME/quartz
-```
-
-## Editing
-Great! Now you have everything you need to start editing and growing your digital garden. If you're ready to start writing content already, check out the recommended flow for editing notes in Quartz.
-
-✏️ [Editing Notes in Quartz](notes/editing.md)
-
-Having problems? Checkout our [FAQ and Troubleshooting guide](notes/troubleshooting.md).
-
-## Updating
-Haven't updated Quartz in a while and want all the cool new optimizations? On Unix/Mac systems you can run the following command for a one-line update! This command will show you a log summary of all commits since you last updated, press `q` to acknowledge this. Then, it will show you each change in turn and press `y` to accept the patch or `n` to reject it. Usually you should press `y` for most of these unless it conflicts with existing changes you've made!
-
-```shell
-make update
-
-# or, if you don't want the interactive parts and just want the update
-make update-force
-```
-
-Or, manually checkout the changes yourself.
-
-> ⚠️ **WARNING** ⚠️
->
-> If you customized the files in `data/`, or anything inside `layouts/`, your customization may be overwritten!
-> Make sure you have a copy of these changes if you don't want to lose them.
-
-
-```shell
-# add Quartz as a remote host
-git remote add upstream git@github.com:jackyzha0/quartz.git
-
-# index and fetch changes
-git fetch upstream
-git checkout -p upstream/hugo -- layouts .github Makefile assets/js assets/styles/base.scss assets/styles/darkmode.scss config.toml data
-```
diff --git a/content/notes/showcase.md b/content/notes/showcase.md
deleted file mode 100644
index 5c16a0d39..000000000
--- a/content/notes/showcase.md
+++ /dev/null
@@ -1,17 +0,0 @@
----
-title: "Showcase"
----
-
-Want to see what Quartz can do? Here are some cool community gardens :)
-
-- [Quartz Documentation (this site!)](https://quartz.jzhao.xyz/)
-- [Jacky Zhao's Garden](https://garden.jzhao.xyz/)
-- [AWAGMI Intern Notes](https://notes.awagmi.xyz/)
-- [Shihyu's PKM](https://shihyuho.github.io/pkm/)
-- [Chloe's Garden](https://garden.chloeabrasada.online/)
-- [SlRvb's Site](https://slrvb.github.io/Site/)
-- [Course notes for Information Technology Advanced Theory](https://a2itnotes.github.io/quartz/)
-- [Brandon Boswell's Garden](https://brandonkboswell.com)
-- [Siyang's Courtyard](https://siyangsun.github.io/courtyard/)
-
-If you want to see your own on here, submit a [Pull Request adding yourself to this file](https://github.com/jackyzha0/quartz/blob/hugo/content/notes/showcase.md)!
diff --git a/content/notes/troubleshooting.md b/content/notes/troubleshooting.md
deleted file mode 100644
index 66eb87929..000000000
--- a/content/notes/troubleshooting.md
+++ /dev/null
@@ -1,81 +0,0 @@
----
-title: "Troubleshooting and FAQ"
----
-
-Still having trouble? Here are a list of common questions and problems people encounter when installing Quartz.
-
-While you're here, join our [Discord](https://discord.gg/cRFFHYye7t) :)
-
-### Does Quartz have Latex support?
-Yes! See [CJK + Latex Support (测试)](notes/CJK%20+%20Latex%20Support%20(测试).md) for a brief demo.
-
-### Can I use \ in Quartz?
-Unless it produces direct Markdown output in the file, no. There currently is no way to bundle plugin code with Quartz.
-
-The easiest way would be to add your own HTML partial that supports the functionality you are looking for.
-
-### My GitHub pages is just showing the README and not Quartz
-Make sure you set the source to deploy from `master` (and not `hugo`) using `/ (root)`! See more in the [hosting](/notes/hosting) guide
-
-### Some of my pages have 'January 1, 0001' as the last modified date
-This is a problem caused by `git` treating files as case-insensitive by default and some of your posts probably have capitalized file names. You can turn this off in your Quartz by running this command.
-
-```shell
-# in the root of your Quartz (same folder as config.toml)
-git config core.ignorecase true
-
-# or globally (not recommended)
-git config --global core.ignorecase true
-```
-
-### Can I publish only a subset of my pages?
-Yes! Quartz makes selective publishing really easy. Heres a guide on [excluding pages from being published](notes/ignore%20notes.md).
-
-### Can I host this myself and not on GitHub Pages?
-Yes! All built files can be found under `/public` in the `master` branch. More details under [hosting](notes/hosting.md).
-
-### `command not found: hugo-obsidian`
-Make sure you set your `GOPATH` correctly! This will allow your terminal to correctly recognize `hugo-obsidian` as an executable.
-
-```shell
-# Add the following 2 lines to your ~/.bash_profile
-export GOPATH=/Users/$USER/go
-export PATH=$GOPATH/bin:$PATH
-
-# In your current terminal, to reload the session
-source ~/.bash_profile
-```
-
-### How come my notes aren't being rendered?
-You probably forgot to include front matter in your Markdown files. You can either setup [Obsidian](notes/obsidian.md) to do this for you or you need to manually define it. More details in [the 'how to edit' guide](notes/editing.md).
-
-### My custom domain isn't working!
-Walk through the steps in [the hosting guide](notes/hosting.md) again. Make sure you wait 30 min to 1 hour for changes to take effect.
-
-### How do I setup Google Analytics?
-You can edit it in `config.toml` and either use a V3 (UA-) or V4 (G-) tag.
-
-### How do I change the content on the home page?
-To edit the main home page, open `/content/_index.md`.
-
-### How do I change the colours?
-You can change the theme by editing `assets/custom.scss`. More details on customization and themeing can be found in the [customization guide](notes/config.md).
-
-### How do I add images?
-You can put images anywhere in the `/content` folder.
-
-```markdown
-Example image (source is in content/notes/images/example.png)
-
-```
-
-### My Interactive Graph and Backlinks aren't up to date
-By default, the `linkIndex.json` (which Quartz needs to generate the Interactive Graph and Backlinks) are not regenerated locally. To set that up, see the guide on [local editing](notes/editing.md)
-
-### Can I use React/Vue/some other framework?
-Not out of the box. You could probably make it work by editing `/layouts/_default/single.html` but that's not what Quartz is designed to work with. 99% of things you are trying to do with those frameworks you can accomplish perfectly fine using just vanilla HTML/CSS/JS.
-
-## Still Stuck?
-Quartz isn't perfect! If you're still having troubles, file an issue in the GitHub repo with as much information as you can reasonably provide. Alternatively, you can message me on [Twitter](https://twitter.com/_jzhao) and I'll try to get back to you as soon as I can.
-
-🐛 [Submit an Issue](https://github.com/jackyzha0/quartz/issues)
\ No newline at end of file
diff --git a/content/private/private-note.md b/content/private/private-note.md
deleted file mode 100644
index 6930c102c..000000000
--- a/content/private/private-note.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-title: "Private Stuff"
----
-
-This page doesn't get published!
\ No newline at end of file
diff --git a/content/publish.css b/content/publish.css
new file mode 100644
index 000000000..a2976236c
--- /dev/null
+++ b/content/publish.css
@@ -0,0 +1,121 @@
+@import url('https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,900;1,900&family=Poppins:ital,wght@0,300;0,700;1,300;1,500;1,700&display=swap');
+
+:root {
+ --text-accent: rgb(238, 27, 231);
+ --background-primary-alt: #000;
+}
+.theme-dark {
+ --text-accent: rgb(238, 27, 231);
+ --background-primary-alt: #000;
+}
+
+html {
+ font-size: 16px;
+}
+
+body.theme-dark {
+ color: #fff;
+ width: 100%;
+ height: 100%;
+ margin: 0;
+ padding: 0;
+ font-size: .75rem;
+ background: #000;
+ box-sizing: border-box;
+ font-family: "Poppins", sans-serif;
+ font-weight: 500;
+ line-height: 1em;
+ font-smoothing: antialiased;
+ text-size-adjust: 100%;
+ -ms-text-size-adjust: 100%;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-text-size-adjust: 100%;
+}
+
+body.theme-dark h1,
+body.theme-dark h2,
+body.theme-dark h3,
+body.theme-dark h4,
+body.theme-dark h5,
+body.theme-dark h6,
+body.theme-dark .page-header {
+ font-family: 'Playfair Display', serif;
+ margin-top: 45px;
+ margin-bottom: 25px;
+}
+
+.page-header {
+ font-size: 2.5rem;
+}
+
+.markdown-preview-view h1 {
+ font-size: 32px;
+ font-family: 'Playfair Display', sans-serif;
+ font-weight: 500;
+ line-height: 1.5;
+}
+
+.markdown-preview-view {
+ font-size: 16px;
+ line-height: 26px;
+ font-family: 'Poppins', sans-serif;
+}
+
+.markdown-preview-view .internal-link.is-unresolved {
+ opacity: .75;
+}
+.published-container.is-readable-line-width .site-body {
+ justify-content: initial;
+}
+
+.site-body-left-column-site-name {
+ padding-left: 60px;
+ position: relative;
+}
+
+.site-body-left-column {
+ flex: 0 0 330px;
+}
+
+.published-container.is-readable-line-width .site-body-center-column {
+ flex: 0 1 940px;
+}
+
+.site-body-left-column-site-name:before {
+ content: '';
+ display: block;
+ width: 30px;
+ height: 30px;
+ background: url(https://overment.com/images/logo-icon.svg);
+ background-size: cover;
+ position: absolute;
+ left: 20px;
+ top: 11px;
+}
+
+.has-navigation .site-body-left-column {
+ background: #000;
+}
+
+img[alt="overment"] { width: 200px; margin: 0 auto; display: block; }
+
+
+
+@media (max-width: 1024px) {
+ .site-body-left-column-site-name:before {
+ top: 0;
+ }
+ body.theme-dark {
+ font-size: 1.2rem;
+ }
+
+ h1, h2, h3, h4, h5, h6, {
+ margin-top: 25px;
+ }
+
+ .markdown-preview-view {
+ font-size: 1.3rem;
+ line-height: 1.7rem;
+ }
+}
\ No newline at end of file
diff --git a/content/templates/post.md b/content/templates/post.md
deleted file mode 100644
index c2a9b3376..000000000
--- a/content/templates/post.md
+++ /dev/null
@@ -1,3 +0,0 @@
----
-title: "{{title}}"
----
diff --git a/data/config.yaml b/data/config.yaml
index e33c32939..a7866ed79 100644
--- a/data/config.yaml
+++ b/data/config.yaml
@@ -7,7 +7,7 @@ description:
Host your second brain and digital garden for free. Quartz features extremely fast full-text search,
Wikilink support, backlinks, local graph, tags, and link previews.
page_title:
- "🪴 Quartz 3.2"
+ "brain.overment.com"
links:
- link_name: Twitter
link: https://twitter.com/_jzhao
diff --git a/layouts/_default/single.html b/layouts/_default/single.html
index 88a859c3b..70293826d 100644
--- a/layouts/_default/single.html
+++ b/layouts/_default/single.html
@@ -7,7 +7,7 @@
+
+
+`
+ doc, err := goquery.NewDocumentFromReader(strings.NewReader(html))
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ // By default, the selector string selects all matching nodes
+ multiSel := doc.Find("div")
+ fmt.Println(multiSel.Text())
+
+ // Using goquery.Single, only the first match is selected
+ singleSel := doc.FindMatcher(goquery.Single("div"))
+ fmt.Println(singleSel.Text())
+
+ // Output:
+ // 123
+ // 1
+}
diff --git a/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/expand.go b/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/expand.go
new file mode 100644
index 000000000..7caade531
--- /dev/null
+++ b/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/expand.go
@@ -0,0 +1,70 @@
+package goquery
+
+import "golang.org/x/net/html"
+
+// Add adds the selector string's matching nodes to those in the current
+// selection and returns a new Selection object.
+// The selector string is run in the context of the document of the current
+// Selection object.
+func (s *Selection) Add(selector string) *Selection {
+ return s.AddNodes(findWithMatcher([]*html.Node{s.document.rootNode}, compileMatcher(selector))...)
+}
+
+// AddMatcher adds the matcher's matching nodes to those in the current
+// selection and returns a new Selection object.
+// The matcher is run in the context of the document of the current
+// Selection object.
+func (s *Selection) AddMatcher(m Matcher) *Selection {
+ return s.AddNodes(findWithMatcher([]*html.Node{s.document.rootNode}, m)...)
+}
+
+// AddSelection adds the specified Selection object's nodes to those in the
+// current selection and returns a new Selection object.
+func (s *Selection) AddSelection(sel *Selection) *Selection {
+ if sel == nil {
+ return s.AddNodes()
+ }
+ return s.AddNodes(sel.Nodes...)
+}
+
+// Union is an alias for AddSelection.
+func (s *Selection) Union(sel *Selection) *Selection {
+ return s.AddSelection(sel)
+}
+
+// AddNodes adds the specified nodes to those in the
+// current selection and returns a new Selection object.
+func (s *Selection) AddNodes(nodes ...*html.Node) *Selection {
+ return pushStack(s, appendWithoutDuplicates(s.Nodes, nodes, nil))
+}
+
+// AndSelf adds the previous set of elements on the stack to the current set.
+// It returns a new Selection object containing the current Selection combined
+// with the previous one.
+// Deprecated: This function has been deprecated and is now an alias for AddBack().
+func (s *Selection) AndSelf() *Selection {
+ return s.AddBack()
+}
+
+// AddBack adds the previous set of elements on the stack to the current set.
+// It returns a new Selection object containing the current Selection combined
+// with the previous one.
+func (s *Selection) AddBack() *Selection {
+ return s.AddSelection(s.prevSel)
+}
+
+// AddBackFiltered reduces the previous set of elements on the stack to those that
+// match the selector string, and adds them to the current set.
+// It returns a new Selection object containing the current Selection combined
+// with the filtered previous one
+func (s *Selection) AddBackFiltered(selector string) *Selection {
+ return s.AddSelection(s.prevSel.Filter(selector))
+}
+
+// AddBackMatcher reduces the previous set of elements on the stack to those that match
+// the mateher, and adds them to the curernt set.
+// It returns a new Selection object containing the current Selection combined
+// with the filtered previous one
+func (s *Selection) AddBackMatcher(m Matcher) *Selection {
+ return s.AddSelection(s.prevSel.FilterMatcher(m))
+}
diff --git a/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/expand_test.go b/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/expand_test.go
new file mode 100644
index 000000000..c034dc62a
--- /dev/null
+++ b/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/expand_test.go
@@ -0,0 +1,118 @@
+package goquery
+
+import (
+ "testing"
+)
+
+func TestAdd(t *testing.T) {
+ sel := Doc().Find("div.row-fluid").Add("a")
+ assertLength(t, sel.Nodes, 19)
+}
+
+func TestAddInvalid(t *testing.T) {
+ sel1 := Doc().Find("div.row-fluid")
+ sel2 := sel1.Add("")
+ assertLength(t, sel1.Nodes, 9)
+ assertLength(t, sel2.Nodes, 9)
+ if sel1 == sel2 {
+ t.Errorf("selections should not be the same")
+ }
+}
+
+func TestAddRollback(t *testing.T) {
+ sel := Doc().Find(".pvk-content")
+ sel2 := sel.Add("a").End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestAddSelection(t *testing.T) {
+ sel := Doc().Find("div.row-fluid")
+ sel2 := Doc().Find("a")
+ sel = sel.AddSelection(sel2)
+ assertLength(t, sel.Nodes, 19)
+}
+
+func TestAddSelectionNil(t *testing.T) {
+ sel := Doc().Find("div.row-fluid")
+ assertLength(t, sel.Nodes, 9)
+
+ sel = sel.AddSelection(nil)
+ assertLength(t, sel.Nodes, 9)
+}
+
+func TestAddSelectionRollback(t *testing.T) {
+ sel := Doc().Find(".pvk-content")
+ sel2 := sel.Find("a")
+ sel2 = sel.AddSelection(sel2).End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestAddNodes(t *testing.T) {
+ sel := Doc().Find("div.pvk-gutter")
+ sel2 := Doc().Find(".pvk-content")
+ sel = sel.AddNodes(sel2.Nodes...)
+ assertLength(t, sel.Nodes, 9)
+}
+
+func TestAddNodesNone(t *testing.T) {
+ sel := Doc().Find("div.pvk-gutter").AddNodes()
+ assertLength(t, sel.Nodes, 6)
+}
+
+func TestAddNodesRollback(t *testing.T) {
+ sel := Doc().Find(".pvk-content")
+ sel2 := sel.Find("a")
+ sel2 = sel.AddNodes(sel2.Nodes...).End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestAddNodesBig(t *testing.T) {
+ doc := DocW()
+ sel := doc.Find("li")
+ assertLength(t, sel.Nodes, 373)
+ sel2 := doc.Find("xyz")
+ assertLength(t, sel2.Nodes, 0)
+
+ nodes := sel.Nodes
+ sel2 = sel2.AddNodes(nodes...)
+ assertLength(t, sel2.Nodes, 373)
+ nodes2 := append(nodes, nodes...)
+ sel2 = sel2.End().AddNodes(nodes2...)
+ assertLength(t, sel2.Nodes, 373)
+ nodes3 := append(nodes2, nodes...)
+ sel2 = sel2.End().AddNodes(nodes3...)
+ assertLength(t, sel2.Nodes, 373)
+}
+
+func TestAndSelf(t *testing.T) {
+ sel := Doc().Find(".span12").Last().AndSelf()
+ assertLength(t, sel.Nodes, 2)
+}
+
+func TestAndSelfRollback(t *testing.T) {
+ sel := Doc().Find(".pvk-content")
+ sel2 := sel.Find("a").AndSelf().End().End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestAddBack(t *testing.T) {
+ sel := Doc().Find(".span12").Last().AddBack()
+ assertLength(t, sel.Nodes, 2)
+}
+
+func TestAddBackRollback(t *testing.T) {
+ sel := Doc().Find(".pvk-content")
+ sel2 := sel.Find("a").AddBack().End().End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestAddBackFiltered(t *testing.T) {
+ sel := Doc().Find(".span12, .footer").Find("h1").AddBackFiltered(".footer")
+ assertLength(t, sel.Nodes, 2)
+}
+
+func TestAddBackFilteredRollback(t *testing.T) {
+ sel := Doc().Find(".span12, .footer")
+ sel2 := sel.Find("h1").AddBackFiltered(".footer").End().End()
+ assertEqual(t, sel, sel2)
+}
diff --git a/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/filter.go b/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/filter.go
new file mode 100644
index 000000000..9138ffb33
--- /dev/null
+++ b/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/filter.go
@@ -0,0 +1,163 @@
+package goquery
+
+import "golang.org/x/net/html"
+
+// Filter reduces the set of matched elements to those that match the selector string.
+// It returns a new Selection object for this subset of matching elements.
+func (s *Selection) Filter(selector string) *Selection {
+ return s.FilterMatcher(compileMatcher(selector))
+}
+
+// FilterMatcher reduces the set of matched elements to those that match
+// the given matcher. It returns a new Selection object for this subset
+// of matching elements.
+func (s *Selection) FilterMatcher(m Matcher) *Selection {
+ return pushStack(s, winnow(s, m, true))
+}
+
+// Not removes elements from the Selection that match the selector string.
+// It returns a new Selection object with the matching elements removed.
+func (s *Selection) Not(selector string) *Selection {
+ return s.NotMatcher(compileMatcher(selector))
+}
+
+// NotMatcher removes elements from the Selection that match the given matcher.
+// It returns a new Selection object with the matching elements removed.
+func (s *Selection) NotMatcher(m Matcher) *Selection {
+ return pushStack(s, winnow(s, m, false))
+}
+
+// FilterFunction reduces the set of matched elements to those that pass the function's test.
+// It returns a new Selection object for this subset of elements.
+func (s *Selection) FilterFunction(f func(int, *Selection) bool) *Selection {
+ return pushStack(s, winnowFunction(s, f, true))
+}
+
+// NotFunction removes elements from the Selection that pass the function's test.
+// It returns a new Selection object with the matching elements removed.
+func (s *Selection) NotFunction(f func(int, *Selection) bool) *Selection {
+ return pushStack(s, winnowFunction(s, f, false))
+}
+
+// FilterNodes reduces the set of matched elements to those that match the specified nodes.
+// It returns a new Selection object for this subset of elements.
+func (s *Selection) FilterNodes(nodes ...*html.Node) *Selection {
+ return pushStack(s, winnowNodes(s, nodes, true))
+}
+
+// NotNodes removes elements from the Selection that match the specified nodes.
+// It returns a new Selection object with the matching elements removed.
+func (s *Selection) NotNodes(nodes ...*html.Node) *Selection {
+ return pushStack(s, winnowNodes(s, nodes, false))
+}
+
+// FilterSelection reduces the set of matched elements to those that match a
+// node in the specified Selection object.
+// It returns a new Selection object for this subset of elements.
+func (s *Selection) FilterSelection(sel *Selection) *Selection {
+ if sel == nil {
+ return pushStack(s, winnowNodes(s, nil, true))
+ }
+ return pushStack(s, winnowNodes(s, sel.Nodes, true))
+}
+
+// NotSelection removes elements from the Selection that match a node in the specified
+// Selection object. It returns a new Selection object with the matching elements removed.
+func (s *Selection) NotSelection(sel *Selection) *Selection {
+ if sel == nil {
+ return pushStack(s, winnowNodes(s, nil, false))
+ }
+ return pushStack(s, winnowNodes(s, sel.Nodes, false))
+}
+
+// Intersection is an alias for FilterSelection.
+func (s *Selection) Intersection(sel *Selection) *Selection {
+ return s.FilterSelection(sel)
+}
+
+// Has reduces the set of matched elements to those that have a descendant
+// that matches the selector.
+// It returns a new Selection object with the matching elements.
+func (s *Selection) Has(selector string) *Selection {
+ return s.HasSelection(s.document.Find(selector))
+}
+
+// HasMatcher reduces the set of matched elements to those that have a descendant
+// that matches the matcher.
+// It returns a new Selection object with the matching elements.
+func (s *Selection) HasMatcher(m Matcher) *Selection {
+ return s.HasSelection(s.document.FindMatcher(m))
+}
+
+// HasNodes reduces the set of matched elements to those that have a
+// descendant that matches one of the nodes.
+// It returns a new Selection object with the matching elements.
+func (s *Selection) HasNodes(nodes ...*html.Node) *Selection {
+ return s.FilterFunction(func(_ int, sel *Selection) bool {
+ // Add all nodes that contain one of the specified nodes
+ for _, n := range nodes {
+ if sel.Contains(n) {
+ return true
+ }
+ }
+ return false
+ })
+}
+
+// HasSelection reduces the set of matched elements to those that have a
+// descendant that matches one of the nodes of the specified Selection object.
+// It returns a new Selection object with the matching elements.
+func (s *Selection) HasSelection(sel *Selection) *Selection {
+ if sel == nil {
+ return s.HasNodes()
+ }
+ return s.HasNodes(sel.Nodes...)
+}
+
+// End ends the most recent filtering operation in the current chain and
+// returns the set of matched elements to its previous state.
+func (s *Selection) End() *Selection {
+ if s.prevSel != nil {
+ return s.prevSel
+ }
+ return newEmptySelection(s.document)
+}
+
+// Filter based on the matcher, and the indicator to keep (Filter) or
+// to get rid of (Not) the matching elements.
+func winnow(sel *Selection, m Matcher, keep bool) []*html.Node {
+ // Optimize if keep is requested
+ if keep {
+ return m.Filter(sel.Nodes)
+ }
+ // Use grep
+ return grep(sel, func(i int, s *Selection) bool {
+ return !m.Match(s.Get(0))
+ })
+}
+
+// Filter based on an array of nodes, and the indicator to keep (Filter) or
+// to get rid of (Not) the matching elements.
+func winnowNodes(sel *Selection, nodes []*html.Node, keep bool) []*html.Node {
+ if len(nodes)+len(sel.Nodes) < minNodesForSet {
+ return grep(sel, func(i int, s *Selection) bool {
+ return isInSlice(nodes, s.Get(0)) == keep
+ })
+ }
+
+ set := make(map[*html.Node]bool)
+ for _, n := range nodes {
+ set[n] = true
+ }
+ return grep(sel, func(i int, s *Selection) bool {
+ return set[s.Get(0)] == keep
+ })
+}
+
+// Filter based on a function test, and the indicator to keep (Filter) or
+// to get rid of (Not) the matching elements.
+func winnowFunction(sel *Selection, f func(int, *Selection) bool, keep bool) []*html.Node {
+ return grep(sel, func(i int, s *Selection) bool {
+ return f(i, s) == keep
+ })
+}
diff --git a/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/filter_test.go b/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/filter_test.go
new file mode 100644
index 000000000..f663c08f6
--- /dev/null
+++ b/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/filter_test.go
@@ -0,0 +1,206 @@
+package goquery
+
+import (
+ "testing"
+)
+
+func TestFilter(t *testing.T) {
+ sel := Doc().Find(".span12").Filter(".alert")
+ assertLength(t, sel.Nodes, 1)
+}
+
+func TestFilterNone(t *testing.T) {
+ sel := Doc().Find(".span12").Filter(".zzalert")
+ assertLength(t, sel.Nodes, 0)
+}
+
+func TestFilterInvalid(t *testing.T) {
+ sel := Doc().Find(".span12").Filter("")
+ assertLength(t, sel.Nodes, 0)
+}
+
+func TestFilterRollback(t *testing.T) {
+ sel := Doc().Find(".pvk-content")
+ sel2 := sel.Filter(".alert").End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestFilterFunction(t *testing.T) {
+ sel := Doc().Find(".pvk-content").FilterFunction(func(i int, s *Selection) bool {
+ return i > 0
+ })
+ assertLength(t, sel.Nodes, 2)
+}
+
+func TestFilterFunctionRollback(t *testing.T) {
+ sel := Doc().Find(".pvk-content")
+ sel2 := sel.FilterFunction(func(i int, s *Selection) bool {
+ return i > 0
+ }).End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestFilterNode(t *testing.T) {
+ sel := Doc().Find(".pvk-content")
+ sel2 := sel.FilterNodes(sel.Nodes[2])
+ assertLength(t, sel2.Nodes, 1)
+}
+
+func TestFilterNodeRollback(t *testing.T) {
+ sel := Doc().Find(".pvk-content")
+ sel2 := sel.FilterNodes(sel.Nodes[2]).End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestFilterSelection(t *testing.T) {
+ sel := Doc().Find(".link")
+ sel2 := Doc().Find("a[ng-click]")
+ sel3 := sel.FilterSelection(sel2)
+ assertLength(t, sel3.Nodes, 1)
+}
+
+func TestFilterSelectionRollback(t *testing.T) {
+ sel := Doc().Find(".link")
+ sel2 := Doc().Find("a[ng-click]")
+ sel2 = sel.FilterSelection(sel2).End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestFilterSelectionNil(t *testing.T) {
+ var sel2 *Selection
+
+ sel := Doc().Find(".link")
+ sel3 := sel.FilterSelection(sel2)
+ assertLength(t, sel3.Nodes, 0)
+}
+
+func TestNot(t *testing.T) {
+ sel := Doc().Find(".span12").Not(".alert")
+ assertLength(t, sel.Nodes, 1)
+}
+
+func TestNotInvalid(t *testing.T) {
+ sel := Doc().Find(".span12").Not("")
+ assertLength(t, sel.Nodes, 2)
+}
+
+func TestNotRollback(t *testing.T) {
+ sel := Doc().Find(".span12")
+ sel2 := sel.Not(".alert").End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestNotNone(t *testing.T) {
+ sel := Doc().Find(".span12").Not(".zzalert")
+ assertLength(t, sel.Nodes, 2)
+}
+
+func TestNotFunction(t *testing.T) {
+ sel := Doc().Find(".pvk-content").NotFunction(func(i int, s *Selection) bool {
+ return i > 0
+ })
+ assertLength(t, sel.Nodes, 1)
+}
+
+func TestNotFunctionRollback(t *testing.T) {
+ sel := Doc().Find(".pvk-content")
+ sel2 := sel.NotFunction(func(i int, s *Selection) bool {
+ return i > 0
+ }).End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestNotNode(t *testing.T) {
+ sel := Doc().Find(".pvk-content")
+ sel2 := sel.NotNodes(sel.Nodes[2])
+ assertLength(t, sel2.Nodes, 2)
+}
+
+func TestNotNodeRollback(t *testing.T) {
+ sel := Doc().Find(".pvk-content")
+ sel2 := sel.NotNodes(sel.Nodes[2]).End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestNotSelection(t *testing.T) {
+ sel := Doc().Find(".link")
+ sel2 := Doc().Find("a[ng-click]")
+ sel3 := sel.NotSelection(sel2)
+ assertLength(t, sel3.Nodes, 6)
+}
+
+func TestNotSelectionRollback(t *testing.T) {
+ sel := Doc().Find(".link")
+ sel2 := Doc().Find("a[ng-click]")
+ sel2 = sel.NotSelection(sel2).End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestIntersection(t *testing.T) {
+ sel := Doc().Find(".pvk-gutter")
+ sel2 := Doc().Find("div").Intersection(sel)
+ assertLength(t, sel2.Nodes, 6)
+}
+
+func TestIntersectionRollback(t *testing.T) {
+ sel := Doc().Find(".pvk-gutter")
+ sel2 := Doc().Find("div")
+ sel2 = sel.Intersection(sel2).End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestHas(t *testing.T) {
+ sel := Doc().Find(".container-fluid").Has(".center-content")
+ assertLength(t, sel.Nodes, 2)
+ // Has() returns the high-level .container-fluid div, and the one that is the immediate parent of center-content
+}
+
+func TestHasInvalid(t *testing.T) {
+ sel := Doc().Find(".container-fluid").Has("")
+ assertLength(t, sel.Nodes, 0)
+}
+
+func TestHasRollback(t *testing.T) {
+ sel := Doc().Find(".container-fluid")
+ sel2 := sel.Has(".center-content").End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestHasNodes(t *testing.T) {
+ sel := Doc().Find(".container-fluid")
+ sel2 := Doc().Find(".center-content")
+ sel = sel.HasNodes(sel2.Nodes...)
+ assertLength(t, sel.Nodes, 2)
+ // Has() returns the high-level .container-fluid div, and the one that is the immediate parent of center-content
+}
+
+func TestHasNodesRollback(t *testing.T) {
+ sel := Doc().Find(".container-fluid")
+ sel2 := Doc().Find(".center-content")
+ sel2 = sel.HasNodes(sel2.Nodes...).End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestHasSelection(t *testing.T) {
+ sel := Doc().Find("p")
+ sel2 := Doc().Find("small")
+ sel = sel.HasSelection(sel2)
+ assertLength(t, sel.Nodes, 1)
+}
+
+func TestHasSelectionRollback(t *testing.T) {
+ sel := Doc().Find("p")
+ sel2 := Doc().Find("small")
+ sel2 = sel.HasSelection(sel2).End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestEnd(t *testing.T) {
+ sel := Doc().Find("p").Has("small").End()
+ assertLength(t, sel.Nodes, 4)
+}
+
+func TestEndToTop(t *testing.T) {
+ sel := Doc().Find("p").Has("small").End().End().End()
+ assertLength(t, sel.Nodes, 0)
+}
diff --git a/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/go.mod b/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/go.mod
new file mode 100644
index 000000000..4b5a30963
--- /dev/null
+++ b/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/go.mod
@@ -0,0 +1,8 @@
+module github.com/PuerkitoBio/goquery
+
+require (
+ github.com/andybalholm/cascadia v1.3.1
+ golang.org/x/net v0.0.0-20210916014120-12bc252f5db8
+)
+
+go 1.13
diff --git a/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/go.sum b/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/go.sum
new file mode 100644
index 000000000..167f12d2d
--- /dev/null
+++ b/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/go.sum
@@ -0,0 +1,9 @@
+github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c=
+github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA=
+golang.org/x/net v0.0.0-20210916014120-12bc252f5db8 h1:/6y1LfuqNuQdHAm0jjtPtgRcxIxjVZgm5OTu8/QhZvk=
+golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
diff --git a/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/iteration.go b/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/iteration.go
new file mode 100644
index 000000000..e246f2e0e
--- /dev/null
+++ b/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/iteration.go
@@ -0,0 +1,39 @@
+package goquery
+
+// Each iterates over a Selection object, executing a function for each
+// matched element. It returns the current Selection object. The function
+// f is called for each element in the selection with the index of the
+// element in that selection starting at 0, and a *Selection that contains
+// only that element.
+func (s *Selection) Each(f func(int, *Selection)) *Selection {
+ for i, n := range s.Nodes {
+ f(i, newSingleSelection(n, s.document))
+ }
+ return s
+}
+
+// EachWithBreak iterates over a Selection object, executing a function for each
+// matched element. It is identical to Each except that it is possible to break
+// out of the loop by returning false in the callback function. It returns the
+// current Selection object.
+func (s *Selection) EachWithBreak(f func(int, *Selection) bool) *Selection {
+ for i, n := range s.Nodes {
+ if !f(i, newSingleSelection(n, s.document)) {
+ return s
+ }
+ }
+ return s
+}
+
+// Map passes each element in the current matched set through a function,
+// producing a slice of string holding the returned values. The function
+// f is called for each element in the selection with the index of the
+// element in that selection starting at 0, and a *Selection that contains
+// only that element.
+func (s *Selection) Map(f func(int, *Selection) string) (result []string) {
+ for i, n := range s.Nodes {
+ result = append(result, f(i, newSingleSelection(n, s.document)))
+ }
+
+ return result
+}
diff --git a/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/iteration_test.go b/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/iteration_test.go
new file mode 100644
index 000000000..9b6aafb7b
--- /dev/null
+++ b/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/iteration_test.go
@@ -0,0 +1,88 @@
+package goquery
+
+import (
+ "testing"
+
+ "golang.org/x/net/html"
+)
+
+func TestEach(t *testing.T) {
+ var cnt int
+
+ sel := Doc().Find(".hero-unit .row-fluid").Each(func(i int, n *Selection) {
+ cnt++
+ t.Logf("At index %v, node %v", i, n.Nodes[0].Data)
+ }).Find("a")
+
+ if cnt != 4 {
+ t.Errorf("Expected Each() to call function 4 times, got %v times.", cnt)
+ }
+ assertLength(t, sel.Nodes, 6)
+}
+
+func TestEachWithBreak(t *testing.T) {
+ var cnt int
+
+ sel := Doc().Find(".hero-unit .row-fluid").EachWithBreak(func(i int, n *Selection) bool {
+ cnt++
+ t.Logf("At index %v, node %v", i, n.Nodes[0].Data)
+ return false
+ }).Find("a")
+
+ if cnt != 1 {
+ t.Errorf("Expected Each() to call function 1 time, got %v times.", cnt)
+ }
+ assertLength(t, sel.Nodes, 6)
+}
+
+func TestEachEmptySelection(t *testing.T) {
+ var cnt int
+
+ sel := Doc().Find("zzzz")
+ sel.Each(func(i int, n *Selection) {
+ cnt++
+ })
+ if cnt > 0 {
+ t.Error("Expected Each() to not be called on empty Selection.")
+ }
+ sel2 := sel.Find("div")
+ assertLength(t, sel2.Nodes, 0)
+}
+
+func TestMap(t *testing.T) {
+ sel := Doc().Find(".pvk-content")
+ vals := sel.Map(func(i int, s *Selection) string {
+ n := s.Get(0)
+ if n.Type == html.ElementNode {
+ return n.Data
+ }
+ return ""
+ })
+ for _, v := range vals {
+ if v != "div" {
+ t.Error("Expected Map array result to be all 'div's.")
+ }
+ }
+ if len(vals) != 3 {
+ t.Errorf("Expected Map array result to have a length of 3, found %v.", len(vals))
+ }
+}
+
+func TestForRange(t *testing.T) {
+ sel := Doc().Find(".pvk-content")
+ initLen := sel.Length()
+ for i := range sel.Nodes {
+ single := sel.Eq(i)
+ //h, err := single.Html()
+ //if err != nil {
+ // t.Fatal(err)
+ //}
+ //fmt.Println(i, h)
+ if single.Length() != 1 {
+ t.Errorf("%d: expected length of 1, got %d", i, single.Length())
+ }
+ }
+ if sel.Length() != initLen {
+ t.Errorf("expected initial selection to still have length %d, got %d", initLen, sel.Length())
+ }
+}
diff --git a/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/manipulation.go b/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/manipulation.go
new file mode 100644
index 000000000..35febf118
--- /dev/null
+++ b/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/manipulation.go
@@ -0,0 +1,679 @@
+package goquery
+
+import (
+ "strings"
+
+ "golang.org/x/net/html"
+)
+
+// After applies the selector from the root document and inserts the matched elements
+// after the elements in the set of matched elements.
+//
+// If one of the matched elements in the selection is not currently in the
+// document, it's impossible to insert nodes after it, so it will be ignored.
+//
+// This follows the same rules as Selection.Append.
+func (s *Selection) After(selector string) *Selection {
+ return s.AfterMatcher(compileMatcher(selector))
+}
+
+// AfterMatcher applies the matcher from the root document and inserts the matched elements
+// after the elements in the set of matched elements.
+//
+// If one of the matched elements in the selection is not currently in the
+// document, it's impossible to insert nodes after it, so it will be ignored.
+//
+// This follows the same rules as Selection.Append.
+func (s *Selection) AfterMatcher(m Matcher) *Selection {
+ return s.AfterNodes(m.MatchAll(s.document.rootNode)...)
+}
+
+// AfterSelection inserts the elements in the selection after each element in the set of matched
+// elements.
+//
+// This follows the same rules as Selection.Append.
+func (s *Selection) AfterSelection(sel *Selection) *Selection {
+ return s.AfterNodes(sel.Nodes...)
+}
+
+// AfterHtml parses the html and inserts it after the set of matched elements.
+//
+// This follows the same rules as Selection.Append.
+func (s *Selection) AfterHtml(htmlStr string) *Selection {
+ return s.eachNodeHtml(htmlStr, true, func(node *html.Node, nodes []*html.Node) {
+ nextSibling := node.NextSibling
+ for _, n := range nodes {
+ if node.Parent != nil {
+ node.Parent.InsertBefore(n, nextSibling)
+ }
+ }
+ })
+}
+
+// AfterNodes inserts the nodes after each element in the set of matched elements.
+//
+// This follows the same rules as Selection.Append.
+func (s *Selection) AfterNodes(ns ...*html.Node) *Selection {
+ return s.manipulateNodes(ns, true, func(sn *html.Node, n *html.Node) {
+ if sn.Parent != nil {
+ sn.Parent.InsertBefore(n, sn.NextSibling)
+ }
+ })
+}
+
+// Append appends the elements specified by the selector to the end of each element
+// in the set of matched elements, following those rules:
+//
+// 1) The selector is applied to the root document.
+//
+// 2) Elements that are part of the document will be moved to the new location.
+//
+// 3) If there are multiple locations to append to, cloned nodes will be
+// appended to all target locations except the last one, which will be moved
+// as noted in (2).
+func (s *Selection) Append(selector string) *Selection {
+ return s.AppendMatcher(compileMatcher(selector))
+}
+
+// AppendMatcher appends the elements specified by the matcher to the end of each element
+// in the set of matched elements.
+//
+// This follows the same rules as Selection.Append.
+func (s *Selection) AppendMatcher(m Matcher) *Selection {
+ return s.AppendNodes(m.MatchAll(s.document.rootNode)...)
+}
+
+// AppendSelection appends the elements in the selection to the end of each element
+// in the set of matched elements.
+//
+// This follows the same rules as Selection.Append.
+func (s *Selection) AppendSelection(sel *Selection) *Selection {
+ return s.AppendNodes(sel.Nodes...)
+}
+
+// AppendHtml parses the html and appends it to the set of matched elements.
+func (s *Selection) AppendHtml(htmlStr string) *Selection {
+ return s.eachNodeHtml(htmlStr, false, func(node *html.Node, nodes []*html.Node) {
+ for _, n := range nodes {
+ node.AppendChild(n)
+ }
+ })
+}
+
+// AppendNodes appends the specified nodes to each node in the set of matched elements.
+//
+// This follows the same rules as Selection.Append.
+func (s *Selection) AppendNodes(ns ...*html.Node) *Selection {
+ return s.manipulateNodes(ns, false, func(sn *html.Node, n *html.Node) {
+ sn.AppendChild(n)
+ })
+}
+
+// Before inserts the matched elements before each element in the set of matched elements.
+//
+// This follows the same rules as Selection.Append.
+func (s *Selection) Before(selector string) *Selection {
+ return s.BeforeMatcher(compileMatcher(selector))
+}
+
+// BeforeMatcher inserts the matched elements before each element in the set of matched elements.
+//
+// This follows the same rules as Selection.Append.
+func (s *Selection) BeforeMatcher(m Matcher) *Selection {
+ return s.BeforeNodes(m.MatchAll(s.document.rootNode)...)
+}
+
+// BeforeSelection inserts the elements in the selection before each element in the set of matched
+// elements.
+//
+// This follows the same rules as Selection.Append.
+func (s *Selection) BeforeSelection(sel *Selection) *Selection {
+ return s.BeforeNodes(sel.Nodes...)
+}
+
+// BeforeHtml parses the html and inserts it before the set of matched elements.
+//
+// This follows the same rules as Selection.Append.
+func (s *Selection) BeforeHtml(htmlStr string) *Selection {
+ return s.eachNodeHtml(htmlStr, true, func(node *html.Node, nodes []*html.Node) {
+ for _, n := range nodes {
+ if node.Parent != nil {
+ node.Parent.InsertBefore(n, node)
+ }
+ }
+ })
+}
+
+// BeforeNodes inserts the nodes before each element in the set of matched elements.
+//
+// This follows the same rules as Selection.Append.
+func (s *Selection) BeforeNodes(ns ...*html.Node) *Selection {
+ return s.manipulateNodes(ns, false, func(sn *html.Node, n *html.Node) {
+ if sn.Parent != nil {
+ sn.Parent.InsertBefore(n, sn)
+ }
+ })
+}
+
+// Clone creates a deep copy of the set of matched nodes. The new nodes will not be
+// attached to the document.
+func (s *Selection) Clone() *Selection {
+ ns := newEmptySelection(s.document)
+ ns.Nodes = cloneNodes(s.Nodes)
+ return ns
+}
+
+// Empty removes all children nodes from the set of matched elements.
+// It returns the children nodes in a new Selection.
+func (s *Selection) Empty() *Selection {
+ var nodes []*html.Node
+
+ for _, n := range s.Nodes {
+ for c := n.FirstChild; c != nil; c = n.FirstChild {
+ n.RemoveChild(c)
+ nodes = append(nodes, c)
+ }
+ }
+
+ return pushStack(s, nodes)
+}
+
+// Prepend prepends the elements specified by the selector to each element in
+// the set of matched elements, following the same rules as Append.
+func (s *Selection) Prepend(selector string) *Selection {
+ return s.PrependMatcher(compileMatcher(selector))
+}
+
+// PrependMatcher prepends the elements specified by the matcher to each
+// element in the set of matched elements.
+//
+// This follows the same rules as Selection.Append.
+func (s *Selection) PrependMatcher(m Matcher) *Selection {
+ return s.PrependNodes(m.MatchAll(s.document.rootNode)...)
+}
+
+// PrependSelection prepends the elements in the selection to each element in
+// the set of matched elements.
+//
+// This follows the same rules as Selection.Append.
+func (s *Selection) PrependSelection(sel *Selection) *Selection {
+ return s.PrependNodes(sel.Nodes...)
+}
+
+// PrependHtml parses the html and prepends it to the set of matched elements.
+func (s *Selection) PrependHtml(htmlStr string) *Selection {
+ return s.eachNodeHtml(htmlStr, false, func(node *html.Node, nodes []*html.Node) {
+ firstChild := node.FirstChild
+ for _, n := range nodes {
+ node.InsertBefore(n, firstChild)
+ }
+ })
+}
+
+// PrependNodes prepends the specified nodes to each node in the set of
+// matched elements.
+//
+// This follows the same rules as Selection.Append.
+func (s *Selection) PrependNodes(ns ...*html.Node) *Selection {
+ return s.manipulateNodes(ns, true, func(sn *html.Node, n *html.Node) {
+ // sn.FirstChild may be nil, in which case this functions like
+ // sn.AppendChild()
+ sn.InsertBefore(n, sn.FirstChild)
+ })
+}
+
+// Remove removes the set of matched elements from the document.
+// It returns the same selection, now consisting of nodes not in the document.
+func (s *Selection) Remove() *Selection {
+ for _, n := range s.Nodes {
+ if n.Parent != nil {
+ n.Parent.RemoveChild(n)
+ }
+ }
+
+ return s
+}
+
+// RemoveFiltered removes from the current set of matched elements those that
+// match the selector filter. It returns the Selection of removed nodes.
+//
+// For example if the selection s contains "
", "
" and "
"
+// and s.RemoveFiltered("h2") is called, only the "
" node is removed
+// (and returned), while "
" and "
" are kept in the document.
+func (s *Selection) RemoveFiltered(selector string) *Selection {
+ return s.RemoveMatcher(compileMatcher(selector))
+}
+
+// RemoveMatcher removes from the current set of matched elements those that
+// match the Matcher filter. It returns the Selection of removed nodes.
+// See RemoveFiltered for additional information.
+func (s *Selection) RemoveMatcher(m Matcher) *Selection {
+ return s.FilterMatcher(m).Remove()
+}
+
+// ReplaceWith replaces each element in the set of matched elements with the
+// nodes matched by the given selector.
+// It returns the removed elements.
+//
+// This follows the same rules as Selection.Append.
+func (s *Selection) ReplaceWith(selector string) *Selection {
+ return s.ReplaceWithMatcher(compileMatcher(selector))
+}
+
+// ReplaceWithMatcher replaces each element in the set of matched elements with
+// the nodes matched by the given Matcher.
+// It returns the removed elements.
+//
+// This follows the same rules as Selection.Append.
+func (s *Selection) ReplaceWithMatcher(m Matcher) *Selection {
+ return s.ReplaceWithNodes(m.MatchAll(s.document.rootNode)...)
+}
+
+// ReplaceWithSelection replaces each element in the set of matched elements with
+// the nodes from the given Selection.
+// It returns the removed elements.
+//
+// This follows the same rules as Selection.Append.
+func (s *Selection) ReplaceWithSelection(sel *Selection) *Selection {
+ return s.ReplaceWithNodes(sel.Nodes...)
+}
+
+// ReplaceWithHtml replaces each element in the set of matched elements with
+// the parsed HTML.
+// It returns the removed elements.
+//
+// This follows the same rules as Selection.Append.
+func (s *Selection) ReplaceWithHtml(htmlStr string) *Selection {
+ s.eachNodeHtml(htmlStr, true, func(node *html.Node, nodes []*html.Node) {
+ nextSibling := node.NextSibling
+ for _, n := range nodes {
+ if node.Parent != nil {
+ node.Parent.InsertBefore(n, nextSibling)
+ }
+ }
+ })
+ return s.Remove()
+}
+
+// ReplaceWithNodes replaces each element in the set of matched elements with
+// the given nodes.
+// It returns the removed elements.
+//
+// This follows the same rules as Selection.Append.
+func (s *Selection) ReplaceWithNodes(ns ...*html.Node) *Selection {
+ s.AfterNodes(ns...)
+ return s.Remove()
+}
+
+// SetHtml sets the html content of each element in the selection to
+// specified html string.
+func (s *Selection) SetHtml(htmlStr string) *Selection {
+ for _, context := range s.Nodes {
+ for c := context.FirstChild; c != nil; c = context.FirstChild {
+ context.RemoveChild(c)
+ }
+ }
+ return s.eachNodeHtml(htmlStr, false, func(node *html.Node, nodes []*html.Node) {
+ for _, n := range nodes {
+ node.AppendChild(n)
+ }
+ })
+}
+
+// SetText sets the content of each element in the selection to specified content.
+// The provided text string is escaped.
+func (s *Selection) SetText(text string) *Selection {
+ return s.SetHtml(html.EscapeString(text))
+}
+
+// Unwrap removes the parents of the set of matched elements, leaving the matched
+// elements (and their siblings, if any) in their place.
+// It returns the original selection.
+func (s *Selection) Unwrap() *Selection {
+ s.Parent().Each(func(i int, ss *Selection) {
+ // For some reason, jquery allows unwrap to remove the element, so
+ // allowing it here too. Same for . Why it allows those elements to
+ // be unwrapped while not allowing body is a mystery to me.
+ if ss.Nodes[0].Data != "body" {
+ ss.ReplaceWithSelection(ss.Contents())
+ }
+ })
+
+ return s
+}
+
+// Wrap wraps each element in the set of matched elements inside the first
+// element matched by the given selector. The matched child is cloned before
+// being inserted into the document.
+//
+// It returns the original set of elements.
+func (s *Selection) Wrap(selector string) *Selection {
+ return s.WrapMatcher(compileMatcher(selector))
+}
+
+// WrapMatcher wraps each element in the set of matched elements inside the
+// first element matched by the given matcher. The matched child is cloned
+// before being inserted into the document.
+//
+// It returns the original set of elements.
+func (s *Selection) WrapMatcher(m Matcher) *Selection {
+ return s.wrapNodes(m.MatchAll(s.document.rootNode)...)
+}
+
+// WrapSelection wraps each element in the set of matched elements inside the
+// first element in the given Selection. The element is cloned before being
+// inserted into the document.
+//
+// It returns the original set of elements.
+func (s *Selection) WrapSelection(sel *Selection) *Selection {
+ return s.wrapNodes(sel.Nodes...)
+}
+
+// WrapHtml wraps each element in the set of matched elements inside the inner-
+// most child of the given HTML.
+//
+// It returns the original set of elements.
+func (s *Selection) WrapHtml(htmlStr string) *Selection {
+ nodesMap := make(map[string][]*html.Node)
+ for _, context := range s.Nodes {
+ var parent *html.Node
+ if context.Parent != nil {
+ parent = context.Parent
+ } else {
+ parent = &html.Node{Type: html.ElementNode}
+ }
+ nodes, found := nodesMap[nodeName(parent)]
+ if !found {
+ nodes = parseHtmlWithContext(htmlStr, parent)
+ nodesMap[nodeName(parent)] = nodes
+ }
+ newSingleSelection(context, s.document).wrapAllNodes(cloneNodes(nodes)...)
+ }
+ return s
+}
+
+// WrapNode wraps each element in the set of matched elements inside the inner-
+// most child of the given node. The given node is copied before being inserted
+// into the document.
+//
+// It returns the original set of elements.
+func (s *Selection) WrapNode(n *html.Node) *Selection {
+ return s.wrapNodes(n)
+}
+
+func (s *Selection) wrapNodes(ns ...*html.Node) *Selection {
+ s.Each(func(i int, ss *Selection) {
+ ss.wrapAllNodes(ns...)
+ })
+
+ return s
+}
+
+// WrapAll wraps a single HTML structure, matched by the given selector, around
+// all elements in the set of matched elements. The matched child is cloned
+// before being inserted into the document.
+//
+// It returns the original set of elements.
+func (s *Selection) WrapAll(selector string) *Selection {
+ return s.WrapAllMatcher(compileMatcher(selector))
+}
+
+// WrapAllMatcher wraps a single HTML structure, matched by the given Matcher,
+// around all elements in the set of matched elements. The matched child is
+// cloned before being inserted into the document.
+//
+// It returns the original set of elements.
+func (s *Selection) WrapAllMatcher(m Matcher) *Selection {
+ return s.wrapAllNodes(m.MatchAll(s.document.rootNode)...)
+}
+
+// WrapAllSelection wraps a single HTML structure, the first node of the given
+// Selection, around all elements in the set of matched elements. The matched
+// child is cloned before being inserted into the document.
+//
+// It returns the original set of elements.
+func (s *Selection) WrapAllSelection(sel *Selection) *Selection {
+ return s.wrapAllNodes(sel.Nodes...)
+}
+
+// WrapAllHtml wraps the given HTML structure around all elements in the set of
+// matched elements. The matched child is cloned before being inserted into the
+// document.
+//
+// It returns the original set of elements.
+func (s *Selection) WrapAllHtml(htmlStr string) *Selection {
+ var context *html.Node
+ var nodes []*html.Node
+ if len(s.Nodes) > 0 {
+ context = s.Nodes[0]
+ if context.Parent != nil {
+ nodes = parseHtmlWithContext(htmlStr, context)
+ } else {
+ nodes = parseHtml(htmlStr)
+ }
+ }
+ return s.wrapAllNodes(nodes...)
+}
+
+func (s *Selection) wrapAllNodes(ns ...*html.Node) *Selection {
+ if len(ns) > 0 {
+ return s.WrapAllNode(ns[0])
+ }
+ return s
+}
+
+// WrapAllNode wraps the given node around the first element in the Selection,
+// making all other nodes in the Selection children of the given node. The node
+// is cloned before being inserted into the document.
+//
+// It returns the original set of elements.
+func (s *Selection) WrapAllNode(n *html.Node) *Selection {
+ if s.Size() == 0 {
+ return s
+ }
+
+ wrap := cloneNode(n)
+
+ first := s.Nodes[0]
+ if first.Parent != nil {
+ first.Parent.InsertBefore(wrap, first)
+ first.Parent.RemoveChild(first)
+ }
+
+ for c := getFirstChildEl(wrap); c != nil; c = getFirstChildEl(wrap) {
+ wrap = c
+ }
+
+ newSingleSelection(wrap, s.document).AppendSelection(s)
+
+ return s
+}
+
+// WrapInner wraps an HTML structure, matched by the given selector, around the
+// content of element in the set of matched elements. The matched child is
+// cloned before being inserted into the document.
+//
+// It returns the original set of elements.
+func (s *Selection) WrapInner(selector string) *Selection {
+ return s.WrapInnerMatcher(compileMatcher(selector))
+}
+
+// WrapInnerMatcher wraps an HTML structure, matched by the given selector,
+// around the content of element in the set of matched elements. The matched
+// child is cloned before being inserted into the document.
+//
+// It returns the original set of elements.
+func (s *Selection) WrapInnerMatcher(m Matcher) *Selection {
+ return s.wrapInnerNodes(m.MatchAll(s.document.rootNode)...)
+}
+
+// WrapInnerSelection wraps an HTML structure, matched by the given selector,
+// around the content of element in the set of matched elements. The matched
+// child is cloned before being inserted into the document.
+//
+// It returns the original set of elements.
+func (s *Selection) WrapInnerSelection(sel *Selection) *Selection {
+ return s.wrapInnerNodes(sel.Nodes...)
+}
+
+// WrapInnerHtml wraps an HTML structure, matched by the given selector, around
+// the content of element in the set of matched elements. The matched child is
+// cloned before being inserted into the document.
+//
+// It returns the original set of elements.
+func (s *Selection) WrapInnerHtml(htmlStr string) *Selection {
+ nodesMap := make(map[string][]*html.Node)
+ for _, context := range s.Nodes {
+ nodes, found := nodesMap[nodeName(context)]
+ if !found {
+ nodes = parseHtmlWithContext(htmlStr, context)
+ nodesMap[nodeName(context)] = nodes
+ }
+ newSingleSelection(context, s.document).wrapInnerNodes(cloneNodes(nodes)...)
+ }
+ return s
+}
+
+// WrapInnerNode wraps an HTML structure, matched by the given selector, around
+// the content of element in the set of matched elements. The matched child is
+// cloned before being inserted into the document.
+//
+// It returns the original set of elements.
+func (s *Selection) WrapInnerNode(n *html.Node) *Selection {
+ return s.wrapInnerNodes(n)
+}
+
+func (s *Selection) wrapInnerNodes(ns ...*html.Node) *Selection {
+ if len(ns) == 0 {
+ return s
+ }
+
+ s.Each(func(i int, s *Selection) {
+ contents := s.Contents()
+
+ if contents.Size() > 0 {
+ contents.wrapAllNodes(ns...)
+ } else {
+ s.AppendNodes(cloneNode(ns[0]))
+ }
+ })
+
+ return s
+}
+
+func parseHtml(h string) []*html.Node {
+ // Errors are only returned when the io.Reader returns any error besides
+ // EOF, but strings.Reader never will
+ nodes, err := html.ParseFragment(strings.NewReader(h), &html.Node{Type: html.ElementNode})
+ if err != nil {
+ panic("goquery: failed to parse HTML: " + err.Error())
+ }
+ return nodes
+}
+
+func parseHtmlWithContext(h string, context *html.Node) []*html.Node {
+ // Errors are only returned when the io.Reader returns any error besides
+ // EOF, but strings.Reader never will
+ nodes, err := html.ParseFragment(strings.NewReader(h), context)
+ if err != nil {
+ panic("goquery: failed to parse HTML: " + err.Error())
+ }
+ return nodes
+}
+
+// Get the first child that is an ElementNode
+func getFirstChildEl(n *html.Node) *html.Node {
+ c := n.FirstChild
+ for c != nil && c.Type != html.ElementNode {
+ c = c.NextSibling
+ }
+ return c
+}
+
+// Deep copy a slice of nodes.
+func cloneNodes(ns []*html.Node) []*html.Node {
+ cns := make([]*html.Node, 0, len(ns))
+
+ for _, n := range ns {
+ cns = append(cns, cloneNode(n))
+ }
+
+ return cns
+}
+
+// Deep copy a node. The new node has clones of all the original node's
+// children but none of its parents or siblings.
+func cloneNode(n *html.Node) *html.Node {
+ nn := &html.Node{
+ Type: n.Type,
+ DataAtom: n.DataAtom,
+ Data: n.Data,
+ Attr: make([]html.Attribute, len(n.Attr)),
+ }
+
+ copy(nn.Attr, n.Attr)
+ for c := n.FirstChild; c != nil; c = c.NextSibling {
+ nn.AppendChild(cloneNode(c))
+ }
+
+ return nn
+}
+
+func (s *Selection) manipulateNodes(ns []*html.Node, reverse bool,
+ f func(sn *html.Node, n *html.Node)) *Selection {
+
+ lasti := s.Size() - 1
+
+ // net.Html doesn't provide document fragments for insertion, so to get
+ // things in the correct order with After() and Prepend(), the callback
+ // needs to be called on the reverse of the nodes.
+ if reverse {
+ for i, j := 0, len(ns)-1; i < j; i, j = i+1, j-1 {
+ ns[i], ns[j] = ns[j], ns[i]
+ }
+ }
+
+ for i, sn := range s.Nodes {
+ for _, n := range ns {
+ if i != lasti {
+ f(sn, cloneNode(n))
+ } else {
+ if n.Parent != nil {
+ n.Parent.RemoveChild(n)
+ }
+ f(sn, n)
+ }
+ }
+ }
+
+ return s
+}
+
+// eachNodeHtml parses the given html string and inserts the resulting nodes in the dom with the mergeFn.
+// The parsed nodes are inserted for each element of the selection.
+// isParent can be used to indicate that the elements of the selection should be treated as the parent for the parsed html.
+// A cache is used to avoid parsing the html multiple times should the elements of the selection result in the same context.
+func (s *Selection) eachNodeHtml(htmlStr string, isParent bool, mergeFn func(n *html.Node, nodes []*html.Node)) *Selection {
+ // cache to avoid parsing the html for the same context multiple times
+ nodeCache := make(map[string][]*html.Node)
+ var context *html.Node
+ for _, n := range s.Nodes {
+ if isParent {
+ context = n.Parent
+ } else {
+ if n.Type != html.ElementNode {
+ continue
+ }
+ context = n
+ }
+ if context != nil {
+ nodes, found := nodeCache[nodeName(context)]
+ if !found {
+ nodes = parseHtmlWithContext(htmlStr, context)
+ nodeCache[nodeName(context)] = nodes
+ }
+ mergeFn(n, cloneNodes(nodes))
+ }
+ }
+ return s
+}
diff --git a/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/manipulation_test.go b/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/manipulation_test.go
new file mode 100644
index 000000000..111968912
--- /dev/null
+++ b/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/manipulation_test.go
@@ -0,0 +1,739 @@
+package goquery
+
+import (
+ "log"
+ "testing"
+)
+
+const (
+ wrapHtml = "
")
+
+ printSel(t, docA.Selection)
+ printSel(t, docTable.Selection)
+ printSel(t, docBoth.Selection)
+
+ oA, _ := sA.Html()
+ oTable, _ := sTable.Html()
+
+ if oA == oTable {
+ t.Errorf("Expected inner html of and
to not be equal, but got %s and %s", oA, oTable)
+ }
+
+ oBothTable, _ := sBoth.First().Html()
+ if oBothTable != oTable {
+ t.Errorf("Expected inner html of
`
+ d, err := NewDocumentFromReader(strings.NewReader(src))
+ if err != nil {
+ t.Fatal(err)
+ }
+ txt := d.Find("p").Text()
+ ix := strings.Index(txt, "\u00a0")
+ if ix != 4 {
+ t.Errorf("Text: expected a non-breaking space at index 4, got %d", ix)
+ }
+
+ h, err := d.Find("p").Html()
+ if err != nil {
+ t.Fatal(err)
+ }
+ ix = strings.Index(h, "\u00a0")
+ if ix != 4 {
+ t.Errorf("Html: expected a non-breaking space at index 4, got %d", ix)
+ }
+}
+
+func TestAddClass(t *testing.T) {
+ sel := Doc2Clone().Find("#main")
+ sel.AddClass("main main main")
+
+ // Make sure that class was only added once
+ if a, ok := sel.Attr("class"); !ok || a != "main" {
+ t.Error("Expected #main to have class main")
+ }
+}
+
+func TestAddClassSimilar(t *testing.T) {
+ sel := Doc2Clone().Find("#nf5")
+ sel.AddClass("odd")
+
+ assertClass(t, sel, "odd")
+ assertClass(t, sel, "odder")
+ printSel(t, sel.Parent())
+}
+
+func TestAddEmptyClass(t *testing.T) {
+ sel := Doc2Clone().Find("#main")
+ sel.AddClass("")
+
+ // Make sure that class was only added once
+ if a, ok := sel.Attr("class"); ok {
+ t.Errorf("Expected #main to not to have a class, have: %s", a)
+ }
+}
+
+func TestAddClasses(t *testing.T) {
+ sel := Doc2Clone().Find("#main")
+ sel.AddClass("a b")
+
+ // Make sure that class was only added once
+ if !sel.HasClass("a") || !sel.HasClass("b") {
+ t.Errorf("#main does not have classes")
+ }
+}
+
+func TestHasClass(t *testing.T) {
+ sel := Doc().Find("div")
+ if !sel.HasClass("span12") {
+ t.Error("Expected at least one div to have class span12.")
+ }
+}
+
+func TestHasClassNone(t *testing.T) {
+ sel := Doc().Find("h2")
+ if sel.HasClass("toto") {
+ t.Error("Expected h1 to have no class.")
+ }
+}
+
+func TestHasClassNotFirst(t *testing.T) {
+ sel := Doc().Find(".alert")
+ if !sel.HasClass("alert-error") {
+ t.Error("Expected .alert to also have class .alert-error.")
+ }
+}
+
+func TestRemoveClass(t *testing.T) {
+ sel := Doc2Clone().Find("#nf1")
+ sel.RemoveClass("one row")
+
+ if !sel.HasClass("even") || sel.HasClass("one") || sel.HasClass("row") {
+ classes, _ := sel.Attr("class")
+ t.Error("Expected #nf1 to have class even, has ", classes)
+ }
+}
+
+func TestRemoveClassSimilar(t *testing.T) {
+ sel := Doc2Clone().Find("#nf5, #nf6")
+ assertLength(t, sel.Nodes, 2)
+
+ sel.RemoveClass("odd")
+ assertClass(t, sel.Eq(0), "odder")
+ printSel(t, sel)
+}
+
+func TestRemoveAllClasses(t *testing.T) {
+ sel := Doc2Clone().Find("#nf1")
+ sel.RemoveClass()
+
+ if a, ok := sel.Attr("class"); ok {
+ t.Error("All classes were not removed, has ", a)
+ }
+
+ sel = Doc2Clone().Find("#main")
+ sel.RemoveClass()
+ if a, ok := sel.Attr("class"); ok {
+ t.Error("All classes were not removed, has ", a)
+ }
+}
+
+func TestToggleClass(t *testing.T) {
+ sel := Doc2Clone().Find("#nf1")
+
+ sel.ToggleClass("one")
+ if sel.HasClass("one") {
+ t.Error("Expected #nf1 to not have class one")
+ }
+
+ sel.ToggleClass("one")
+ if !sel.HasClass("one") {
+ t.Error("Expected #nf1 to have class one")
+ }
+
+ sel.ToggleClass("one even row")
+ if a, ok := sel.Attr("class"); ok {
+ t.Errorf("Expected #nf1 to have no classes, have %q", a)
+ }
+}
diff --git a/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/query.go b/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/query.go
new file mode 100644
index 000000000..fe86bf0bf
--- /dev/null
+++ b/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/query.go
@@ -0,0 +1,49 @@
+package goquery
+
+import "golang.org/x/net/html"
+
+// Is checks the current matched set of elements against a selector and
+// returns true if at least one of these elements matches.
+func (s *Selection) Is(selector string) bool {
+ return s.IsMatcher(compileMatcher(selector))
+}
+
+// IsMatcher checks the current matched set of elements against a matcher and
+// returns true if at least one of these elements matches.
+func (s *Selection) IsMatcher(m Matcher) bool {
+ if len(s.Nodes) > 0 {
+ if len(s.Nodes) == 1 {
+ return m.Match(s.Nodes[0])
+ }
+ return len(m.Filter(s.Nodes)) > 0
+ }
+
+ return false
+}
+
+// IsFunction checks the current matched set of elements against a predicate and
+// returns true if at least one of these elements matches.
+func (s *Selection) IsFunction(f func(int, *Selection) bool) bool {
+ return s.FilterFunction(f).Length() > 0
+}
+
+// IsSelection checks the current matched set of elements against a Selection object
+// and returns true if at least one of these elements matches.
+func (s *Selection) IsSelection(sel *Selection) bool {
+ return s.FilterSelection(sel).Length() > 0
+}
+
+// IsNodes checks the current matched set of elements against the specified nodes
+// and returns true if at least one of these elements matches.
+func (s *Selection) IsNodes(nodes ...*html.Node) bool {
+ return s.FilterNodes(nodes...).Length() > 0
+}
+
+// Contains returns true if the specified Node is within,
+// at any depth, one of the nodes in the Selection object.
+// It is NOT inclusive, to behave like jQuery's implementation, and
+// unlike Javascript's .contains, so if the contained
+// node is itself in the selection, it returns false.
+func (s *Selection) Contains(n *html.Node) bool {
+ return sliceContains(s.Nodes, n)
+}
diff --git a/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/query_test.go b/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/query_test.go
new file mode 100644
index 000000000..54b2a2e0d
--- /dev/null
+++ b/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/query_test.go
@@ -0,0 +1,103 @@
+package goquery
+
+import (
+ "testing"
+)
+
+func TestIs(t *testing.T) {
+ sel := Doc().Find(".footer p:nth-child(1)")
+ if !sel.Is("p") {
+ t.Error("Expected .footer p:nth-child(1) to be p.")
+ }
+}
+
+func TestIsInvalid(t *testing.T) {
+ sel := Doc().Find(".footer p:nth-child(1)")
+ if sel.Is("") {
+ t.Error("Is should not succeed with invalid selector string")
+ }
+}
+
+func TestIsPositional(t *testing.T) {
+ sel := Doc().Find(".footer p:nth-child(2)")
+ if !sel.Is("p:nth-child(2)") {
+ t.Error("Expected .footer p:nth-child(2) to be p:nth-child(2).")
+ }
+}
+
+func TestIsPositionalNot(t *testing.T) {
+ sel := Doc().Find(".footer p:nth-child(1)")
+ if sel.Is("p:nth-child(2)") {
+ t.Error("Expected .footer p:nth-child(1) NOT to be p:nth-child(2).")
+ }
+}
+
+func TestIsFunction(t *testing.T) {
+ ok := Doc().Find("div").IsFunction(func(i int, s *Selection) bool {
+ return s.HasClass("container-fluid")
+ })
+
+ if !ok {
+ t.Error("Expected some div to have a container-fluid class.")
+ }
+}
+
+func TestIsFunctionRollback(t *testing.T) {
+ ok := Doc().Find("div").IsFunction(func(i int, s *Selection) bool {
+ return s.HasClass("container-fluid")
+ })
+
+ if !ok {
+ t.Error("Expected some div to have a container-fluid class.")
+ }
+}
+
+func TestIsSelection(t *testing.T) {
+ sel := Doc().Find("div")
+ sel2 := Doc().Find(".pvk-gutter")
+
+ if !sel.IsSelection(sel2) {
+ t.Error("Expected some div to have a pvk-gutter class.")
+ }
+}
+
+func TestIsSelectionNot(t *testing.T) {
+ sel := Doc().Find("div")
+ sel2 := Doc().Find("a")
+
+ if sel.IsSelection(sel2) {
+ t.Error("Expected some div NOT to be an anchor.")
+ }
+}
+
+func TestIsNodes(t *testing.T) {
+ sel := Doc().Find("div")
+ sel2 := Doc().Find(".footer")
+
+ if !sel.IsNodes(sel2.Nodes[0]) {
+ t.Error("Expected some div to have a footer class.")
+ }
+}
+
+func TestDocContains(t *testing.T) {
+ sel := Doc().Find("h1")
+ if !Doc().Contains(sel.Nodes[0]) {
+ t.Error("Expected document to contain H1 tag.")
+ }
+}
+
+func TestSelContains(t *testing.T) {
+ sel := Doc().Find(".row-fluid")
+ sel2 := Doc().Find("a[ng-click]")
+ if !sel.Contains(sel2.Nodes[0]) {
+ t.Error("Expected .row-fluid to contain a[ng-click] tag.")
+ }
+}
+
+func TestSelNotContains(t *testing.T) {
+ sel := Doc().Find("a.link")
+ sel2 := Doc().Find("span")
+ if sel.Contains(sel2.Nodes[0]) {
+ t.Error("Expected a.link to NOT contain span tag.")
+ }
+}
diff --git a/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/testdata/gotesting.html b/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/testdata/gotesting.html
new file mode 100644
index 000000000..ba5348fd4
--- /dev/null
+++ b/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/testdata/gotesting.html
@@ -0,0 +1,855 @@
+
+
+
+
+
+ testing - The Go Programming Language
+
+
+
+
+
+
+
+
+
+
+
+Package testing provides support for automated testing of Go packages.
+It is intended to be used in concert with the “go test” command, which automates
+execution of any function of the form
+
+
func TestXxx(*testing.T)
+
+
+where Xxx can be any alphanumeric string (but the first letter must not be in
+[a-z]) and serves to identify the test routine.
+These TestXxx routines should be declared within the package they are testing.
+
+
+Functions of the form
+
+
func BenchmarkXxx(*testing.B)
+
+
+are considered benchmarks, and are executed by the "go test" command when
+the -test.bench flag is provided.
+
+
+A sample benchmark function looks like this:
+
+
func BenchmarkHello(b *testing.B) {
+ for i := 0; i < b.N; i++ {
+ fmt.Sprintf("hello")
+ }
+}
+
+
+The benchmark package will vary b.N until the benchmark function lasts
+long enough to be timed reliably. The output
+
+
testing.BenchmarkHello 10000000 282 ns/op
+
+
+means that the loop ran 10000000 times at a speed of 282 ns per loop.
+
+
+If a benchmark needs some expensive setup before running, the timer
+may be stopped:
+
+
func BenchmarkBigLen(b *testing.B) {
+ b.StopTimer()
+ big := NewBig()
+ b.StartTimer()
+ for i := 0; i < b.N; i++ {
+ big.Len()
+ }
+}
+
+
+The package also runs and verifies example code. Example functions may
+include a concluding comment that begins with "Output:" and is compared with
+the standard output of the function when the tests are run, as in these
+examples of an example:
+
+Multiple example functions for a type/function/method may be provided by
+appending a distinct suffix to the name. The suffix must start with a
+lower-case letter.
+
+The entire test file is presented as the example when it contains a single
+example function, at least one other function, type, variable, or constant
+declaration, and no test or benchmark functions.
+
+StartTimer starts timing a test. This function is called automatically
+before a benchmark starts, but it can also used to resume timing after
+a call to StopTimer.
+
type BenchmarkResult struct {
+ N int // The number of iterations.
+ T time.Duration // The total time taken.
+ Bytes int64 // Bytes processed in one iteration.
+}
type T struct {
+ // contains filtered or unexported fields
+}
+
+T is a type passed to Test functions to manage test state and support formatted test logs.
+Logs are accumulated during execution and dumped to standard error when done.
+
The syntax of Go is broadly similar to that of C: blocks of code are surrounded with curly braces; common control flow structures include for, switch, and if. Unlike C, line-ending semicolons are optional, variable declarations are written differently and are usually optional, type conversions must be made explicit, and new go and select control keywords have been introduced to support concurrent programming. New built-in types include maps, Unicode strings, array slices, and channels for inter-thread communication.
+
Go is designed for exceptionally fast compiling times, even on modest hardware.[10] The language requires garbage collection. Certain concurrency-related structural conventions of Go (channels and alternative channel inputs) are borrowed from Tony Hoare'sCSP. Unlike previous concurrent programming languages such as occam or Limbo, Go does not provide any built-in notion of safe or verifiable concurrency.[11]
+
Of features found in C++ or Java, Go does not include type inheritance, generic programming, assertions, method overloading, or pointer arithmetic.[2] Of these, the Go authors express an openness to generic programming, explicitly argue against assertions and pointer arithmetic, while defending the choice to omit type inheritance as giving a more useful language, encouraging heavy use of interfaces instead.[2] Initially, the language did not include exception handling, but in March 2010 a mechanism known as panic/recover was implemented to handle exceptional errors while avoiding some of the problems the Go authors find with exceptions.[12][13]
Go allows a programmer to write functions that can operate on inputs of arbitrary type, provided that the type implements the functions defined by a given interface.
+
Unlike Java, the interfaces a type supports do not need to be specified at the point at which the type is defined, and Go interfaces do not participate in a type hierarchy. A Go interface is best described as a set of methods, each identified by a name and signature. A type is considered to implement an interface if all the required methods have been defined for that type. An interface can be declared to "embed" other interfaces, meaning the declared interface includes the methods defined in the other interfaces.[11]
+
Unlike Java, the in-memory representation of an object does not contain a pointer to a virtual method table. Instead a value of interface type is implemented as a pair of a pointer to the object, and a pointer to a dictionary containing implementations of the interface methods for that type.
These four definitions could have been placed in separate files, in different parts of the program. Notably, the programmer who defined the Sequence type did not need to declare that the type implemented HasLength, and the person who implemented the Len method for Sequence did not need to specify that this method was part of HasLength.
Visibility of structures, structure fields, variables, constants, methods, top-level types and functions outside their defining package is defined implicitly according to the capitalization of their identifier.[14]
Go provides goroutines, small lightweight threads; the name alludes to coroutines. Goroutines are created with the go statement from anonymous or named functions.
+
Goroutines are executed in parallel with other goroutines, including their caller. They do not necessarily run in separate threads, but a group of goroutines are multiplexed onto multiple threads — execution control is moved between them by blocking them when sending or receiving messages over channels.
6g/8g/5g (the compilers for AMD64, x86, and ARM respectively) with their supporting tools (collectively known as "gc") based on Ken's previous work on Plan 9's C toolchain.
+
gccgo, a GCC frontend written in C++,[15] and now officially supported as of version 4.6, albeit not part of the standard binary for gcc.[16]
+
+
Both compilers work on Unix-like systems, and a port to Microsoft Windows of the gc compiler and runtime have been integrated in the main distribution. Most of the standard libraries also work on Windows.
+
There is also an unmaintained "tiny" runtime environment that allows Go programs to run on bare hardware.[17]
Go's automatic semicolon insertion feature requires that opening braces not be placed on their own lines, and this is thus the preferred brace style; the examples shown comply with this style.[18]
Michele Simionato wrote in an article for artima.com:[20]
+
+
Here I just wanted to point out the design choices about interfaces and inheritance. Such ideas are not new and it is a shame that no popular language has followed such particular route in the design space. I hope Go will become popular; if not, I hope such ideas will finally enter in a popular language, we are already 10 or 20 years too late :-(
Go is extremely easy to dive into. There are a minimal number of fundamental language concepts and the syntax is clean and designed to be clear and unambiguous. Go is still experimental and still a little rough around the edges.
+
+
Ars Technica interviewed Rob Pike, one of the authors of Go, and asked why a new language was needed. He replied that:[22]
+
+
It wasn't enough to just add features to existing programming languages, because sometimes you can get more in the long run by taking things away. They wanted to start from scratch and rethink everything. ... [But they did not want] to deviate too much from what developers already knew because they wanted to avoid alienating Go's target audience.
The complexity of C++ (even more complexity has been added in the new C++), and the resulting impact on productivity, is no longer justified. All the hoops that the C++ programmer had to jump through in order to use a C-compatible language make no sense anymore -- they're just a waste of time and effort. Now, Go makes much more sense for the class of problems that C++ was originally intended to solve.
On the day of the general release of the language, Francis McCabe, developer of the Go! programming language (note the exclamation point), requested a name change of Google's language to prevent confusion with his language.[25] The issue was closed by a Google developer on 12 October 2010 with the custom status "Unfortunate", with a comment that "there are many computing products and services named Go. In the 11 months since our release, there has been minimal confusion of the two languages."[26]
^"A Tutorial for the Go Programming Language". The Go Programming Language. Google. http://golang.org/doc/go_tutorial.html. Retrieved 10 March 2010. "In Go the rule about visibility of information is simple: if a name (of a top-level type, function, method, constant or variable, or of a structure field or method) is capitalized, users of the package may see it. Otherwise, the name and hence the thing being named is visible only inside the package in which it is declared."
^"A Tutorial for the Go Programming Language". The Go Programming Language. Google. http://golang.org/doc/go_tutorial.html. Retrieved 10 March 2010. "The one surprise is that it's important to put the opening brace of a construct such as an if statement on the same line as the if; however, if you don't, there are situations that may not compile or may give the wrong result. The language forces the brace style to some extent."
+
+
\ No newline at end of file
diff --git a/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/testdata/page2.html b/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/testdata/page2.html
new file mode 100644
index 000000000..4c2f92f4b
--- /dev/null
+++ b/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/testdata/page2.html
@@ -0,0 +1,24 @@
+
+
+
+ Tests for siblings
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/testdata/page3.html b/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/testdata/page3.html
new file mode 100644
index 000000000..17e86241f
--- /dev/null
+++ b/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/testdata/page3.html
@@ -0,0 +1,24 @@
+
+
+
+ Tests for siblings
+
+
+
+
hello
+
+
+
+
+
+
+
+
text
+
+
+
+
+
+
+
+
diff --git a/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/traversal.go b/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/traversal.go
new file mode 100644
index 000000000..5fa5315ac
--- /dev/null
+++ b/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/traversal.go
@@ -0,0 +1,698 @@
+package goquery
+
+import "golang.org/x/net/html"
+
+type siblingType int
+
+// Sibling type, used internally when iterating over children at the same
+// level (siblings) to specify which nodes are requested.
+const (
+ siblingPrevUntil siblingType = iota - 3
+ siblingPrevAll
+ siblingPrev
+ siblingAll
+ siblingNext
+ siblingNextAll
+ siblingNextUntil
+ siblingAllIncludingNonElements
+)
+
+// Find gets the descendants of each element in the current set of matched
+// elements, filtered by a selector. It returns a new Selection object
+// containing these matched elements.
+func (s *Selection) Find(selector string) *Selection {
+ return pushStack(s, findWithMatcher(s.Nodes, compileMatcher(selector)))
+}
+
+// FindMatcher gets the descendants of each element in the current set of matched
+// elements, filtered by the matcher. It returns a new Selection object
+// containing these matched elements.
+func (s *Selection) FindMatcher(m Matcher) *Selection {
+ return pushStack(s, findWithMatcher(s.Nodes, m))
+}
+
+// FindSelection gets the descendants of each element in the current
+// Selection, filtered by a Selection. It returns a new Selection object
+// containing these matched elements.
+func (s *Selection) FindSelection(sel *Selection) *Selection {
+ if sel == nil {
+ return pushStack(s, nil)
+ }
+ return s.FindNodes(sel.Nodes...)
+}
+
+// FindNodes gets the descendants of each element in the current
+// Selection, filtered by some nodes. It returns a new Selection object
+// containing these matched elements.
+func (s *Selection) FindNodes(nodes ...*html.Node) *Selection {
+ return pushStack(s, mapNodes(nodes, func(i int, n *html.Node) []*html.Node {
+ if sliceContains(s.Nodes, n) {
+ return []*html.Node{n}
+ }
+ return nil
+ }))
+}
+
+// Contents gets the children of each element in the Selection,
+// including text and comment nodes. It returns a new Selection object
+// containing these elements.
+func (s *Selection) Contents() *Selection {
+ return pushStack(s, getChildrenNodes(s.Nodes, siblingAllIncludingNonElements))
+}
+
+// ContentsFiltered gets the children of each element in the Selection,
+// filtered by the specified selector. It returns a new Selection
+// object containing these elements. Since selectors only act on Element nodes,
+// this function is an alias to ChildrenFiltered unless the selector is empty,
+// in which case it is an alias to Contents.
+func (s *Selection) ContentsFiltered(selector string) *Selection {
+ if selector != "" {
+ return s.ChildrenFiltered(selector)
+ }
+ return s.Contents()
+}
+
+// ContentsMatcher gets the children of each element in the Selection,
+// filtered by the specified matcher. It returns a new Selection
+// object containing these elements. Since matchers only act on Element nodes,
+// this function is an alias to ChildrenMatcher.
+func (s *Selection) ContentsMatcher(m Matcher) *Selection {
+ return s.ChildrenMatcher(m)
+}
+
+// Children gets the child elements of each element in the Selection.
+// It returns a new Selection object containing these elements.
+func (s *Selection) Children() *Selection {
+ return pushStack(s, getChildrenNodes(s.Nodes, siblingAll))
+}
+
+// ChildrenFiltered gets the child elements of each element in the Selection,
+// filtered by the specified selector. It returns a new
+// Selection object containing these elements.
+func (s *Selection) ChildrenFiltered(selector string) *Selection {
+ return filterAndPush(s, getChildrenNodes(s.Nodes, siblingAll), compileMatcher(selector))
+}
+
+// ChildrenMatcher gets the child elements of each element in the Selection,
+// filtered by the specified matcher. It returns a new
+// Selection object containing these elements.
+func (s *Selection) ChildrenMatcher(m Matcher) *Selection {
+ return filterAndPush(s, getChildrenNodes(s.Nodes, siblingAll), m)
+}
+
+// Parent gets the parent of each element in the Selection. It returns a
+// new Selection object containing the matched elements.
+func (s *Selection) Parent() *Selection {
+ return pushStack(s, getParentNodes(s.Nodes))
+}
+
+// ParentFiltered gets the parent of each element in the Selection filtered by a
+// selector. It returns a new Selection object containing the matched elements.
+func (s *Selection) ParentFiltered(selector string) *Selection {
+ return filterAndPush(s, getParentNodes(s.Nodes), compileMatcher(selector))
+}
+
+// ParentMatcher gets the parent of each element in the Selection filtered by a
+// matcher. It returns a new Selection object containing the matched elements.
+func (s *Selection) ParentMatcher(m Matcher) *Selection {
+ return filterAndPush(s, getParentNodes(s.Nodes), m)
+}
+
+// Closest gets the first element that matches the selector by testing the
+// element itself and traversing up through its ancestors in the DOM tree.
+func (s *Selection) Closest(selector string) *Selection {
+ cs := compileMatcher(selector)
+ return s.ClosestMatcher(cs)
+}
+
+// ClosestMatcher gets the first element that matches the matcher by testing the
+// element itself and traversing up through its ancestors in the DOM tree.
+func (s *Selection) ClosestMatcher(m Matcher) *Selection {
+ return pushStack(s, mapNodes(s.Nodes, func(i int, n *html.Node) []*html.Node {
+ // For each node in the selection, test the node itself, then each parent
+ // until a match is found.
+ for ; n != nil; n = n.Parent {
+ if m.Match(n) {
+ return []*html.Node{n}
+ }
+ }
+ return nil
+ }))
+}
+
+// ClosestNodes gets the first element that matches one of the nodes by testing the
+// element itself and traversing up through its ancestors in the DOM tree.
+func (s *Selection) ClosestNodes(nodes ...*html.Node) *Selection {
+ set := make(map[*html.Node]bool)
+ for _, n := range nodes {
+ set[n] = true
+ }
+ return pushStack(s, mapNodes(s.Nodes, func(i int, n *html.Node) []*html.Node {
+ // For each node in the selection, test the node itself, then each parent
+ // until a match is found.
+ for ; n != nil; n = n.Parent {
+ if set[n] {
+ return []*html.Node{n}
+ }
+ }
+ return nil
+ }))
+}
+
+// ClosestSelection gets the first element that matches one of the nodes in the
+// Selection by testing the element itself and traversing up through its ancestors
+// in the DOM tree.
+func (s *Selection) ClosestSelection(sel *Selection) *Selection {
+ if sel == nil {
+ return pushStack(s, nil)
+ }
+ return s.ClosestNodes(sel.Nodes...)
+}
+
+// Parents gets the ancestors of each element in the current Selection. It
+// returns a new Selection object with the matched elements.
+func (s *Selection) Parents() *Selection {
+ return pushStack(s, getParentsNodes(s.Nodes, nil, nil))
+}
+
+// ParentsFiltered gets the ancestors of each element in the current
+// Selection. It returns a new Selection object with the matched elements.
+func (s *Selection) ParentsFiltered(selector string) *Selection {
+ return filterAndPush(s, getParentsNodes(s.Nodes, nil, nil), compileMatcher(selector))
+}
+
+// ParentsMatcher gets the ancestors of each element in the current
+// Selection. It returns a new Selection object with the matched elements.
+func (s *Selection) ParentsMatcher(m Matcher) *Selection {
+ return filterAndPush(s, getParentsNodes(s.Nodes, nil, nil), m)
+}
+
+// ParentsUntil gets the ancestors of each element in the Selection, up to but
+// not including the element matched by the selector. It returns a new Selection
+// object containing the matched elements.
+func (s *Selection) ParentsUntil(selector string) *Selection {
+ return pushStack(s, getParentsNodes(s.Nodes, compileMatcher(selector), nil))
+}
+
+// ParentsUntilMatcher gets the ancestors of each element in the Selection, up to but
+// not including the element matched by the matcher. It returns a new Selection
+// object containing the matched elements.
+func (s *Selection) ParentsUntilMatcher(m Matcher) *Selection {
+ return pushStack(s, getParentsNodes(s.Nodes, m, nil))
+}
+
+// ParentsUntilSelection gets the ancestors of each element in the Selection,
+// up to but not including the elements in the specified Selection. It returns a
+// new Selection object containing the matched elements.
+func (s *Selection) ParentsUntilSelection(sel *Selection) *Selection {
+ if sel == nil {
+ return s.Parents()
+ }
+ return s.ParentsUntilNodes(sel.Nodes...)
+}
+
+// ParentsUntilNodes gets the ancestors of each element in the Selection,
+// up to but not including the specified nodes. It returns a
+// new Selection object containing the matched elements.
+func (s *Selection) ParentsUntilNodes(nodes ...*html.Node) *Selection {
+ return pushStack(s, getParentsNodes(s.Nodes, nil, nodes))
+}
+
+// ParentsFilteredUntil is like ParentsUntil, with the option to filter the
+// results based on a selector string. It returns a new Selection
+// object containing the matched elements.
+func (s *Selection) ParentsFilteredUntil(filterSelector, untilSelector string) *Selection {
+ return filterAndPush(s, getParentsNodes(s.Nodes, compileMatcher(untilSelector), nil), compileMatcher(filterSelector))
+}
+
+// ParentsFilteredUntilMatcher is like ParentsUntilMatcher, with the option to filter the
+// results based on a matcher. It returns a new Selection object containing the matched elements.
+func (s *Selection) ParentsFilteredUntilMatcher(filter, until Matcher) *Selection {
+ return filterAndPush(s, getParentsNodes(s.Nodes, until, nil), filter)
+}
+
+// ParentsFilteredUntilSelection is like ParentsUntilSelection, with the
+// option to filter the results based on a selector string. It returns a new
+// Selection object containing the matched elements.
+func (s *Selection) ParentsFilteredUntilSelection(filterSelector string, sel *Selection) *Selection {
+ return s.ParentsMatcherUntilSelection(compileMatcher(filterSelector), sel)
+}
+
+// ParentsMatcherUntilSelection is like ParentsUntilSelection, with the
+// option to filter the results based on a matcher. It returns a new
+// Selection object containing the matched elements.
+func (s *Selection) ParentsMatcherUntilSelection(filter Matcher, sel *Selection) *Selection {
+ if sel == nil {
+ return s.ParentsMatcher(filter)
+ }
+ return s.ParentsMatcherUntilNodes(filter, sel.Nodes...)
+}
+
+// ParentsFilteredUntilNodes is like ParentsUntilNodes, with the
+// option to filter the results based on a selector string. It returns a new
+// Selection object containing the matched elements.
+func (s *Selection) ParentsFilteredUntilNodes(filterSelector string, nodes ...*html.Node) *Selection {
+ return filterAndPush(s, getParentsNodes(s.Nodes, nil, nodes), compileMatcher(filterSelector))
+}
+
+// ParentsMatcherUntilNodes is like ParentsUntilNodes, with the
+// option to filter the results based on a matcher. It returns a new
+// Selection object containing the matched elements.
+func (s *Selection) ParentsMatcherUntilNodes(filter Matcher, nodes ...*html.Node) *Selection {
+ return filterAndPush(s, getParentsNodes(s.Nodes, nil, nodes), filter)
+}
+
+// Siblings gets the siblings of each element in the Selection. It returns
+// a new Selection object containing the matched elements.
+func (s *Selection) Siblings() *Selection {
+ return pushStack(s, getSiblingNodes(s.Nodes, siblingAll, nil, nil))
+}
+
+// SiblingsFiltered gets the siblings of each element in the Selection
+// filtered by a selector. It returns a new Selection object containing the
+// matched elements.
+func (s *Selection) SiblingsFiltered(selector string) *Selection {
+ return filterAndPush(s, getSiblingNodes(s.Nodes, siblingAll, nil, nil), compileMatcher(selector))
+}
+
+// SiblingsMatcher gets the siblings of each element in the Selection
+// filtered by a matcher. It returns a new Selection object containing the
+// matched elements.
+func (s *Selection) SiblingsMatcher(m Matcher) *Selection {
+ return filterAndPush(s, getSiblingNodes(s.Nodes, siblingAll, nil, nil), m)
+}
+
+// Next gets the immediately following sibling of each element in the
+// Selection. It returns a new Selection object containing the matched elements.
+func (s *Selection) Next() *Selection {
+ return pushStack(s, getSiblingNodes(s.Nodes, siblingNext, nil, nil))
+}
+
+// NextFiltered gets the immediately following sibling of each element in the
+// Selection filtered by a selector. It returns a new Selection object
+// containing the matched elements.
+func (s *Selection) NextFiltered(selector string) *Selection {
+ return filterAndPush(s, getSiblingNodes(s.Nodes, siblingNext, nil, nil), compileMatcher(selector))
+}
+
+// NextMatcher gets the immediately following sibling of each element in the
+// Selection filtered by a matcher. It returns a new Selection object
+// containing the matched elements.
+func (s *Selection) NextMatcher(m Matcher) *Selection {
+ return filterAndPush(s, getSiblingNodes(s.Nodes, siblingNext, nil, nil), m)
+}
+
+// NextAll gets all the following siblings of each element in the
+// Selection. It returns a new Selection object containing the matched elements.
+func (s *Selection) NextAll() *Selection {
+ return pushStack(s, getSiblingNodes(s.Nodes, siblingNextAll, nil, nil))
+}
+
+// NextAllFiltered gets all the following siblings of each element in the
+// Selection filtered by a selector. It returns a new Selection object
+// containing the matched elements.
+func (s *Selection) NextAllFiltered(selector string) *Selection {
+ return filterAndPush(s, getSiblingNodes(s.Nodes, siblingNextAll, nil, nil), compileMatcher(selector))
+}
+
+// NextAllMatcher gets all the following siblings of each element in the
+// Selection filtered by a matcher. It returns a new Selection object
+// containing the matched elements.
+func (s *Selection) NextAllMatcher(m Matcher) *Selection {
+ return filterAndPush(s, getSiblingNodes(s.Nodes, siblingNextAll, nil, nil), m)
+}
+
+// Prev gets the immediately preceding sibling of each element in the
+// Selection. It returns a new Selection object containing the matched elements.
+func (s *Selection) Prev() *Selection {
+ return pushStack(s, getSiblingNodes(s.Nodes, siblingPrev, nil, nil))
+}
+
+// PrevFiltered gets the immediately preceding sibling of each element in the
+// Selection filtered by a selector. It returns a new Selection object
+// containing the matched elements.
+func (s *Selection) PrevFiltered(selector string) *Selection {
+ return filterAndPush(s, getSiblingNodes(s.Nodes, siblingPrev, nil, nil), compileMatcher(selector))
+}
+
+// PrevMatcher gets the immediately preceding sibling of each element in the
+// Selection filtered by a matcher. It returns a new Selection object
+// containing the matched elements.
+func (s *Selection) PrevMatcher(m Matcher) *Selection {
+ return filterAndPush(s, getSiblingNodes(s.Nodes, siblingPrev, nil, nil), m)
+}
+
+// PrevAll gets all the preceding siblings of each element in the
+// Selection. It returns a new Selection object containing the matched elements.
+func (s *Selection) PrevAll() *Selection {
+ return pushStack(s, getSiblingNodes(s.Nodes, siblingPrevAll, nil, nil))
+}
+
+// PrevAllFiltered gets all the preceding siblings of each element in the
+// Selection filtered by a selector. It returns a new Selection object
+// containing the matched elements.
+func (s *Selection) PrevAllFiltered(selector string) *Selection {
+ return filterAndPush(s, getSiblingNodes(s.Nodes, siblingPrevAll, nil, nil), compileMatcher(selector))
+}
+
+// PrevAllMatcher gets all the preceding siblings of each element in the
+// Selection filtered by a matcher. It returns a new Selection object
+// containing the matched elements.
+func (s *Selection) PrevAllMatcher(m Matcher) *Selection {
+ return filterAndPush(s, getSiblingNodes(s.Nodes, siblingPrevAll, nil, nil), m)
+}
+
+// NextUntil gets all following siblings of each element up to but not
+// including the element matched by the selector. It returns a new Selection
+// object containing the matched elements.
+func (s *Selection) NextUntil(selector string) *Selection {
+ return pushStack(s, getSiblingNodes(s.Nodes, siblingNextUntil,
+ compileMatcher(selector), nil))
+}
+
+// NextUntilMatcher gets all following siblings of each element up to but not
+// including the element matched by the matcher. It returns a new Selection
+// object containing the matched elements.
+func (s *Selection) NextUntilMatcher(m Matcher) *Selection {
+ return pushStack(s, getSiblingNodes(s.Nodes, siblingNextUntil,
+ m, nil))
+}
+
+// NextUntilSelection gets all following siblings of each element up to but not
+// including the element matched by the Selection. It returns a new Selection
+// object containing the matched elements.
+func (s *Selection) NextUntilSelection(sel *Selection) *Selection {
+ if sel == nil {
+ return s.NextAll()
+ }
+ return s.NextUntilNodes(sel.Nodes...)
+}
+
+// NextUntilNodes gets all following siblings of each element up to but not
+// including the element matched by the nodes. It returns a new Selection
+// object containing the matched elements.
+func (s *Selection) NextUntilNodes(nodes ...*html.Node) *Selection {
+ return pushStack(s, getSiblingNodes(s.Nodes, siblingNextUntil,
+ nil, nodes))
+}
+
+// PrevUntil gets all preceding siblings of each element up to but not
+// including the element matched by the selector. It returns a new Selection
+// object containing the matched elements.
+func (s *Selection) PrevUntil(selector string) *Selection {
+ return pushStack(s, getSiblingNodes(s.Nodes, siblingPrevUntil,
+ compileMatcher(selector), nil))
+}
+
+// PrevUntilMatcher gets all preceding siblings of each element up to but not
+// including the element matched by the matcher. It returns a new Selection
+// object containing the matched elements.
+func (s *Selection) PrevUntilMatcher(m Matcher) *Selection {
+ return pushStack(s, getSiblingNodes(s.Nodes, siblingPrevUntil,
+ m, nil))
+}
+
+// PrevUntilSelection gets all preceding siblings of each element up to but not
+// including the element matched by the Selection. It returns a new Selection
+// object containing the matched elements.
+func (s *Selection) PrevUntilSelection(sel *Selection) *Selection {
+ if sel == nil {
+ return s.PrevAll()
+ }
+ return s.PrevUntilNodes(sel.Nodes...)
+}
+
+// PrevUntilNodes gets all preceding siblings of each element up to but not
+// including the element matched by the nodes. It returns a new Selection
+// object containing the matched elements.
+func (s *Selection) PrevUntilNodes(nodes ...*html.Node) *Selection {
+ return pushStack(s, getSiblingNodes(s.Nodes, siblingPrevUntil,
+ nil, nodes))
+}
+
+// NextFilteredUntil is like NextUntil, with the option to filter
+// the results based on a selector string.
+// It returns a new Selection object containing the matched elements.
+func (s *Selection) NextFilteredUntil(filterSelector, untilSelector string) *Selection {
+ return filterAndPush(s, getSiblingNodes(s.Nodes, siblingNextUntil,
+ compileMatcher(untilSelector), nil), compileMatcher(filterSelector))
+}
+
+// NextFilteredUntilMatcher is like NextUntilMatcher, with the option to filter
+// the results based on a matcher.
+// It returns a new Selection object containing the matched elements.
+func (s *Selection) NextFilteredUntilMatcher(filter, until Matcher) *Selection {
+ return filterAndPush(s, getSiblingNodes(s.Nodes, siblingNextUntil,
+ until, nil), filter)
+}
+
+// NextFilteredUntilSelection is like NextUntilSelection, with the
+// option to filter the results based on a selector string. It returns a new
+// Selection object containing the matched elements.
+func (s *Selection) NextFilteredUntilSelection(filterSelector string, sel *Selection) *Selection {
+ return s.NextMatcherUntilSelection(compileMatcher(filterSelector), sel)
+}
+
+// NextMatcherUntilSelection is like NextUntilSelection, with the
+// option to filter the results based on a matcher. It returns a new
+// Selection object containing the matched elements.
+func (s *Selection) NextMatcherUntilSelection(filter Matcher, sel *Selection) *Selection {
+ if sel == nil {
+ return s.NextMatcher(filter)
+ }
+ return s.NextMatcherUntilNodes(filter, sel.Nodes...)
+}
+
+// NextFilteredUntilNodes is like NextUntilNodes, with the
+// option to filter the results based on a selector string. It returns a new
+// Selection object containing the matched elements.
+func (s *Selection) NextFilteredUntilNodes(filterSelector string, nodes ...*html.Node) *Selection {
+ return filterAndPush(s, getSiblingNodes(s.Nodes, siblingNextUntil,
+ nil, nodes), compileMatcher(filterSelector))
+}
+
+// NextMatcherUntilNodes is like NextUntilNodes, with the
+// option to filter the results based on a matcher. It returns a new
+// Selection object containing the matched elements.
+func (s *Selection) NextMatcherUntilNodes(filter Matcher, nodes ...*html.Node) *Selection {
+ return filterAndPush(s, getSiblingNodes(s.Nodes, siblingNextUntil,
+ nil, nodes), filter)
+}
+
+// PrevFilteredUntil is like PrevUntil, with the option to filter
+// the results based on a selector string.
+// It returns a new Selection object containing the matched elements.
+func (s *Selection) PrevFilteredUntil(filterSelector, untilSelector string) *Selection {
+ return filterAndPush(s, getSiblingNodes(s.Nodes, siblingPrevUntil,
+ compileMatcher(untilSelector), nil), compileMatcher(filterSelector))
+}
+
+// PrevFilteredUntilMatcher is like PrevUntilMatcher, with the option to filter
+// the results based on a matcher.
+// It returns a new Selection object containing the matched elements.
+func (s *Selection) PrevFilteredUntilMatcher(filter, until Matcher) *Selection {
+ return filterAndPush(s, getSiblingNodes(s.Nodes, siblingPrevUntil,
+ until, nil), filter)
+}
+
+// PrevFilteredUntilSelection is like PrevUntilSelection, with the
+// option to filter the results based on a selector string. It returns a new
+// Selection object containing the matched elements.
+func (s *Selection) PrevFilteredUntilSelection(filterSelector string, sel *Selection) *Selection {
+ return s.PrevMatcherUntilSelection(compileMatcher(filterSelector), sel)
+}
+
+// PrevMatcherUntilSelection is like PrevUntilSelection, with the
+// option to filter the results based on a matcher. It returns a new
+// Selection object containing the matched elements.
+func (s *Selection) PrevMatcherUntilSelection(filter Matcher, sel *Selection) *Selection {
+ if sel == nil {
+ return s.PrevMatcher(filter)
+ }
+ return s.PrevMatcherUntilNodes(filter, sel.Nodes...)
+}
+
+// PrevFilteredUntilNodes is like PrevUntilNodes, with the
+// option to filter the results based on a selector string. It returns a new
+// Selection object containing the matched elements.
+func (s *Selection) PrevFilteredUntilNodes(filterSelector string, nodes ...*html.Node) *Selection {
+ return filterAndPush(s, getSiblingNodes(s.Nodes, siblingPrevUntil,
+ nil, nodes), compileMatcher(filterSelector))
+}
+
+// PrevMatcherUntilNodes is like PrevUntilNodes, with the
+// option to filter the results based on a matcher. It returns a new
+// Selection object containing the matched elements.
+func (s *Selection) PrevMatcherUntilNodes(filter Matcher, nodes ...*html.Node) *Selection {
+ return filterAndPush(s, getSiblingNodes(s.Nodes, siblingPrevUntil,
+ nil, nodes), filter)
+}
+
+// Filter and push filters the nodes based on a matcher, and pushes the results
+// on the stack, with the srcSel as previous selection.
+func filterAndPush(srcSel *Selection, nodes []*html.Node, m Matcher) *Selection {
+ // Create a temporary Selection with the specified nodes to filter using winnow
+ sel := &Selection{nodes, srcSel.document, nil}
+ // Filter based on matcher and push on stack
+ return pushStack(srcSel, winnow(sel, m, true))
+}
+
+// Internal implementation of Find that return raw nodes.
+func findWithMatcher(nodes []*html.Node, m Matcher) []*html.Node {
+ // Map nodes to find the matches within the children of each node
+ return mapNodes(nodes, func(i int, n *html.Node) (result []*html.Node) {
+ // Go down one level, becausejQuery's Find selects only within descendants
+ for c := n.FirstChild; c != nil; c = c.NextSibling {
+ if c.Type == html.ElementNode {
+ result = append(result, m.MatchAll(c)...)
+ }
+ }
+ return
+ })
+}
+
+// Internal implementation to get all parent nodes, stopping at the specified
+// node (or nil if no stop).
+func getParentsNodes(nodes []*html.Node, stopm Matcher, stopNodes []*html.Node) []*html.Node {
+ return mapNodes(nodes, func(i int, n *html.Node) (result []*html.Node) {
+ for p := n.Parent; p != nil; p = p.Parent {
+ sel := newSingleSelection(p, nil)
+ if stopm != nil {
+ if sel.IsMatcher(stopm) {
+ break
+ }
+ } else if len(stopNodes) > 0 {
+ if sel.IsNodes(stopNodes...) {
+ break
+ }
+ }
+ if p.Type == html.ElementNode {
+ result = append(result, p)
+ }
+ }
+ return
+ })
+}
+
+// Internal implementation of sibling nodes that return a raw slice of matches.
+func getSiblingNodes(nodes []*html.Node, st siblingType, untilm Matcher, untilNodes []*html.Node) []*html.Node {
+ var f func(*html.Node) bool
+
+ // If the requested siblings are ...Until, create the test function to
+ // determine if the until condition is reached (returns true if it is)
+ if st == siblingNextUntil || st == siblingPrevUntil {
+ f = func(n *html.Node) bool {
+ if untilm != nil {
+ // Matcher-based condition
+ sel := newSingleSelection(n, nil)
+ return sel.IsMatcher(untilm)
+ } else if len(untilNodes) > 0 {
+ // Nodes-based condition
+ sel := newSingleSelection(n, nil)
+ return sel.IsNodes(untilNodes...)
+ }
+ return false
+ }
+ }
+
+ return mapNodes(nodes, func(i int, n *html.Node) []*html.Node {
+ return getChildrenWithSiblingType(n.Parent, st, n, f)
+ })
+}
+
+// Gets the children nodes of each node in the specified slice of nodes,
+// based on the sibling type request.
+func getChildrenNodes(nodes []*html.Node, st siblingType) []*html.Node {
+ return mapNodes(nodes, func(i int, n *html.Node) []*html.Node {
+ return getChildrenWithSiblingType(n, st, nil, nil)
+ })
+}
+
+// Gets the children of the specified parent, based on the requested sibling
+// type, skipping a specified node if required.
+func getChildrenWithSiblingType(parent *html.Node, st siblingType, skipNode *html.Node,
+ untilFunc func(*html.Node) bool) (result []*html.Node) {
+
+ // Create the iterator function
+ var iter = func(cur *html.Node) (ret *html.Node) {
+ // Based on the sibling type requested, iterate the right way
+ for {
+ switch st {
+ case siblingAll, siblingAllIncludingNonElements:
+ if cur == nil {
+ // First iteration, start with first child of parent
+ // Skip node if required
+ if ret = parent.FirstChild; ret == skipNode && skipNode != nil {
+ ret = skipNode.NextSibling
+ }
+ } else {
+ // Skip node if required
+ if ret = cur.NextSibling; ret == skipNode && skipNode != nil {
+ ret = skipNode.NextSibling
+ }
+ }
+ case siblingPrev, siblingPrevAll, siblingPrevUntil:
+ if cur == nil {
+ // Start with previous sibling of the skip node
+ ret = skipNode.PrevSibling
+ } else {
+ ret = cur.PrevSibling
+ }
+ case siblingNext, siblingNextAll, siblingNextUntil:
+ if cur == nil {
+ // Start with next sibling of the skip node
+ ret = skipNode.NextSibling
+ } else {
+ ret = cur.NextSibling
+ }
+ default:
+ panic("Invalid sibling type.")
+ }
+ if ret == nil || ret.Type == html.ElementNode || st == siblingAllIncludingNonElements {
+ return
+ }
+ // Not a valid node, try again from this one
+ cur = ret
+ }
+ }
+
+ for c := iter(nil); c != nil; c = iter(c) {
+ // If this is an ...Until case, test before append (returns true
+ // if the until condition is reached)
+ if st == siblingNextUntil || st == siblingPrevUntil {
+ if untilFunc(c) {
+ return
+ }
+ }
+ result = append(result, c)
+ if st == siblingNext || st == siblingPrev {
+ // Only one node was requested (immediate next or previous), so exit
+ return
+ }
+ }
+ return
+}
+
+// Internal implementation of parent nodes that return a raw slice of Nodes.
+func getParentNodes(nodes []*html.Node) []*html.Node {
+ return mapNodes(nodes, func(i int, n *html.Node) []*html.Node {
+ if n.Parent != nil && n.Parent.Type == html.ElementNode {
+ return []*html.Node{n.Parent}
+ }
+ return nil
+ })
+}
+
+// Internal map function used by many traversing methods. Takes the source nodes
+// to iterate on and the mapping function that returns an array of nodes.
+// Returns an array of nodes mapped by calling the callback function once for
+// each node in the source nodes.
+func mapNodes(nodes []*html.Node, f func(int, *html.Node) []*html.Node) (result []*html.Node) {
+ set := make(map[*html.Node]bool)
+ for i, n := range nodes {
+ if vals := f(i, n); len(vals) > 0 {
+ result = appendWithoutDuplicates(result, vals, set)
+ }
+ }
+ return result
+}
diff --git a/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/traversal_test.go b/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/traversal_test.go
new file mode 100644
index 000000000..04383a413
--- /dev/null
+++ b/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/traversal_test.go
@@ -0,0 +1,793 @@
+package goquery
+
+import (
+ "strings"
+ "testing"
+)
+
+func TestFind(t *testing.T) {
+ sel := Doc().Find("div.row-fluid")
+ assertLength(t, sel.Nodes, 9)
+}
+
+func TestFindRollback(t *testing.T) {
+ sel := Doc().Find("div.row-fluid")
+ sel2 := sel.Find("a").End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestFindNotSelf(t *testing.T) {
+ sel := Doc().Find("h1").Find("h1")
+ assertLength(t, sel.Nodes, 0)
+}
+
+func TestFindInvalid(t *testing.T) {
+ sel := Doc().Find(":+ ^")
+ assertLength(t, sel.Nodes, 0)
+}
+
+func TestFindBig(t *testing.T) {
+ doc := DocW()
+ sel := doc.Find("li")
+ assertLength(t, sel.Nodes, 373)
+ sel2 := doc.Find("span")
+ assertLength(t, sel2.Nodes, 448)
+ sel3 := sel.FindSelection(sel2)
+ assertLength(t, sel3.Nodes, 248)
+}
+
+func TestChainedFind(t *testing.T) {
+ sel := Doc().Find("div.hero-unit").Find(".row-fluid")
+ assertLength(t, sel.Nodes, 4)
+}
+
+func TestChainedFindInvalid(t *testing.T) {
+ sel := Doc().Find("div.hero-unit").Find("")
+ assertLength(t, sel.Nodes, 0)
+}
+
+func TestChildren(t *testing.T) {
+ sel := Doc().Find(".pvk-content").Children()
+ assertLength(t, sel.Nodes, 5)
+}
+
+func TestChildrenRollback(t *testing.T) {
+ sel := Doc().Find(".pvk-content")
+ sel2 := sel.Children().End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestContents(t *testing.T) {
+ sel := Doc().Find(".pvk-content").Contents()
+ assertLength(t, sel.Nodes, 13)
+}
+
+func TestContentsRollback(t *testing.T) {
+ sel := Doc().Find(".pvk-content")
+ sel2 := sel.Contents().End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestChildrenFiltered(t *testing.T) {
+ sel := Doc().Find(".pvk-content").ChildrenFiltered(".hero-unit")
+ assertLength(t, sel.Nodes, 1)
+}
+
+func TestChildrenFilteredInvalid(t *testing.T) {
+ sel := Doc().Find(".pvk-content").ChildrenFiltered("")
+ assertLength(t, sel.Nodes, 0)
+}
+
+func TestChildrenFilteredRollback(t *testing.T) {
+ sel := Doc().Find(".pvk-content")
+ sel2 := sel.ChildrenFiltered(".hero-unit").End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestContentsFiltered(t *testing.T) {
+ sel := Doc().Find(".pvk-content").ContentsFiltered(".hero-unit")
+ assertLength(t, sel.Nodes, 1)
+}
+
+func TestContentsFilteredInvalid(t *testing.T) {
+ sel := Doc().Find(".pvk-content").ContentsFiltered("~")
+ assertLength(t, sel.Nodes, 0)
+}
+
+func TestContentsFilteredRollback(t *testing.T) {
+ sel := Doc().Find(".pvk-content")
+ sel2 := sel.ContentsFiltered(".hero-unit").End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestChildrenFilteredNone(t *testing.T) {
+ sel := Doc().Find(".pvk-content").ChildrenFiltered("a.btn")
+ assertLength(t, sel.Nodes, 0)
+}
+
+func TestParent(t *testing.T) {
+ sel := Doc().Find(".container-fluid").Parent()
+ assertLength(t, sel.Nodes, 3)
+}
+
+func TestParentRollback(t *testing.T) {
+ sel := Doc().Find(".container-fluid")
+ sel2 := sel.Parent().End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestParentBody(t *testing.T) {
+ sel := Doc().Find("body").Parent()
+ assertLength(t, sel.Nodes, 1)
+}
+
+func TestParentFiltered(t *testing.T) {
+ sel := Doc().Find(".container-fluid").ParentFiltered(".hero-unit")
+ assertLength(t, sel.Nodes, 1)
+ assertClass(t, sel, "hero-unit")
+}
+
+func TestParentFilteredInvalid(t *testing.T) {
+ sel := Doc().Find(".container-fluid").ParentFiltered("")
+ assertLength(t, sel.Nodes, 0)
+}
+
+func TestParentFilteredRollback(t *testing.T) {
+ sel := Doc().Find(".container-fluid")
+ sel2 := sel.ParentFiltered(".hero-unit").End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestParents(t *testing.T) {
+ sel := Doc().Find(".container-fluid").Parents()
+ assertLength(t, sel.Nodes, 8)
+}
+
+func TestParentsOrder(t *testing.T) {
+ sel := Doc().Find("#cf2").Parents()
+ assertLength(t, sel.Nodes, 6)
+ assertSelectionIs(t, sel, ".hero-unit", ".pvk-content", "div.row-fluid", "#cf1", "body", "html")
+}
+
+func TestParentsRollback(t *testing.T) {
+ sel := Doc().Find(".container-fluid")
+ sel2 := sel.Parents().End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestParentsFiltered(t *testing.T) {
+ sel := Doc().Find(".container-fluid").ParentsFiltered("body")
+ assertLength(t, sel.Nodes, 1)
+}
+
+func TestParentsFilteredInvalid(t *testing.T) {
+ sel := Doc().Find(".container-fluid").ParentsFiltered("")
+ assertLength(t, sel.Nodes, 0)
+}
+
+func TestParentsFilteredRollback(t *testing.T) {
+ sel := Doc().Find(".container-fluid")
+ sel2 := sel.ParentsFiltered("body").End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestParentsUntil(t *testing.T) {
+ sel := Doc().Find(".container-fluid").ParentsUntil("body")
+ assertLength(t, sel.Nodes, 6)
+}
+
+func TestParentsUntilInvalid(t *testing.T) {
+ sel := Doc().Find(".container-fluid").ParentsUntil("")
+ assertLength(t, sel.Nodes, 8)
+}
+
+func TestParentsUntilRollback(t *testing.T) {
+ sel := Doc().Find(".container-fluid")
+ sel2 := sel.ParentsUntil("body").End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestParentsUntilSelection(t *testing.T) {
+ sel := Doc().Find(".container-fluid")
+ sel2 := Doc().Find(".pvk-content")
+ sel = sel.ParentsUntilSelection(sel2)
+ assertLength(t, sel.Nodes, 3)
+}
+
+func TestParentsUntilSelectionRollback(t *testing.T) {
+ sel := Doc().Find(".container-fluid")
+ sel2 := Doc().Find(".pvk-content")
+ sel2 = sel.ParentsUntilSelection(sel2).End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestParentsUntilNodes(t *testing.T) {
+ sel := Doc().Find(".container-fluid")
+ sel2 := Doc().Find(".pvk-content, .hero-unit")
+ sel = sel.ParentsUntilNodes(sel2.Nodes...)
+ assertLength(t, sel.Nodes, 2)
+}
+
+func TestParentsUntilNodesRollback(t *testing.T) {
+ sel := Doc().Find(".container-fluid")
+ sel2 := Doc().Find(".pvk-content, .hero-unit")
+ sel2 = sel.ParentsUntilNodes(sel2.Nodes...).End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestParentsFilteredUntil(t *testing.T) {
+ sel := Doc().Find(".container-fluid").ParentsFilteredUntil(".pvk-content", "body")
+ assertLength(t, sel.Nodes, 2)
+}
+
+func TestParentsFilteredUntilInvalid(t *testing.T) {
+ sel := Doc().Find(".container-fluid").ParentsFilteredUntil("", "")
+ assertLength(t, sel.Nodes, 0)
+}
+
+func TestParentsFilteredUntilRollback(t *testing.T) {
+ sel := Doc().Find(".container-fluid")
+ sel2 := sel.ParentsFilteredUntil(".pvk-content", "body").End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestParentsFilteredUntilSelection(t *testing.T) {
+ sel := Doc().Find(".container-fluid")
+ sel2 := Doc().Find(".row-fluid")
+ sel = sel.ParentsFilteredUntilSelection("div", sel2)
+ assertLength(t, sel.Nodes, 3)
+}
+
+func TestParentsFilteredUntilSelectionRollback(t *testing.T) {
+ sel := Doc().Find(".container-fluid")
+ sel2 := Doc().Find(".row-fluid")
+ sel2 = sel.ParentsFilteredUntilSelection("div", sel2).End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestParentsFilteredUntilNodes(t *testing.T) {
+ sel := Doc().Find(".container-fluid")
+ sel2 := Doc().Find(".row-fluid")
+ sel = sel.ParentsFilteredUntilNodes("body", sel2.Nodes...)
+ assertLength(t, sel.Nodes, 1)
+}
+
+func TestParentsFilteredUntilNodesRollback(t *testing.T) {
+ sel := Doc().Find(".container-fluid")
+ sel2 := Doc().Find(".row-fluid")
+ sel2 = sel.ParentsFilteredUntilNodes("body", sel2.Nodes...).End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestSiblings(t *testing.T) {
+ sel := Doc().Find("h1").Siblings()
+ assertLength(t, sel.Nodes, 1)
+}
+
+func TestSiblingsRollback(t *testing.T) {
+ sel := Doc().Find("h1")
+ sel2 := sel.Siblings().End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestSiblings2(t *testing.T) {
+ sel := Doc().Find(".pvk-gutter").Siblings()
+ assertLength(t, sel.Nodes, 9)
+}
+
+func TestSiblings3(t *testing.T) {
+ sel := Doc().Find("body>.container-fluid").Siblings()
+ assertLength(t, sel.Nodes, 0)
+}
+
+func TestSiblingsFiltered(t *testing.T) {
+ sel := Doc().Find(".pvk-gutter").SiblingsFiltered(".pvk-content")
+ assertLength(t, sel.Nodes, 3)
+}
+
+func TestSiblingsFilteredInvalid(t *testing.T) {
+ sel := Doc().Find(".pvk-gutter").SiblingsFiltered("")
+ assertLength(t, sel.Nodes, 0)
+}
+
+func TestSiblingsFilteredRollback(t *testing.T) {
+ sel := Doc().Find(".pvk-gutter")
+ sel2 := sel.SiblingsFiltered(".pvk-content").End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestNext(t *testing.T) {
+ sel := Doc().Find("h1").Next()
+ assertLength(t, sel.Nodes, 1)
+}
+
+func TestNextRollback(t *testing.T) {
+ sel := Doc().Find("h1")
+ sel2 := sel.Next().End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestNext2(t *testing.T) {
+ sel := Doc().Find(".close").Next()
+ assertLength(t, sel.Nodes, 1)
+}
+
+func TestNextNone(t *testing.T) {
+ sel := Doc().Find("small").Next()
+ assertLength(t, sel.Nodes, 0)
+}
+
+func TestNextFiltered(t *testing.T) {
+ sel := Doc().Find(".container-fluid").NextFiltered("div")
+ assertLength(t, sel.Nodes, 2)
+}
+
+func TestNextFilteredInvalid(t *testing.T) {
+ sel := Doc().Find(".container-fluid").NextFiltered("")
+ assertLength(t, sel.Nodes, 0)
+}
+
+func TestNextFilteredRollback(t *testing.T) {
+ sel := Doc().Find(".container-fluid")
+ sel2 := sel.NextFiltered("div").End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestNextFiltered2(t *testing.T) {
+ sel := Doc().Find(".container-fluid").NextFiltered("[ng-view]")
+ assertLength(t, sel.Nodes, 1)
+}
+
+func TestPrev(t *testing.T) {
+ sel := Doc().Find(".red").Prev()
+ assertLength(t, sel.Nodes, 1)
+ assertClass(t, sel, "green")
+}
+
+func TestPrevRollback(t *testing.T) {
+ sel := Doc().Find(".red")
+ sel2 := sel.Prev().End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestPrev2(t *testing.T) {
+ sel := Doc().Find(".row-fluid").Prev()
+ assertLength(t, sel.Nodes, 5)
+}
+
+func TestPrevNone(t *testing.T) {
+ sel := Doc().Find("h2").Prev()
+ assertLength(t, sel.Nodes, 0)
+}
+
+func TestPrevFiltered(t *testing.T) {
+ sel := Doc().Find(".row-fluid").PrevFiltered(".row-fluid")
+ assertLength(t, sel.Nodes, 5)
+}
+
+func TestPrevFilteredInvalid(t *testing.T) {
+ sel := Doc().Find(".row-fluid").PrevFiltered("")
+ assertLength(t, sel.Nodes, 0)
+}
+
+func TestPrevFilteredRollback(t *testing.T) {
+ sel := Doc().Find(".row-fluid")
+ sel2 := sel.PrevFiltered(".row-fluid").End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestNextAll(t *testing.T) {
+ sel := Doc().Find("#cf2 div:nth-child(1)").NextAll()
+ assertLength(t, sel.Nodes, 3)
+}
+
+func TestNextAllRollback(t *testing.T) {
+ sel := Doc().Find("#cf2 div:nth-child(1)")
+ sel2 := sel.NextAll().End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestNextAll2(t *testing.T) {
+ sel := Doc().Find("div[ng-cloak]").NextAll()
+ assertLength(t, sel.Nodes, 1)
+}
+
+func TestNextAllNone(t *testing.T) {
+ sel := Doc().Find(".footer").NextAll()
+ assertLength(t, sel.Nodes, 0)
+}
+
+func TestNextAllFiltered(t *testing.T) {
+ sel := Doc().Find("#cf2 .row-fluid").NextAllFiltered("[ng-cloak]")
+ assertLength(t, sel.Nodes, 2)
+}
+
+func TestNextAllFilteredInvalid(t *testing.T) {
+ sel := Doc().Find("#cf2 .row-fluid").NextAllFiltered("")
+ assertLength(t, sel.Nodes, 0)
+}
+
+func TestNextAllFilteredRollback(t *testing.T) {
+ sel := Doc().Find("#cf2 .row-fluid")
+ sel2 := sel.NextAllFiltered("[ng-cloak]").End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestNextAllFiltered2(t *testing.T) {
+ sel := Doc().Find(".close").NextAllFiltered("h4")
+ assertLength(t, sel.Nodes, 1)
+}
+
+func TestPrevAll(t *testing.T) {
+ sel := Doc().Find("[ng-view]").PrevAll()
+ assertLength(t, sel.Nodes, 2)
+}
+
+func TestPrevAllOrder(t *testing.T) {
+ sel := Doc().Find("[ng-view]").PrevAll()
+ assertLength(t, sel.Nodes, 2)
+ assertSelectionIs(t, sel, "#cf4", "#cf3")
+}
+
+func TestPrevAllRollback(t *testing.T) {
+ sel := Doc().Find("[ng-view]")
+ sel2 := sel.PrevAll().End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestPrevAll2(t *testing.T) {
+ sel := Doc().Find(".pvk-gutter").PrevAll()
+ assertLength(t, sel.Nodes, 6)
+}
+
+func TestPrevAllFiltered(t *testing.T) {
+ sel := Doc().Find(".pvk-gutter").PrevAllFiltered(".pvk-content")
+ assertLength(t, sel.Nodes, 3)
+}
+
+func TestPrevAllFilteredInvalid(t *testing.T) {
+ sel := Doc().Find(".pvk-gutter").PrevAllFiltered("")
+ assertLength(t, sel.Nodes, 0)
+}
+
+func TestPrevAllFilteredRollback(t *testing.T) {
+ sel := Doc().Find(".pvk-gutter")
+ sel2 := sel.PrevAllFiltered(".pvk-content").End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestNextUntil(t *testing.T) {
+ sel := Doc().Find(".alert a").NextUntil("p")
+ assertLength(t, sel.Nodes, 1)
+ assertSelectionIs(t, sel, "h4")
+}
+
+func TestNextUntilInvalid(t *testing.T) {
+ sel := Doc().Find(".alert a").NextUntil("")
+ assertLength(t, sel.Nodes, 2)
+}
+
+func TestNextUntil2(t *testing.T) {
+ sel := Doc().Find("#cf2-1").NextUntil("[ng-cloak]")
+ assertLength(t, sel.Nodes, 1)
+ assertSelectionIs(t, sel, "#cf2-2")
+}
+
+func TestNextUntilOrder(t *testing.T) {
+ sel := Doc().Find("#cf2-1").NextUntil("#cf2-4")
+ assertLength(t, sel.Nodes, 2)
+ assertSelectionIs(t, sel, "#cf2-2", "#cf2-3")
+}
+
+func TestNextUntilRollback(t *testing.T) {
+ sel := Doc().Find("#cf2-1")
+ sel2 := sel.PrevUntil("#cf2-4").End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestNextUntilSelection(t *testing.T) {
+ sel := Doc2().Find("#n2")
+ sel2 := Doc2().Find("#n4")
+ sel2 = sel.NextUntilSelection(sel2)
+ assertLength(t, sel2.Nodes, 1)
+ assertSelectionIs(t, sel2, "#n3")
+}
+
+func TestNextUntilSelectionRollback(t *testing.T) {
+ sel := Doc2().Find("#n2")
+ sel2 := Doc2().Find("#n4")
+ sel2 = sel.NextUntilSelection(sel2).End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestNextUntilNodes(t *testing.T) {
+ sel := Doc2().Find("#n2")
+ sel2 := Doc2().Find("#n5")
+ sel2 = sel.NextUntilNodes(sel2.Nodes...)
+ assertLength(t, sel2.Nodes, 2)
+ assertSelectionIs(t, sel2, "#n3", "#n4")
+}
+
+func TestNextUntilNodesRollback(t *testing.T) {
+ sel := Doc2().Find("#n2")
+ sel2 := Doc2().Find("#n5")
+ sel2 = sel.NextUntilNodes(sel2.Nodes...).End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestPrevUntil(t *testing.T) {
+ sel := Doc().Find(".alert p").PrevUntil("a")
+ assertLength(t, sel.Nodes, 1)
+ assertSelectionIs(t, sel, "h4")
+}
+
+func TestPrevUntilInvalid(t *testing.T) {
+ sel := Doc().Find(".alert p").PrevUntil("")
+ assertLength(t, sel.Nodes, 2)
+}
+
+func TestPrevUntil2(t *testing.T) {
+ sel := Doc().Find("[ng-cloak]").PrevUntil(":not([ng-cloak])")
+ assertLength(t, sel.Nodes, 1)
+ assertSelectionIs(t, sel, "[ng-cloak]")
+}
+
+func TestPrevUntilOrder(t *testing.T) {
+ sel := Doc().Find("#cf2-4").PrevUntil("#cf2-1")
+ assertLength(t, sel.Nodes, 2)
+ assertSelectionIs(t, sel, "#cf2-3", "#cf2-2")
+}
+
+func TestPrevUntilRollback(t *testing.T) {
+ sel := Doc().Find("#cf2-4")
+ sel2 := sel.PrevUntil("#cf2-1").End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestPrevUntilSelection(t *testing.T) {
+ sel := Doc2().Find("#n4")
+ sel2 := Doc2().Find("#n2")
+ sel2 = sel.PrevUntilSelection(sel2)
+ assertLength(t, sel2.Nodes, 1)
+ assertSelectionIs(t, sel2, "#n3")
+}
+
+func TestPrevUntilSelectionRollback(t *testing.T) {
+ sel := Doc2().Find("#n4")
+ sel2 := Doc2().Find("#n2")
+ sel2 = sel.PrevUntilSelection(sel2).End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestPrevUntilNodes(t *testing.T) {
+ sel := Doc2().Find("#n5")
+ sel2 := Doc2().Find("#n2")
+ sel2 = sel.PrevUntilNodes(sel2.Nodes...)
+ assertLength(t, sel2.Nodes, 2)
+ assertSelectionIs(t, sel2, "#n4", "#n3")
+}
+
+func TestPrevUntilNodesRollback(t *testing.T) {
+ sel := Doc2().Find("#n5")
+ sel2 := Doc2().Find("#n2")
+ sel2 = sel.PrevUntilNodes(sel2.Nodes...).End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestNextFilteredUntil(t *testing.T) {
+ sel := Doc2().Find(".two").NextFilteredUntil(".even", ".six")
+ assertLength(t, sel.Nodes, 4)
+ assertSelectionIs(t, sel, "#n3", "#n5", "#nf3", "#nf5")
+}
+
+func TestNextFilteredUntilInvalid(t *testing.T) {
+ sel := Doc2().Find(".two").NextFilteredUntil("", "")
+ assertLength(t, sel.Nodes, 0)
+}
+
+func TestNextFilteredUntilRollback(t *testing.T) {
+ sel := Doc2().Find(".two")
+ sel2 := sel.NextFilteredUntil(".even", ".six").End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestNextFilteredUntilSelection(t *testing.T) {
+ sel := Doc2().Find(".even")
+ sel2 := Doc2().Find(".five")
+ sel = sel.NextFilteredUntilSelection(".even", sel2)
+ assertLength(t, sel.Nodes, 2)
+ assertSelectionIs(t, sel, "#n3", "#nf3")
+}
+
+func TestNextFilteredUntilSelectionRollback(t *testing.T) {
+ sel := Doc2().Find(".even")
+ sel2 := Doc2().Find(".five")
+ sel3 := sel.NextFilteredUntilSelection(".even", sel2).End()
+ assertEqual(t, sel, sel3)
+}
+
+func TestNextFilteredUntilNodes(t *testing.T) {
+ sel := Doc2().Find(".even")
+ sel2 := Doc2().Find(".four")
+ sel = sel.NextFilteredUntilNodes(".odd", sel2.Nodes...)
+ assertLength(t, sel.Nodes, 4)
+ assertSelectionIs(t, sel, "#n2", "#n6", "#nf2", "#nf6")
+}
+
+func TestNextFilteredUntilNodesRollback(t *testing.T) {
+ sel := Doc2().Find(".even")
+ sel2 := Doc2().Find(".four")
+ sel3 := sel.NextFilteredUntilNodes(".odd", sel2.Nodes...).End()
+ assertEqual(t, sel, sel3)
+}
+
+func TestPrevFilteredUntil(t *testing.T) {
+ sel := Doc2().Find(".five").PrevFilteredUntil(".odd", ".one")
+ assertLength(t, sel.Nodes, 4)
+ assertSelectionIs(t, sel, "#n4", "#n2", "#nf4", "#nf2")
+}
+
+func TestPrevFilteredUntilInvalid(t *testing.T) {
+ sel := Doc2().Find(".five").PrevFilteredUntil("", "")
+ assertLength(t, sel.Nodes, 0)
+}
+
+func TestPrevFilteredUntilRollback(t *testing.T) {
+ sel := Doc2().Find(".four")
+ sel2 := sel.PrevFilteredUntil(".odd", ".one").End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestPrevFilteredUntilSelection(t *testing.T) {
+ sel := Doc2().Find(".odd")
+ sel2 := Doc2().Find(".two")
+ sel = sel.PrevFilteredUntilSelection(".odd", sel2)
+ assertLength(t, sel.Nodes, 2)
+ assertSelectionIs(t, sel, "#n4", "#nf4")
+}
+
+func TestPrevFilteredUntilSelectionRollback(t *testing.T) {
+ sel := Doc2().Find(".even")
+ sel2 := Doc2().Find(".five")
+ sel3 := sel.PrevFilteredUntilSelection(".even", sel2).End()
+ assertEqual(t, sel, sel3)
+}
+
+func TestPrevFilteredUntilNodes(t *testing.T) {
+ sel := Doc2().Find(".even")
+ sel2 := Doc2().Find(".four")
+ sel = sel.PrevFilteredUntilNodes(".odd", sel2.Nodes...)
+ assertLength(t, sel.Nodes, 2)
+ assertSelectionIs(t, sel, "#n2", "#nf2")
+}
+
+func TestPrevFilteredUntilNodesRollback(t *testing.T) {
+ sel := Doc2().Find(".even")
+ sel2 := Doc2().Find(".four")
+ sel3 := sel.PrevFilteredUntilNodes(".odd", sel2.Nodes...).End()
+ assertEqual(t, sel, sel3)
+}
+
+func TestClosestItself(t *testing.T) {
+ sel := Doc2().Find(".three")
+ sel2 := sel.Closest(".row")
+ assertLength(t, sel2.Nodes, sel.Length())
+ assertSelectionIs(t, sel2, "#n3", "#nf3")
+}
+
+func TestClosestNoDupes(t *testing.T) {
+ sel := Doc().Find(".span12")
+ sel2 := sel.Closest(".pvk-content")
+ assertLength(t, sel2.Nodes, 1)
+ assertClass(t, sel2, "pvk-content")
+}
+
+func TestClosestNone(t *testing.T) {
+ sel := Doc().Find("h4")
+ sel2 := sel.Closest("a")
+ assertLength(t, sel2.Nodes, 0)
+}
+
+func TestClosestInvalid(t *testing.T) {
+ sel := Doc().Find("h4")
+ sel2 := sel.Closest("")
+ assertLength(t, sel2.Nodes, 0)
+}
+
+func TestClosestMany(t *testing.T) {
+ sel := Doc().Find(".container-fluid")
+ sel2 := sel.Closest(".pvk-content")
+ assertLength(t, sel2.Nodes, 2)
+ assertSelectionIs(t, sel2, "#pc1", "#pc2")
+}
+
+func TestClosestRollback(t *testing.T) {
+ sel := Doc().Find(".container-fluid")
+ sel2 := sel.Closest(".pvk-content").End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestClosestSelectionItself(t *testing.T) {
+ sel := Doc2().Find(".three")
+ sel2 := sel.ClosestSelection(Doc2().Find(".row"))
+ assertLength(t, sel2.Nodes, sel.Length())
+}
+
+func TestClosestSelectionNoDupes(t *testing.T) {
+ sel := Doc().Find(".span12")
+ sel2 := sel.ClosestSelection(Doc().Find(".pvk-content"))
+ assertLength(t, sel2.Nodes, 1)
+ assertClass(t, sel2, "pvk-content")
+}
+
+func TestClosestSelectionNone(t *testing.T) {
+ sel := Doc().Find("h4")
+ sel2 := sel.ClosestSelection(Doc().Find("a"))
+ assertLength(t, sel2.Nodes, 0)
+}
+
+func TestClosestSelectionMany(t *testing.T) {
+ sel := Doc().Find(".container-fluid")
+ sel2 := sel.ClosestSelection(Doc().Find(".pvk-content"))
+ assertLength(t, sel2.Nodes, 2)
+ assertSelectionIs(t, sel2, "#pc1", "#pc2")
+}
+
+func TestClosestSelectionRollback(t *testing.T) {
+ sel := Doc().Find(".container-fluid")
+ sel2 := sel.ClosestSelection(Doc().Find(".pvk-content")).End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestClosestNodesItself(t *testing.T) {
+ sel := Doc2().Find(".three")
+ sel2 := sel.ClosestNodes(Doc2().Find(".row").Nodes...)
+ assertLength(t, sel2.Nodes, sel.Length())
+}
+
+func TestClosestNodesNoDupes(t *testing.T) {
+ sel := Doc().Find(".span12")
+ sel2 := sel.ClosestNodes(Doc().Find(".pvk-content").Nodes...)
+ assertLength(t, sel2.Nodes, 1)
+ assertClass(t, sel2, "pvk-content")
+}
+
+func TestClosestNodesNone(t *testing.T) {
+ sel := Doc().Find("h4")
+ sel2 := sel.ClosestNodes(Doc().Find("a").Nodes...)
+ assertLength(t, sel2.Nodes, 0)
+}
+
+func TestClosestNodesMany(t *testing.T) {
+ sel := Doc().Find(".container-fluid")
+ sel2 := sel.ClosestNodes(Doc().Find(".pvk-content").Nodes...)
+ assertLength(t, sel2.Nodes, 2)
+ assertSelectionIs(t, sel2, "#pc1", "#pc2")
+}
+
+func TestClosestNodesRollback(t *testing.T) {
+ sel := Doc().Find(".container-fluid")
+ sel2 := sel.ClosestNodes(Doc().Find(".pvk-content").Nodes...).End()
+ assertEqual(t, sel, sel2)
+}
+
+func TestIssue26(t *testing.T) {
+ img1 := ``
+ img2 := ``
+ cases := []struct {
+ s string
+ l int
+ }{
+ {s: img1 + img2, l: 2},
+ {s: img1, l: 1},
+ {s: img2, l: 1},
+ }
+ for _, c := range cases {
+ doc, err := NewDocumentFromReader(strings.NewReader(c.s))
+ if err != nil {
+ t.Fatal(err)
+ }
+ sel := doc.Find("img[src]")
+ assertLength(t, sel.Nodes, c.l)
+ }
+}
diff --git a/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/type.go b/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/type.go
new file mode 100644
index 000000000..6646c143b
--- /dev/null
+++ b/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/type.go
@@ -0,0 +1,203 @@
+package goquery
+
+import (
+ "errors"
+ "io"
+ "net/http"
+ "net/url"
+
+ "github.com/andybalholm/cascadia"
+ "golang.org/x/net/html"
+)
+
+// Document represents an HTML document to be manipulated. Unlike jQuery, which
+// is loaded as part of a DOM document, and thus acts upon its containing
+// document, GoQuery doesn't know which HTML document to act upon. So it needs
+// to be told, and that's what the Document class is for. It holds the root
+// document node to manipulate, and can make selections on this document.
+type Document struct {
+ *Selection
+ Url *url.URL
+ rootNode *html.Node
+}
+
+// NewDocumentFromNode is a Document constructor that takes a root html Node
+// as argument.
+func NewDocumentFromNode(root *html.Node) *Document {
+ return newDocument(root, nil)
+}
+
+// NewDocument is a Document constructor that takes a string URL as argument.
+// It loads the specified document, parses it, and stores the root Document
+// node, ready to be manipulated.
+//
+// Deprecated: Use the net/http standard library package to make the request
+// and validate the response before calling goquery.NewDocumentFromReader
+// with the response's body.
+func NewDocument(url string) (*Document, error) {
+ // Load the URL
+ res, e := http.Get(url)
+ if e != nil {
+ return nil, e
+ }
+ return NewDocumentFromResponse(res)
+}
+
+// NewDocumentFromReader returns a Document from an io.Reader.
+// It returns an error as second value if the reader's data cannot be parsed
+// as html. It does not check if the reader is also an io.Closer, the
+// provided reader is never closed by this call. It is the responsibility
+// of the caller to close it if required.
+func NewDocumentFromReader(r io.Reader) (*Document, error) {
+ root, e := html.Parse(r)
+ if e != nil {
+ return nil, e
+ }
+ return newDocument(root, nil), nil
+}
+
+// NewDocumentFromResponse is another Document constructor that takes an http response as argument.
+// It loads the specified response's document, parses it, and stores the root Document
+// node, ready to be manipulated. The response's body is closed on return.
+//
+// Deprecated: Use goquery.NewDocumentFromReader with the response's body.
+func NewDocumentFromResponse(res *http.Response) (*Document, error) {
+ if res == nil {
+ return nil, errors.New("Response is nil")
+ }
+ defer res.Body.Close()
+ if res.Request == nil {
+ return nil, errors.New("Response.Request is nil")
+ }
+
+ // Parse the HTML into nodes
+ root, e := html.Parse(res.Body)
+ if e != nil {
+ return nil, e
+ }
+
+ // Create and fill the document
+ return newDocument(root, res.Request.URL), nil
+}
+
+// CloneDocument creates a deep-clone of a document.
+func CloneDocument(doc *Document) *Document {
+ return newDocument(cloneNode(doc.rootNode), doc.Url)
+}
+
+// Private constructor, make sure all fields are correctly filled.
+func newDocument(root *html.Node, url *url.URL) *Document {
+ // Create and fill the document
+ d := &Document{nil, url, root}
+ d.Selection = newSingleSelection(root, d)
+ return d
+}
+
+// Selection represents a collection of nodes matching some criteria. The
+// initial Selection can be created by using Document.Find, and then
+// manipulated using the jQuery-like chainable syntax and methods.
+type Selection struct {
+ Nodes []*html.Node
+ document *Document
+ prevSel *Selection
+}
+
+// Helper constructor to create an empty selection
+func newEmptySelection(doc *Document) *Selection {
+ return &Selection{nil, doc, nil}
+}
+
+// Helper constructor to create a selection of only one node
+func newSingleSelection(node *html.Node, doc *Document) *Selection {
+ return &Selection{[]*html.Node{node}, doc, nil}
+}
+
+// Matcher is an interface that defines the methods to match
+// HTML nodes against a compiled selector string. Cascadia's
+// Selector implements this interface.
+type Matcher interface {
+ Match(*html.Node) bool
+ MatchAll(*html.Node) []*html.Node
+ Filter([]*html.Node) []*html.Node
+}
+
+// Single compiles a selector string to a Matcher that stops after the first
+// match is found.
+//
+// By default, Selection.Find and other functions that accept a selector string
+// to select nodes will use all matches corresponding to that selector. By
+// using the Matcher returned by Single, at most the first match will be
+// selected.
+//
+// For example, those two statements are semantically equivalent:
+//
+// sel1 := doc.Find("a").First()
+// sel2 := doc.FindMatcher(goquery.Single("a"))
+//
+// The one using Single is optimized to be potentially much faster on large
+// documents.
+//
+// Only the behaviour of the MatchAll method of the Matcher interface is
+// altered compared to standard Matchers. This means that the single-selection
+// property of the Matcher only applies for Selection methods where the Matcher
+// is used to select nodes, not to filter or check if a node matches the
+// Matcher - in those cases, the behaviour of the Matcher is unchanged (e.g.
+// FilterMatcher(Single("div")) will still result in a Selection with multiple
+// "div"s if there were many "div"s in the Selection to begin with).
+func Single(selector string) Matcher {
+ return singleMatcher{compileMatcher(selector)}
+}
+
+// SingleMatcher returns a Matcher matches the same nodes as m, but that stops
+// after the first match is found.
+//
+// See the documentation of function Single for more details.
+func SingleMatcher(m Matcher) Matcher {
+ if _, ok := m.(singleMatcher); ok {
+ // m is already a singleMatcher
+ return m
+ }
+ return singleMatcher{m}
+}
+
+// compileMatcher compiles the selector string s and returns
+// the corresponding Matcher. If s is an invalid selector string,
+// it returns a Matcher that fails all matches.
+func compileMatcher(s string) Matcher {
+ cs, err := cascadia.Compile(s)
+ if err != nil {
+ return invalidMatcher{}
+ }
+ return cs
+}
+
+type singleMatcher struct {
+ Matcher
+}
+
+func (m singleMatcher) MatchAll(n *html.Node) []*html.Node {
+ // Optimized version - stops finding at the first match (cascadia-compiled
+ // matchers all use this code path).
+ if mm, ok := m.Matcher.(interface{ MatchFirst(*html.Node) *html.Node }); ok {
+ node := mm.MatchFirst(n)
+ if node == nil {
+ return nil
+ }
+ return []*html.Node{node}
+ }
+
+ // Fallback version, for e.g. test mocks that don't provide the MatchFirst
+ // method.
+ nodes := m.Matcher.MatchAll(n)
+ if len(nodes) > 0 {
+ return nodes[:1:1]
+ }
+ return nil
+}
+
+// invalidMatcher is a Matcher that always fails to match.
+type invalidMatcher struct{}
+
+func (invalidMatcher) Match(n *html.Node) bool { return false }
+func (invalidMatcher) MatchAll(n *html.Node) []*html.Node { return nil }
+func (invalidMatcher) Filter(ns []*html.Node) []*html.Node { return nil }
diff --git a/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/type_test.go b/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/type_test.go
new file mode 100644
index 000000000..84080a9c7
--- /dev/null
+++ b/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/type_test.go
@@ -0,0 +1,255 @@
+package goquery
+
+import (
+ "bytes"
+ "fmt"
+ "os"
+ "strings"
+ "testing"
+
+ "github.com/andybalholm/cascadia"
+ "golang.org/x/net/html"
+)
+
+// Test helper functions and members
+var doc *Document
+var doc2 *Document
+var doc3 *Document
+var docB *Document
+var docW *Document
+
+func Doc() *Document {
+ if doc == nil {
+ doc = loadDoc("page.html")
+ }
+ return doc
+}
+
+func Doc2() *Document {
+ if doc2 == nil {
+ doc2 = loadDoc("page2.html")
+ }
+ return doc2
+}
+
+func Doc2Clone() *Document {
+ return CloneDocument(Doc2())
+}
+
+func Doc3() *Document {
+ if doc3 == nil {
+ doc3 = loadDoc("page3.html")
+ }
+ return doc3
+}
+
+func Doc3Clone() *Document {
+ return CloneDocument(Doc3())
+}
+
+func DocB() *Document {
+ if docB == nil {
+ docB = loadDoc("gotesting.html")
+ }
+ return docB
+}
+
+func DocW() *Document {
+ if docW == nil {
+ docW = loadDoc("gowiki.html")
+ }
+ return docW
+}
+
+func assertLength(t *testing.T, nodes []*html.Node, length int) {
+ if len(nodes) != length {
+ t.Errorf("Expected %d nodes, found %d.", length, len(nodes))
+ for i, n := range nodes {
+ t.Logf("Node %d: %+v.", i, n)
+ }
+ }
+}
+
+func assertClass(t *testing.T, sel *Selection, class string) {
+ if !sel.HasClass(class) {
+ t.Errorf("Expected node to have class %s, found %+v.", class, sel.Get(0))
+ }
+}
+
+func assertPanic(t *testing.T) {
+ if e := recover(); e == nil {
+ t.Error("Expected a panic.")
+ }
+}
+
+func assertEqual(t *testing.T, s1 *Selection, s2 *Selection) {
+ if s1 != s2 {
+ t.Error("Expected selection objects to be the same.")
+ }
+}
+
+func assertSelectionIs(t *testing.T, sel *Selection, is ...string) {
+ for i := 0; i < sel.Length(); i++ {
+ if !sel.Eq(i).Is(is[i]) {
+ t.Errorf("Expected node %d to be %s, found %+v", i, is[i], sel.Get(i))
+ }
+ }
+}
+
+func printSel(t *testing.T, sel *Selection) {
+ if testing.Verbose() {
+ h, err := sel.Html()
+ if err != nil {
+ t.Fatal(err)
+ }
+ t.Log(h)
+ }
+}
+
+func loadDoc(page string) *Document {
+ var f *os.File
+ var e error
+
+ if f, e = os.Open(fmt.Sprintf("./testdata/%s", page)); e != nil {
+ panic(e.Error())
+ }
+ defer f.Close()
+
+ var node *html.Node
+ if node, e = html.Parse(f); e != nil {
+ panic(e.Error())
+ }
+ return NewDocumentFromNode(node)
+}
+
+func loadString(t *testing.T, doc string) *Document {
+ d, err := NewDocumentFromReader(strings.NewReader(doc))
+ if err != nil {
+ t.Error("Failed to parse test document")
+ }
+ return d
+}
+
+func TestNewDocument(t *testing.T) {
+ if f, e := os.Open("./testdata/page.html"); e != nil {
+ t.Error(e.Error())
+ } else {
+ defer f.Close()
+ if node, e := html.Parse(f); e != nil {
+ t.Error(e.Error())
+ } else {
+ doc = NewDocumentFromNode(node)
+ }
+ }
+}
+
+func TestNewDocumentFromReader(t *testing.T) {
+ cases := []struct {
+ src string
+ err bool
+ sel string
+ cnt int
+ }{
+ 0: {
+ src: `
+
+
+Test
+
+
Hi
+
+`,
+ sel: "h1",
+ cnt: 1,
+ },
+ 1: {
+ // Actually pretty hard to make html.Parse return an error
+ // based on content...
+ src: `>>qq>`,
+ },
+ }
+ buf := bytes.NewBuffer(nil)
+
+ for i, c := range cases {
+ buf.Reset()
+ buf.WriteString(c.src)
+
+ d, e := NewDocumentFromReader(buf)
+ if (e != nil) != c.err {
+ if c.err {
+ t.Errorf("[%d] - expected error, got none", i)
+ } else {
+ t.Errorf("[%d] - expected no error, got %s", i, e)
+ }
+ }
+ if c.sel != "" {
+ s := d.Find(c.sel)
+ if s.Length() != c.cnt {
+ t.Errorf("[%d] - expected %d nodes, found %d", i, c.cnt, s.Length())
+ }
+ }
+ }
+}
+
+func TestNewDocumentFromResponseNil(t *testing.T) {
+ _, e := NewDocumentFromResponse(nil)
+ if e == nil {
+ t.Error("Expected error, got none")
+ }
+}
+
+func TestIssue103(t *testing.T) {
+ d, err := NewDocumentFromReader(strings.NewReader("Scientists Stored These Images in DNA—Then Flawlessly Retrieved Them"))
+ if err != nil {
+ t.Error(err)
+ }
+ text := d.Find("title").Text()
+ for i, r := range text {
+ t.Logf("%d: %d - %q\n", i, r, string(r))
+ }
+ t.Log(text)
+}
+
+func TestSingle(t *testing.T) {
+ data := `
+
+
+
1
+
2
+
3
+
4
+
+
+`
+ doc, err := NewDocumentFromReader(strings.NewReader(data))
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ text := doc.FindMatcher(Single("div")).Text()
+ if text != "1" {
+ t.Fatalf("want %q, got %q", "1", text)
+ }
+
+ // Verify semantic equivalence
+ sel1 := doc.Find("div").First()
+ sel2 := doc.FindMatcher(Single("div"))
+ if sel1.Text() != sel2.Text() {
+ t.Fatalf("want sel1 to equal sel2")
+ }
+
+ // Here, the Single has no effect as the selector is used to filter
+ // from the existing selection, not to find nodes in the document.
+ divs := doc.Find("div")
+ text = divs.FilterMatcher(Single(".a")).Text()
+ if text != "23" {
+ t.Fatalf("want %q, got %q", "23", text)
+ }
+
+ classA := cascadia.MustCompile(".a")
+ classB := cascadia.MustCompile(".b")
+ text = doc.FindMatcher(classB).AddMatcher(SingleMatcher(classA)).Text()
+ if text != "142" {
+ t.Fatalf("want %q, got %q", "142", text)
+ }
+}
diff --git a/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/utilities.go b/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/utilities.go
new file mode 100644
index 000000000..6d243cdd6
--- /dev/null
+++ b/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/utilities.go
@@ -0,0 +1,178 @@
+package goquery
+
+import (
+ "bytes"
+ "io"
+
+ "golang.org/x/net/html"
+)
+
+// used to determine if a set (map[*html.Node]bool) should be used
+// instead of iterating over a slice. The set uses more memory and
+// is slower than slice iteration for small N.
+const minNodesForSet = 1000
+
+var nodeNames = []string{
+ html.ErrorNode: "#error",
+ html.TextNode: "#text",
+ html.DocumentNode: "#document",
+ html.CommentNode: "#comment",
+}
+
+// NodeName returns the node name of the first element in the selection.
+// It tries to behave in a similar way as the DOM's nodeName property
+// (https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeName).
+//
+// Go's net/html package defines the following node types, listed with
+// the corresponding returned value from this function:
+//
+// ErrorNode : #error
+// TextNode : #text
+// DocumentNode : #document
+// ElementNode : the element's tag name
+// CommentNode : #comment
+// DoctypeNode : the name of the document type
+//
+func NodeName(s *Selection) string {
+ if s.Length() == 0 {
+ return ""
+ }
+ return nodeName(s.Get(0))
+}
+
+// nodeName returns the node name of the given html node.
+// See NodeName for additional details on behaviour.
+func nodeName(node *html.Node) string {
+ if node == nil {
+ return ""
+ }
+
+ switch node.Type {
+ case html.ElementNode, html.DoctypeNode:
+ return node.Data
+ default:
+ if int(node.Type) < len(nodeNames) {
+ return nodeNames[node.Type]
+ }
+ return ""
+ }
+}
+
+// Render renders the html of the first element from selector and writes it to
+// the writer. It behaves the same as OuterHtml but writes to w instead of
+// returning the string.
+func Render(w io.Writer, s *Selection) error {
+ if s.Length() == 0 {
+ return nil
+ }
+ n := s.Get(0)
+ return html.Render(w, n)
+}
+
+// OuterHtml returns the outer HTML rendering of the first item in
+// the selection - that is, the HTML including the first element's
+// tag and attributes.
+//
+// Unlike InnerHtml, this is a function and not a method on the Selection,
+// because this is not a jQuery method (in javascript-land, this is
+// a property provided by the DOM).
+func OuterHtml(s *Selection) (string, error) {
+ var buf bytes.Buffer
+ if err := Render(&buf, s); err != nil {
+ return "", err
+ }
+ return buf.String(), nil
+}
+
+// Loop through all container nodes to search for the target node.
+func sliceContains(container []*html.Node, contained *html.Node) bool {
+ for _, n := range container {
+ if nodeContains(n, contained) {
+ return true
+ }
+ }
+
+ return false
+}
+
+// Checks if the contained node is within the container node.
+func nodeContains(container *html.Node, contained *html.Node) bool {
+ // Check if the parent of the contained node is the container node, traversing
+ // upward until the top is reached, or the container is found.
+ for contained = contained.Parent; contained != nil; contained = contained.Parent {
+ if container == contained {
+ return true
+ }
+ }
+ return false
+}
+
+// Checks if the target node is in the slice of nodes.
+func isInSlice(slice []*html.Node, node *html.Node) bool {
+ return indexInSlice(slice, node) > -1
+}
+
+// Returns the index of the target node in the slice, or -1.
+func indexInSlice(slice []*html.Node, node *html.Node) int {
+ if node != nil {
+ for i, n := range slice {
+ if n == node {
+ return i
+ }
+ }
+ }
+ return -1
+}
+
+// Appends the new nodes to the target slice, making sure no duplicate is added.
+// There is no check to the original state of the target slice, so it may still
+// contain duplicates. The target slice is returned because append() may create
+// a new underlying array. If targetSet is nil, a local set is created with the
+// target if len(target) + len(nodes) is greater than minNodesForSet.
+func appendWithoutDuplicates(target []*html.Node, nodes []*html.Node, targetSet map[*html.Node]bool) []*html.Node {
+ // if there are not that many nodes, don't use the map, faster to just use nested loops
+ // (unless a non-nil targetSet is passed, in which case the caller knows better).
+ if targetSet == nil && len(target)+len(nodes) < minNodesForSet {
+ for _, n := range nodes {
+ if !isInSlice(target, n) {
+ target = append(target, n)
+ }
+ }
+ return target
+ }
+
+ // if a targetSet is passed, then assume it is reliable, otherwise create one
+ // and initialize it with the current target contents.
+ if targetSet == nil {
+ targetSet = make(map[*html.Node]bool, len(target))
+ for _, n := range target {
+ targetSet[n] = true
+ }
+ }
+ for _, n := range nodes {
+ if !targetSet[n] {
+ target = append(target, n)
+ targetSet[n] = true
+ }
+ }
+
+ return target
+}
+
+// Loop through a selection, returning only those nodes that pass the predicate
+// function.
+func grep(sel *Selection, predicate func(i int, s *Selection) bool) (result []*html.Node) {
+ for i, n := range sel.Nodes {
+ if predicate(i, newSingleSelection(n, sel.document)) {
+ result = append(result, n)
+ }
+ }
+ return result
+}
+
+// Creates a new Selection object based on the specified nodes, and keeps the
+// source Selection object on the stack (linked list).
+func pushStack(fromSel *Selection, nodes []*html.Node) *Selection {
+ result := &Selection{nodes, fromSel.document, fromSel}
+ return result
+}
diff --git a/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/utilities_test.go b/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/utilities_test.go
new file mode 100644
index 000000000..c8e9d5400
--- /dev/null
+++ b/pkg/mod/github.com/!puerkito!bio/goquery@v1.8.0/utilities_test.go
@@ -0,0 +1,128 @@
+package goquery
+
+import (
+ "reflect"
+ "sort"
+ "strings"
+ "testing"
+
+ "golang.org/x/net/html"
+)
+
+var allNodes = `
+
+
+
+
+
+
+//= = = = = = = = = = = = = = = = = = = = = = = =//
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/.travis.yml b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/.travis.yml
new file mode 100644
index 000000000..6f227517d
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/.travis.yml
@@ -0,0 +1,14 @@
+language: go
+
+go:
+ - 1.3
+ - 1.4
+
+install:
+ - go get github.com/andybalholm/cascadia
+
+script:
+ - go test -v
+
+notifications:
+ email: false
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/LICENSE b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/LICENSE
new file mode 100644
index 000000000..ee5ad35ac
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/LICENSE
@@ -0,0 +1,24 @@
+Copyright (c) 2011 Andy Balholm. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/README.md b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/README.md
new file mode 100644
index 000000000..26f4c37b3
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/README.md
@@ -0,0 +1,9 @@
+# cascadia
+
+[](https://travis-ci.org/andybalholm/cascadia)
+
+The Cascadia package implements CSS selectors for use with the parse trees produced by the html package.
+
+To test CSS selectors without writing Go code, check out [cascadia](https://github.com/suntong/cascadia) the command line tool, a thin wrapper around this package.
+
+[Refer to godoc here](https://godoc.org/github.com/andybalholm/cascadia).
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/benchmark_test.go b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/benchmark_test.go
new file mode 100644
index 000000000..42bf50006
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/benchmark_test.go
@@ -0,0 +1,53 @@
+package cascadia
+
+import (
+ "strings"
+ "testing"
+
+ "golang.org/x/net/html"
+)
+
+func MustParseHTML(doc string) *html.Node {
+ dom, err := html.Parse(strings.NewReader(doc))
+ if err != nil {
+ panic(err)
+ }
+ return dom
+}
+
+var selector = MustCompile(`div.matched`)
+var doc = `
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+`
+var dom = MustParseHTML(doc)
+
+func BenchmarkMatchAll(b *testing.B) {
+ var matches []*html.Node
+ for i := 0; i < b.N; i++ {
+ matches = selector.MatchAll(dom)
+ }
+ _ = matches
+}
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test0 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test0
new file mode 100644
index 000000000..83a6561a7
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test0
@@ -0,0 +1 @@
+address
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test1 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test1
new file mode 100644
index 000000000..f59ec20aa
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test1
@@ -0,0 +1 @@
+*
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test10 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test10
new file mode 100644
index 000000000..0ee70eb00
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test10
@@ -0,0 +1 @@
+p[title]
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test11 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test11
new file mode 100644
index 000000000..66340c4af
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test11
@@ -0,0 +1 @@
+address[title="foo"]
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test12 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test12
new file mode 100644
index 000000000..6303f0869
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test12
@@ -0,0 +1 @@
+[ title ~= foo ]
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test13 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test13
new file mode 100644
index 000000000..45d91eb63
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test13
@@ -0,0 +1 @@
+[title~="hello world"]
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test14 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test14
new file mode 100644
index 000000000..62e7d68a8
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test14
@@ -0,0 +1 @@
+[lang|="en"]
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test15 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test15
new file mode 100644
index 000000000..fe9ab530e
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test15
@@ -0,0 +1 @@
+[title^="foo"]
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test16 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test16
new file mode 100644
index 000000000..dbee7332c
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test16
@@ -0,0 +1 @@
+[title$="bar"]
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test17 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test17
new file mode 100644
index 000000000..e4fb4032c
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test17
@@ -0,0 +1 @@
+[title*="bar"]
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test18 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test18
new file mode 100644
index 000000000..607501436
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test18
@@ -0,0 +1 @@
+.t1:not(.t2)
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test19 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test19
new file mode 100644
index 000000000..f04dfafd4
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test19
@@ -0,0 +1 @@
+div:not(.t1)
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test2 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test2
new file mode 100644
index 000000000..5529b9b4c
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test2
@@ -0,0 +1 @@
+#foo
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test20 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test20
new file mode 100644
index 000000000..a1c883497
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test20
@@ -0,0 +1 @@
+li:nth-child(odd)
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test21 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test21
new file mode 100644
index 000000000..b99fcb6ac
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test21
@@ -0,0 +1 @@
+li:nth-child(even)
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test22 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test22
new file mode 100644
index 000000000..a9ee21795
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test22
@@ -0,0 +1 @@
+li:nth-child(-n+2)
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test23 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test23
new file mode 100644
index 000000000..aad519d55
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test23
@@ -0,0 +1 @@
+li:nth-child(3n+1)
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test24 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test24
new file mode 100644
index 000000000..436a2191c
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test24
@@ -0,0 +1 @@
+li:nth-last-child(odd)
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test25 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test25
new file mode 100644
index 000000000..46f6cbc27
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test25
@@ -0,0 +1 @@
+li:nth-last-child(even)
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test26 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test26
new file mode 100644
index 000000000..d18bf3b45
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test26
@@ -0,0 +1 @@
+li:nth-last-child(-n+2)
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test27 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test27
new file mode 100644
index 000000000..d1d6eb317
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test27
@@ -0,0 +1 @@
+li:nth-last-child(3n+1)
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test28 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test28
new file mode 100644
index 000000000..9a0c94931
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test28
@@ -0,0 +1 @@
+span:first-child
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test29 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test29
new file mode 100644
index 000000000..7058608ec
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test29
@@ -0,0 +1 @@
+span:last-child
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test3 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test3
new file mode 100644
index 000000000..ee024825f
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test3
@@ -0,0 +1 @@
+li#t1
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test30 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test30
new file mode 100644
index 000000000..536e6ffb3
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test30
@@ -0,0 +1 @@
+p:nth-of-type(2)
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test31 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test31
new file mode 100644
index 000000000..61c1fc758
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test31
@@ -0,0 +1 @@
+p:nth-last-of-type(2)
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test32 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test32
new file mode 100644
index 000000000..d9a9dc54b
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test32
@@ -0,0 +1 @@
+p:last-of-type
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test33 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test33
new file mode 100644
index 000000000..9052c4194
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test33
@@ -0,0 +1 @@
+p:first-of-type
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test34 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test34
new file mode 100644
index 000000000..60bd12471
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test34
@@ -0,0 +1 @@
+p:only-child
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test35 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test35
new file mode 100644
index 000000000..87d9dbc65
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test35
@@ -0,0 +1 @@
+p:only-of-type
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test36 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test36
new file mode 100644
index 000000000..8e9295421
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test36
@@ -0,0 +1 @@
+:empty
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test37 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test37
new file mode 100644
index 000000000..ba3455f5b
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test37
@@ -0,0 +1 @@
+div p
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test38 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test38
new file mode 100644
index 000000000..d6f24c0af
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test38
@@ -0,0 +1 @@
+div table p
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test39 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test39
new file mode 100644
index 000000000..a72a605cf
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test39
@@ -0,0 +1 @@
+div > p
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test4 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test4
new file mode 100644
index 000000000..7b253d3ee
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test4
@@ -0,0 +1 @@
+*#t4
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test40 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test40
new file mode 100644
index 000000000..407ea3c42
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test40
@@ -0,0 +1 @@
+p ~ p
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test41 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test41
new file mode 100644
index 000000000..e36e0942f
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test41
@@ -0,0 +1 @@
+p + p
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test42 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test42
new file mode 100644
index 000000000..fa59ada06
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test42
@@ -0,0 +1 @@
+li, p
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test43 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test43
new file mode 100644
index 000000000..e946ff3aa
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test43
@@ -0,0 +1 @@
+p +/*This is a comment*/ p
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test44 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test44
new file mode 100644
index 000000000..df68954ae
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test44
@@ -0,0 +1 @@
+p:contains("that wraps")
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test45 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test45
new file mode 100644
index 000000000..5c479a9a1
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test45
@@ -0,0 +1 @@
+p:containsOwn("that wraps")
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test46 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test46
new file mode 100644
index 000000000..a189d03cb
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test46
@@ -0,0 +1 @@
+:containsOwn("inner")
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test47 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test47
new file mode 100644
index 000000000..bfba3689e
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test47
@@ -0,0 +1 @@
+p:containsOwn("block")
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test48 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test48
new file mode 100644
index 000000000..4a6abb3ce
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test48
@@ -0,0 +1 @@
+div:has(#p1)
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test49 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test49
new file mode 100644
index 000000000..2048a0cd8
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test49
@@ -0,0 +1 @@
+div:has(:containsOwn("2"))
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test5 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test5
new file mode 100644
index 000000000..702c0f1e5
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test5
@@ -0,0 +1 @@
+.t1
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test50 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test50
new file mode 100644
index 000000000..c062e4c1b
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test50
@@ -0,0 +1 @@
+body :has(:containsOwn("2"))
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test51 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test51
new file mode 100644
index 000000000..151226047
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test51
@@ -0,0 +1 @@
+body :haschild(:containsOwn("2"))
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test52 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test52
new file mode 100644
index 000000000..c3dee62a8
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test52
@@ -0,0 +1 @@
+p:matches([\d])
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test53 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test53
new file mode 100644
index 000000000..90f71d782
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test53
@@ -0,0 +1 @@
+p:matches([a-z])
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test54 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test54
new file mode 100644
index 000000000..88b4c2830
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test54
@@ -0,0 +1 @@
+p:matches([a-zA-Z])
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test55 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test55
new file mode 100644
index 000000000..699b41ffd
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test55
@@ -0,0 +1 @@
+p:matches([^\d])
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test56 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test56
new file mode 100644
index 000000000..83d4c474b
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test56
@@ -0,0 +1 @@
+p:matches(^(0|a))
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test57 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test57
new file mode 100644
index 000000000..e8507ba67
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test57
@@ -0,0 +1 @@
+p:matches(^\d+$)
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test58 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test58
new file mode 100644
index 000000000..e29dba9b3
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test58
@@ -0,0 +1 @@
+p:not(:matches(^\d+$))
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test59 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test59
new file mode 100644
index 000000000..b5f72069a
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test59
@@ -0,0 +1 @@
+div :matchesOwn(^\d+$)
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test6 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test6
new file mode 100644
index 000000000..cf58afccd
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test6
@@ -0,0 +1 @@
+p.t1
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test60 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test60
new file mode 100644
index 000000000..2154ba88b
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test60
@@ -0,0 +1 @@
+[href#=(fina)]:not([href#=(\/\/[^\/]+untrusted)])
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test61 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test61
new file mode 100644
index 000000000..1c8f5258e
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test61
@@ -0,0 +1 @@
+[href#=(^https:\/\/[^\/]*\/?news)]
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test7 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test7
new file mode 100644
index 000000000..9ad6c2093
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test7
@@ -0,0 +1 @@
+div.teST
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test8 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test8
new file mode 100644
index 000000000..2ed128422
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test8
@@ -0,0 +1 @@
+.t1.fail
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test9 b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test9
new file mode 100644
index 000000000..8c1c2a272
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/corpus/test9
@@ -0,0 +1 @@
+p.t1.t2
\ No newline at end of file
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/fuzz.go b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/fuzz.go
new file mode 100644
index 000000000..d1a46f8cb
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/fuzz/fuzz.go
@@ -0,0 +1,15 @@
+package fuzz
+
+import "github.com/andybalholm/cascadia"
+
+// Fuzz is the entrypoint used by the go-fuzz framework
+func Fuzz(data []byte) int {
+ sel, err := cascadia.Compile(string(data))
+ if err != nil {
+ if sel != nil {
+ panic("sel != nil on error")
+ }
+ return 0
+ }
+ return 1
+}
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/go.mod b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/go.mod
new file mode 100644
index 000000000..ee72d3fe0
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/go.mod
@@ -0,0 +1,5 @@
+module github.com/andybalholm/cascadia
+
+go 1.16
+
+require golang.org/x/net v0.0.0-20210916014120-12bc252f5db8
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/go.sum b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/go.sum
new file mode 100644
index 000000000..0f4194c57
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/go.sum
@@ -0,0 +1,7 @@
+golang.org/x/net v0.0.0-20210916014120-12bc252f5db8 h1:/6y1LfuqNuQdHAm0jjtPtgRcxIxjVZgm5OTu8/QhZvk=
+golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/parser.go b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/parser.go
new file mode 100644
index 000000000..f654c0c7a
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/parser.go
@@ -0,0 +1,887 @@
+// Package cascadia is an implementation of CSS selectors.
+package cascadia
+
+import (
+ "errors"
+ "fmt"
+ "regexp"
+ "strconv"
+ "strings"
+)
+
+// a parser for CSS selectors
+type parser struct {
+ s string // the source text
+ i int // the current position
+
+ // if `false`, parsing a pseudo-element
+ // returns an error.
+ acceptPseudoElements bool
+}
+
+// parseEscape parses a backslash escape.
+func (p *parser) parseEscape() (result string, err error) {
+ if len(p.s) < p.i+2 || p.s[p.i] != '\\' {
+ return "", errors.New("invalid escape sequence")
+ }
+
+ start := p.i + 1
+ c := p.s[start]
+ switch {
+ case c == '\r' || c == '\n' || c == '\f':
+ return "", errors.New("escaped line ending outside string")
+ case hexDigit(c):
+ // unicode escape (hex)
+ var i int
+ for i = start; i < start+6 && i < len(p.s) && hexDigit(p.s[i]); i++ {
+ // empty
+ }
+ v, _ := strconv.ParseUint(p.s[start:i], 16, 64)
+ if len(p.s) > i {
+ switch p.s[i] {
+ case '\r':
+ i++
+ if len(p.s) > i && p.s[i] == '\n' {
+ i++
+ }
+ case ' ', '\t', '\n', '\f':
+ i++
+ }
+ }
+ p.i = i
+ return string(rune(v)), nil
+ }
+
+ // Return the literal character after the backslash.
+ result = p.s[start : start+1]
+ p.i += 2
+ return result, nil
+}
+
+// toLowerASCII returns s with all ASCII capital letters lowercased.
+func toLowerASCII(s string) string {
+ var b []byte
+ for i := 0; i < len(s); i++ {
+ if c := s[i]; 'A' <= c && c <= 'Z' {
+ if b == nil {
+ b = make([]byte, len(s))
+ copy(b, s)
+ }
+ b[i] = s[i] + ('a' - 'A')
+ }
+ }
+
+ if b == nil {
+ return s
+ }
+
+ return string(b)
+}
+
+func hexDigit(c byte) bool {
+ return '0' <= c && c <= '9' || 'a' <= c && c <= 'f' || 'A' <= c && c <= 'F'
+}
+
+// nameStart returns whether c can be the first character of an identifier
+// (not counting an initial hyphen, or an escape sequence).
+func nameStart(c byte) bool {
+ return 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' || c == '_' || c > 127
+}
+
+// nameChar returns whether c can be a character within an identifier
+// (not counting an escape sequence).
+func nameChar(c byte) bool {
+ return 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' || c == '_' || c > 127 ||
+ c == '-' || '0' <= c && c <= '9'
+}
+
+// parseIdentifier parses an identifier.
+func (p *parser) parseIdentifier() (result string, err error) {
+ startingDash := false
+ if len(p.s) > p.i && p.s[p.i] == '-' {
+ startingDash = true
+ p.i++
+ }
+
+ if len(p.s) <= p.i {
+ return "", errors.New("expected identifier, found EOF instead")
+ }
+
+ if c := p.s[p.i]; !(nameStart(c) || c == '\\') {
+ return "", fmt.Errorf("expected identifier, found %c instead", c)
+ }
+
+ result, err = p.parseName()
+ if startingDash && err == nil {
+ result = "-" + result
+ }
+ return
+}
+
+// parseName parses a name (which is like an identifier, but doesn't have
+// extra restrictions on the first character).
+func (p *parser) parseName() (result string, err error) {
+ i := p.i
+loop:
+ for i < len(p.s) {
+ c := p.s[i]
+ switch {
+ case nameChar(c):
+ start := i
+ for i < len(p.s) && nameChar(p.s[i]) {
+ i++
+ }
+ result += p.s[start:i]
+ case c == '\\':
+ p.i = i
+ val, err := p.parseEscape()
+ if err != nil {
+ return "", err
+ }
+ i = p.i
+ result += val
+ default:
+ break loop
+ }
+ }
+
+ if result == "" {
+ return "", errors.New("expected name, found EOF instead")
+ }
+
+ p.i = i
+ return result, nil
+}
+
+// parseString parses a single- or double-quoted string.
+func (p *parser) parseString() (result string, err error) {
+ i := p.i
+ if len(p.s) < i+2 {
+ return "", errors.New("expected string, found EOF instead")
+ }
+
+ quote := p.s[i]
+ i++
+
+loop:
+ for i < len(p.s) {
+ switch p.s[i] {
+ case '\\':
+ if len(p.s) > i+1 {
+ switch c := p.s[i+1]; c {
+ case '\r':
+ if len(p.s) > i+2 && p.s[i+2] == '\n' {
+ i += 3
+ continue loop
+ }
+ fallthrough
+ case '\n', '\f':
+ i += 2
+ continue loop
+ }
+ }
+ p.i = i
+ val, err := p.parseEscape()
+ if err != nil {
+ return "", err
+ }
+ i = p.i
+ result += val
+ case quote:
+ break loop
+ case '\r', '\n', '\f':
+ return "", errors.New("unexpected end of line in string")
+ default:
+ start := i
+ for i < len(p.s) {
+ if c := p.s[i]; c == quote || c == '\\' || c == '\r' || c == '\n' || c == '\f' {
+ break
+ }
+ i++
+ }
+ result += p.s[start:i]
+ }
+ }
+
+ if i >= len(p.s) {
+ return "", errors.New("EOF in string")
+ }
+
+ // Consume the final quote.
+ i++
+
+ p.i = i
+ return result, nil
+}
+
+// parseRegex parses a regular expression; the end is defined by encountering an
+// unmatched closing ')' or ']' which is not consumed
+func (p *parser) parseRegex() (rx *regexp.Regexp, err error) {
+ i := p.i
+ if len(p.s) < i+2 {
+ return nil, errors.New("expected regular expression, found EOF instead")
+ }
+
+ // number of open parens or brackets;
+ // when it becomes negative, finished parsing regex
+ open := 0
+
+loop:
+ for i < len(p.s) {
+ switch p.s[i] {
+ case '(', '[':
+ open++
+ case ')', ']':
+ open--
+ if open < 0 {
+ break loop
+ }
+ }
+ i++
+ }
+
+ if i >= len(p.s) {
+ return nil, errors.New("EOF in regular expression")
+ }
+ rx, err = regexp.Compile(p.s[p.i:i])
+ p.i = i
+ return rx, err
+}
+
+// skipWhitespace consumes whitespace characters and comments.
+// It returns true if there was actually anything to skip.
+func (p *parser) skipWhitespace() bool {
+ i := p.i
+ for i < len(p.s) {
+ switch p.s[i] {
+ case ' ', '\t', '\r', '\n', '\f':
+ i++
+ continue
+ case '/':
+ if strings.HasPrefix(p.s[i:], "/*") {
+ end := strings.Index(p.s[i+len("/*"):], "*/")
+ if end != -1 {
+ i += end + len("/**/")
+ continue
+ }
+ }
+ }
+ break
+ }
+
+ if i > p.i {
+ p.i = i
+ return true
+ }
+
+ return false
+}
+
+// consumeParenthesis consumes an opening parenthesis and any following
+// whitespace. It returns true if there was actually a parenthesis to skip.
+func (p *parser) consumeParenthesis() bool {
+ if p.i < len(p.s) && p.s[p.i] == '(' {
+ p.i++
+ p.skipWhitespace()
+ return true
+ }
+ return false
+}
+
+// consumeClosingParenthesis consumes a closing parenthesis and any preceding
+// whitespace. It returns true if there was actually a parenthesis to skip.
+func (p *parser) consumeClosingParenthesis() bool {
+ i := p.i
+ p.skipWhitespace()
+ if p.i < len(p.s) && p.s[p.i] == ')' {
+ p.i++
+ return true
+ }
+ p.i = i
+ return false
+}
+
+// parseTypeSelector parses a type selector (one that matches by tag name).
+func (p *parser) parseTypeSelector() (result tagSelector, err error) {
+ tag, err := p.parseIdentifier()
+ if err != nil {
+ return
+ }
+ return tagSelector{tag: toLowerASCII(tag)}, nil
+}
+
+// parseIDSelector parses a selector that matches by id attribute.
+func (p *parser) parseIDSelector() (idSelector, error) {
+ if p.i >= len(p.s) {
+ return idSelector{}, fmt.Errorf("expected id selector (#id), found EOF instead")
+ }
+ if p.s[p.i] != '#' {
+ return idSelector{}, fmt.Errorf("expected id selector (#id), found '%c' instead", p.s[p.i])
+ }
+
+ p.i++
+ id, err := p.parseName()
+ if err != nil {
+ return idSelector{}, err
+ }
+
+ return idSelector{id: id}, nil
+}
+
+// parseClassSelector parses a selector that matches by class attribute.
+func (p *parser) parseClassSelector() (classSelector, error) {
+ if p.i >= len(p.s) {
+ return classSelector{}, fmt.Errorf("expected class selector (.class), found EOF instead")
+ }
+ if p.s[p.i] != '.' {
+ return classSelector{}, fmt.Errorf("expected class selector (.class), found '%c' instead", p.s[p.i])
+ }
+
+ p.i++
+ class, err := p.parseIdentifier()
+ if err != nil {
+ return classSelector{}, err
+ }
+
+ return classSelector{class: class}, nil
+}
+
+// parseAttributeSelector parses a selector that matches by attribute value.
+func (p *parser) parseAttributeSelector() (attrSelector, error) {
+ if p.i >= len(p.s) {
+ return attrSelector{}, fmt.Errorf("expected attribute selector ([attribute]), found EOF instead")
+ }
+ if p.s[p.i] != '[' {
+ return attrSelector{}, fmt.Errorf("expected attribute selector ([attribute]), found '%c' instead", p.s[p.i])
+ }
+
+ p.i++
+ p.skipWhitespace()
+ key, err := p.parseIdentifier()
+ if err != nil {
+ return attrSelector{}, err
+ }
+ key = toLowerASCII(key)
+
+ p.skipWhitespace()
+ if p.i >= len(p.s) {
+ return attrSelector{}, errors.New("unexpected EOF in attribute selector")
+ }
+
+ if p.s[p.i] == ']' {
+ p.i++
+ return attrSelector{key: key, operation: ""}, nil
+ }
+
+ if p.i+2 >= len(p.s) {
+ return attrSelector{}, errors.New("unexpected EOF in attribute selector")
+ }
+
+ op := p.s[p.i : p.i+2]
+ if op[0] == '=' {
+ op = "="
+ } else if op[1] != '=' {
+ return attrSelector{}, fmt.Errorf(`expected equality operator, found "%s" instead`, op)
+ }
+ p.i += len(op)
+
+ p.skipWhitespace()
+ if p.i >= len(p.s) {
+ return attrSelector{}, errors.New("unexpected EOF in attribute selector")
+ }
+ var val string
+ var rx *regexp.Regexp
+ if op == "#=" {
+ rx, err = p.parseRegex()
+ } else {
+ switch p.s[p.i] {
+ case '\'', '"':
+ val, err = p.parseString()
+ default:
+ val, err = p.parseIdentifier()
+ }
+ }
+ if err != nil {
+ return attrSelector{}, err
+ }
+
+ p.skipWhitespace()
+ if p.i >= len(p.s) {
+ return attrSelector{}, errors.New("unexpected EOF in attribute selector")
+ }
+
+ // check if the attribute contains an ignore case flag
+ ignoreCase := false
+ if p.s[p.i] == 'i' || p.s[p.i] == 'I' {
+ ignoreCase = true
+ p.i++
+ }
+
+ p.skipWhitespace()
+ if p.i >= len(p.s) {
+ return attrSelector{}, errors.New("unexpected EOF in attribute selector")
+ }
+
+ if p.s[p.i] != ']' {
+ return attrSelector{}, fmt.Errorf("expected ']', found '%c' instead", p.s[p.i])
+ }
+ p.i++
+
+ switch op {
+ case "=", "!=", "~=", "|=", "^=", "$=", "*=", "#=":
+ return attrSelector{key: key, val: val, operation: op, regexp: rx, insensitive: ignoreCase}, nil
+ default:
+ return attrSelector{}, fmt.Errorf("attribute operator %q is not supported", op)
+ }
+}
+
+var (
+ errExpectedParenthesis = errors.New("expected '(' but didn't find it")
+ errExpectedClosingParenthesis = errors.New("expected ')' but didn't find it")
+ errUnmatchedParenthesis = errors.New("unmatched '('")
+)
+
+// parsePseudoclassSelector parses a pseudoclass selector like :not(p) or a pseudo-element
+// For backwards compatibility, both ':' and '::' prefix are allowed for pseudo-elements.
+// https://drafts.csswg.org/selectors-3/#pseudo-elements
+// Returning a nil `Sel` (and a nil `error`) means we found a pseudo-element.
+func (p *parser) parsePseudoclassSelector() (out Sel, pseudoElement string, err error) {
+ if p.i >= len(p.s) {
+ return nil, "", fmt.Errorf("expected pseudoclass selector (:pseudoclass), found EOF instead")
+ }
+ if p.s[p.i] != ':' {
+ return nil, "", fmt.Errorf("expected attribute selector (:pseudoclass), found '%c' instead", p.s[p.i])
+ }
+
+ p.i++
+ var mustBePseudoElement bool
+ if p.i >= len(p.s) {
+ return nil, "", fmt.Errorf("got empty pseudoclass (or pseudoelement)")
+ }
+ if p.s[p.i] == ':' { // we found a pseudo-element
+ mustBePseudoElement = true
+ p.i++
+ }
+
+ name, err := p.parseIdentifier()
+ if err != nil {
+ return
+ }
+ name = toLowerASCII(name)
+ if mustBePseudoElement && (name != "after" && name != "backdrop" && name != "before" &&
+ name != "cue" && name != "first-letter" && name != "first-line" && name != "grammar-error" &&
+ name != "marker" && name != "placeholder" && name != "selection" && name != "spelling-error") {
+ return out, "", fmt.Errorf("unknown pseudoelement :%s", name)
+ }
+
+ switch name {
+ case "not", "has", "haschild":
+ if !p.consumeParenthesis() {
+ return out, "", errExpectedParenthesis
+ }
+ sel, parseErr := p.parseSelectorGroup()
+ if parseErr != nil {
+ return out, "", parseErr
+ }
+ if !p.consumeClosingParenthesis() {
+ return out, "", errExpectedClosingParenthesis
+ }
+
+ out = relativePseudoClassSelector{name: name, match: sel}
+
+ case "contains", "containsown":
+ if !p.consumeParenthesis() {
+ return out, "", errExpectedParenthesis
+ }
+ if p.i == len(p.s) {
+ return out, "", errUnmatchedParenthesis
+ }
+ var val string
+ switch p.s[p.i] {
+ case '\'', '"':
+ val, err = p.parseString()
+ default:
+ val, err = p.parseIdentifier()
+ }
+ if err != nil {
+ return out, "", err
+ }
+ val = strings.ToLower(val)
+ p.skipWhitespace()
+ if p.i >= len(p.s) {
+ return out, "", errors.New("unexpected EOF in pseudo selector")
+ }
+ if !p.consumeClosingParenthesis() {
+ return out, "", errExpectedClosingParenthesis
+ }
+
+ out = containsPseudoClassSelector{own: name == "containsown", value: val}
+
+ case "matches", "matchesown":
+ if !p.consumeParenthesis() {
+ return out, "", errExpectedParenthesis
+ }
+ rx, err := p.parseRegex()
+ if err != nil {
+ return out, "", err
+ }
+ if p.i >= len(p.s) {
+ return out, "", errors.New("unexpected EOF in pseudo selector")
+ }
+ if !p.consumeClosingParenthesis() {
+ return out, "", errExpectedClosingParenthesis
+ }
+
+ out = regexpPseudoClassSelector{own: name == "matchesown", regexp: rx}
+
+ case "nth-child", "nth-last-child", "nth-of-type", "nth-last-of-type":
+ if !p.consumeParenthesis() {
+ return out, "", errExpectedParenthesis
+ }
+ a, b, err := p.parseNth()
+ if err != nil {
+ return out, "", err
+ }
+ if !p.consumeClosingParenthesis() {
+ return out, "", errExpectedClosingParenthesis
+ }
+ last := name == "nth-last-child" || name == "nth-last-of-type"
+ ofType := name == "nth-of-type" || name == "nth-last-of-type"
+ out = nthPseudoClassSelector{a: a, b: b, last: last, ofType: ofType}
+
+ case "first-child":
+ out = nthPseudoClassSelector{a: 0, b: 1, ofType: false, last: false}
+ case "last-child":
+ out = nthPseudoClassSelector{a: 0, b: 1, ofType: false, last: true}
+ case "first-of-type":
+ out = nthPseudoClassSelector{a: 0, b: 1, ofType: true, last: false}
+ case "last-of-type":
+ out = nthPseudoClassSelector{a: 0, b: 1, ofType: true, last: true}
+ case "only-child":
+ out = onlyChildPseudoClassSelector{ofType: false}
+ case "only-of-type":
+ out = onlyChildPseudoClassSelector{ofType: true}
+ case "input":
+ out = inputPseudoClassSelector{}
+ case "empty":
+ out = emptyElementPseudoClassSelector{}
+ case "root":
+ out = rootPseudoClassSelector{}
+ case "link":
+ out = linkPseudoClassSelector{}
+ case "lang":
+ if !p.consumeParenthesis() {
+ return out, "", errExpectedParenthesis
+ }
+ if p.i == len(p.s) {
+ return out, "", errUnmatchedParenthesis
+ }
+ val, err := p.parseIdentifier()
+ if err != nil {
+ return out, "", err
+ }
+ val = strings.ToLower(val)
+ p.skipWhitespace()
+ if p.i >= len(p.s) {
+ return out, "", errors.New("unexpected EOF in pseudo selector")
+ }
+ if !p.consumeClosingParenthesis() {
+ return out, "", errExpectedClosingParenthesis
+ }
+ out = langPseudoClassSelector{lang: val}
+ case "enabled":
+ out = enabledPseudoClassSelector{}
+ case "disabled":
+ out = disabledPseudoClassSelector{}
+ case "checked":
+ out = checkedPseudoClassSelector{}
+ case "visited", "hover", "active", "focus", "target":
+ // Not applicable in a static context: never match.
+ out = neverMatchSelector{value: ":" + name}
+ case "after", "backdrop", "before", "cue", "first-letter", "first-line", "grammar-error", "marker", "placeholder", "selection", "spelling-error":
+ return nil, name, nil
+ default:
+ return out, "", fmt.Errorf("unknown pseudoclass or pseudoelement :%s", name)
+ }
+ return
+}
+
+// parseInteger parses a decimal integer.
+func (p *parser) parseInteger() (int, error) {
+ i := p.i
+ start := i
+ for i < len(p.s) && '0' <= p.s[i] && p.s[i] <= '9' {
+ i++
+ }
+ if i == start {
+ return 0, errors.New("expected integer, but didn't find it")
+ }
+ p.i = i
+
+ val, err := strconv.Atoi(p.s[start:i])
+ if err != nil {
+ return 0, err
+ }
+
+ return val, nil
+}
+
+// parseNth parses the argument for :nth-child (normally of the form an+b).
+func (p *parser) parseNth() (a, b int, err error) {
+ // initial state
+ if p.i >= len(p.s) {
+ goto eof
+ }
+ switch p.s[p.i] {
+ case '-':
+ p.i++
+ goto negativeA
+ case '+':
+ p.i++
+ goto positiveA
+ case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
+ goto positiveA
+ case 'n', 'N':
+ a = 1
+ p.i++
+ goto readN
+ case 'o', 'O', 'e', 'E':
+ id, nameErr := p.parseName()
+ if nameErr != nil {
+ return 0, 0, nameErr
+ }
+ id = toLowerASCII(id)
+ if id == "odd" {
+ return 2, 1, nil
+ }
+ if id == "even" {
+ return 2, 0, nil
+ }
+ return 0, 0, fmt.Errorf("expected 'odd' or 'even', but found '%s' instead", id)
+ default:
+ goto invalid
+ }
+
+positiveA:
+ if p.i >= len(p.s) {
+ goto eof
+ }
+ switch p.s[p.i] {
+ case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
+ a, err = p.parseInteger()
+ if err != nil {
+ return 0, 0, err
+ }
+ goto readA
+ case 'n', 'N':
+ a = 1
+ p.i++
+ goto readN
+ default:
+ goto invalid
+ }
+
+negativeA:
+ if p.i >= len(p.s) {
+ goto eof
+ }
+ switch p.s[p.i] {
+ case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
+ a, err = p.parseInteger()
+ if err != nil {
+ return 0, 0, err
+ }
+ a = -a
+ goto readA
+ case 'n', 'N':
+ a = -1
+ p.i++
+ goto readN
+ default:
+ goto invalid
+ }
+
+readA:
+ if p.i >= len(p.s) {
+ goto eof
+ }
+ switch p.s[p.i] {
+ case 'n', 'N':
+ p.i++
+ goto readN
+ default:
+ // The number we read as a is actually b.
+ return 0, a, nil
+ }
+
+readN:
+ p.skipWhitespace()
+ if p.i >= len(p.s) {
+ goto eof
+ }
+ switch p.s[p.i] {
+ case '+':
+ p.i++
+ p.skipWhitespace()
+ b, err = p.parseInteger()
+ if err != nil {
+ return 0, 0, err
+ }
+ return a, b, nil
+ case '-':
+ p.i++
+ p.skipWhitespace()
+ b, err = p.parseInteger()
+ if err != nil {
+ return 0, 0, err
+ }
+ return a, -b, nil
+ default:
+ return a, 0, nil
+ }
+
+eof:
+ return 0, 0, errors.New("unexpected EOF while attempting to parse expression of form an+b")
+
+invalid:
+ return 0, 0, errors.New("unexpected character while attempting to parse expression of form an+b")
+}
+
+// parseSimpleSelectorSequence parses a selector sequence that applies to
+// a single element.
+func (p *parser) parseSimpleSelectorSequence() (Sel, error) {
+ var selectors []Sel
+
+ if p.i >= len(p.s) {
+ return nil, errors.New("expected selector, found EOF instead")
+ }
+
+ switch p.s[p.i] {
+ case '*':
+ // It's the universal selector. Just skip over it, since it doesn't affect the meaning.
+ p.i++
+ if p.i+2 < len(p.s) && p.s[p.i:p.i+2] == "|*" { // other version of universal selector
+ p.i += 2
+ }
+ case '#', '.', '[', ':':
+ // There's no type selector. Wait to process the other till the main loop.
+ default:
+ r, err := p.parseTypeSelector()
+ if err != nil {
+ return nil, err
+ }
+ selectors = append(selectors, r)
+ }
+
+ var pseudoElement string
+loop:
+ for p.i < len(p.s) {
+ var (
+ ns Sel
+ newPseudoElement string
+ err error
+ )
+ switch p.s[p.i] {
+ case '#':
+ ns, err = p.parseIDSelector()
+ case '.':
+ ns, err = p.parseClassSelector()
+ case '[':
+ ns, err = p.parseAttributeSelector()
+ case ':':
+ ns, newPseudoElement, err = p.parsePseudoclassSelector()
+ default:
+ break loop
+ }
+ if err != nil {
+ return nil, err
+ }
+ // From https://drafts.csswg.org/selectors-3/#pseudo-elements :
+ // "Only one pseudo-element may appear per selector, and if present
+ // it must appear after the sequence of simple selectors that
+ // represents the subjects of the selector.""
+ if ns == nil { // we found a pseudo-element
+ if pseudoElement != "" {
+ return nil, fmt.Errorf("only one pseudo-element is accepted per selector, got %s and %s", pseudoElement, newPseudoElement)
+ }
+ if !p.acceptPseudoElements {
+ return nil, fmt.Errorf("pseudo-element %s found, but pseudo-elements support is disabled", newPseudoElement)
+ }
+ pseudoElement = newPseudoElement
+ } else {
+ if pseudoElement != "" {
+ return nil, fmt.Errorf("pseudo-element %s must be at the end of selector", pseudoElement)
+ }
+ selectors = append(selectors, ns)
+ }
+
+ }
+ if len(selectors) == 1 && pseudoElement == "" { // no need wrap the selectors in compoundSelector
+ return selectors[0], nil
+ }
+ return compoundSelector{selectors: selectors, pseudoElement: pseudoElement}, nil
+}
+
+// parseSelector parses a selector that may include combinators.
+func (p *parser) parseSelector() (Sel, error) {
+ p.skipWhitespace()
+ result, err := p.parseSimpleSelectorSequence()
+ if err != nil {
+ return nil, err
+ }
+
+ for {
+ var (
+ combinator byte
+ c Sel
+ )
+ if p.skipWhitespace() {
+ combinator = ' '
+ }
+ if p.i >= len(p.s) {
+ return result, nil
+ }
+
+ switch p.s[p.i] {
+ case '+', '>', '~':
+ combinator = p.s[p.i]
+ p.i++
+ p.skipWhitespace()
+ case ',', ')':
+ // These characters can't begin a selector, but they can legally occur after one.
+ return result, nil
+ }
+
+ if combinator == 0 {
+ return result, nil
+ }
+
+ c, err = p.parseSimpleSelectorSequence()
+ if err != nil {
+ return nil, err
+ }
+ result = combinedSelector{first: result, combinator: combinator, second: c}
+ }
+}
+
+// parseSelectorGroup parses a group of selectors, separated by commas.
+func (p *parser) parseSelectorGroup() (SelectorGroup, error) {
+ current, err := p.parseSelector()
+ if err != nil {
+ return nil, err
+ }
+ result := SelectorGroup{current}
+
+ for p.i < len(p.s) {
+ if p.s[p.i] != ',' {
+ break
+ }
+ p.i++
+ c, err := p.parseSelector()
+ if err != nil {
+ return nil, err
+ }
+ result = append(result, c)
+ }
+ return result, nil
+}
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/parser_test.go b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/parser_test.go
new file mode 100644
index 000000000..0dacb79ea
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/parser_test.go
@@ -0,0 +1,88 @@
+package cascadia
+
+import (
+ "testing"
+)
+
+var identifierTests = map[string]string{
+ "x": "x",
+ "96": "",
+ "-x": "-x",
+ `r\e9 sumé`: "résumé",
+ `r\0000e9 sumé`: "résumé",
+ `r\0000e9sumé`: "résumé",
+ `a\"b`: `a"b`,
+}
+
+func TestParseIdentifier(t *testing.T) {
+ for source, want := range identifierTests {
+ p := &parser{s: source}
+ got, err := p.parseIdentifier()
+ if err != nil {
+ if want == "" {
+ // It was supposed to be an error.
+ continue
+ }
+ t.Errorf("parsing %q: got error (%s), want %q", source, err, want)
+ continue
+ }
+
+ if want == "" {
+ if err == nil {
+ t.Errorf("parsing %q: got %q, want error", source, got)
+ }
+ continue
+ }
+
+ if p.i < len(source) {
+ t.Errorf("parsing %q: %d bytes left over", source, len(source)-p.i)
+ continue
+ }
+
+ if got != want {
+ t.Errorf("parsing %q: got %q, want %q", source, got, want)
+ }
+ }
+}
+
+var stringTests = map[string]string{
+ `"x"`: "x",
+ `'x'`: "x",
+ `'x`: "",
+ "'x\\\r\nx'": "xx",
+ `"r\e9 sumé"`: "résumé",
+ `"r\0000e9 sumé"`: "résumé",
+ `"r\0000e9sumé"`: "résumé",
+ `"a\"b"`: `a"b`,
+}
+
+func TestParseString(t *testing.T) {
+ for source, want := range stringTests {
+ p := &parser{s: source}
+ got, err := p.parseString()
+ if err != nil {
+ if want == "" {
+ // It was supposed to be an error.
+ continue
+ }
+ t.Errorf("parsing %q: got error (%s), want %q", source, err, want)
+ continue
+ }
+
+ if want == "" {
+ if err == nil {
+ t.Errorf("parsing %q: got %q, want error", source, got)
+ }
+ continue
+ }
+
+ if p.i < len(source) {
+ t.Errorf("parsing %q: %d bytes left over", source, len(source)-p.i)
+ continue
+ }
+
+ if got != want {
+ t.Errorf("parsing %q: got %q, want %q", source, got, want)
+ }
+ }
+}
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/pseudo_classes.go b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/pseudo_classes.go
new file mode 100644
index 000000000..3986b22cd
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/pseudo_classes.go
@@ -0,0 +1,474 @@
+package cascadia
+
+import (
+ "bytes"
+ "fmt"
+ "regexp"
+ "strings"
+
+ "golang.org/x/net/html"
+ "golang.org/x/net/html/atom"
+)
+
+// This file implements the pseudo classes selectors,
+// which share the implementation of PseudoElement() and Specificity()
+
+type abstractPseudoClass struct{}
+
+func (s abstractPseudoClass) Specificity() Specificity {
+ return Specificity{0, 1, 0}
+}
+
+func (c abstractPseudoClass) PseudoElement() string {
+ return ""
+}
+
+type relativePseudoClassSelector struct {
+ name string // one of "not", "has", "haschild"
+ match SelectorGroup
+}
+
+func (s relativePseudoClassSelector) Match(n *html.Node) bool {
+ if n.Type != html.ElementNode {
+ return false
+ }
+ switch s.name {
+ case "not":
+ // matches elements that do not match a.
+ return !s.match.Match(n)
+ case "has":
+ // matches elements with any descendant that matches a.
+ return hasDescendantMatch(n, s.match)
+ case "haschild":
+ // matches elements with a child that matches a.
+ return hasChildMatch(n, s.match)
+ default:
+ panic(fmt.Sprintf("unsupported relative pseudo class selector : %s", s.name))
+ }
+}
+
+// hasChildMatch returns whether n has any child that matches a.
+func hasChildMatch(n *html.Node, a Matcher) bool {
+ for c := n.FirstChild; c != nil; c = c.NextSibling {
+ if a.Match(c) {
+ return true
+ }
+ }
+ return false
+}
+
+// hasDescendantMatch performs a depth-first search of n's descendants,
+// testing whether any of them match a. It returns true as soon as a match is
+// found, or false if no match is found.
+func hasDescendantMatch(n *html.Node, a Matcher) bool {
+ for c := n.FirstChild; c != nil; c = c.NextSibling {
+ if a.Match(c) || (c.Type == html.ElementNode && hasDescendantMatch(c, a)) {
+ return true
+ }
+ }
+ return false
+}
+
+// Specificity returns the specificity of the most specific selectors
+// in the pseudo-class arguments.
+// See https://www.w3.org/TR/selectors/#specificity-rules
+func (s relativePseudoClassSelector) Specificity() Specificity {
+ var max Specificity
+ for _, sel := range s.match {
+ newSpe := sel.Specificity()
+ if max.Less(newSpe) {
+ max = newSpe
+ }
+ }
+ return max
+}
+
+func (c relativePseudoClassSelector) PseudoElement() string {
+ return ""
+}
+
+type containsPseudoClassSelector struct {
+ abstractPseudoClass
+ value string
+ own bool
+}
+
+func (s containsPseudoClassSelector) Match(n *html.Node) bool {
+ var text string
+ if s.own {
+ // matches nodes that directly contain the given text
+ text = strings.ToLower(nodeOwnText(n))
+ } else {
+ // matches nodes that contain the given text.
+ text = strings.ToLower(nodeText(n))
+ }
+ return strings.Contains(text, s.value)
+}
+
+type regexpPseudoClassSelector struct {
+ abstractPseudoClass
+ regexp *regexp.Regexp
+ own bool
+}
+
+func (s regexpPseudoClassSelector) Match(n *html.Node) bool {
+ var text string
+ if s.own {
+ // matches nodes whose text directly matches the specified regular expression
+ text = nodeOwnText(n)
+ } else {
+ // matches nodes whose text matches the specified regular expression
+ text = nodeText(n)
+ }
+ return s.regexp.MatchString(text)
+}
+
+// writeNodeText writes the text contained in n and its descendants to b.
+func writeNodeText(n *html.Node, b *bytes.Buffer) {
+ switch n.Type {
+ case html.TextNode:
+ b.WriteString(n.Data)
+ case html.ElementNode:
+ for c := n.FirstChild; c != nil; c = c.NextSibling {
+ writeNodeText(c, b)
+ }
+ }
+}
+
+// nodeText returns the text contained in n and its descendants.
+func nodeText(n *html.Node) string {
+ var b bytes.Buffer
+ writeNodeText(n, &b)
+ return b.String()
+}
+
+// nodeOwnText returns the contents of the text nodes that are direct
+// children of n.
+func nodeOwnText(n *html.Node) string {
+ var b bytes.Buffer
+ for c := n.FirstChild; c != nil; c = c.NextSibling {
+ if c.Type == html.TextNode {
+ b.WriteString(c.Data)
+ }
+ }
+ return b.String()
+}
+
+type nthPseudoClassSelector struct {
+ abstractPseudoClass
+ a, b int
+ last, ofType bool
+}
+
+func (s nthPseudoClassSelector) Match(n *html.Node) bool {
+ if s.a == 0 {
+ if s.last {
+ return simpleNthLastChildMatch(s.b, s.ofType, n)
+ } else {
+ return simpleNthChildMatch(s.b, s.ofType, n)
+ }
+ }
+ return nthChildMatch(s.a, s.b, s.last, s.ofType, n)
+}
+
+// nthChildMatch implements :nth-child(an+b).
+// If last is true, implements :nth-last-child instead.
+// If ofType is true, implements :nth-of-type instead.
+func nthChildMatch(a, b int, last, ofType bool, n *html.Node) bool {
+ if n.Type != html.ElementNode {
+ return false
+ }
+
+ parent := n.Parent
+ if parent == nil {
+ return false
+ }
+
+ if parent.Type == html.DocumentNode {
+ return false
+ }
+
+ i := -1
+ count := 0
+ for c := parent.FirstChild; c != nil; c = c.NextSibling {
+ if (c.Type != html.ElementNode) || (ofType && c.Data != n.Data) {
+ continue
+ }
+ count++
+ if c == n {
+ i = count
+ if !last {
+ break
+ }
+ }
+ }
+
+ if i == -1 {
+ // This shouldn't happen, since n should always be one of its parent's children.
+ return false
+ }
+
+ if last {
+ i = count - i + 1
+ }
+
+ i -= b
+ if a == 0 {
+ return i == 0
+ }
+
+ return i%a == 0 && i/a >= 0
+}
+
+// simpleNthChildMatch implements :nth-child(b).
+// If ofType is true, implements :nth-of-type instead.
+func simpleNthChildMatch(b int, ofType bool, n *html.Node) bool {
+ if n.Type != html.ElementNode {
+ return false
+ }
+
+ parent := n.Parent
+ if parent == nil {
+ return false
+ }
+
+ if parent.Type == html.DocumentNode {
+ return false
+ }
+
+ count := 0
+ for c := parent.FirstChild; c != nil; c = c.NextSibling {
+ if c.Type != html.ElementNode || (ofType && c.Data != n.Data) {
+ continue
+ }
+ count++
+ if c == n {
+ return count == b
+ }
+ if count >= b {
+ return false
+ }
+ }
+ return false
+}
+
+// simpleNthLastChildMatch implements :nth-last-child(b).
+// If ofType is true, implements :nth-last-of-type instead.
+func simpleNthLastChildMatch(b int, ofType bool, n *html.Node) bool {
+ if n.Type != html.ElementNode {
+ return false
+ }
+
+ parent := n.Parent
+ if parent == nil {
+ return false
+ }
+
+ if parent.Type == html.DocumentNode {
+ return false
+ }
+
+ count := 0
+ for c := parent.LastChild; c != nil; c = c.PrevSibling {
+ if c.Type != html.ElementNode || (ofType && c.Data != n.Data) {
+ continue
+ }
+ count++
+ if c == n {
+ return count == b
+ }
+ if count >= b {
+ return false
+ }
+ }
+ return false
+}
+
+type onlyChildPseudoClassSelector struct {
+ abstractPseudoClass
+ ofType bool
+}
+
+// Match implements :only-child.
+// If `ofType` is true, it implements :only-of-type instead.
+func (s onlyChildPseudoClassSelector) Match(n *html.Node) bool {
+ if n.Type != html.ElementNode {
+ return false
+ }
+
+ parent := n.Parent
+ if parent == nil {
+ return false
+ }
+
+ if parent.Type == html.DocumentNode {
+ return false
+ }
+
+ count := 0
+ for c := parent.FirstChild; c != nil; c = c.NextSibling {
+ if (c.Type != html.ElementNode) || (s.ofType && c.Data != n.Data) {
+ continue
+ }
+ count++
+ if count > 1 {
+ return false
+ }
+ }
+
+ return count == 1
+}
+
+type inputPseudoClassSelector struct {
+ abstractPseudoClass
+}
+
+// Matches input, select, textarea and button elements.
+func (s inputPseudoClassSelector) Match(n *html.Node) bool {
+ return n.Type == html.ElementNode && (n.Data == "input" || n.Data == "select" || n.Data == "textarea" || n.Data == "button")
+}
+
+type emptyElementPseudoClassSelector struct {
+ abstractPseudoClass
+}
+
+// Matches empty elements.
+func (s emptyElementPseudoClassSelector) Match(n *html.Node) bool {
+ if n.Type != html.ElementNode {
+ return false
+ }
+
+ for c := n.FirstChild; c != nil; c = c.NextSibling {
+ switch c.Type {
+ case html.ElementNode:
+ return false
+ case html.TextNode:
+ if strings.TrimSpace(nodeText(c)) == "" {
+ continue
+ } else {
+ return false
+ }
+ }
+ }
+
+ return true
+}
+
+type rootPseudoClassSelector struct {
+ abstractPseudoClass
+}
+
+// Match implements :root
+func (s rootPseudoClassSelector) Match(n *html.Node) bool {
+ if n.Type != html.ElementNode {
+ return false
+ }
+ if n.Parent == nil {
+ return false
+ }
+ return n.Parent.Type == html.DocumentNode
+}
+
+func hasAttr(n *html.Node, attr string) bool {
+ return matchAttribute(n, attr, func(string) bool { return true })
+}
+
+type linkPseudoClassSelector struct {
+ abstractPseudoClass
+}
+
+// Match implements :link
+func (s linkPseudoClassSelector) Match(n *html.Node) bool {
+ return (n.DataAtom == atom.A || n.DataAtom == atom.Area || n.DataAtom == atom.Link) && hasAttr(n, "href")
+}
+
+type langPseudoClassSelector struct {
+ abstractPseudoClass
+ lang string
+}
+
+func (s langPseudoClassSelector) Match(n *html.Node) bool {
+ own := matchAttribute(n, "lang", func(val string) bool {
+ return val == s.lang || strings.HasPrefix(val, s.lang+"-")
+ })
+ if n.Parent == nil {
+ return own
+ }
+ return own || s.Match(n.Parent)
+}
+
+type enabledPseudoClassSelector struct {
+ abstractPseudoClass
+}
+
+func (s enabledPseudoClassSelector) Match(n *html.Node) bool {
+ if n.Type != html.ElementNode {
+ return false
+ }
+ switch n.DataAtom {
+ case atom.A, atom.Area, atom.Link:
+ return hasAttr(n, "href")
+ case atom.Optgroup, atom.Menuitem, atom.Fieldset:
+ return !hasAttr(n, "disabled")
+ case atom.Button, atom.Input, atom.Select, atom.Textarea, atom.Option:
+ return !hasAttr(n, "disabled") && !inDisabledFieldset(n)
+ }
+ return false
+}
+
+type disabledPseudoClassSelector struct {
+ abstractPseudoClass
+}
+
+func (s disabledPseudoClassSelector) Match(n *html.Node) bool {
+ if n.Type != html.ElementNode {
+ return false
+ }
+ switch n.DataAtom {
+ case atom.Optgroup, atom.Menuitem, atom.Fieldset:
+ return hasAttr(n, "disabled")
+ case atom.Button, atom.Input, atom.Select, atom.Textarea, atom.Option:
+ return hasAttr(n, "disabled") || inDisabledFieldset(n)
+ }
+ return false
+}
+
+func hasLegendInPreviousSiblings(n *html.Node) bool {
+ for s := n.PrevSibling; s != nil; s = s.PrevSibling {
+ if s.DataAtom == atom.Legend {
+ return true
+ }
+ }
+ return false
+}
+
+func inDisabledFieldset(n *html.Node) bool {
+ if n.Parent == nil {
+ return false
+ }
+ if n.Parent.DataAtom == atom.Fieldset && hasAttr(n.Parent, "disabled") &&
+ (n.DataAtom != atom.Legend || hasLegendInPreviousSiblings(n)) {
+ return true
+ }
+ return inDisabledFieldset(n.Parent)
+}
+
+type checkedPseudoClassSelector struct {
+ abstractPseudoClass
+}
+
+func (s checkedPseudoClassSelector) Match(n *html.Node) bool {
+ if n.Type != html.ElementNode {
+ return false
+ }
+ switch n.DataAtom {
+ case atom.Input, atom.Menuitem:
+ return hasAttr(n, "checked") && matchAttribute(n, "type", func(val string) bool {
+ t := toLowerASCII(val)
+ return t == "checkbox" || t == "radio"
+ })
+ case atom.Option:
+ return hasAttr(n, "selected")
+ }
+ return false
+}
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/selector.go b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/selector.go
new file mode 100644
index 000000000..87549be23
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/selector.go
@@ -0,0 +1,586 @@
+package cascadia
+
+import (
+ "fmt"
+ "regexp"
+ "strings"
+
+ "golang.org/x/net/html"
+)
+
+// Matcher is the interface for basic selector functionality.
+// Match returns whether a selector matches n.
+type Matcher interface {
+ Match(n *html.Node) bool
+}
+
+// Sel is the interface for all the functionality provided by selectors.
+type Sel interface {
+ Matcher
+ Specificity() Specificity
+
+ // Returns a CSS input compiling to this selector.
+ String() string
+
+ // Returns a pseudo-element, or an empty string.
+ PseudoElement() string
+}
+
+// Parse parses a selector. Use `ParseWithPseudoElement`
+// if you need support for pseudo-elements.
+func Parse(sel string) (Sel, error) {
+ p := &parser{s: sel}
+ compiled, err := p.parseSelector()
+ if err != nil {
+ return nil, err
+ }
+
+ if p.i < len(sel) {
+ return nil, fmt.Errorf("parsing %q: %d bytes left over", sel, len(sel)-p.i)
+ }
+
+ return compiled, nil
+}
+
+// ParseWithPseudoElement parses a single selector,
+// with support for pseudo-element.
+func ParseWithPseudoElement(sel string) (Sel, error) {
+ p := &parser{s: sel, acceptPseudoElements: true}
+ compiled, err := p.parseSelector()
+ if err != nil {
+ return nil, err
+ }
+
+ if p.i < len(sel) {
+ return nil, fmt.Errorf("parsing %q: %d bytes left over", sel, len(sel)-p.i)
+ }
+
+ return compiled, nil
+}
+
+// ParseGroup parses a selector, or a group of selectors separated by commas.
+// Use `ParseGroupWithPseudoElements`
+// if you need support for pseudo-elements.
+func ParseGroup(sel string) (SelectorGroup, error) {
+ p := &parser{s: sel}
+ compiled, err := p.parseSelectorGroup()
+ if err != nil {
+ return nil, err
+ }
+
+ if p.i < len(sel) {
+ return nil, fmt.Errorf("parsing %q: %d bytes left over", sel, len(sel)-p.i)
+ }
+
+ return compiled, nil
+}
+
+// ParseGroupWithPseudoElements parses a selector, or a group of selectors separated by commas.
+// It supports pseudo-elements.
+func ParseGroupWithPseudoElements(sel string) (SelectorGroup, error) {
+ p := &parser{s: sel, acceptPseudoElements: true}
+ compiled, err := p.parseSelectorGroup()
+ if err != nil {
+ return nil, err
+ }
+
+ if p.i < len(sel) {
+ return nil, fmt.Errorf("parsing %q: %d bytes left over", sel, len(sel)-p.i)
+ }
+
+ return compiled, nil
+}
+
+// A Selector is a function which tells whether a node matches or not.
+//
+// This type is maintained for compatibility; I recommend using the newer and
+// more idiomatic interfaces Sel and Matcher.
+type Selector func(*html.Node) bool
+
+// Compile parses a selector and returns, if successful, a Selector object
+// that can be used to match against html.Node objects.
+func Compile(sel string) (Selector, error) {
+ compiled, err := ParseGroup(sel)
+ if err != nil {
+ return nil, err
+ }
+
+ return Selector(compiled.Match), nil
+}
+
+// MustCompile is like Compile, but panics instead of returning an error.
+func MustCompile(sel string) Selector {
+ compiled, err := Compile(sel)
+ if err != nil {
+ panic(err)
+ }
+ return compiled
+}
+
+// MatchAll returns a slice of the nodes that match the selector,
+// from n and its children.
+func (s Selector) MatchAll(n *html.Node) []*html.Node {
+ return s.matchAllInto(n, nil)
+}
+
+func (s Selector) matchAllInto(n *html.Node, storage []*html.Node) []*html.Node {
+ if s(n) {
+ storage = append(storage, n)
+ }
+
+ for child := n.FirstChild; child != nil; child = child.NextSibling {
+ storage = s.matchAllInto(child, storage)
+ }
+
+ return storage
+}
+
+func queryInto(n *html.Node, m Matcher, storage []*html.Node) []*html.Node {
+ for child := n.FirstChild; child != nil; child = child.NextSibling {
+ if m.Match(child) {
+ storage = append(storage, child)
+ }
+ storage = queryInto(child, m, storage)
+ }
+
+ return storage
+}
+
+// QueryAll returns a slice of all the nodes that match m, from the descendants
+// of n.
+func QueryAll(n *html.Node, m Matcher) []*html.Node {
+ return queryInto(n, m, nil)
+}
+
+// Match returns true if the node matches the selector.
+func (s Selector) Match(n *html.Node) bool {
+ return s(n)
+}
+
+// MatchFirst returns the first node that matches s, from n and its children.
+func (s Selector) MatchFirst(n *html.Node) *html.Node {
+ if s.Match(n) {
+ return n
+ }
+
+ for c := n.FirstChild; c != nil; c = c.NextSibling {
+ m := s.MatchFirst(c)
+ if m != nil {
+ return m
+ }
+ }
+ return nil
+}
+
+// Query returns the first node that matches m, from the descendants of n.
+// If none matches, it returns nil.
+func Query(n *html.Node, m Matcher) *html.Node {
+ for c := n.FirstChild; c != nil; c = c.NextSibling {
+ if m.Match(c) {
+ return c
+ }
+ if matched := Query(c, m); matched != nil {
+ return matched
+ }
+ }
+
+ return nil
+}
+
+// Filter returns the nodes in nodes that match the selector.
+func (s Selector) Filter(nodes []*html.Node) (result []*html.Node) {
+ for _, n := range nodes {
+ if s(n) {
+ result = append(result, n)
+ }
+ }
+ return result
+}
+
+// Filter returns the nodes that match m.
+func Filter(nodes []*html.Node, m Matcher) (result []*html.Node) {
+ for _, n := range nodes {
+ if m.Match(n) {
+ result = append(result, n)
+ }
+ }
+ return result
+}
+
+type tagSelector struct {
+ tag string
+}
+
+// Matches elements with a given tag name.
+func (t tagSelector) Match(n *html.Node) bool {
+ return n.Type == html.ElementNode && n.Data == t.tag
+}
+
+func (c tagSelector) Specificity() Specificity {
+ return Specificity{0, 0, 1}
+}
+
+func (c tagSelector) PseudoElement() string {
+ return ""
+}
+
+type classSelector struct {
+ class string
+}
+
+// Matches elements by class attribute.
+func (t classSelector) Match(n *html.Node) bool {
+ return matchAttribute(n, "class", func(s string) bool {
+ return matchInclude(t.class, s, false)
+ })
+}
+
+func (c classSelector) Specificity() Specificity {
+ return Specificity{0, 1, 0}
+}
+
+func (c classSelector) PseudoElement() string {
+ return ""
+}
+
+type idSelector struct {
+ id string
+}
+
+// Matches elements by id attribute.
+func (t idSelector) Match(n *html.Node) bool {
+ return matchAttribute(n, "id", func(s string) bool {
+ return s == t.id
+ })
+}
+
+func (c idSelector) Specificity() Specificity {
+ return Specificity{1, 0, 0}
+}
+
+func (c idSelector) PseudoElement() string {
+ return ""
+}
+
+type attrSelector struct {
+ key, val, operation string
+ regexp *regexp.Regexp
+ insensitive bool
+}
+
+// Matches elements by attribute value.
+func (t attrSelector) Match(n *html.Node) bool {
+ switch t.operation {
+ case "":
+ return matchAttribute(n, t.key, func(string) bool { return true })
+ case "=":
+ return matchAttribute(n, t.key, func(s string) bool { return matchInsensitiveValue(s, t.val, t.insensitive) })
+ case "!=":
+ return attributeNotEqualMatch(t.key, t.val, n, t.insensitive)
+ case "~=":
+ // matches elements where the attribute named key is a whitespace-separated list that includes val.
+ return matchAttribute(n, t.key, func(s string) bool { return matchInclude(t.val, s, t.insensitive) })
+ case "|=":
+ return attributeDashMatch(t.key, t.val, n, t.insensitive)
+ case "^=":
+ return attributePrefixMatch(t.key, t.val, n, t.insensitive)
+ case "$=":
+ return attributeSuffixMatch(t.key, t.val, n, t.insensitive)
+ case "*=":
+ return attributeSubstringMatch(t.key, t.val, n, t.insensitive)
+ case "#=":
+ return attributeRegexMatch(t.key, t.regexp, n)
+ default:
+ panic(fmt.Sprintf("unsuported operation : %s", t.operation))
+ }
+}
+
+// matches elements where we ignore (or not) the case of the attribute value
+// the user attribute is the value set by the user to match elements
+// the real attribute is the attribute value found in the code parsed
+func matchInsensitiveValue(userAttr string, realAttr string, ignoreCase bool) bool {
+ if ignoreCase {
+ return strings.EqualFold(userAttr, realAttr)
+ }
+ return userAttr == realAttr
+
+}
+
+// matches elements where the attribute named key satisifes the function f.
+func matchAttribute(n *html.Node, key string, f func(string) bool) bool {
+ if n.Type != html.ElementNode {
+ return false
+ }
+ for _, a := range n.Attr {
+ if a.Key == key && f(a.Val) {
+ return true
+ }
+ }
+ return false
+}
+
+// attributeNotEqualMatch matches elements where
+// the attribute named key does not have the value val.
+func attributeNotEqualMatch(key, val string, n *html.Node, ignoreCase bool) bool {
+ if n.Type != html.ElementNode {
+ return false
+ }
+ for _, a := range n.Attr {
+ if a.Key == key && matchInsensitiveValue(a.Val, val, ignoreCase) {
+ return false
+ }
+ }
+ return true
+}
+
+// returns true if s is a whitespace-separated list that includes val.
+func matchInclude(val string, s string, ignoreCase bool) bool {
+ for s != "" {
+ i := strings.IndexAny(s, " \t\r\n\f")
+ if i == -1 {
+ return matchInsensitiveValue(s, val, ignoreCase)
+ }
+ if matchInsensitiveValue(s[:i], val, ignoreCase) {
+ return true
+ }
+ s = s[i+1:]
+ }
+ return false
+}
+
+// matches elements where the attribute named key equals val or starts with val plus a hyphen.
+func attributeDashMatch(key, val string, n *html.Node, ignoreCase bool) bool {
+ return matchAttribute(n, key,
+ func(s string) bool {
+ if matchInsensitiveValue(s, val, ignoreCase) {
+ return true
+ }
+ if len(s) <= len(val) {
+ return false
+ }
+ if matchInsensitiveValue(s[:len(val)], val, ignoreCase) && s[len(val)] == '-' {
+ return true
+ }
+ return false
+ })
+}
+
+// attributePrefixMatch returns a Selector that matches elements where
+// the attribute named key starts with val.
+func attributePrefixMatch(key, val string, n *html.Node, ignoreCase bool) bool {
+ return matchAttribute(n, key,
+ func(s string) bool {
+ if strings.TrimSpace(s) == "" {
+ return false
+ }
+ if ignoreCase {
+ return strings.HasPrefix(strings.ToLower(s), strings.ToLower(val))
+ }
+ return strings.HasPrefix(s, val)
+ })
+}
+
+// attributeSuffixMatch matches elements where
+// the attribute named key ends with val.
+func attributeSuffixMatch(key, val string, n *html.Node, ignoreCase bool) bool {
+ return matchAttribute(n, key,
+ func(s string) bool {
+ if strings.TrimSpace(s) == "" {
+ return false
+ }
+ if ignoreCase {
+ return strings.HasSuffix(strings.ToLower(s), strings.ToLower(val))
+ }
+ return strings.HasSuffix(s, val)
+ })
+}
+
+// attributeSubstringMatch matches nodes where
+// the attribute named key contains val.
+func attributeSubstringMatch(key, val string, n *html.Node, ignoreCase bool) bool {
+ return matchAttribute(n, key,
+ func(s string) bool {
+ if strings.TrimSpace(s) == "" {
+ return false
+ }
+ if ignoreCase {
+ return strings.Contains(strings.ToLower(s), strings.ToLower(val))
+ }
+ return strings.Contains(s, val)
+ })
+}
+
+// attributeRegexMatch matches nodes where
+// the attribute named key matches the regular expression rx
+func attributeRegexMatch(key string, rx *regexp.Regexp, n *html.Node) bool {
+ return matchAttribute(n, key,
+ func(s string) bool {
+ return rx.MatchString(s)
+ })
+}
+
+func (c attrSelector) Specificity() Specificity {
+ return Specificity{0, 1, 0}
+}
+
+func (c attrSelector) PseudoElement() string {
+ return ""
+}
+
+// see pseudo_classes.go for pseudo classes selectors
+
+// on a static context, some selectors can't match anything
+type neverMatchSelector struct {
+ value string
+}
+
+func (s neverMatchSelector) Match(n *html.Node) bool {
+ return false
+}
+
+func (s neverMatchSelector) Specificity() Specificity {
+ return Specificity{0, 0, 0}
+}
+
+func (c neverMatchSelector) PseudoElement() string {
+ return ""
+}
+
+type compoundSelector struct {
+ selectors []Sel
+ pseudoElement string
+}
+
+// Matches elements if each sub-selectors matches.
+func (t compoundSelector) Match(n *html.Node) bool {
+ if len(t.selectors) == 0 {
+ return n.Type == html.ElementNode
+ }
+
+ for _, sel := range t.selectors {
+ if !sel.Match(n) {
+ return false
+ }
+ }
+ return true
+}
+
+func (s compoundSelector) Specificity() Specificity {
+ var out Specificity
+ for _, sel := range s.selectors {
+ out = out.Add(sel.Specificity())
+ }
+ if s.pseudoElement != "" {
+ // https://drafts.csswg.org/selectors-3/#specificity
+ out = out.Add(Specificity{0, 0, 1})
+ }
+ return out
+}
+
+func (c compoundSelector) PseudoElement() string {
+ return c.pseudoElement
+}
+
+type combinedSelector struct {
+ first Sel
+ combinator byte
+ second Sel
+}
+
+func (t combinedSelector) Match(n *html.Node) bool {
+ if t.first == nil {
+ return false // maybe we should panic
+ }
+ switch t.combinator {
+ case 0:
+ return t.first.Match(n)
+ case ' ':
+ return descendantMatch(t.first, t.second, n)
+ case '>':
+ return childMatch(t.first, t.second, n)
+ case '+':
+ return siblingMatch(t.first, t.second, true, n)
+ case '~':
+ return siblingMatch(t.first, t.second, false, n)
+ default:
+ panic("unknown combinator")
+ }
+}
+
+// matches an element if it matches d and has an ancestor that matches a.
+func descendantMatch(a, d Matcher, n *html.Node) bool {
+ if !d.Match(n) {
+ return false
+ }
+
+ for p := n.Parent; p != nil; p = p.Parent {
+ if a.Match(p) {
+ return true
+ }
+ }
+
+ return false
+}
+
+// matches an element if it matches d and its parent matches a.
+func childMatch(a, d Matcher, n *html.Node) bool {
+ return d.Match(n) && n.Parent != nil && a.Match(n.Parent)
+}
+
+// matches an element if it matches s2 and is preceded by an element that matches s1.
+// If adjacent is true, the sibling must be immediately before the element.
+func siblingMatch(s1, s2 Matcher, adjacent bool, n *html.Node) bool {
+ if !s2.Match(n) {
+ return false
+ }
+
+ if adjacent {
+ for n = n.PrevSibling; n != nil; n = n.PrevSibling {
+ if n.Type == html.TextNode || n.Type == html.CommentNode {
+ continue
+ }
+ return s1.Match(n)
+ }
+ return false
+ }
+
+ // Walk backwards looking for element that matches s1
+ for c := n.PrevSibling; c != nil; c = c.PrevSibling {
+ if s1.Match(c) {
+ return true
+ }
+ }
+
+ return false
+}
+
+func (s combinedSelector) Specificity() Specificity {
+ spec := s.first.Specificity()
+ if s.second != nil {
+ spec = spec.Add(s.second.Specificity())
+ }
+ return spec
+}
+
+// on combinedSelector, a pseudo-element only makes sens on the last
+// selector, although others increase specificity.
+func (c combinedSelector) PseudoElement() string {
+ if c.second == nil {
+ return ""
+ }
+ return c.second.PseudoElement()
+}
+
+// A SelectorGroup is a list of selectors, which matches if any of the
+// individual selectors matches.
+type SelectorGroup []Sel
+
+// Match returns true if the node matches one of the single selectors.
+func (s SelectorGroup) Match(n *html.Node) bool {
+ for _, sel := range s {
+ if sel.Match(n) {
+ return true
+ }
+ }
+ return false
+}
diff --git a/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/selector_test.go b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/selector_test.go
new file mode 100644
index 000000000..b357a9800
--- /dev/null
+++ b/pkg/mod/github.com/andybalholm/cascadia@v1.3.1/selector_test.go
@@ -0,0 +1,1003 @@
+package cascadia
+
+import (
+ "bytes"
+ "encoding/json"
+ "fmt"
+ "io/ioutil"
+ "log"
+ "reflect"
+ "strings"
+ "testing"
+
+ "golang.org/x/net/html"
+)
+
+var validSelectors []validSelector
+
+func init() {
+ c, err := ioutil.ReadFile("test_resources/valid_selectors.json")
+ if err != nil {
+ log.Fatal(err)
+ }
+ if err = json.Unmarshal(c, &validSelectors); err != nil {
+ log.Fatal(err)
+ }
+}
+
+type selectorTest struct {
+ HTML, selector string
+ results []string
+}
+
+func nodeString(n *html.Node) string {
+ buf := bytes.NewBufferString("")
+ if err := html.Render(buf, n); err != nil {
+ log.Fatal(err)
+ }
+ return buf.String()
+}
+
+var selectorTests = []selectorTest{
+ {
+ `This address...`,
+ "address",
+ []string{
+ "This address...",
+ },
+ },
+ {
+ `text`,
+ "*",
+ []string{
+ "text",
+ "",
+ "text",
+ },
+ },
+ {
+ ``,
+ "*",
+ []string{
+ "",
+ "",
+ "",
+ },
+ },
+ {
+ `